bridge: fix netconsole setup over bridge

Commit 93d8bf9fb8 ("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: 93d8bf9fb8 ("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: Cong Wang <cwang@twopensource.com>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
Acked-by: Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp>
Tested-by: Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Cong Wang 2014-02-06 15:00:52 -08:00 committed by David S. Miller
parent ed98df3361
commit dbe173079a
1 changed files with 32 additions and 27 deletions

View File

@ -226,37 +226,11 @@ static void br_netpoll_cleanup(struct net_device *dev)
br_netpoll_disable(p); br_netpoll_disable(p);
} }
static int br_netpoll_setup(struct net_device *dev, struct netpoll_info *ni, static int __br_netpoll_enable(struct net_bridge_port *p, gfp_t gfp)
gfp_t gfp)
{
struct net_bridge *br = netdev_priv(dev);
struct net_bridge_port *p;
int err = 0;
list_for_each_entry(p, &br->port_list, list) {
if (!p->dev)
continue;
err = br_netpoll_enable(p, gfp);
if (err)
goto fail;
}
out:
return err;
fail:
br_netpoll_cleanup(dev);
goto out;
}
int br_netpoll_enable(struct net_bridge_port *p, gfp_t gfp)
{ {
struct netpoll *np; struct netpoll *np;
int err; int err;
if (!p->br->dev->npinfo)
return 0;
np = kzalloc(sizeof(*p->np), gfp); np = kzalloc(sizeof(*p->np), gfp);
if (!np) if (!np)
return -ENOMEM; return -ENOMEM;
@ -271,6 +245,37 @@ int br_netpoll_enable(struct net_bridge_port *p, gfp_t gfp)
return err; 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)
{
struct net_bridge *br = netdev_priv(dev);
struct net_bridge_port *p;
int err = 0;
list_for_each_entry(p, &br->port_list, list) {
if (!p->dev)
continue;
err = __br_netpoll_enable(p, gfp);
if (err)
goto fail;
}
out:
return err;
fail:
br_netpoll_cleanup(dev);
goto out;
}
void br_netpoll_disable(struct net_bridge_port *p) void br_netpoll_disable(struct net_bridge_port *p)
{ {
struct netpoll *np = p->np; struct netpoll *np = p->np;