diff options
Diffstat (limited to 'drivers/md')
| -rw-r--r-- | drivers/md/bitmap.c | 3 | ||||
| -rw-r--r-- | drivers/md/bitmap.h | 3 | ||||
| -rw-r--r-- | drivers/md/dm-raid.c | 4 | ||||
| -rw-r--r-- | drivers/md/md.c | 7 | 
4 files changed, 7 insertions, 10 deletions
| diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index 97e73e555d11..17e2b472e16d 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c @@ -1727,8 +1727,7 @@ int bitmap_create(struct mddev *mddev)  	bitmap->chunkshift = (ffz(~mddev->bitmap_info.chunksize)  			      - BITMAP_BLOCK_SHIFT); -	/* now that chunksize and chunkshift are set, we can use these macros */ -	chunks = (blocks + bitmap->chunkshift - 1) >> +	chunks = (blocks + (1 << bitmap->chunkshift) - 1) >>  			bitmap->chunkshift;  	pages = (chunks + PAGE_COUNTER_RATIO - 1) / PAGE_COUNTER_RATIO; diff --git a/drivers/md/bitmap.h b/drivers/md/bitmap.h index 55ca5aec84e4..b44b0aba2d47 100644 --- a/drivers/md/bitmap.h +++ b/drivers/md/bitmap.h @@ -101,9 +101,6 @@ typedef __u16 bitmap_counter_t;  #define BITMAP_BLOCK_SHIFT 9 -/* how many blocks per chunk? (this is variable) */ -#define CHUNK_BLOCK_RATIO(bitmap) ((bitmap)->mddev->bitmap_info.chunksize >> BITMAP_BLOCK_SHIFT) -  #endif  /* diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c index b0ba52459ed7..68965e663248 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c @@ -859,7 +859,7 @@ static int analyse_superblocks(struct dm_target *ti, struct raid_set *rs)  	int ret;  	unsigned redundancy = 0;  	struct raid_dev *dev; -	struct md_rdev *rdev, *freshest; +	struct md_rdev *rdev, *tmp, *freshest;  	struct mddev *mddev = &rs->md;  	switch (rs->raid_type->level) { @@ -877,7 +877,7 @@ static int analyse_superblocks(struct dm_target *ti, struct raid_set *rs)  	}  	freshest = NULL; -	rdev_for_each(rdev, mddev) { +	rdev_for_each_safe(rdev, tmp, mddev) {  		if (!rdev->meta_bdev)  			continue; diff --git a/drivers/md/md.c b/drivers/md/md.c index b572e1e386ce..477eb2e180c0 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -7560,14 +7560,14 @@ void md_check_recovery(struct mddev *mddev)  		 * any transients in the value of "sync_action".  		 */  		set_bit(MD_RECOVERY_RUNNING, &mddev->recovery); -		clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery);  		/* Clear some bits that don't mean anything, but  		 * might be left set  		 */  		clear_bit(MD_RECOVERY_INTR, &mddev->recovery);  		clear_bit(MD_RECOVERY_DONE, &mddev->recovery); -		if (test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) +		if (!test_and_clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery) || +		    test_bit(MD_RECOVERY_FROZEN, &mddev->recovery))  			goto unlock;  		/* no recovery is running.  		 * remove any failed drives, then @@ -8140,7 +8140,8 @@ static int md_notify_reboot(struct notifier_block *this,  	for_each_mddev(mddev, tmp) {  		if (mddev_trylock(mddev)) { -			__md_stop_writes(mddev); +			if (mddev->pers) +				__md_stop_writes(mddev);  			mddev->safemode = 2;  			mddev_unlock(mddev);  		} |