diff options
author | Cong Wang <cwang@twopensource.com> | 2014-02-06 18:00:52 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-02-07 00:28:06 -0500 |
commit | dbe173079ab58a444e12dbebe96f5aec1e0bed1a (patch) | |
tree | 99e3267bb0bf26cbcadc15dae0431d29f1a2f765 /net | |
parent | ed98df3361f059db42786c830ea96e2d18b8d4db (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.c | 51 |
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 | ||
229 | static 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 | |||
248 | int 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 | |||
229 | static int br_netpoll_setup(struct net_device *dev, struct netpoll_info *ni, | 256 | static 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 | ||
252 | int 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 | |||
274 | void br_netpoll_disable(struct net_bridge_port *p) | 279 | void br_netpoll_disable(struct net_bridge_port *p) |
275 | { | 280 | { |
276 | struct netpoll *np = p->np; | 281 | struct netpoll *np = p->np; |