bond_destroy_slave_symlinks(bond_dev, slave_dev); 
static int bond_release_all(struct net_device *bond_dev){	struct bonding *bond = bond_dev->priv;	struct slave *slave;	struct net_device *slave_dev;	struct sockaddr addr;	write_lock_bh(&bond->lock);	if (bond->slave_cnt == 0) {		goto out;	}	bond->current_arp_slave = NULL;	bond->primary_slave = NULL;	bond_change_active_slave(bond, NULL);	while ((slave = bond->first_slave) != NULL) {		/* Inform AD package of unbinding of slave		 * before slave is detached from the list.		 */		if (bond->params.mode == BOND_MODE_8023AD) {			bond_3ad_unbind_slave(slave);		}		slave_dev = slave->dev;		bond_detach_slave(bond, slave);		if ((bond->params.mode == BOND_MODE_TLB) ||		    (bond->params.mode == BOND_MODE_ALB)) {			/* must be called only after the slave			 * has been detached from the list			 */			bond_alb_deinit_slave(bond, slave);		}		bond_compute_features(bond);		/* now that the slave is detached, unlock and perform		 * all the undo steps that should not be called from		 * within a lock.		 */		write_unlock_bh(&bond->lock);		bond_del_vlans_from_slave(bond, slave_dev);		/* If the mode USES_PRIMARY, then we should only remove its		 * promisc and mc settings if it was the curr_active_slave, but that was		 * already taken care of above when we detached the slave		 */		if (!USES_PRIMARY(bond->params.mode)) {			/* unset promiscuity level from slave */			if (bond_dev->flags & IFF_PROMISC) {				dev_set_promiscuity(slave_dev, -1);			}			/* unset allmulti level from slave */			if (bond_dev->flags & IFF_ALLMULTI) {				dev_set_allmulti(slave_dev, -1);			}			/* flush master's mc_list from slave */			bond_mc_list_flush(bond_dev, slave_dev);		}		netdev_set_master(slave_dev, NULL);		/* close slave before restoring its mac address */		dev_close(slave_dev);		/* restore original ("permanent") mac address*/		memcpy(addr.sa_data, slave->perm_hwaddr, ETH_ALEN);		addr.sa_family = slave_dev->type;		dev_set_mac_address(slave_dev, &addr);		/* restore the original state of the IFF_NOARP flag that might have		 * been set by bond_set_slave_inactive_flags()		 */		if ((slave->original_flags & IFF_NOARP) == 0) {			slave_dev->flags &= ~IFF_NOARP;		}		kfree(slave);		/* re-acquire the lock before getting the next slave */		write_lock_bh(&bond->lock);	}	/* zero the mac address of the master so it will be	 * set by the application to the mac address of the	 * first slave	 */	memset(bond_dev->dev_addr, 0, bond_dev->addr_len);	if (list_empty(&bond->vlan_list)) {		bond_dev->features |= NETIF_F_VLAN_CHALLENGED;	} else {		printk(KERN_WARNING DRV_NAME		       ": %s: Warning: clearing HW address of %s while it "		       "still has VLANs.\n",		       bond_dev->name, bond_dev->name);		printk(KERN_WARNING DRV_NAME		       ": %s: When re-adding slaves, make sure the bond's "		       "HW address matches its VLANs'.\n",		       bond_dev->name);	}	printk(KERN_INFO DRV_NAME	       ": %s: released all slaves\n",	       bond_dev->name);out:	write_unlock_bh(&bond->lock);	return 0;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/b76cdba9cdb29b091cacb4c11534ffb2eac02f64/bond_main.c/buggy/drivers/net/bonding/bond_main.c