summaryrefslogtreecommitdiffstats
path: root/drivers/md/dm-raid.c
diff options
context:
space:
mode:
authorHeinz Mauelshagen <heinzm@redhat.com>2016-06-09 10:42:16 -0400
committerMike Snitzer <snitzer@redhat.com>2016-06-14 17:25:02 -0400
commita30cbc0d1c80f2d07a1b973e1f4c58d925a3ff4a (patch)
treea4c3678c991acefefd6c75e76070119e8e37f75c /drivers/md/dm-raid.c
parente6ca5e1a0323a34a24999243a00374a8c2cbafe1 (diff)
dm raid: inverse check for flags from invalid to valid flags
It is more intuitive to manage each raid level's features in terms of what is supported rather than what isn't supported. Signed-off-by: Heinz Mauelshagen <heinzm@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Diffstat (limited to 'drivers/md/dm-raid.c')
-rw-r--r--drivers/md/dm-raid.c88
1 files changed, 56 insertions, 32 deletions
diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c
index f78a5e9d25c8..a32cddbb5f4f 100644
--- a/drivers/md/dm-raid.c
+++ b/drivers/md/dm-raid.c
@@ -113,26 +113,35 @@ struct raid_dev {
113 CTR_FLAG_DELTA_DISKS | \ 113 CTR_FLAG_DELTA_DISKS | \
114 CTR_FLAG_DATA_OFFSET) 114 CTR_FLAG_DATA_OFFSET)
115 115
116/* All ctr optional arguments */ 116/* Valid options definitions per raid level... */
117#define ALL_CTR_FLAGS (CTR_FLAG_OPTIONS_NO_ARGS | \ 117
118 CTR_FLAG_OPTIONS_ONE_ARG) 118/* "raid0" does only accept data offset */
119 119#define RAID0_VALID_FLAGS (CTR_FLAG_DATA_OFFSET)
120/* Invalid options definitions per raid level... */ 120
121 121/* "raid1" does not accept stripe cache, data offset, delta_disks or any raid10 options */
122/* "raid0" does not accept any options */ 122#define RAID1_VALID_FLAGS (CTR_FLAGS_ANY_SYNC | \
123#define RAID0_INVALID_FLAGS ALL_CTR_FLAGS 123 CTR_FLAG_REBUILD | \
124 CTR_FLAG_WRITE_MOSTLY | \
125 CTR_FLAG_DAEMON_SLEEP | \
126 CTR_FLAG_MIN_RECOVERY_RATE | \
127 CTR_FLAG_MAX_RECOVERY_RATE | \
128 CTR_FLAG_MAX_WRITE_BEHIND | \
129 CTR_FLAG_REGION_SIZE | \
130 CTR_FLAG_DATA_OFFSET)
124 131
125/* "raid1" does not accept stripe cache or any raid10 options */ 132/* "raid10" does not accept any raid1 or stripe cache options */
126#define RAID1_INVALID_FLAGS (CTR_FLAG_STRIPE_CACHE | \ 133#define RAID10_VALID_FLAGS (CTR_FLAGS_ANY_SYNC | \
134 CTR_FLAG_REBUILD | \
135 CTR_FLAG_DAEMON_SLEEP | \
136 CTR_FLAG_MIN_RECOVERY_RATE | \
137 CTR_FLAG_MAX_RECOVERY_RATE | \
138 CTR_FLAG_REGION_SIZE | \
127 CTR_FLAG_RAID10_COPIES | \ 139 CTR_FLAG_RAID10_COPIES | \
128 CTR_FLAG_RAID10_FORMAT | \ 140 CTR_FLAG_RAID10_FORMAT | \
129 CTR_FLAG_DELTA_DISKS | \ 141 CTR_FLAG_DELTA_DISKS | \
130 CTR_FLAG_DATA_OFFSET) 142 CTR_FLAG_DATA_OFFSET | \
143 CTR_FLAG_RAID10_USE_NEAR_SETS)
131 144
132/* "raid10" does not accept any raid1 or stripe cache options */
133#define RAID10_INVALID_FLAGS (CTR_FLAG_WRITE_MOSTLY | \
134 CTR_FLAG_MAX_WRITE_BEHIND | \
135 CTR_FLAG_STRIPE_CACHE)
136/* 145/*
137 * "raid4/5/6" do not accept any raid1 or raid10 specific options 146 * "raid4/5/6" do not accept any raid1 or raid10 specific options
138 * 147 *
@@ -140,13 +149,28 @@ struct raid_dev {
140 * that both parity and q-syndrome are being written properly with 149 * that both parity and q-syndrome are being written properly with
141 * any writes 150 * any writes
142 */ 151 */
143#define RAID45_INVALID_FLAGS (CTR_FLAG_WRITE_MOSTLY | \ 152#define RAID45_VALID_FLAGS (CTR_FLAGS_ANY_SYNC | \
153 CTR_FLAG_REBUILD | \
154 CTR_FLAG_DAEMON_SLEEP | \
155 CTR_FLAG_MIN_RECOVERY_RATE | \
156 CTR_FLAG_MAX_RECOVERY_RATE | \
144 CTR_FLAG_MAX_WRITE_BEHIND | \ 157 CTR_FLAG_MAX_WRITE_BEHIND | \
145 CTR_FLAG_RAID10_FORMAT | \ 158 CTR_FLAG_STRIPE_CACHE | \
146 CTR_FLAG_RAID10_COPIES | \ 159 CTR_FLAG_REGION_SIZE | \
147 CTR_FLAG_RAID10_USE_NEAR_SETS) 160 CTR_FLAG_DELTA_DISKS | \
148#define RAID6_INVALID_FLAGS (CTR_FLAG_NOSYNC | RAID45_INVALID_FLAGS) 161 CTR_FLAG_DATA_OFFSET)
149/* ...invalid options definitions per raid level */ 162
163#define RAID6_VALID_FLAGS (CTR_FLAG_SYNC | \
164 CTR_FLAG_REBUILD | \
165 CTR_FLAG_DAEMON_SLEEP | \
166 CTR_FLAG_MIN_RECOVERY_RATE | \
167 CTR_FLAG_MAX_RECOVERY_RATE | \
168 CTR_FLAG_MAX_WRITE_BEHIND | \
169 CTR_FLAG_STRIPE_CACHE | \
170 CTR_FLAG_REGION_SIZE | \
171 CTR_FLAG_DELTA_DISKS | \
172 CTR_FLAG_DATA_OFFSET)
173/* ...valid options definitions per raid level */
150 174
151/* 175/*
152 * Flags for rs->runtime_flags field 176 * Flags for rs->runtime_flags field
@@ -354,31 +378,31 @@ static bool rt_is_raid456(struct raid_type *rt)
354} 378}
355/* END: raid level bools */ 379/* END: raid level bools */
356 380
357/* Return invalid ctr flags for the raid level of @rs */ 381/* Return valid ctr flags for the raid level of @rs */
358static uint32_t __invalid_flags(struct raid_set *rs) 382static unsigned long __valid_flags(struct raid_set *rs)
359{ 383{
360 if (rt_is_raid0(rs->raid_type)) 384 if (rt_is_raid0(rs->raid_type))
361 return RAID0_INVALID_FLAGS; 385 return RAID0_VALID_FLAGS;
362 else if (rt_is_raid1(rs->raid_type)) 386 else if (rt_is_raid1(rs->raid_type))
363 return RAID1_INVALID_FLAGS; 387 return RAID1_VALID_FLAGS;
364 else if (rt_is_raid10(rs->raid_type)) 388 else if (rt_is_raid10(rs->raid_type))
365 return RAID10_INVALID_FLAGS; 389 return RAID10_VALID_FLAGS;
366 else if (rt_is_raid45(rs->raid_type)) 390 else if (rt_is_raid45(rs->raid_type))
367 return RAID45_INVALID_FLAGS; 391 return RAID45_VALID_FLAGS;
368 else if (rt_is_raid6(rs->raid_type)) 392 else if (rt_is_raid6(rs->raid_type))
369 return RAID6_INVALID_FLAGS; 393 return RAID6_VALID_FLAGS;
370 394
371 return ~0; 395 return ~0;
372} 396}
373 397
374/* 398/*
375 * Check for any invalid flags set on @rs defined by bitset @invalid_flags 399 * Check for valid flags set on @rs
376 * 400 *
377 * Has to be called after parsing of the ctr flags! 401 * Has to be called after parsing of the ctr flags!
378 */ 402 */
379static int rs_check_for_invalid_flags(struct raid_set *rs) 403static int rs_check_for_valid_flags(struct raid_set *rs)
380{ 404{
381 if (rs->ctr_flags & __invalid_flags(rs)) { 405 if (rs->ctr_flags & ~__valid_flags(rs)) {
382 rs->ti->error = "Invalid flags combination"; 406 rs->ti->error = "Invalid flags combination";
383 return -EINVAL; 407 return -EINVAL;
384 } 408 }
@@ -1282,7 +1306,7 @@ static int parse_raid_params(struct raid_set *rs, struct dm_arg_set *as,
1282 rs->md.external = 1; 1306 rs->md.external = 1;
1283 1307
1284 /* Check, if any invalid ctr arguments have been passed in for the raid level */ 1308 /* Check, if any invalid ctr arguments have been passed in for the raid level */
1285 return rs_check_for_invalid_flags(rs); 1309 return rs_check_for_valid_flags(rs);
1286} 1310}
1287 1311
1288/* Return # of data stripes as kept in mddev as of @rs (i.e. as of superblock) */ 1312/* Return # of data stripes as kept in mddev as of @rs (i.e. as of superblock) */