]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
sysfs: fixed sysfs_freeze_array array to work properly with Manage_subdevs.
authorNeilBrown <neilb@suse.de>
Wed, 28 Mar 2012 06:29:37 +0000 (17:29 +1100)
committerNeilBrown <neilb@suse.de>
Wed, 28 Mar 2012 06:29:37 +0000 (17:29 +1100)
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>
sysfs.c

diff --git a/sysfs.c b/sysfs.c
index e32ececa3faff026008beeb7208feb6095538a59..cddabaee8b6d17dbfab3deb92fe2687edb4cb4b8 100644 (file)
--- a/sysfs.c
+++ b/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;