aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorCong Wang <cwang@twopensource.com>2014-02-06 18:00:52 -0500
committerDavid S. Miller <davem@davemloft.net>2014-02-07 00:28:06 -0500
commitdbe173079ab58a444e12dbebe96f5aec1e0bed1a (patch)
tree99e3267bb0bf26cbcadc15dae0431d29f1a2f765 /net
parented98df3361f059db42786c830ea96e2d18b8d4db (diff)
bridge: fix netconsole setup over bridge
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>
Diffstat (limited to 'net')
-rw-r--r--net/bridge/br_device.c51
1 files changed, 28 insertions, 23 deletions
diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c
index e4401a531afb..d9a9b0fc1795 100644
--- a/net/bridge/br_device.c
+++ b/net/bridge/br_device.c
@@ -226,6 +226,33 @@ static void br_netpoll_cleanup(struct net_device *dev)
226 br_netpoll_disable(p); 226 br_netpoll_disable(p);
227} 227}
228 228
229static int __br_netpoll_enable(struct net_bridge_port *p, gfp_t gfp)
230{
231 struct netpoll *np;
232 int err;
233
234 np = kzalloc(sizeof(*p->np), gfp);
235 if (!np)
236 return -ENOMEM;
237
238 err = __netpoll_setup(np, p->dev, gfp);
239 if (err) {
240 kfree(np);
241 return err;
242 }
243
244 p->np = np;
245 return err;
246}
247
248int br_netpoll_enable(struct net_bridge_port *p, gfp_t gfp)
249{
250 if (!p->br->dev->npinfo)
251 return 0;
252
253 return __br_netpoll_enable(p, gfp);
254}
255
229static int br_netpoll_setup(struct net_device *dev, struct netpoll_info *ni, 256static int br_netpoll_setup(struct net_device *dev, struct netpoll_info *ni,
230 gfp_t gfp) 257 gfp_t gfp)
231{ 258{
@@ -236,7 +263,7 @@ static int br_netpoll_setup(struct net_device *dev, struct netpoll_info *ni,
236 list_for_each_entry(p, &br->port_list, list) { 263 list_for_each_entry(p, &br->port_list, list) {
237 if (!p->dev) 264 if (!p->dev)
238 continue; 265 continue;
239 err = br_netpoll_enable(p, gfp); 266 err = __br_netpoll_enable(p, gfp);
240 if (err) 267 if (err)
241 goto fail; 268 goto fail;
242 } 269 }
@@ -249,28 +276,6 @@ fail:
249 goto out; 276 goto out;
250} 277}
251 278
252int br_netpoll_enable(struct net_bridge_port *p, gfp_t gfp)
253{
254 struct netpoll *np;
255 int err;
256
257 if (!p->br->dev->npinfo)
258 return 0;
259
260 np = kzalloc(sizeof(*p->np), gfp);
261 if (!np)
262 return -ENOMEM;
263
264 err = __netpoll_setup(np, p->dev, gfp);
265 if (err) {
266 kfree(np);
267 return err;
268 }
269
270 p->np = np;
271 return err;
272}
273
274void br_netpoll_disable(struct net_bridge_port *p) 279void br_netpoll_disable(struct net_bridge_port *p)
275{ 280{
276 struct netpoll *np = p->np; 281 struct netpoll *np = p->np;