bonding: fix error unwind in bonding_store_bonds
Fixed an error unwind in bonding_store_bonds that didn't release the locks it held, and consolidated unwinds into a common block at the end of the function. Bug reported by Pavel Emelyanov <xemul@openvz.org>, who provided a different fix. Signed-off-by: Jay Vosburgh <fubar@us.ibm.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
parent
822973ba79
commit
c4ebc66a1a
|
@ -146,29 +146,29 @@ static ssize_t bonding_store_bonds(struct class *cls, const char *buffer, size_t
|
|||
": Unable remove bond %s due to open references.\n",
|
||||
ifname);
|
||||
res = -EPERM;
|
||||
goto out;
|
||||
goto out_unlock;
|
||||
}
|
||||
printk(KERN_INFO DRV_NAME
|
||||
": %s is being deleted...\n",
|
||||
bond->dev->name);
|
||||
bond_destroy(bond);
|
||||
up_write(&bonding_rwsem);
|
||||
rtnl_unlock();
|
||||
goto out;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
printk(KERN_ERR DRV_NAME
|
||||
": unable to delete non-existent bond %s\n", ifname);
|
||||
res = -ENODEV;
|
||||
up_write(&bonding_rwsem);
|
||||
rtnl_unlock();
|
||||
goto out;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
err_no_cmd:
|
||||
printk(KERN_ERR DRV_NAME
|
||||
": no command found in bonding_masters. Use +ifname or -ifname.\n");
|
||||
res = -EPERM;
|
||||
return -EPERM;
|
||||
|
||||
out_unlock:
|
||||
up_write(&bonding_rwsem);
|
||||
rtnl_unlock();
|
||||
|
||||
/* Always return either count or an error. If you return 0, you'll
|
||||
* get called forever, which is bad.
|
||||
|
|
Loading…
Reference in New Issue