Merge remote-tracking branch 'mkp-scsi/4.11/scsi-fixes' into fixes
[linux-2.6-block.git] / drivers / md / dm-raid.c
index 5c9e95d66f3b64d14355a91abd936eb5f3c46440..f8564d63982f43f9e3fb453fc9adedf3f14be51a 100644 (file)
@@ -101,6 +101,8 @@ struct raid_dev {
 #define CTR_FLAG_RAID10_USE_NEAR_SETS  (1 << __CTR_FLAG_RAID10_USE_NEAR_SETS)
 #define CTR_FLAG_JOURNAL_DEV           (1 << __CTR_FLAG_JOURNAL_DEV)
 
+#define RESUME_STAY_FROZEN_FLAGS (CTR_FLAG_DELTA_DISKS | CTR_FLAG_DATA_OFFSET)
+
 /*
  * Definitions of various constructor flags to
  * be used in checks of valid / invalid flags
@@ -3462,9 +3464,11 @@ static int raid_message(struct dm_target *ti, unsigned int argc, char **argv)
        else if (!strcasecmp(argv[0], "recover"))
                set_bit(MD_RECOVERY_RECOVER, &mddev->recovery);
        else {
-               if (!strcasecmp(argv[0], "check"))
+               if (!strcasecmp(argv[0], "check")) {
                        set_bit(MD_RECOVERY_CHECK, &mddev->recovery);
-               else if (!strcasecmp(argv[0], "repair")) {
+                       set_bit(MD_RECOVERY_REQUESTED, &mddev->recovery);
+                       set_bit(MD_RECOVERY_SYNC, &mddev->recovery);
+               } else if (!strcasecmp(argv[0], "repair")) {
                        set_bit(MD_RECOVERY_REQUESTED, &mddev->recovery);
                        set_bit(MD_RECOVERY_SYNC, &mddev->recovery);
                } else
@@ -3771,7 +3775,15 @@ static void raid_resume(struct dm_target *ti)
        mddev->ro = 0;
        mddev->in_sync = 0;
 
-       clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
+       /*
+        * Keep the RAID set frozen if reshape/rebuild flags are set.
+        * The RAID set is unfrozen once the next table load/resume,
+        * which clears the reshape/rebuild flags, occurs.
+        * This ensures that the constructor for the inactive table
+        * retrieves an up-to-date reshape_position.
+        */
+       if (!(rs->ctr_flags & RESUME_STAY_FROZEN_FLAGS))
+               clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
 
        if (mddev->suspended)
                mddev_resume(mddev);
@@ -3779,7 +3791,7 @@ static void raid_resume(struct dm_target *ti)
 
 static struct target_type raid_target = {
        .name = "raid",
-       .version = {1, 10, 0},
+       .version = {1, 10, 1},
        .module = THIS_MODULE,
        .ctr = raid_ctr,
        .dtr = raid_dtr,