Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit de3cb747 authored by Daniel Lezcano's avatar Daniel Lezcano Committed by David S. Miller
Browse files

[NET]: Dynamically allocate the loopback device, part 1.



This patch replaces all occurences to the static variable
loopback_dev to a pointer loopback_dev. That provides the
mindless, trivial, uninteressting change part for the dynamic
allocation for the loopback.

Signed-off-by: default avatarEric W. Biederman <ebiederm@xmission.com>
Signed-off-by: default avatarDaniel Lezcano <dlezcano@fr.ibm.com>
Acked-By: default avatarKirill Korotaev <dev@sw.ru>
Acked-by: default avatarBenjamin Thery <benjamin.thery@bull.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 55682965
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -202,7 +202,7 @@ static const struct ethtool_ops loopback_ethtool_ops = {
 * The loopback device is special. There is only one instance and
 * it is statically allocated. Don't do this for other devices.
 */
struct net_device loopback_dev = {
struct net_device __loopback_dev = {
	.name	 		= "lo",
	.get_stats		= &get_stats,
	.mtu			= (16 * 1024) + 20 + 20 + 12,
@@ -227,10 +227,12 @@ struct net_device loopback_dev = {
	.nd_net                 = &init_net,
};

struct net_device *loopback_dev = &__loopback_dev;

/* Setup and register the loopback device. */
static int __init loopback_init(void)
{
	int err = register_netdev(&loopback_dev);
	int err = register_netdev(loopback_dev);

	if (err)
		panic("loopback: Failed to register netdevice: %d\n", err);
+1 −1
Original line number Diff line number Diff line
@@ -741,7 +741,7 @@ struct packet_type {
#include <linux/interrupt.h>
#include <linux/notifier.h>

extern struct net_device		loopback_dev;		/* The loopback */
extern struct net_device		*loopback_dev;		/* The loopback */
extern rwlock_t				dev_base_lock;		/* Device list lock */


+4 −4
Original line number Diff line number Diff line
@@ -278,13 +278,13 @@ static inline void dst_ifdown(struct dst_entry *dst, struct net_device *dev,
	if (!unregister) {
		dst->input = dst->output = dst_discard;
	} else {
		dst->dev = &loopback_dev;
		dev_hold(&loopback_dev);
		dst->dev = loopback_dev;
		dev_hold(dst->dev);
		dev_put(dev);
		if (dst->neighbour && dst->neighbour->dev == dev) {
			dst->neighbour->dev = &loopback_dev;
			dst->neighbour->dev = loopback_dev;
			dev_put(dev);
			dev_hold(&loopback_dev);
			dev_hold(dst->neighbour->dev);
		}
	}
}
+2 −2
Original line number Diff line number Diff line
@@ -869,10 +869,10 @@ int dn_dev_bind_default(__le16 *addr)
		rv = dn_dev_get_first(dev, addr);
		read_unlock(&dev_base_lock);
		dev_put(dev);
		if (rv == 0 || dev == &loopback_dev)
		if (rv == 0 || dev == loopback_dev)
			return rv;
	}
	dev = &loopback_dev;
	dev = loopback_dev;
	dev_hold(dev);
	goto last_chance;
}
+7 −7
Original line number Diff line number Diff line
@@ -887,7 +887,7 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old
					.scope = RT_SCOPE_UNIVERSE,
				     } },
			    .mark = oldflp->mark,
			    .iif = loopback_dev.ifindex,
			    .iif = loopback_dev->ifindex,
			    .oif = oldflp->oif };
	struct dn_route *rt = NULL;
	struct net_device *dev_out = NULL, *dev;
@@ -904,7 +904,7 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old
		       "dn_route_output_slow: dst=%04x src=%04x mark=%d"
		       " iif=%d oif=%d\n", dn_ntohs(oldflp->fld_dst),
		       dn_ntohs(oldflp->fld_src),
		       oldflp->mark, loopback_dev.ifindex, oldflp->oif);
		       oldflp->mark, loopback_dev->ifindex, oldflp->oif);

	/* If we have an output interface, verify its a DECnet device */
	if (oldflp->oif) {
@@ -957,7 +957,7 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old
		err = -EADDRNOTAVAIL;
		if (dev_out)
			dev_put(dev_out);
		dev_out = &loopback_dev;
		dev_out = loopback_dev;
		dev_hold(dev_out);
		if (!fl.fld_dst) {
			fl.fld_dst =
@@ -966,7 +966,7 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old
			if (!fl.fld_dst)
				goto out;
		}
		fl.oif = loopback_dev.ifindex;
		fl.oif = loopback_dev->ifindex;
		res.type = RTN_LOCAL;
		goto make_route;
	}
@@ -1012,7 +1012,7 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old
					if (dev_out)
						dev_put(dev_out);
					if (dn_dev_islocal(neigh->dev, fl.fld_dst)) {
						dev_out = &loopback_dev;
						dev_out = loopback_dev;
						res.type = RTN_LOCAL;
					} else {
						dev_out = neigh->dev;
@@ -1033,7 +1033,7 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old
		/* Possible improvement - check all devices for local addr */
		if (dn_dev_islocal(dev_out, fl.fld_dst)) {
			dev_put(dev_out);
			dev_out = &loopback_dev;
			dev_out = loopback_dev;
			dev_hold(dev_out);
			res.type = RTN_LOCAL;
			goto select_source;
@@ -1069,7 +1069,7 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old
			fl.fld_src = fl.fld_dst;
		if (dev_out)
			dev_put(dev_out);
		dev_out = &loopback_dev;
		dev_out = loopback_dev;
		dev_hold(dev_out);
		fl.oif = dev_out->ifindex;
		if (res.fi)
Loading