diff options
Diffstat (limited to 'drivers/md/md.c')
| -rw-r--r-- | drivers/md/md.c | 13 | 
1 files changed, 7 insertions, 6 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 32fc19c540d4..1294238610df 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -5961,7 +5961,7 @@ static int set_bitmap_file(struct mddev *mddev, int fd)  	int err = 0;  	if (mddev->pers) { -		if (!mddev->pers->quiesce) +		if (!mddev->pers->quiesce || !mddev->thread)  			return -EBUSY;  		if (mddev->recovery || mddev->sync_thread)  			return -EBUSY; @@ -6263,7 +6263,7 @@ static int update_array_info(struct mddev *mddev, mdu_array_info_t *info)  		rv = update_raid_disks(mddev, info->raid_disks);  	if ((state ^ info->state) & (1<<MD_SB_BITMAP_PRESENT)) { -		if (mddev->pers->quiesce == NULL) +		if (mddev->pers->quiesce == NULL || mddev->thread == NULL)  			return -EINVAL;  		if (mddev->recovery || mddev->sync_thread)  			return -EBUSY; @@ -7376,7 +7376,7 @@ void md_do_sync(struct md_thread *thread)  	struct mddev *mddev2;  	unsigned int currspeed = 0,  		 window; -	sector_t max_sectors,j, io_sectors; +	sector_t max_sectors,j, io_sectors, recovery_done;  	unsigned long mark[SYNC_MARKS];  	unsigned long update_time;  	sector_t mark_cnt[SYNC_MARKS]; @@ -7652,7 +7652,8 @@ void md_do_sync(struct md_thread *thread)  		 */  		cond_resched(); -		currspeed = ((unsigned long)(io_sectors-mddev->resync_mark_cnt))/2 +		recovery_done = io_sectors - atomic_read(&mddev->recovery_active); +		currspeed = ((unsigned long)(recovery_done - mddev->resync_mark_cnt))/2  			/((jiffies-mddev->resync_mark)/HZ +1) +1;  		if (currspeed > speed_min(mddev)) { @@ -8592,7 +8593,7 @@ static int __init md_init(void)  		goto err_mdp;  	mdp_major = ret; -	blk_register_region(MKDEV(MD_MAJOR, 0), 1UL<<MINORBITS, THIS_MODULE, +	blk_register_region(MKDEV(MD_MAJOR, 0), 512, THIS_MODULE,  			    md_probe, NULL, NULL);  	blk_register_region(MKDEV(mdp_major, 0), 1UL<<MINORBITS, THIS_MODULE,  			    md_probe, NULL, NULL); @@ -8687,7 +8688,7 @@ static __exit void md_exit(void)  	struct list_head *tmp;  	int delay = 1; -	blk_unregister_region(MKDEV(MD_MAJOR,0), 1U << MINORBITS); +	blk_unregister_region(MKDEV(MD_MAJOR,0), 512);  	blk_unregister_region(MKDEV(mdp_major,0), 1U << MINORBITS);  	unregister_blkdev(MD_MAJOR,"md");  |