[PATCH 14/21] imsm: FIX: Move reshape_progress forward

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



When array under reshape is assembled, reshape position used in sysfs_set_array()
should be set to position after recovered from backup area.
This avoids data corruption due to reshape the same array area again.

Signed-off-by: Adam Kwolek <adam.kwolek@xxxxxxxxx>
---

 super-intel.c |   23 +++++++++++++----------
 1 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/super-intel.c b/super-intel.c
index c19ffac..55829cf 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -2194,6 +2194,13 @@ static void getinfo_super_imsm_volume(struct supertype *st, struct mdinfo *info,
 			unsigned long long array_blocks;
 			int used_disks;
 
+			if (__le32_to_cpu(migr_rec->ascending_migr) &&
+			    (units <
+				(__le32_to_cpu(migr_rec->num_migr_units)-1)) &&
+			    (super->migr_rec->rec_status ==
+					__cpu_to_le32(UNIT_SRC_IN_CP_AREA)))
+				units++;
+
 			info->reshape_progress = blocks_per_unit * units;
 
 			dprintf("IMSM: General Migration checkpoint : %llu "
@@ -7824,7 +7831,6 @@ int recover_backup_imsm(struct supertype *st, struct mdinfo *info)
 	int retval = 1;
 	unsigned long curr_migr_unit = __le32_to_cpu(migr_rec->curr_migr_unit);
 	unsigned long num_migr_units = __le32_to_cpu(migr_rec->num_migr_units);
-	int ascending = __le32_to_cpu(migr_rec->ascending_migr);
 	char buffer[20];
 	int skipped_disks = 0;
 	int max_degradation;
@@ -7907,16 +7913,13 @@ int recover_backup_imsm(struct supertype *st, struct mdinfo *info)
 		goto abort;
 	}
 
-	if (ascending && curr_migr_unit < (num_migr_units-1))
-		curr_migr_unit++;
-
-	migr_rec->curr_migr_unit = __le32_to_cpu(curr_migr_unit);
-	super->migr_rec->rec_status = __cpu_to_le32(UNIT_SRC_NORMAL);
-	if (write_imsm_migr_rec(st) == 0) {
-		__u64 blocks_per_unit = blocks_per_migr_unit(super, id->dev);
-		info->reshape_progress = curr_migr_unit * blocks_per_unit;
+	if (save_checkpoint_imsm(st, info, UNIT_SRC_NORMAL)) {
+		/* ignore error == 2, this can mean end of reshape here
+		 */
+		dprintf("imsm: Cannot write checkpoint to "
+			"migration record (UNIT_SRC_NORMAL) during restart\n");
+	} else
 		retval = 0;
-	}
 
 abort:
 	if (targets) {

--
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux