if (busy) { set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(HZ / 10); } 
if (busy) msleep_interruptible(100); 
static void __exit slip_exit(void){	int i;	struct net_device *dev;	struct slip *sl;	unsigned long timeout = jiffies + HZ;	int busy = 0;	if (slip_devs == NULL) 		return;	/* First of all: check for active disciplines and hangup them.	 */	do {		if (busy) {			set_current_state(TASK_INTERRUPTIBLE);			schedule_timeout(HZ / 10);		}		busy = 0;		for (i = 0; i < slip_maxdev; i++) {			dev = slip_devs[i];			if (!dev)				continue;			sl = netdev_priv(dev);			spin_lock_bh(&sl->lock);			if (sl->tty) {				busy++;				tty_hangup(sl->tty);			}			spin_unlock_bh(&sl->lock);		}	} while (busy && time_before(jiffies, timeout));	for (i = 0; i < slip_maxdev; i++) {		dev = slip_devs[i];		if (!dev)			continue;		slip_devs[i] = NULL;		sl = netdev_priv(dev);		if (sl->tty) {			printk(KERN_ERR "%s: tty discipline still running\n",			       dev->name);			/* Intentionally leak the control block. */			dev->destructor = NULL;		} 		unregister_netdev(dev);	}	kfree(slip_devs);	slip_devs = NULL;	if ((i = tty_unregister_ldisc(N_SLIP)))	{		printk(KERN_ERR "SLIP: can't unregister line discipline (err = %d)\n", i);	}}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/a9fc25108995f1f59ee30026818d7ec2bb016fbe/slip.c/buggy/drivers/net/slip.c