Skip to content

Commit

Permalink
[BRIDGE]: fix module startup error handling
Browse files Browse the repository at this point in the history
Return address in use, if some other kernel code has the SAP.
Propogate out error codes from netfilter registration and unwind.

Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Stephen Hemminger authored and David S. Miller committed Jun 18, 2006
1 parent 9ef513b commit c090971
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 9 deletions.
26 changes: 17 additions & 9 deletions net/bridge/br.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,36 +30,44 @@ static struct llc_sap *br_stp_sap;

static int __init br_init(void)
{
int err;

br_stp_sap = llc_sap_open(LLC_SAP_BSPAN, br_stp_rcv);
if (!br_stp_sap) {
printk(KERN_ERR "bridge: can't register sap for STP\n");
return -EBUSY;
return -EADDRINUSE;
}

br_fdb_init();

#ifdef CONFIG_BRIDGE_NETFILTER
if (br_netfilter_init())
return 1;
#endif
err = br_netfilter_init();
if (err)
goto err_out1;

err = register_netdevice_notifier(&br_device_notifier);
if (err)
goto err_out2;

brioctl_set(br_ioctl_deviceless_stub);
br_handle_frame_hook = br_handle_frame;

br_fdb_get_hook = br_fdb_get;
br_fdb_put_hook = br_fdb_put;

register_netdevice_notifier(&br_device_notifier);

return 0;

err_out2:
br_netfilter_fini();
err_out1:
llc_sap_put(br_stp_sap);
return err;
}

static void __exit br_deinit(void)
{
rcu_assign_pointer(br_stp_sap->rcv_func, NULL);

#ifdef CONFIG_BRIDGE_NETFILTER
br_netfilter_fini();
#endif
unregister_netdevice_notifier(&br_device_notifier);
brioctl_set(NULL);

Expand Down
5 changes: 5 additions & 0 deletions net/bridge/br_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -192,8 +192,13 @@ extern int br_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
extern int br_ioctl_deviceless_stub(unsigned int cmd, void __user *arg);

/* br_netfilter.c */
#ifdef CONFIG_BRIDGE_NETFILTER
extern int br_netfilter_init(void);
extern void br_netfilter_fini(void);
#else
#define br_netfilter_init() (0)
#define br_netfilter_fini() do { } while(0)
#endif

/* br_stp.c */
extern void br_log_state(const struct net_bridge_port *p);
Expand Down

0 comments on commit c090971

Please sign in to comment.