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

Commit dbe17307 authored by Cong Wang's avatar Cong Wang Committed by David S. Miller
Browse files

bridge: fix netconsole setup over bridge



Commit 93d8bf9f ("bridge: cleanup netpoll code") introduced
a check in br_netpoll_enable(), but this check is incorrect for
br_netpoll_setup(). This patch moves the code after the check
into __br_netpoll_enable() and calls it in br_netpoll_setup().
For br_add_if(), the check is still needed.

Fixes: 93d8bf9f ("bridge: cleanup netpoll code")
Cc: Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp>
Cc: Stephen Hemminger <stephen@networkplumber.org>
Cc: David S. Miller <davem@davemloft.net>
Signed-off-by: default avatarCong Wang <cwang@twopensource.com>
Signed-off-by: default avatarCong Wang <xiyou.wangcong@gmail.com>
Acked-by: default avatarToshiaki Makita <makita.toshiaki@lab.ntt.co.jp>
Tested-by: default avatarToshiaki Makita <makita.toshiaki@lab.ntt.co.jp>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ed98df33
Loading
Loading
Loading
Loading
+28 −23
Original line number Diff line number Diff line
@@ -226,6 +226,33 @@ static void br_netpoll_cleanup(struct net_device *dev)
		br_netpoll_disable(p);
}

static int __br_netpoll_enable(struct net_bridge_port *p, gfp_t gfp)
{
	struct netpoll *np;
	int err;

	np = kzalloc(sizeof(*p->np), gfp);
	if (!np)
		return -ENOMEM;

	err = __netpoll_setup(np, p->dev, gfp);
	if (err) {
		kfree(np);
		return err;
	}

	p->np = np;
	return err;
}

int br_netpoll_enable(struct net_bridge_port *p, gfp_t gfp)
{
	if (!p->br->dev->npinfo)
		return 0;

	return __br_netpoll_enable(p, gfp);
}

static int br_netpoll_setup(struct net_device *dev, struct netpoll_info *ni,
			    gfp_t gfp)
{
@@ -236,7 +263,7 @@ static int br_netpoll_setup(struct net_device *dev, struct netpoll_info *ni,
	list_for_each_entry(p, &br->port_list, list) {
		if (!p->dev)
			continue;
		err = br_netpoll_enable(p, gfp);
		err = __br_netpoll_enable(p, gfp);
		if (err)
			goto fail;
	}
@@ -249,28 +276,6 @@ static int br_netpoll_setup(struct net_device *dev, struct netpoll_info *ni,
	goto out;
}

int br_netpoll_enable(struct net_bridge_port *p, gfp_t gfp)
{
	struct netpoll *np;
	int err;

	if (!p->br->dev->npinfo)
		return 0;

	np = kzalloc(sizeof(*p->np), gfp);
	if (!np)
		return -ENOMEM;

	err = __netpoll_setup(np, p->dev, gfp);
	if (err) {
		kfree(np);
		return err;
	}

	p->np = np;
	return err;
}

void br_netpoll_disable(struct net_bridge_port *p)
{
	struct netpoll *np = p->np;