[dm-devel] [PATCH v2] DM RAID: Add support for MD RAID10

Brassow Jonathan jbrassow at redhat.com
Mon Jul 16 22:06:32 UTC 2012


On Jul 12, 2012, at 1:32 AM, NeilBrown wrote:

>> 
>> @@ -76,6 +80,7 @@ static struct raid_type {
>> 	const unsigned algorithm;	/* RAID algorithm. */
>> } raid_types[] = {
>> 	{"raid1",    "RAID1 (mirroring)",               0, 2, 1, 0 /* NONE */},
>> +	{"raid10",   "RAID10 (striped mirrors)",        0, 2, 10, -1 /* Varies */},
>> 	{"raid4",    "RAID4 (dedicated parity disk)",	1, 2, 5, ALGORITHM_PARITY_0},
>> 	{"raid5_la", "RAID5 (left asymmetric)",		1, 2, 5, ALGORITHM_LEFT_ASYMMETRIC},
>> 	{"raid5_ra", "RAID5 (right asymmetric)",	1, 2, 5, ALGORITHM_RIGHT_ASYMMETRIC},
> 
> Initialising the "unsigned" algorithm to "-1" looks like it is asking for
> trouble.

I'm initializing to -1 because I know it is a value that will fail if not set later in the setup process.  I could just as easily choose the default values (near = 2).

> 
>> @@ -493,7 +554,7 @@ static int parse_raid_params(struct raid
>> 			 */
>> 			value /= 2;
>> 
>> -			if (rs->raid_type->level < 5) {
>> +			if (rs->raid_type->level != 5) {
>> 				rs->ti->error = "Inappropriate argument: stripe_cache";
>> 				return -EINVAL;
>> 			}
> 
> This leaves RAID6 out in the cold.  Maybe
>  level < 5 || level > 6
> or      !=5          !=6
> or a switch statement?

Thanks.  For some reason I had thought that raid6 had level=5, like raid4...  Fixed.



>> @@ -536,9 +605,25 @@ static int parse_raid_params(struct raid
>> 	if (dm_set_target_max_io_len(rs->ti, max_io_len))
>> 		return -EINVAL;
>> 
>> -	if ((rs->raid_type->level > 1) &&
>> -	    sector_div(sectors_per_dev, (rs->md.raid_disks - rs->raid_type->parity_devs))) {
>> +	if (rs->raid_type->level == 10) {
>> +		/* (Len * Stripes) / Mirrors */
>> +		sectors_per_dev *= rs->md.raid_disks;
>> +		if (sector_div(sectors_per_dev, raid10_copies)) {
>> +			rs->ti->error = "Target length not divisible by number of data devices";
>> +			return -EINVAL;
>> +		}
> 
> I'm not entirely sure what you are trying to do here, but I don't think it
> works.
> 
> At the very least you would need to convert the "sectors_per_dev" number to a
> 'chunks_per_dev' before multiplying by raid_disks and dividing by copies.
> 
> But even that isn't necessary.  If you have a 3-device near=2 array with an
> odd number of chunks per device, that will still work.  The last chunk won't
> be mirrored, so won't be used.
> Until a couple of weeks ago a recovery of the last device would trigger an
> error when we try to recover that last chunk, but that is fixed now.
> 
> So if you want to impose this limitation (and there is some merit in making
> sure people don't confuse themselves), I suggest it get imposed in the
> user-space tools which create the RAID10.

I have seen what you do in calc_sectors(), I suppose I could bring that in.  However, I'm simply trying to find the value that will be preliminarily assigned to mddev->dev_sectors.  It is an enforced (perhaps unnecessary) constraint that the array length be divisible by the number of data devices.  I'm not accounting for chunk boundaries - I leave that to userspace to configure and MD to catch.

 brassow





More information about the dm-devel mailing list