Subject: Re: [PATCH] bonding: prevent deadlock on slave store with alb mode

From: Jay Vosburgh <[email-masked]>
Date: Tue, 24 May 2011 14:12:54 -0700

Nicolas de Pesloüan <[email-masked]> wrote:

>Le 24/05/2011 22:37, Neil Horman a écrit :
>
>>>>> +		return -EINVAL;
>>>
>>> This will turn a warning into an error.
>>>
>> Yes, because it should have been an error all along.
>>
>>> This warning existed for long, but never caused the bonding setup to
>>> fail. This patch cause some regression for user space. For example,
>>> current ifenslave-2.6 package in Debian doesn't ensure bond is UP
>>> before enslaving, because this was never required.
>>>
>> Thats not a regression, thats the kernel returning an error where it should have
>> done so all along.  Just because a utility got away with it for awhile and it
>> didn't always cause a lockup, doesn't grandfather that application in to a
>> situation where the kernel has to support its broken behavior in perpituity.
>>
>> Besides, iirc, the ifsenslave utility still uses the ioctl path, which this
>> patch doesn't touch, so ifenslave is currently unaffected (although I should
>> look in the ioctl path to see if we have already added such a check, lest you be
>> able to deadlock your system as previously indicated using that tool).
>
>Unfortunately, no. Recent versions of ifenslave-2.6 on Debian don't use
>ioctl (ifenslave binary) anymore, but only sysfs.
>
>Documentation/bonding.txt should be updated to reflect this change.
>pr_warning should be changed to pr_ err.
>Bonding version should be bumped.
>
>Anyway, I will fix this package, but I suspect there exist many user
>scripts that don't ensure bond is up before enslaving.

	I looked at sysconfig (as supplied with opensuse) and it uses
sysfs, and does set the master device up first.  The other potential
user that comes to mind is that OFED at one point had a script to set up
bonding for Infiniband devices.  I don't know if this is still the case,
nor do I know if it set the bond device up before enslaving.

	Generally speaking, though, in the long run I think it should be
permissible to change any bonding option when the bond is down (even to
values that make no sense in context, e.g., setting the primary to a
device not currently enslaved).  My rationale here is that some options
are very difficult to modify when the bond is up (e.g., changing the
mode), and now some other set is precluded when the bond is down.  The
init scripts already have repeat logic in them; this just makes things
more complicated.

	There should be a state wherein any option can be changed (well,
maybe not max_bonds), and that should be the down state.  A subset can
also be changed while up.  I'd be happy to be able to change all options
while the bond is up, too, but that seems pretty hard to do.

	How much harder is it to fix the locking and permit the action
in question here?

	-J

---
	-Jay Vosburgh, IBM Linux Technology Center, [email-masked]