From 50f7f68f7425380aecdfb52f71017c5359189092 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Thu, 11 Sep 2003 07:33:28 -0400 Subject: [PATCH] [PATCH] (4/4) dlci netdevice event handling Since dlci device is a pseudo device built on top of sdla, change it to handle unregister events and delete itself. --- drivers/net/wan/dlci.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/drivers/net/wan/dlci.c b/drivers/net/wan/dlci.c index 8255192a526f5..0d1795e6f4559 100644 --- a/drivers/net/wan/dlci.c +++ b/drivers/net/wan/dlci.c @@ -509,20 +509,46 @@ static void dlci_setup(struct net_device *dev) } -int __init init_dlci(void) +/* if slave is unregistering, then cleanup master */ +static int dlci_dev_event(struct notifier_block *unused, + unsigned long event, void *ptr) +{ + struct net_device *dev = (struct net_device *) ptr; + + if (event == NETDEV_UNREGISTER) { + struct dlci_local *dlp; + + list_for_each_entry(dlp, &dlci_devs, list) { + if (dlp->slave == dev) { + unregister_netdevice(dlp->master); + dev_put(dlp->slave); + break; + } + } + } + return NOTIFY_DONE; +} + +static struct notifier_block dlci_notifier = { + .notifier_call = dlci_dev_event, +}; + +static int __init init_dlci(void) { dlci_ioctl_set(dlci_ioctl); + register_netdevice_notifier(&dlci_notifier); printk("%s.\n", version); return 0; } -void __exit dlci_exit(void) +static void __exit dlci_exit(void) { struct dlci_local *dlp, *nxt; dlci_ioctl_set(NULL); + unregister_netdevice_notifier(&dlci_notifier); rtnl_lock(); list_for_each_entry_safe(dlp, nxt, &dlci_devs, list) { -- 2.53.0