| From foo@baz Thu Feb 27 20:11:26 PST 2014 |
| From: Cong Wang <cwang@twopensource.com> |
| Date: Thu, 6 Feb 2014 15:00:52 -0800 |
| Subject: bridge: fix netconsole setup over bridge |
| |
| From: Cong Wang <cwang@twopensource.com> |
| |
| [ Upstream commit dbe173079ab58a444e12dbebe96f5aec1e0bed1a ] |
| |
| Commit 93d8bf9fb8f3 ("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: 93d8bf9fb8f3 ("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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/bridge/br_device.c | 51 ++++++++++++++++++++++++++----------------------- |
| 1 file changed, 28 insertions(+), 23 deletions(-) |
| |
| --- a/net/bridge/br_device.c |
| +++ b/net/bridge/br_device.c |
| @@ -226,6 +226,33 @@ static void br_netpoll_cleanup(struct ne |
| 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_d |
| 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 @@ fail: |
| 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; |