diff options
Diffstat (limited to 'kernel/linux2.5/net/core/dev.c')
-rw-r--r-- | kernel/linux2.5/net/core/dev.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/kernel/linux2.5/net/core/dev.c b/kernel/linux2.5/net/core/dev.c index 6988fb9..5efaf6e 100644 --- a/kernel/linux2.5/net/core/dev.c +++ b/kernel/linux2.5/net/core/dev.c @@ -694,10 +694,14 @@ int dev_open(struct net_device *dev) * Call device private open method */ if (try_inc_mod_count(dev->owner)) { + set_bit(__LINK_STATE_START, &dev->state); if (dev->open) { ret = dev->open(dev); - if (ret && dev->owner) - __MOD_DEC_USE_COUNT(dev->owner); + if (ret) { + clear_bit(__LINK_STATE_START, &dev->state); + if (dev->owner) + __MOD_DEC_USE_COUNT(dev->owner); + } } } else { ret = -ENODEV; @@ -713,8 +717,6 @@ int dev_open(struct net_device *dev) */ dev->flags |= IFF_UP; - set_bit(__LINK_STATE_START, &dev->state); - /* * Initialize multicasting status */ @@ -1472,11 +1474,12 @@ int netif_receive_skb(struct sk_buff *skb) #if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) if (skb->dev->br_port && br_handle_frame_hook) { - int ret; + int ret; - ret = handle_bridge(skb, pt_prev); - if (br_handle_frame_hook(skb) == 0) - return ret; + ret = handle_bridge(skb, pt_prev); + if (br_handle_frame_hook(skb) == 0) + return ret; + pt_prev = NULL; } #endif |