diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-05-03 13:31:20 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-05-03 13:31:20 -0400 |
commit | d35a878ae1c50977b55e352fd46e36e35add72a0 (patch) | |
tree | 7cd4e0ec418c6f3be365e56ee3c49bab218cd608 /drivers/md/dm-raid.c | |
parent | e5021876c91dc3894b2174cca8fa797f8e29e7b9 (diff) | |
parent | 390020ad2af9ca04844c4f3b1f299ad8746d84c8 (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.c | 164 |
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 */ | ||
356 | static 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 */ | ||
365 | static 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 */ | ||
377 | static 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 | ||
3185 | bad_journal_mode_set: | ||
3112 | bad_stripe_cache: | 3186 | bad_stripe_cache: |
3113 | bad_check_reshape: | 3187 | bad_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 | */ |
3187 | static const char *__raid_dev_status(struct md_rdev *rdev, bool array_in_sync) | 3261 | static 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 | ||
3792 | static struct target_type raid_target = { | 3872 | static 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, |