aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/dm-raid.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-05-03 13:31:20 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-05-03 13:31:20 -0400
commitd35a878ae1c50977b55e352fd46e36e35add72a0 (patch)
tree7cd4e0ec418c6f3be365e56ee3c49bab218cd608 /drivers/md/dm-raid.c
parente5021876c91dc3894b2174cca8fa797f8e29e7b9 (diff)
parent390020ad2af9ca04844c4f3b1f299ad8746d84c8 (diff)
Merge tag 'for-4.12/dm-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm
Pull device mapper updates from Mike Snitzer: - A major update for DM cache that reduces the latency for deciding whether blocks should migrate to/from the cache. The bio-prison-v2 interface supports this improvement by enabling direct dispatch of work to workqueues rather than having to delay the actual work dispatch to the DM cache core. So the dm-cache policies are much more nimble by being able to drive IO as they see fit. One immediate benefit from the improved latency is a cache that should be much more adaptive to changing workloads. - Add a new DM integrity target that emulates a block device that has additional per-sector tags that can be used for storing integrity information. - Add a new authenticated encryption feature to the DM crypt target that builds on the capabilities provided by the DM integrity target. - Add MD interface for switching the raid4/5/6 journal mode and update the DM raid target to use it to enable aid4/5/6 journal write-back support. - Switch the DM verity target over to using the asynchronous hash crypto API (this helps work better with architectures that have access to off-CPU algorithm providers, which should reduce CPU utilization). - Various request-based DM and DM multipath fixes and improvements from Bart and Christoph. - A DM thinp target fix for a bio structure leak that occurs for each discard IFF discard passdown is enabled. - A fix for a possible deadlock in DM bufio and a fix to re-check the new buffer allocation watermark in the face of competing admin changes to the 'max_cache_size_bytes' tunable. - A couple DM core cleanups. * tag 'for-4.12/dm-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm: (50 commits) dm bufio: check new buffer allocation watermark every 30 seconds dm bufio: avoid a possible ABBA deadlock dm mpath: make it easier to detect unintended I/O request flushes dm mpath: cleanup QUEUE_IF_NO_PATH bit manipulation by introducing assign_bit() dm mpath: micro-optimize the hot path relative to MPATHF_QUEUE_IF_NO_PATH dm: introduce enum dm_queue_mode to cleanup related code dm mpath: verify __pg_init_all_paths locking assumptions at runtime dm: verify suspend_locking assumptions at runtime dm block manager: remove an unused argument from dm_block_manager_create() dm rq: check blk_mq_register_dev() return value in dm_mq_init_request_queue() dm mpath: delay requeuing while path initialization is in progress dm mpath: avoid that path removal can trigger an infinite loop dm mpath: split and rename activate_path() to prepare for its expanded use dm ioctl: prevent stack leak in dm ioctl call dm integrity: use previously calculated log2 of sectors_per_block dm integrity: use hex2bin instead of open-coded variant dm crypt: replace custom implementation of hex2bin() dm crypt: remove obsolete references to per-CPU state dm verity: switch to using asynchronous hash crypto API dm crypt: use WQ_HIGHPRI for the IO and crypt workqueues ...
Diffstat (limited to 'drivers/md/dm-raid.c')
-rw-r--r--drivers/md/dm-raid.c164
1 files changed, 122 insertions, 42 deletions
diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c
index 2dae3e5b851c..7d893228c40f 100644
--- a/drivers/md/dm-raid.c
+++ b/drivers/md/dm-raid.c
@@ -1,6 +1,6 @@
1/* 1/*
2 * Copyright (C) 2010-2011 Neil Brown 2 * Copyright (C) 2010-2011 Neil Brown
3 * Copyright (C) 2010-2016 Red Hat, Inc. All rights reserved. 3 * Copyright (C) 2010-2017 Red Hat, Inc. All rights reserved.
4 * 4 *
5 * This file is released under the GPL. 5 * This file is released under the GPL.
6 */ 6 */
@@ -79,7 +79,10 @@ struct raid_dev {
79#define __CTR_FLAG_RAID10_USE_NEAR_SETS 14 /* 2 */ /* Only with raid10! */ 79#define __CTR_FLAG_RAID10_USE_NEAR_SETS 14 /* 2 */ /* Only with raid10! */
80 80
81/* New for v1.10.0 */ 81/* New for v1.10.0 */
82#define __CTR_FLAG_JOURNAL_DEV 15 /* 2 */ /* Only with raid4/5/6! */ 82#define __CTR_FLAG_JOURNAL_DEV 15 /* 2 */ /* Only with raid4/5/6 (journal device)! */
83
84/* New for v1.11.1 */
85#define __CTR_FLAG_JOURNAL_MODE 16 /* 2 */ /* Only with raid4/5/6 (journal mode)! */
83 86
84/* 87/*
85 * Flags for rs->ctr_flags field. 88 * Flags for rs->ctr_flags field.
@@ -100,6 +103,7 @@ struct raid_dev {
100#define CTR_FLAG_DATA_OFFSET (1 << __CTR_FLAG_DATA_OFFSET) 103#define CTR_FLAG_DATA_OFFSET (1 << __CTR_FLAG_DATA_OFFSET)
101#define CTR_FLAG_RAID10_USE_NEAR_SETS (1 << __CTR_FLAG_RAID10_USE_NEAR_SETS) 104#define CTR_FLAG_RAID10_USE_NEAR_SETS (1 << __CTR_FLAG_RAID10_USE_NEAR_SETS)
102#define CTR_FLAG_JOURNAL_DEV (1 << __CTR_FLAG_JOURNAL_DEV) 105#define CTR_FLAG_JOURNAL_DEV (1 << __CTR_FLAG_JOURNAL_DEV)
106#define CTR_FLAG_JOURNAL_MODE (1 << __CTR_FLAG_JOURNAL_MODE)
103 107
104#define RESUME_STAY_FROZEN_FLAGS (CTR_FLAG_DELTA_DISKS | CTR_FLAG_DATA_OFFSET) 108#define RESUME_STAY_FROZEN_FLAGS (CTR_FLAG_DELTA_DISKS | CTR_FLAG_DATA_OFFSET)
105 109
@@ -175,7 +179,8 @@ struct raid_dev {
175 CTR_FLAG_REGION_SIZE | \ 179 CTR_FLAG_REGION_SIZE | \
176 CTR_FLAG_DELTA_DISKS | \ 180 CTR_FLAG_DELTA_DISKS | \
177 CTR_FLAG_DATA_OFFSET | \ 181 CTR_FLAG_DATA_OFFSET | \
178 CTR_FLAG_JOURNAL_DEV) 182 CTR_FLAG_JOURNAL_DEV | \
183 CTR_FLAG_JOURNAL_MODE)
179 184
180#define RAID6_VALID_FLAGS (CTR_FLAG_SYNC | \ 185#define RAID6_VALID_FLAGS (CTR_FLAG_SYNC | \
181 CTR_FLAG_REBUILD | \ 186 CTR_FLAG_REBUILD | \
@@ -186,7 +191,8 @@ struct raid_dev {
186 CTR_FLAG_REGION_SIZE | \ 191 CTR_FLAG_REGION_SIZE | \
187 CTR_FLAG_DELTA_DISKS | \ 192 CTR_FLAG_DELTA_DISKS | \
188 CTR_FLAG_DATA_OFFSET | \ 193 CTR_FLAG_DATA_OFFSET | \
189 CTR_FLAG_JOURNAL_DEV) 194 CTR_FLAG_JOURNAL_DEV | \
195 CTR_FLAG_JOURNAL_MODE)
190/* ...valid options definitions per raid level */ 196/* ...valid options definitions per raid level */
191 197
192/* 198/*
@@ -239,6 +245,7 @@ struct raid_set {
239 struct journal_dev { 245 struct journal_dev {
240 struct dm_dev *dev; 246 struct dm_dev *dev;
241 struct md_rdev rdev; 247 struct md_rdev rdev;
248 int mode;
242 } journal_dev; 249 } journal_dev;
243 250
244 struct raid_dev dev[0]; 251 struct raid_dev dev[0];
@@ -326,6 +333,7 @@ static struct arg_name_flag {
326 { CTR_FLAG_DELTA_DISKS, "delta_disks"}, 333 { CTR_FLAG_DELTA_DISKS, "delta_disks"},
327 { CTR_FLAG_RAID10_USE_NEAR_SETS, "raid10_use_near_sets"}, 334 { CTR_FLAG_RAID10_USE_NEAR_SETS, "raid10_use_near_sets"},
328 { CTR_FLAG_JOURNAL_DEV, "journal_dev" }, 335 { CTR_FLAG_JOURNAL_DEV, "journal_dev" },
336 { CTR_FLAG_JOURNAL_MODE, "journal_mode" },
329}; 337};
330 338
331/* Return argument name string for given @flag */ 339/* Return argument name string for given @flag */
@@ -344,6 +352,39 @@ static const char *dm_raid_arg_name_by_flag(const uint32_t flag)
344 return NULL; 352 return NULL;
345} 353}
346 354
355/* Define correlation of raid456 journal cache modes and dm-raid target line parameters */
356static struct {
357 const int mode;
358 const char *param;
359} _raid456_journal_mode[] = {
360 { R5C_JOURNAL_MODE_WRITE_THROUGH , "writethrough" },
361 { R5C_JOURNAL_MODE_WRITE_BACK , "writeback" }
362};
363
364/* Return MD raid4/5/6 journal mode for dm @journal_mode one */
365static int dm_raid_journal_mode_to_md(const char *mode)
366{
367 int m = ARRAY_SIZE(_raid456_journal_mode);
368
369 while (m--)
370 if (!strcasecmp(mode, _raid456_journal_mode[m].param))
371 return _raid456_journal_mode[m].mode;
372
373 return -EINVAL;
374}
375
376/* Return dm-raid raid4/5/6 journal mode string for @mode */
377static const char *md_journal_mode_to_dm_raid(const int mode)
378{
379 int m = ARRAY_SIZE(_raid456_journal_mode);
380
381 while (m--)
382 if (mode == _raid456_journal_mode[m].mode)
383 return _raid456_journal_mode[m].param;
384
385 return "unknown";
386}
387
347/* 388/*
348 * Bool helpers to test for various raid levels of a raid set. 389 * Bool helpers to test for various raid levels of a raid set.
349 * It's level as reported by the superblock rather than 390 * It's level as reported by the superblock rather than
@@ -1183,7 +1224,7 @@ static int parse_raid_params(struct raid_set *rs, struct dm_arg_set *as,
1183 continue; 1224 continue;
1184 } 1225 }
1185 1226
1186 /* "journal_dev dev" */ 1227 /* "journal_dev <dev>" */
1187 if (!strcasecmp(key, dm_raid_arg_name_by_flag(CTR_FLAG_JOURNAL_DEV))) { 1228 if (!strcasecmp(key, dm_raid_arg_name_by_flag(CTR_FLAG_JOURNAL_DEV))) {
1188 int r; 1229 int r;
1189 struct md_rdev *jdev; 1230 struct md_rdev *jdev;
@@ -1211,10 +1252,32 @@ static int parse_raid_params(struct raid_set *rs, struct dm_arg_set *as,
1211 rs->ti->error = "No space for raid4/5/6 journal"; 1252 rs->ti->error = "No space for raid4/5/6 journal";
1212 return -ENOSPC; 1253 return -ENOSPC;
1213 } 1254 }
1255 rs->journal_dev.mode = R5C_JOURNAL_MODE_WRITE_THROUGH;
1214 set_bit(Journal, &jdev->flags); 1256 set_bit(Journal, &jdev->flags);
1215 continue; 1257 continue;
1216 } 1258 }
1217 1259
1260 /* "journal_mode <mode>" ("journal_dev" mandatory!) */
1261 if (!strcasecmp(key, dm_raid_arg_name_by_flag(CTR_FLAG_JOURNAL_MODE))) {
1262 int r;
1263
1264 if (!test_bit(__CTR_FLAG_JOURNAL_DEV, &rs->ctr_flags)) {
1265 rs->ti->error = "raid4/5/6 'journal_mode' is invalid without 'journal_dev'";
1266 return -EINVAL;
1267 }
1268 if (test_and_set_bit(__CTR_FLAG_JOURNAL_MODE, &rs->ctr_flags)) {
1269 rs->ti->error = "Only one raid4/5/6 'journal_mode' argument allowed";
1270 return -EINVAL;
1271 }
1272 r = dm_raid_journal_mode_to_md(arg);
1273 if (r < 0) {
1274 rs->ti->error = "Invalid 'journal_mode' argument";
1275 return r;
1276 }
1277 rs->journal_dev.mode = r;
1278 continue;
1279 }
1280
1218 /* 1281 /*
1219 * Parameters with number values from here on. 1282 * Parameters with number values from here on.
1220 */ 1283 */
@@ -3076,6 +3139,16 @@ static int raid_ctr(struct dm_target *ti, unsigned int argc, char **argv)
3076 rs->callbacks.congested_fn = raid_is_congested; 3139 rs->callbacks.congested_fn = raid_is_congested;
3077 dm_table_add_target_callbacks(ti->table, &rs->callbacks); 3140 dm_table_add_target_callbacks(ti->table, &rs->callbacks);
3078 3141
3142 /* If raid4/5/6 journal mode explictely requested (only possible with journal dev) -> set it */
3143 if (test_bit(__CTR_FLAG_JOURNAL_MODE, &rs->ctr_flags)) {
3144 r = r5c_journal_mode_set(&rs->md, rs->journal_dev.mode);
3145 if (r) {
3146 ti->error = "Failed to set raid4/5/6 journal mode";
3147 mddev_unlock(&rs->md);
3148 goto bad_journal_mode_set;
3149 }
3150 }
3151
3079 mddev_suspend(&rs->md); 3152 mddev_suspend(&rs->md);
3080 3153
3081 /* Try to adjust the raid4/5/6 stripe cache size to the stripe size */ 3154 /* Try to adjust the raid4/5/6 stripe cache size to the stripe size */
@@ -3109,6 +3182,7 @@ static int raid_ctr(struct dm_target *ti, unsigned int argc, char **argv)
3109 mddev_unlock(&rs->md); 3182 mddev_unlock(&rs->md);
3110 return 0; 3183 return 0;
3111 3184
3185bad_journal_mode_set:
3112bad_stripe_cache: 3186bad_stripe_cache:
3113bad_check_reshape: 3187bad_check_reshape:
3114 md_stop(&rs->md); 3188 md_stop(&rs->md);
@@ -3180,18 +3254,18 @@ static const char *decipher_sync_action(struct mddev *mddev)
3180 * Status characters: 3254 * Status characters:
3181 * 3255 *
3182 * 'D' = Dead/Failed raid set component or raid4/5/6 journal device 3256 * 'D' = Dead/Failed raid set component or raid4/5/6 journal device
3183 * 'a' = Alive but not in-sync 3257 * 'a' = Alive but not in-sync raid set component _or_ alive raid4/5/6 'write_back' journal device
3184 * 'A' = Alive and in-sync raid set component or alive raid4/5/6 journal device 3258 * 'A' = Alive and in-sync raid set component _or_ alive raid4/5/6 'write_through' journal device
3185 * '-' = Non-existing device (i.e. uspace passed '- -' into the ctr) 3259 * '-' = Non-existing device (i.e. uspace passed '- -' into the ctr)
3186 */ 3260 */
3187static const char *__raid_dev_status(struct md_rdev *rdev, bool array_in_sync) 3261static const char *__raid_dev_status(struct raid_set *rs, struct md_rdev *rdev, bool array_in_sync)
3188{ 3262{
3189 if (!rdev->bdev) 3263 if (!rdev->bdev)
3190 return "-"; 3264 return "-";
3191 else if (test_bit(Faulty, &rdev->flags)) 3265 else if (test_bit(Faulty, &rdev->flags))
3192 return "D"; 3266 return "D";
3193 else if (test_bit(Journal, &rdev->flags)) 3267 else if (test_bit(Journal, &rdev->flags))
3194 return "A"; 3268 return (rs->journal_dev.mode == R5C_JOURNAL_MODE_WRITE_THROUGH) ? "A" : "a";
3195 else if (!array_in_sync || !test_bit(In_sync, &rdev->flags)) 3269 else if (!array_in_sync || !test_bit(In_sync, &rdev->flags))
3196 return "a"; 3270 return "a";
3197 else 3271 else
@@ -3315,7 +3389,7 @@ static void raid_status(struct dm_target *ti, status_type_t type,
3315 3389
3316 /* HM FIXME: do we want another state char for raid0? It shows 'D'/'A'/'-' now */ 3390 /* HM FIXME: do we want another state char for raid0? It shows 'D'/'A'/'-' now */
3317 for (i = 0; i < rs->raid_disks; i++) 3391 for (i = 0; i < rs->raid_disks; i++)
3318 DMEMIT(__raid_dev_status(&rs->dev[i].rdev, array_in_sync)); 3392 DMEMIT(__raid_dev_status(rs, &rs->dev[i].rdev, array_in_sync));
3319 3393
3320 /* 3394 /*
3321 * In-sync/Reshape ratio: 3395 * In-sync/Reshape ratio:
@@ -3366,7 +3440,7 @@ static void raid_status(struct dm_target *ti, status_type_t type,
3366 * v1.10.0+: 3440 * v1.10.0+:
3367 */ 3441 */
3368 DMEMIT(" %s", test_bit(__CTR_FLAG_JOURNAL_DEV, &rs->ctr_flags) ? 3442 DMEMIT(" %s", test_bit(__CTR_FLAG_JOURNAL_DEV, &rs->ctr_flags) ?
3369 __raid_dev_status(&rs->journal_dev.rdev, 0) : "-"); 3443 __raid_dev_status(rs, &rs->journal_dev.rdev, 0) : "-");
3370 break; 3444 break;
3371 3445
3372 case STATUSTYPE_TABLE: 3446 case STATUSTYPE_TABLE:
@@ -3381,39 +3455,30 @@ static void raid_status(struct dm_target *ti, status_type_t type,
3381 write_mostly_params + 3455 write_mostly_params +
3382 hweight32(rs->ctr_flags & CTR_FLAG_OPTIONS_NO_ARGS) + 3456 hweight32(rs->ctr_flags & CTR_FLAG_OPTIONS_NO_ARGS) +
3383 hweight32(rs->ctr_flags & CTR_FLAG_OPTIONS_ONE_ARG) * 2 + 3457 hweight32(rs->ctr_flags & CTR_FLAG_OPTIONS_ONE_ARG) * 2 +
3384 (test_bit(__CTR_FLAG_JOURNAL_DEV, &rs->ctr_flags) ? 2 : 0); 3458 (test_bit(__CTR_FLAG_JOURNAL_DEV, &rs->ctr_flags) ? 2 : 0) +
3459 (test_bit(__CTR_FLAG_JOURNAL_MODE, &rs->ctr_flags) ? 2 : 0);
3460
3385 /* Emit table line */ 3461 /* Emit table line */
3462 /* This has to be in the documented order for userspace! */
3386 DMEMIT("%s %u %u", rs->raid_type->name, raid_param_cnt, mddev->new_chunk_sectors); 3463 DMEMIT("%s %u %u", rs->raid_type->name, raid_param_cnt, mddev->new_chunk_sectors);
3387 if (test_bit(__CTR_FLAG_RAID10_FORMAT, &rs->ctr_flags))
3388 DMEMIT(" %s %s", dm_raid_arg_name_by_flag(CTR_FLAG_RAID10_FORMAT),
3389 raid10_md_layout_to_format(mddev->layout));
3390 if (test_bit(__CTR_FLAG_RAID10_COPIES, &rs->ctr_flags))
3391 DMEMIT(" %s %d", dm_raid_arg_name_by_flag(CTR_FLAG_RAID10_COPIES),
3392 raid10_md_layout_to_copies(mddev->layout));
3393 if (test_bit(__CTR_FLAG_NOSYNC, &rs->ctr_flags))
3394 DMEMIT(" %s", dm_raid_arg_name_by_flag(CTR_FLAG_NOSYNC));
3395 if (test_bit(__CTR_FLAG_SYNC, &rs->ctr_flags)) 3464 if (test_bit(__CTR_FLAG_SYNC, &rs->ctr_flags))
3396 DMEMIT(" %s", dm_raid_arg_name_by_flag(CTR_FLAG_SYNC)); 3465 DMEMIT(" %s", dm_raid_arg_name_by_flag(CTR_FLAG_SYNC));
3397 if (test_bit(__CTR_FLAG_REGION_SIZE, &rs->ctr_flags)) 3466 if (test_bit(__CTR_FLAG_NOSYNC, &rs->ctr_flags))
3398 DMEMIT(" %s %llu", dm_raid_arg_name_by_flag(CTR_FLAG_REGION_SIZE), 3467 DMEMIT(" %s", dm_raid_arg_name_by_flag(CTR_FLAG_NOSYNC));
3399 (unsigned long long) to_sector(mddev->bitmap_info.chunksize));
3400 if (test_bit(__CTR_FLAG_DATA_OFFSET, &rs->ctr_flags))
3401 DMEMIT(" %s %llu", dm_raid_arg_name_by_flag(CTR_FLAG_DATA_OFFSET),
3402 (unsigned long long) rs->data_offset);
3403 if (test_bit(__CTR_FLAG_DAEMON_SLEEP, &rs->ctr_flags))
3404 DMEMIT(" %s %lu", dm_raid_arg_name_by_flag(CTR_FLAG_DAEMON_SLEEP),
3405 mddev->bitmap_info.daemon_sleep);
3406 if (test_bit(__CTR_FLAG_DELTA_DISKS, &rs->ctr_flags))
3407 DMEMIT(" %s %d", dm_raid_arg_name_by_flag(CTR_FLAG_DELTA_DISKS),
3408 max(rs->delta_disks, mddev->delta_disks));
3409 if (test_bit(__CTR_FLAG_STRIPE_CACHE, &rs->ctr_flags))
3410 DMEMIT(" %s %d", dm_raid_arg_name_by_flag(CTR_FLAG_STRIPE_CACHE),
3411 max_nr_stripes);
3412 if (rebuild_disks) 3468 if (rebuild_disks)
3413 for (i = 0; i < rs->raid_disks; i++) 3469 for (i = 0; i < rs->raid_disks; i++)
3414 if (test_bit(rs->dev[i].rdev.raid_disk, (void *) rs->rebuild_disks)) 3470 if (test_bit(rs->dev[i].rdev.raid_disk, (void *) rs->rebuild_disks))
3415 DMEMIT(" %s %u", dm_raid_arg_name_by_flag(CTR_FLAG_REBUILD), 3471 DMEMIT(" %s %u", dm_raid_arg_name_by_flag(CTR_FLAG_REBUILD),
3416 rs->dev[i].rdev.raid_disk); 3472 rs->dev[i].rdev.raid_disk);
3473 if (test_bit(__CTR_FLAG_DAEMON_SLEEP, &rs->ctr_flags))
3474 DMEMIT(" %s %lu", dm_raid_arg_name_by_flag(CTR_FLAG_DAEMON_SLEEP),
3475 mddev->bitmap_info.daemon_sleep);
3476 if (test_bit(__CTR_FLAG_MIN_RECOVERY_RATE, &rs->ctr_flags))
3477 DMEMIT(" %s %d", dm_raid_arg_name_by_flag(CTR_FLAG_MIN_RECOVERY_RATE),
3478 mddev->sync_speed_min);
3479 if (test_bit(__CTR_FLAG_MAX_RECOVERY_RATE, &rs->ctr_flags))
3480 DMEMIT(" %s %d", dm_raid_arg_name_by_flag(CTR_FLAG_MAX_RECOVERY_RATE),
3481 mddev->sync_speed_max);
3417 if (write_mostly_params) 3482 if (write_mostly_params)
3418 for (i = 0; i < rs->raid_disks; i++) 3483 for (i = 0; i < rs->raid_disks; i++)
3419 if (test_bit(WriteMostly, &rs->dev[i].rdev.flags)) 3484 if (test_bit(WriteMostly, &rs->dev[i].rdev.flags))
@@ -3422,15 +3487,30 @@ static void raid_status(struct dm_target *ti, status_type_t type,
3422 if (test_bit(__CTR_FLAG_MAX_WRITE_BEHIND, &rs->ctr_flags)) 3487 if (test_bit(__CTR_FLAG_MAX_WRITE_BEHIND, &rs->ctr_flags))
3423 DMEMIT(" %s %lu", dm_raid_arg_name_by_flag(CTR_FLAG_MAX_WRITE_BEHIND), 3488 DMEMIT(" %s %lu", dm_raid_arg_name_by_flag(CTR_FLAG_MAX_WRITE_BEHIND),
3424 mddev->bitmap_info.max_write_behind); 3489 mddev->bitmap_info.max_write_behind);
3425 if (test_bit(__CTR_FLAG_MAX_RECOVERY_RATE, &rs->ctr_flags)) 3490 if (test_bit(__CTR_FLAG_STRIPE_CACHE, &rs->ctr_flags))
3426 DMEMIT(" %s %d", dm_raid_arg_name_by_flag(CTR_FLAG_MAX_RECOVERY_RATE), 3491 DMEMIT(" %s %d", dm_raid_arg_name_by_flag(CTR_FLAG_STRIPE_CACHE),
3427 mddev->sync_speed_max); 3492 max_nr_stripes);
3428 if (test_bit(__CTR_FLAG_MIN_RECOVERY_RATE, &rs->ctr_flags)) 3493 if (test_bit(__CTR_FLAG_REGION_SIZE, &rs->ctr_flags))
3429 DMEMIT(" %s %d", dm_raid_arg_name_by_flag(CTR_FLAG_MIN_RECOVERY_RATE), 3494 DMEMIT(" %s %llu", dm_raid_arg_name_by_flag(CTR_FLAG_REGION_SIZE),
3430 mddev->sync_speed_min); 3495 (unsigned long long) to_sector(mddev->bitmap_info.chunksize));
3496 if (test_bit(__CTR_FLAG_RAID10_COPIES, &rs->ctr_flags))
3497 DMEMIT(" %s %d", dm_raid_arg_name_by_flag(CTR_FLAG_RAID10_COPIES),
3498 raid10_md_layout_to_copies(mddev->layout));
3499 if (test_bit(__CTR_FLAG_RAID10_FORMAT, &rs->ctr_flags))
3500 DMEMIT(" %s %s", dm_raid_arg_name_by_flag(CTR_FLAG_RAID10_FORMAT),
3501 raid10_md_layout_to_format(mddev->layout));
3502 if (test_bit(__CTR_FLAG_DELTA_DISKS, &rs->ctr_flags))
3503 DMEMIT(" %s %d", dm_raid_arg_name_by_flag(CTR_FLAG_DELTA_DISKS),
3504 max(rs->delta_disks, mddev->delta_disks));
3505 if (test_bit(__CTR_FLAG_DATA_OFFSET, &rs->ctr_flags))
3506 DMEMIT(" %s %llu", dm_raid_arg_name_by_flag(CTR_FLAG_DATA_OFFSET),
3507 (unsigned long long) rs->data_offset);
3431 if (test_bit(__CTR_FLAG_JOURNAL_DEV, &rs->ctr_flags)) 3508 if (test_bit(__CTR_FLAG_JOURNAL_DEV, &rs->ctr_flags))
3432 DMEMIT(" %s %s", dm_raid_arg_name_by_flag(CTR_FLAG_JOURNAL_DEV), 3509 DMEMIT(" %s %s", dm_raid_arg_name_by_flag(CTR_FLAG_JOURNAL_DEV),
3433 __get_dev_name(rs->journal_dev.dev)); 3510 __get_dev_name(rs->journal_dev.dev));
3511 if (test_bit(__CTR_FLAG_JOURNAL_MODE, &rs->ctr_flags))
3512 DMEMIT(" %s %s", dm_raid_arg_name_by_flag(CTR_FLAG_JOURNAL_MODE),
3513 md_journal_mode_to_dm_raid(rs->journal_dev.mode));
3434 DMEMIT(" %d", rs->raid_disks); 3514 DMEMIT(" %d", rs->raid_disks);
3435 for (i = 0; i < rs->raid_disks; i++) 3515 for (i = 0; i < rs->raid_disks; i++)
3436 DMEMIT(" %s %s", __get_dev_name(rs->dev[i].meta_dev), 3516 DMEMIT(" %s %s", __get_dev_name(rs->dev[i].meta_dev),
@@ -3791,7 +3871,7 @@ static void raid_resume(struct dm_target *ti)
3791 3871
3792static struct target_type raid_target = { 3872static struct target_type raid_target = {
3793 .name = "raid", 3873 .name = "raid",
3794 .version = {1, 10, 1}, 3874 .version = {1, 11, 1},
3795 .module = THIS_MODULE, 3875 .module = THIS_MODULE,
3796 .ctr = raid_ctr, 3876 .ctr = raid_ctr,
3797 .dtr = raid_dtr, 3877 .dtr = raid_dtr,