Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c4ebc66a authored by Jay Vosburgh's avatar Jay Vosburgh Committed by Jeff Garzik
Browse files

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: default avatarJay Vosburgh <fubar@us.ibm.com>
Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
parent 822973ba
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -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.