diff options
Diffstat (limited to 'drivers/md/raid10.c')
| -rw-r--r-- | drivers/md/raid10.c | 46 | 
1 files changed, 18 insertions, 28 deletions
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 03724992cdf..42e64e4e5e2 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -1482,14 +1482,14 @@ static void fix_read_error(conf_t *conf, mddev_t *mddev, r10bio_t *r10_bio)  	int sectors = r10_bio->sectors;  	mdk_rdev_t*rdev;  	int max_read_errors = atomic_read(&mddev->max_corr_read_errors); +	int d = r10_bio->devs[r10_bio->read_slot].devnum;  	rcu_read_lock(); -	{ -		int d = r10_bio->devs[r10_bio->read_slot].devnum; +	rdev = rcu_dereference(conf->mirrors[d].rdev); +	if (rdev) { /* If rdev is not NULL */  		char b[BDEVNAME_SIZE];  		int cur_read_error_count = 0; -		rdev = rcu_dereference(conf->mirrors[d].rdev);  		bdevname(rdev->bdev, b);  		if (test_bit(Faulty, &rdev->flags)) { @@ -1530,7 +1530,7 @@ static void fix_read_error(conf_t *conf, mddev_t *mddev, r10bio_t *r10_bio)  		rcu_read_lock();  		do { -			int d = r10_bio->devs[sl].devnum; +			d = r10_bio->devs[sl].devnum;  			rdev = rcu_dereference(conf->mirrors[d].rdev);  			if (rdev &&  			    test_bit(In_sync, &rdev->flags)) { @@ -1564,7 +1564,7 @@ static void fix_read_error(conf_t *conf, mddev_t *mddev, r10bio_t *r10_bio)  		rcu_read_lock();  		while (sl != r10_bio->read_slot) {  			char b[BDEVNAME_SIZE]; -			int d; +  			if (sl==0)  				sl = conf->copies;  			sl--; @@ -1601,7 +1601,7 @@ static void fix_read_error(conf_t *conf, mddev_t *mddev, r10bio_t *r10_bio)  		}  		sl = start;  		while (sl != r10_bio->read_slot) { -			int d; +  			if (sl==0)  				sl = conf->copies;  			sl--; @@ -2161,22 +2161,22 @@ static conf_t *setup_conf(mddev_t *mddev)  	sector_t stride, size;  	int err = -EINVAL; -	if (mddev->chunk_sectors < (PAGE_SIZE >> 9) || -	    !is_power_of_2(mddev->chunk_sectors)) { +	if (mddev->new_chunk_sectors < (PAGE_SIZE >> 9) || +	    !is_power_of_2(mddev->new_chunk_sectors)) {  		printk(KERN_ERR "md/raid10:%s: chunk size must be "  		       "at least PAGE_SIZE(%ld) and be a power of 2.\n",  		       mdname(mddev), PAGE_SIZE);  		goto out;  	} -	nc = mddev->layout & 255; -	fc = (mddev->layout >> 8) & 255; -	fo = mddev->layout & (1<<16); +	nc = mddev->new_layout & 255; +	fc = (mddev->new_layout >> 8) & 255; +	fo = mddev->new_layout & (1<<16);  	if ((nc*fc) <2 || (nc*fc) > mddev->raid_disks || -	    (mddev->layout >> 17)) { +	    (mddev->new_layout >> 17)) {  		printk(KERN_ERR "md/raid10:%s: unsupported raid10 layout: 0x%8x\n", -		       mdname(mddev), mddev->layout); +		       mdname(mddev), mddev->new_layout);  		goto out;  	} @@ -2241,7 +2241,6 @@ static conf_t *setup_conf(mddev_t *mddev)  	if (!conf->thread)  		goto out; -	conf->scale_disks = 0;  	conf->mddev = mddev;  	return conf; @@ -2300,11 +2299,6 @@ static int run(mddev_t *mddev)  		if (disk_idx >= conf->raid_disks  		    || disk_idx < 0)  			continue; -		if (conf->scale_disks) { -			disk_idx *= conf->scale_disks; -			rdev->raid_disk = disk_idx; -			/* MOVE 'rd%d' link !! */ -		}  		disk = conf->mirrors + disk_idx;  		disk->rdev = rdev; @@ -2435,26 +2429,22 @@ static void *raid10_takeover_raid0(mddev_t *mddev)  		return ERR_PTR(-EINVAL);  	} -	/* Update slot numbers to obtain -	 * degraded raid10 with missing mirrors -	 */ -	list_for_each_entry(rdev, &mddev->disks, same_set) { -		rdev->raid_disk *= 2; -	} -  	/* Set new parameters */  	mddev->new_level = 10;  	/* new layout: far_copies = 1, near_copies = 2 */  	mddev->new_layout = (1<<8) + 2;  	mddev->new_chunk_sectors = mddev->chunk_sectors;  	mddev->delta_disks = mddev->raid_disks; -	mddev->degraded = mddev->raid_disks;  	mddev->raid_disks *= 2;  	/* make sure it will be not marked as dirty */  	mddev->recovery_cp = MaxSector;  	conf = setup_conf(mddev); -	conf->scale_disks = 2; +	if (!IS_ERR(conf)) +		list_for_each_entry(rdev, &mddev->disks, same_set) +			if (rdev->raid_disk >= 0) +				rdev->new_raid_disk = rdev->raid_disk * 2; +		  	return conf;  }  |