From fd324b08dbfa8404558534dd0a2321213ffb7257 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Wed, 28 Mar 2012 17:29:37 +1100 Subject: [PATCH] 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 --- sysfs.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sysfs.c b/sysfs.c index e32ececa..cddabaee 100644 --- 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; -- 2.39.2