diff options
Diffstat (limited to 'drivers/md/dm-raid.c')
| -rw-r--r-- | drivers/md/dm-raid.c | 17 | 
1 files changed, 14 insertions, 3 deletions
| diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c index 7d893228c40f..b4b75dad816a 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c @@ -1927,7 +1927,7 @@ struct dm_raid_superblock {  	/********************************************************************  	 * BELOW FOLLOW V1.9.0 EXTENSIONS TO THE PRISTINE SUPERBLOCK FORMAT!!!  	 * -	 * FEATURE_FLAG_SUPPORTS_V190 in the features member indicates that those exist +	 * FEATURE_FLAG_SUPPORTS_V190 in the compat_features member indicates that those exist  	 */  	__le32 flags; /* Flags defining array states for reshaping */ @@ -2092,6 +2092,11 @@ static void super_sync(struct mddev *mddev, struct md_rdev *rdev)  	sb->layout = cpu_to_le32(mddev->layout);  	sb->stripe_sectors = cpu_to_le32(mddev->chunk_sectors); +	/******************************************************************** +	 * BELOW FOLLOW V1.9.0 EXTENSIONS TO THE PRISTINE SUPERBLOCK FORMAT!!! +	 * +	 * FEATURE_FLAG_SUPPORTS_V190 in the compat_features member indicates that those exist +	 */  	sb->new_level = cpu_to_le32(mddev->new_level);  	sb->new_layout = cpu_to_le32(mddev->new_layout);  	sb->new_stripe_sectors = cpu_to_le32(mddev->new_chunk_sectors); @@ -2438,8 +2443,14 @@ static int super_validate(struct raid_set *rs, struct md_rdev *rdev)  	mddev->bitmap_info.default_offset = mddev->bitmap_info.offset;  	if (!test_and_clear_bit(FirstUse, &rdev->flags)) { -		/* Retrieve device size stored in superblock to be prepared for shrink */ -		rdev->sectors = le64_to_cpu(sb->sectors); +		/* +		 * Retrieve rdev size stored in superblock to be prepared for shrink. +		 * Check extended superblock members are present otherwise the size +		 * will not be set! +		 */ +		if (le32_to_cpu(sb->compat_features) & FEATURE_FLAG_SUPPORTS_V190) +			rdev->sectors = le64_to_cpu(sb->sectors); +  		rdev->recovery_offset = le64_to_cpu(sb->disk_recovery_offset);  		if (rdev->recovery_offset == MaxSector)  			set_bit(In_sync, &rdev->flags); | 
