sysfs: fixed sysfs_freeze_array array to work properly with Manage_subdevs.
If the array is already frozen when Manage_subdevs is called we don't want it to unfreeze the array. This is because Grow calls Manage_subdevs to add devices to an array being reshaped, and the array must stay frozen over this call. So if sysfs_freeze_array find the array to be frozen it returns '0', meaning that it didn't and cannot freeze it. Then the caller will not try to unfreeze, which is good. Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
2d762ade6a
commit
fd324b08db
7
sysfs.c
7
sysfs.c
|
@ -837,7 +837,6 @@ int sysfs_freeze_array(struct mdinfo *sra)
|
|||
{
|
||||
/* Try to freeze resync/rebuild on this array/container.
|
||||
* Return -1 if the array is busy,
|
||||
* return -2 container cannot be frozen,
|
||||
* return 0 if this kernel doesn't support 'frozen'
|
||||
* return 1 if it worked.
|
||||
*/
|
||||
|
@ -847,8 +846,10 @@ int sysfs_freeze_array(struct mdinfo *sra)
|
|||
return 1; /* no sync_action == frozen */
|
||||
if (sysfs_get_str(sra, NULL, "sync_action", buf, 20) <= 0)
|
||||
return 0;
|
||||
if (strcmp(buf, "idle\n") != 0 &&
|
||||
strcmp(buf, "frozen\n") != 0)
|
||||
if (strcmp(buf, "frozen\n") == 0)
|
||||
/* Already frozen */
|
||||
return 0;
|
||||
if (strcmp(buf, "idle\n") != 0)
|
||||
return -1;
|
||||
if (sysfs_set_str(sra, NULL, "sync_action", "frozen") < 0)
|
||||
return 0;
|
||||
|
|
Loading…
Reference in New Issue