--- linux/drivers/net/bonding.c Sat Jul 15 10:24:35 2000 +++ linux-custom/drivers/net/bonding.c Sat Jul 15 10:43:44 2000 @@ -71,8 +71,12 @@ bonding_t *private = (struct bonding *) master->priv; slave_queue_t *queue = (struct slave_queue *) private->queue; slave_t *slave, *next; + int flags; + + save_flags(flags); + cli(); - for( slave=queue->head; slave != NULL; slave=next) { + for( slave=queue->head; slave != NULL; ) { #ifdef BONDING_DEBUG printk("freeing = %s\n", slave->dev->name); #endif @@ -80,9 +84,12 @@ slave->dev->slave = NULL; next = slave->next; kfree(slave); - queue->num_slaves++; + slave=next; + queue->num_slaves--; } + restore_flags(flags); + MOD_DEC_USE_COUNT; return 0; } @@ -121,14 +128,15 @@ return -EBUSY; } - slave->slave = master; /* save the master in slave->slave */ - slave->flags |= IFF_SLAVE; - if ((new_slave = kmalloc(sizeof(slave_t), GFP_KERNEL)) == NULL) { + restore_flags(flags); return -ENOMEM; } memset(new_slave, 0, sizeof(slave_t)); + slave->slave = master; /* save the master in slave->slave */ + slave->flags |= IFF_SLAVE; + new_slave->dev = slave; if (queue->head == NULL) { @@ -240,6 +248,11 @@ struct slave_queue *queue = bond->queue; int good = 0; + if(!queue->num_slaves) { + dev_kfree_skb(skb); + return 0; + } + while (good == 0) { slave = queue->current_slave->dev; if (slave->flags & (IFF_UP|IFF_RUNNING)) {