History

Merge tag 'for-5.17/drivers-2022-01-11' of git://git.kernel.dk/linux-block

Pull block driver updates from Jens Axboe: - mtip32xx pci cleanups (Bjorn) - mtip32xx conversion to generic power management (Vaibhav) - rsxx pci powermanagement cleanups (Bjorn) - Remove the rsxx driver. This hardware never saw much adoption, and it's been end of lifed for a while. (Christoph) - MD pull request from Song: - REQ_NOWAIT support (Vishal Verma) - raid6 benchmark optimization (Dirk Müller) - Fix for acct bioset (Xiao Ni) - Clean up max_queued_requests (Mariusz Tkaczyk) - PREEMPT_RT optimization (Davidlohr Bueso) - Use default_groups in kobj_type (Greg Kroah-Hartman) - Use attribute groups in pktcdvd and rnbd (Greg) - NVMe pull request from Christoph: - increment request genctr on completion (Keith Busch, Geliang Tang) - add a 'iopolicy' module parameter (Hannes Reinecke) - print out valid arguments when reading from /dev/nvme-fabrics (Hannes Reinecke) - Use struct_group() in drbd (Kees) - null_blk fixes (Ming) - Get rid of congestion logic in pktcdvd (Neil) - Floppy ejection hang fix (Tasos) - Floppy max user request size fix (Xiongwei) - Loop locking fix (Tetsuo) * tag 'for-5.17/drivers-2022-01-11' of git://git.kernel.dk/linux-block: (32 commits) md: use default_groups in kobj_type md: Move alloc/free acct bioset in to personality lib/raid6: Use strict priority ranking for pq gen() benchmarking lib/raid6: skip benchmark of non-chosen xor_syndrome functions md: fix spelling of "its" md: raid456 add nowait support md: raid10 add nowait support md: raid1 add nowait support md: add support for REQ_NOWAIT md: drop queue limitation for RAID1 and RAID10 md/raid5: play nice with PREEMPT_RT block/rnbd-clt-sysfs: use default_groups in kobj_type pktcdvd: convert to use attribute groups block: null_blk: only set set->nr_maps as 3 if active poll_queues is > 0 nvme: add 'iopolicy' module parameter nvme: drop unused variable ctrl in nvme_setup_cmd nvme: increment request genctr on completion nvme-fabrics: print out valid arguments when reading from /dev/nvme-fabrics block: remove the rsxx driver rsxx: Drop PCI legacy power management ...

Linus Torvalds committed 4 years ago

Commit c9193f42 parents d3c8108 d85bd8240 files · +612 −4501Browse files

Showing the changes to drivers/md (9 of 40 files). Show all

Unified · Split

9 files
  1. drivers/md/md-cluster.c +1 −1
  2. drivers/md/md.c +41 −12
  3. drivers/md/md.h +2 −0
  4. drivers/md/raid0.c +28 −10
  5. drivers/md/raid1-10.c +0 −6
  6. drivers/md/raid1.c +56 −27
  7. drivers/md/raid10.c +67 −40
  8. drivers/md/raid5.c +51 −16
  9. drivers/md/raid5.h +3 −1
drivers/md/md-cluster.c+1−1
@@ -574,7 +574,7 @@ static int process_recvd_msg(struct mddev *mddev, struct cluster_msg *msg) · 573 unmodified lines
574 int ret = 0;574 int ret = 0;
575 575
576 if (WARN(mddev->cluster_info->slot_number - 1 == le32_to_cpu(msg->slot),576 if (WARN(mddev->cluster_info->slot_number - 1 == le32_to_cpu(msg->slot),
577 "node %d received it's own msg\n", le32_to_cpu(msg->slot)))577 "node %d received its own msg\n", le32_to_cpu(msg->slot)))
578 return -1;578 return -1;
579 switch (le32_to_cpu(msg->type)) {579 switch (le32_to_cpu(msg->type)) {
580 case METADATA_UPDATED:580 case METADATA_UPDATED:
drivers/md/md.c+41−12
@@ -418,6 +418,12 @@ check_suspended: · 417 unmodified lines
418 rcu_read_lock();418 rcu_read_lock();
419 if (is_suspended(mddev, bio)) {419 if (is_suspended(mddev, bio)) {
420 DEFINE_WAIT(__wait);420 DEFINE_WAIT(__wait);
421 /* Bail out if REQ_NOWAIT is set for the bio */
422 if (bio->bi_opf & REQ_NOWAIT) {
423 rcu_read_unlock();
424 bio_wouldblock_error(bio);
425 return;
426 }
421 for (;;) {427 for (;;) {
422 prepare_to_wait(&mddev->sb_wait, &__wait,428 prepare_to_wait(&mddev->sb_wait, &__wait,
423 TASK_UNINTERRUPTIBLE);429 TASK_UNINTERRUPTIBLE);
@@ -3603,6 +3609,7 @@ static struct attribute *rdev_default_attrs[] = { · 3179 unmodified lines
3603 &rdev_ppl_size.attr,3609 &rdev_ppl_size.attr,
3604 NULL,3610 NULL,
3605};3611};
3612ATTRIBUTE_GROUPS(rdev_default);
3606static ssize_t3613static ssize_t
3607rdev_attr_show(struct kobject *kobj, struct attribute *attr, char *page)3614rdev_attr_show(struct kobject *kobj, struct attribute *attr, char *page)
3608{3615{
@@ -3652,7 +3659,7 @@ static const struct sysfs_ops rdev_sysfs_ops = { · 43 unmodified lines
3652static struct kobj_type rdev_ktype = {3659static struct kobj_type rdev_ktype = {
3653 .release = rdev_free,3660 .release = rdev_free,
3654 .sysfs_ops = &rdev_sysfs_ops,3661 .sysfs_ops = &rdev_sysfs_ops,
3655 .default_attrs = rdev_default_attrs,3662 .default_groups = rdev_default_groups,
3656};3663};
3657 3664
3658int md_rdev_init(struct md_rdev *rdev)3665int md_rdev_init(struct md_rdev *rdev)
@@ -5788,6 +5795,7 @@ int md_run(struct mddev *mddev) · 2129 unmodified lines
5788 int err;5795 int err;
5789 struct md_rdev *rdev;5796 struct md_rdev *rdev;
5790 struct md_personality *pers;5797 struct md_personality *pers;
5798 bool nowait = true;
5791 5799
5792 if (list_empty(&mddev->disks))5800 if (list_empty(&mddev->disks))
5793 /* cannot run an array with no devices.. */5801 /* cannot run an array with no devices.. */
@@ -5858,8 +5866,13 @@ int md_run(struct mddev *mddev) · 64 unmodified lines
5858 }5866 }
5859 }5867 }
5860 sysfs_notify_dirent_safe(rdev->sysfs_state);5868 sysfs_notify_dirent_safe(rdev->sysfs_state);
5869 nowait = nowait && blk_queue_nowait(bdev_get_queue(rdev->bdev));
5861 }5870 }
5862 5871
5872 /* Set the NOWAIT flags if all underlying devices support it */
5873 if (nowait)
5874 blk_queue_flag_set(QUEUE_FLAG_NOWAIT, mddev->queue);
5875
5863 if (!bioset_initialized(&mddev->bio_set)) {5876 if (!bioset_initialized(&mddev->bio_set)) {
5864 err = bioset_init(&mddev->bio_set, BIO_POOL_SIZE, 0, BIOSET_NEED_BVECS);5877 err = bioset_init(&mddev->bio_set, BIO_POOL_SIZE, 0, BIOSET_NEED_BVECS);
5865 if (err)5878 if (err)
@@ -5870,13 +5883,6 @@ int md_run(struct mddev *mddev) · 4 unmodified lines
5870 if (err)5883 if (err)
5871 goto exit_bio_set;5884 goto exit_bio_set;
5872 }5885 }
5873 if (mddev->level != 1 && mddev->level != 10 &&
5874 !bioset_initialized(&mddev->io_acct_set)) {
5875 err = bioset_init(&mddev->io_acct_set, BIO_POOL_SIZE,
5876 offsetof(struct md_io_acct, bio_clone), 0);
5877 if (err)
5878 goto exit_sync_set;
5879 }
5880 5886
5881 spin_lock(&pers_lock);5887 spin_lock(&pers_lock);
5882 pers = find_pers(mddev->level, mddev->clevel);5888 pers = find_pers(mddev->level, mddev->clevel);
@@ -6053,9 +6059,6 @@ bitmap_abort: · 170 unmodified lines
6053 module_put(pers->owner);6059 module_put(pers->owner);
6054 md_bitmap_destroy(mddev);6060 md_bitmap_destroy(mddev);
6055abort:6061abort:
6056 if (mddev->level != 1 && mddev->level != 10)
6057 bioset_exit(&mddev->io_acct_set);
6058exit_sync_set:
6059 bioset_exit(&mddev->sync_set);6062 bioset_exit(&mddev->sync_set);
6060exit_bio_set:6063exit_bio_set:
6061 bioset_exit(&mddev->bio_set);6064 bioset_exit(&mddev->bio_set);
@@ -7004,6 +7007,15 @@ static int hot_add_disk(struct mddev *mddev, dev_t dev) · 942 unmodified lines
7004 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags);7007 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags);
7005 if (!mddev->thread)7008 if (!mddev->thread)
7006 md_update_sb(mddev, 1);7009 md_update_sb(mddev, 1);
7010 /*
7011 * If the new disk does not support REQ_NOWAIT,
7012 * disable on the whole MD.
7013 */
7014 if (!blk_queue_nowait(bdev_get_queue(rdev->bdev))) {
7015 pr_info("%s: Disabling nowait because %s does not support nowait\n",
7016 mdname(mddev), bdevname(rdev->bdev, b));
7017 blk_queue_flag_clear(QUEUE_FLAG_NOWAIT, mddev->queue);
7018 }
7007 /*7019 /*
7008 * Kick recovery, maybe this spare has to be added to the7020 * Kick recovery, maybe this spare has to be added to the
7009 * array immediately.7021 * array immediately.
@@ -8402,7 +8414,7 @@ int md_setup_cluster(struct mddev *mddev, int nodes) · 1392 unmodified lines
8402 spin_lock(&pers_lock);8414 spin_lock(&pers_lock);
8403 /* ensure module won't be unloaded */8415 /* ensure module won't be unloaded */
8404 if (!md_cluster_ops || !try_module_get(md_cluster_mod)) {8416 if (!md_cluster_ops || !try_module_get(md_cluster_mod)) {
8405 pr_warn("can't find md-cluster module or get it's reference.\n");8417 pr_warn("can't find md-cluster module or get its reference.\n");
8406 spin_unlock(&pers_lock);8418 spin_unlock(&pers_lock);
8407 return -ENOENT;8419 return -ENOENT;
8408 }8420 }
@@ -8589,6 +8601,23 @@ void md_submit_discard_bio(struct mddev *mddev, struct md_rdev *rdev, · 180 unmodified lines
8589}8601}
8590EXPORT_SYMBOL_GPL(md_submit_discard_bio);8602EXPORT_SYMBOL_GPL(md_submit_discard_bio);
8591 8603
8604int acct_bioset_init(struct mddev *mddev)
8605{
8606 int err = 0;
8607
8608 if (!bioset_initialized(&mddev->io_acct_set))
8609 err = bioset_init(&mddev->io_acct_set, BIO_POOL_SIZE,
8610 offsetof(struct md_io_acct, bio_clone), 0);
8611 return err;
8612}
8613EXPORT_SYMBOL_GPL(acct_bioset_init);
8614
8615void acct_bioset_exit(struct mddev *mddev)
8616{
8617 bioset_exit(&mddev->io_acct_set);
8618}
8619EXPORT_SYMBOL_GPL(acct_bioset_exit);
8620
8592static void md_end_io_acct(struct bio *bio)8621static void md_end_io_acct(struct bio *bio)
8593{8622{
8594 struct md_io_acct *md_io_acct = bio->bi_private;8623 struct md_io_acct *md_io_acct = bio->bi_private;
drivers/md/md.h+2−0
@@ -721,6 +721,8 @@ extern void md_error(struct mddev *mddev, struct md_rdev *rdev); · 720 unmodified lines
721extern void md_finish_reshape(struct mddev *mddev);721extern void md_finish_reshape(struct mddev *mddev);
722void md_submit_discard_bio(struct mddev *mddev, struct md_rdev *rdev,722void md_submit_discard_bio(struct mddev *mddev, struct md_rdev *rdev,
723 struct bio *bio, sector_t start, sector_t size);723 struct bio *bio, sector_t start, sector_t size);
724int acct_bioset_init(struct mddev *mddev);
725void acct_bioset_exit(struct mddev *mddev);
724void md_account_bio(struct mddev *mddev, struct bio **bio);726void md_account_bio(struct mddev *mddev, struct bio **bio);
725 727
726extern bool __must_check md_flush_request(struct mddev *mddev, struct bio *bio);728extern bool __must_check md_flush_request(struct mddev *mddev, struct bio *bio);
drivers/md/raid0.c+28−10
@@ -356,7 +356,21 @@ static sector_t raid0_size(struct mddev *mddev, sector_t sectors, int raid_disks · 355 unmodified lines
356 return array_sectors;356 return array_sectors;
357}357}
358 358
359static void raid0_free(struct mddev *mddev, void *priv);359static void free_conf(struct mddev *mddev, struct r0conf *conf)
360{
361 kfree(conf->strip_zone);
362 kfree(conf->devlist);
363 kfree(conf);
364 mddev->private = NULL;
365}
366
367static void raid0_free(struct mddev *mddev, void *priv)
368{
369 struct r0conf *conf = priv;
370
371 free_conf(mddev, conf);
372 acct_bioset_exit(mddev);
373}
360 374
361static int raid0_run(struct mddev *mddev)375static int raid0_run(struct mddev *mddev)
362{376{
@@ -370,11 +384,16 @@ static int raid0_run(struct mddev *mddev) · 7 unmodified lines
370 if (md_check_no_bitmap(mddev))384 if (md_check_no_bitmap(mddev))
371 return -EINVAL;385 return -EINVAL;
372 386
387 if (acct_bioset_init(mddev)) {
388 pr_err("md/raid0:%s: alloc acct bioset failed.\n", mdname(mddev));
389 return -ENOMEM;
390 }
391
373 /* if private is not null, we are here after takeover */392 /* if private is not null, we are here after takeover */
374 if (mddev->private == NULL) {393 if (mddev->private == NULL) {
375 ret = create_strip_zones(mddev, &conf);394 ret = create_strip_zones(mddev, &conf);
376 if (ret < 0)395 if (ret < 0)
377 return ret;396 goto exit_acct_set;
378 mddev->private = conf;397 mddev->private = conf;
379 }398 }
380 conf = mddev->private;399 conf = mddev->private;
@@ -413,17 +432,16 @@ static int raid0_run(struct mddev *mddev) · 32 unmodified lines
413 dump_zones(mddev);432 dump_zones(mddev);
414 433
415 ret = md_integrity_register(mddev);434 ret = md_integrity_register(mddev);
435 if (ret)
436 goto free;
416 437
417 return ret;438 return ret;
418}
419 439
420static void raid0_free(struct mddev *mddev, void *priv)440free:
421{441 free_conf(mddev, conf);
422 struct r0conf *conf = priv;442exit_acct_set:
423 443 acct_bioset_exit(mddev);
424 kfree(conf->strip_zone);444 return ret;
425 kfree(conf->devlist);
426 kfree(conf);
427}445}
428 446
429static void raid0_handle_discard(struct mddev *mddev, struct bio *bio)447static void raid0_handle_discard(struct mddev *mddev, struct bio *bio)
drivers/md/raid1-10.c+0−6
@@ -22,12 +22,6 @@ · 21 unmodified lines
22 22
23#define BIO_SPECIAL(bio) ((unsigned long)bio <= 2)23#define BIO_SPECIAL(bio) ((unsigned long)bio <= 2)
24 24
25/* When there are this many requests queue to be written by
26 * the raid thread, we become 'congested' to provide back-pressure
27 * for writeback.
28 */
29static int max_queued_requests = 1024;
30
31/* for managing resync I/O pages */25/* for managing resync I/O pages */
32struct resync_pages {26struct resync_pages {
33 void *raid_bio;27 void *raid_bio;
drivers/md/raid1.c+56−27
@@ -929,8 +929,10 @@ static void lower_barrier(struct r1conf *conf, sector_t sector_nr) · 928 unmodified lines
929 wake_up(&conf->wait_barrier);929 wake_up(&conf->wait_barrier);
930}930}
931 931
932static void _wait_barrier(struct r1conf *conf, int idx)932static bool _wait_barrier(struct r1conf *conf, int idx, bool nowait)
933{933{
934 bool ret = true;
935
934 /*936 /*
935 * We need to increase conf->nr_pending[idx] very early here,937 * We need to increase conf->nr_pending[idx] very early here,
936 * then raise_barrier() can be blocked when it waits for938 * then raise_barrier() can be blocked when it waits for
@@ -961,7 +963,7 @@ static void _wait_barrier(struct r1conf *conf, int idx) · 24 unmodified lines
961 */963 */
962 if (!READ_ONCE(conf->array_frozen) &&964 if (!READ_ONCE(conf->array_frozen) &&
963 !atomic_read(&conf->barrier[idx]))965 !atomic_read(&conf->barrier[idx]))
964 return;966 return ret;
965 967
966 /*968 /*
967 * After holding conf->resync_lock, conf->nr_pending[idx]969 * After holding conf->resync_lock, conf->nr_pending[idx]
@@ -979,18 +981,27 @@ static void _wait_barrier(struct r1conf *conf, int idx) · 11 unmodified lines
979 */981 */
980 wake_up(&conf->wait_barrier);982 wake_up(&conf->wait_barrier);
981 /* Wait for the barrier in same barrier unit bucket to drop. */983 /* Wait for the barrier in same barrier unit bucket to drop. */
982 wait_event_lock_irq(conf->wait_barrier,984
983 !conf->array_frozen &&985 /* Return false when nowait flag is set */
984 !atomic_read(&conf->barrier[idx]),986 if (nowait) {
985 conf->resync_lock);987 ret = false;
986 atomic_inc(&conf->nr_pending[idx]);988 } else {
989 wait_event_lock_irq(conf->wait_barrier,
990 !conf->array_frozen &&
991 !atomic_read(&conf->barrier[idx]),
992 conf->resync_lock);
993 atomic_inc(&conf->nr_pending[idx]);
994 }
995
987 atomic_dec(&conf->nr_waiting[idx]);996 atomic_dec(&conf->nr_waiting[idx]);
988 spin_unlock_irq(&conf->resync_lock);997 spin_unlock_irq(&conf->resync_lock);
998 return ret;
989}999}
990 1000
991static void wait_read_barrier(struct r1conf *conf, sector_t sector_nr)1001static bool wait_read_barrier(struct r1conf *conf, sector_t sector_nr, bool nowait)
992{1002{
993 int idx = sector_to_idx(sector_nr);1003 int idx = sector_to_idx(sector_nr);
1004 bool ret = true;
994 1005
995 /*1006 /*
996 * Very similar to _wait_barrier(). The difference is, for read1007 * Very similar to _wait_barrier(). The difference is, for read
@@ -1002,7 +1013,7 @@ static void wait_read_barrier(struct r1conf *conf, sector_t sector_nr) · 5 unmodified lines
1002 atomic_inc(&conf->nr_pending[idx]);1013 atomic_inc(&conf->nr_pending[idx]);
1003 1014
1004 if (!READ_ONCE(conf->array_frozen))1015 if (!READ_ONCE(conf->array_frozen))
1005 return;1016 return ret;
1006 1017
1007 spin_lock_irq(&conf->resync_lock);1018 spin_lock_irq(&conf->resync_lock);
1008 atomic_inc(&conf->nr_waiting[idx]);1019 atomic_inc(&conf->nr_waiting[idx]);
@@ -1013,19 +1024,28 @@ static void wait_read_barrier(struct r1conf *conf, sector_t sector_nr) · 4 unmodified lines
1013 */1024 */
1014 wake_up(&conf->wait_barrier);1025 wake_up(&conf->wait_barrier);
1015 /* Wait for array to be unfrozen */1026 /* Wait for array to be unfrozen */
1016 wait_event_lock_irq(conf->wait_barrier,1027
1017 !conf->array_frozen,1028 /* Return false when nowait flag is set */
1018 conf->resync_lock);1029 if (nowait) {
1019 atomic_inc(&conf->nr_pending[idx]);1030 /* Return false when nowait flag is set */
1031 ret = false;
1032 } else {
1033 wait_event_lock_irq(conf->wait_barrier,
1034 !conf->array_frozen,
1035 conf->resync_lock);
1036 atomic_inc(&conf->nr_pending[idx]);
1037 }
1038
1020 atomic_dec(&conf->nr_waiting[idx]);1039 atomic_dec(&conf->nr_waiting[idx]);
1021 spin_unlock_irq(&conf->resync_lock);1040 spin_unlock_irq(&conf->resync_lock);
1041 return ret;
1022}1042}
1023 1043
1024static void wait_barrier(struct r1conf *conf, sector_t sector_nr)1044static bool wait_barrier(struct r1conf *conf, sector_t sector_nr, bool nowait)
1025{1045{
1026 int idx = sector_to_idx(sector_nr);1046 int idx = sector_to_idx(sector_nr);
1027 1047
1028 _wait_barrier(conf, idx);1048 return _wait_barrier(conf, idx, nowait);
1029}1049}
1030 1050
1031static void _allow_barrier(struct r1conf *conf, int idx)1051static void _allow_barrier(struct r1conf *conf, int idx)
@@ -1236,7 +1256,11 @@ static void raid1_read_request(struct mddev *mddev, struct bio *bio, · 204 unmodified lines
1236 * Still need barrier for READ in case that whole1256 * Still need barrier for READ in case that whole
1237 * array is frozen.1257 * array is frozen.
1238 */1258 */
1239 wait_read_barrier(conf, bio->bi_iter.bi_sector);1259 if (!wait_read_barrier(conf, bio->bi_iter.bi_sector,
1260 bio->bi_opf & REQ_NOWAIT)) {
1261 bio_wouldblock_error(bio);
1262 return;
1263 }
1240 1264
1241 if (!r1_bio)1265 if (!r1_bio)
1242 r1_bio = alloc_r1bio(mddev, bio);1266 r1_bio = alloc_r1bio(mddev, bio);
@@ -1336,6 +1360,10 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio, · 93 unmodified lines
1336 bio->bi_iter.bi_sector, bio_end_sector(bio))) {1360 bio->bi_iter.bi_sector, bio_end_sector(bio))) {
1337 1361
1338 DEFINE_WAIT(w);1362 DEFINE_WAIT(w);
1363 if (bio->bi_opf & REQ_NOWAIT) {
1364 bio_wouldblock_error(bio);
1365 return;
1366 }
1339 for (;;) {1367 for (;;) {
1340 prepare_to_wait(&conf->wait_barrier,1368 prepare_to_wait(&conf->wait_barrier,
1341 &w, TASK_IDLE);1369 &w, TASK_IDLE);
@@ -1353,17 +1381,15 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio, · 11 unmodified lines
1353 * thread has put up a bar for new requests.1381 * thread has put up a bar for new requests.
1354 * Continue immediately if no resync is active currently.1382 * Continue immediately if no resync is active currently.
1355 */1383 */
1356 wait_barrier(conf, bio->bi_iter.bi_sector);1384 if (!wait_barrier(conf, bio->bi_iter.bi_sector,
1385 bio->bi_opf & REQ_NOWAIT)) {
1386 bio_wouldblock_error(bio);
1387 return;
1388 }
1357 1389
1358 r1_bio = alloc_r1bio(mddev, bio);1390 r1_bio = alloc_r1bio(mddev, bio);
1359 r1_bio->sectors = max_write_sectors;1391 r1_bio->sectors = max_write_sectors;
1360 1392
1361 if (conf->pending_count >= max_queued_requests) {
1362 md_wakeup_thread(mddev->thread);
1363 raid1_log(mddev, "wait queued");
1364 wait_event(conf->wait_barrier,
1365 conf->pending_count < max_queued_requests);
1366 }
1367 /* first select target devices under rcu_lock and1393 /* first select target devices under rcu_lock and
1368 * inc refcount on their rdev. Record them by setting1394 * inc refcount on their rdev. Record them by setting
1369 * bios[x] to bio1395 * bios[x] to bio
@@ -1458,9 +1484,14 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio, · 88 unmodified lines
1458 rdev_dec_pending(conf->mirrors[j].rdev, mddev);1484 rdev_dec_pending(conf->mirrors[j].rdev, mddev);
1459 r1_bio->state = 0;1485 r1_bio->state = 0;
1460 allow_barrier(conf, bio->bi_iter.bi_sector);1486 allow_barrier(conf, bio->bi_iter.bi_sector);
1487
1488 if (bio->bi_opf & REQ_NOWAIT) {
1489 bio_wouldblock_error(bio);
1490 return;
1491 }
1461 raid1_log(mddev, "wait rdev %d blocked", blocked_rdev->raid_disk);1492 raid1_log(mddev, "wait rdev %d blocked", blocked_rdev->raid_disk);
1462 md_wait_for_blocked_rdev(blocked_rdev, mddev);1493 md_wait_for_blocked_rdev(blocked_rdev, mddev);
1463 wait_barrier(conf, bio->bi_iter.bi_sector);1494 wait_barrier(conf, bio->bi_iter.bi_sector, false);
1464 goto retry_write;1495 goto retry_write;
1465 }1496 }
1466 1497
@@ -1688,7 +1719,7 @@ static void close_sync(struct r1conf *conf) · 221 unmodified lines
1688 int idx;1719 int idx;
1689 1720
1690 for (idx = 0; idx < BARRIER_BUCKETS_NR; idx++) {1721 for (idx = 0; idx < BARRIER_BUCKETS_NR; idx++) {
1691 _wait_barrier(conf, idx);1722 _wait_barrier(conf, idx, false);
1692 _allow_barrier(conf, idx);1723 _allow_barrier(conf, idx);
1693 }1724 }
1694 1725
@@ -3410,5 +3441,3 @@ MODULE_DESCRIPTION("RAID1 (mirroring) personality for MD"); · 1715 unmodified lines
3410MODULE_ALIAS("md-personality-3"); /* RAID1 */3441MODULE_ALIAS("md-personality-3"); /* RAID1 */
3411MODULE_ALIAS("md-raid1");3442MODULE_ALIAS("md-raid1");
3412MODULE_ALIAS("md-level-1");3443MODULE_ALIAS("md-level-1");
3413
3414module_param(max_queued_requests, int, S_IRUGO|S_IWUSR);
drivers/md/raid10.c+67−40
@@ -952,8 +952,10 @@ static void lower_barrier(struct r10conf *conf) · 951 unmodified lines
952 wake_up(&conf->wait_barrier);952 wake_up(&conf->wait_barrier);
953}953}
954 954
955static void wait_barrier(struct r10conf *conf)955static bool wait_barrier(struct r10conf *conf, bool nowait)
956{956{
957 bool ret = true;
958
957 spin_lock_irq(&conf->resync_lock);959 spin_lock_irq(&conf->resync_lock);
958 if (conf->barrier) {960 if (conf->barrier) {
959 struct bio_list *bio_list = current->bio_list;961 struct bio_list *bio_list = current->bio_list;
@@ -967,27 +969,35 @@ static void wait_barrier(struct r10conf *conf) · 7 unmodified lines
967 * that queue to get the nr_pending969 * that queue to get the nr_pending
968 * count down.970 * count down.
969 */971 */
970 raid10_log(conf->mddev, "wait barrier");972 /* Return false when nowait flag is set */
971 wait_event_lock_irq(conf->wait_barrier,973 if (nowait) {
972 !conf->barrier ||974 ret = false;
973 (atomic_read(&conf->nr_pending) &&975 } else {
974 bio_list &&976 raid10_log(conf->mddev, "wait barrier");
975 (!bio_list_empty(&bio_list[0]) ||977 wait_event_lock_irq(conf->wait_barrier,
976 !bio_list_empty(&bio_list[1]))) ||978 !conf->barrier ||
977 /* move on if recovery thread is979 (atomic_read(&conf->nr_pending) &&
978 * blocked by us980 bio_list &&
979 */981 (!bio_list_empty(&bio_list[0]) ||
980 (conf->mddev->thread->tsk == current &&982 !bio_list_empty(&bio_list[1]))) ||
981 test_bit(MD_RECOVERY_RUNNING,983 /* move on if recovery thread is
982 &conf->mddev->recovery) &&984 * blocked by us
983 conf->nr_queued > 0),985 */
984 conf->resync_lock);986 (conf->mddev->thread->tsk == current &&
987 test_bit(MD_RECOVERY_RUNNING,
988 &conf->mddev->recovery) &&
989 conf->nr_queued > 0),
990 conf->resync_lock);
991 }
985 conf->nr_waiting--;992 conf->nr_waiting--;
986 if (!conf->nr_waiting)993 if (!conf->nr_waiting)
987 wake_up(&conf->wait_barrier);994 wake_up(&conf->wait_barrier);
988 }995 }
989 atomic_inc(&conf->nr_pending);996 /* Only increment nr_pending when we wait */
997 if (ret)
998 atomic_inc(&conf->nr_pending);
990 spin_unlock_irq(&conf->resync_lock);999 spin_unlock_irq(&conf->resync_lock);
1000 return ret;
991}1001}
992 1002
993static void allow_barrier(struct r10conf *conf)1003static void allow_barrier(struct r10conf *conf)
@@ -1098,21 +1108,30 @@ static void raid10_unplug(struct blk_plug_cb *cb, bool from_schedule) · 104 unmodified lines
1098 * currently.1108 * currently.
1099 * 2. If IO spans the reshape position. Need to wait for reshape to pass.1109 * 2. If IO spans the reshape position. Need to wait for reshape to pass.
1100 */1110 */
1101static void regular_request_wait(struct mddev *mddev, struct r10conf *conf,1111static bool regular_request_wait(struct mddev *mddev, struct r10conf *conf,
1102 struct bio *bio, sector_t sectors)1112 struct bio *bio, sector_t sectors)
1103{1113{
1104 wait_barrier(conf);1114 /* Bail out if REQ_NOWAIT is set for the bio */
1115 if (!wait_barrier(conf, bio->bi_opf & REQ_NOWAIT)) {
1116 bio_wouldblock_error(bio);
1117 return false;
1118 }
1105 while (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) &&1119 while (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) &&
1106 bio->bi_iter.bi_sector < conf->reshape_progress &&1120 bio->bi_iter.bi_sector < conf->reshape_progress &&
1107 bio->bi_iter.bi_sector + sectors > conf->reshape_progress) {1121 bio->bi_iter.bi_sector + sectors > conf->reshape_progress) {
1108 raid10_log(conf->mddev, "wait reshape");
1109 allow_barrier(conf);1122 allow_barrier(conf);
1123 if (bio->bi_opf & REQ_NOWAIT) {
1124 bio_wouldblock_error(bio);
1125 return false;
1126 }
1127 raid10_log(conf->mddev, "wait reshape");
1110 wait_event(conf->wait_barrier,1128 wait_event(conf->wait_barrier,
1111 conf->reshape_progress <= bio->bi_iter.bi_sector ||1129 conf->reshape_progress <= bio->bi_iter.bi_sector ||
1112 conf->reshape_progress >= bio->bi_iter.bi_sector +1130 conf->reshape_progress >= bio->bi_iter.bi_sector +
1113 sectors);1131 sectors);
1114 wait_barrier(conf);1132 wait_barrier(conf, false);
1115 }1133 }
1134 return true;
1116}1135}
1117 1136
1118static void raid10_read_request(struct mddev *mddev, struct bio *bio,1137static void raid10_read_request(struct mddev *mddev, struct bio *bio,
@@ -1157,7 +1176,8 @@ static void raid10_read_request(struct mddev *mddev, struct bio *bio, · 38 unmodified lines
1157 rcu_read_unlock();1176 rcu_read_unlock();
1158 }1177 }
1159 1178
1160 regular_request_wait(mddev, conf, bio, r10_bio->sectors);1179 if (!regular_request_wait(mddev, conf, bio, r10_bio->sectors))
1180 return;
1161 rdev = read_balance(conf, r10_bio, &max_sectors);1181 rdev = read_balance(conf, r10_bio, &max_sectors);
1162 if (!rdev) {1182 if (!rdev) {
1163 if (err_rdev) {1183 if (err_rdev) {
@@ -1179,7 +1199,7 @@ static void raid10_read_request(struct mddev *mddev, struct bio *bio, · 15 unmodified lines
1179 bio_chain(split, bio);1199 bio_chain(split, bio);
1180 allow_barrier(conf);1200 allow_barrier(conf);
1181 submit_bio_noacct(bio);1201 submit_bio_noacct(bio);
1182 wait_barrier(conf);1202 wait_barrier(conf, false);
1183 bio = split;1203 bio = split;
1184 r10_bio->master_bio = bio;1204 r10_bio->master_bio = bio;
1185 r10_bio->sectors = max_sectors;1205 r10_bio->sectors = max_sectors;
@@ -1338,7 +1358,7 @@ retry_wait: · 152 unmodified lines
1338 raid10_log(conf->mddev, "%s wait rdev %d blocked",1358 raid10_log(conf->mddev, "%s wait rdev %d blocked",
1339 __func__, blocked_rdev->raid_disk);1359 __func__, blocked_rdev->raid_disk);
1340 md_wait_for_blocked_rdev(blocked_rdev, mddev);1360 md_wait_for_blocked_rdev(blocked_rdev, mddev);
1341 wait_barrier(conf);1361 wait_barrier(conf, false);
1342 goto retry_wait;1362 goto retry_wait;
1343 }1363 }
1344}1364}
@@ -1356,6 +1376,11 @@ static void raid10_write_request(struct mddev *mddev, struct bio *bio, · 11 unmodified lines
1356 bio->bi_iter.bi_sector,1376 bio->bi_iter.bi_sector,
1357 bio_end_sector(bio)))) {1377 bio_end_sector(bio)))) {
1358 DEFINE_WAIT(w);1378 DEFINE_WAIT(w);
1379 /* Bail out if REQ_NOWAIT is set for the bio */
1380 if (bio->bi_opf & REQ_NOWAIT) {
1381 bio_wouldblock_error(bio);
1382 return;
1383 }
1359 for (;;) {1384 for (;;) {
1360 prepare_to_wait(&conf->wait_barrier,1385 prepare_to_wait(&conf->wait_barrier,
1361 &w, TASK_IDLE);1386 &w, TASK_IDLE);
@@ -1368,7 +1393,8 @@ static void raid10_write_request(struct mddev *mddev, struct bio *bio, · 6 unmodified lines
1368 }1393 }
1369 1394
1370 sectors = r10_bio->sectors;1395 sectors = r10_bio->sectors;
1371 regular_request_wait(mddev, conf, bio, sectors);1396 if (!regular_request_wait(mddev, conf, bio, sectors))
1397 return;
1372 if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) &&1398 if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) &&
1373 (mddev->reshape_backwards1399 (mddev->reshape_backwards
1374 ? (bio->bi_iter.bi_sector < conf->reshape_safe &&1400 ? (bio->bi_iter.bi_sector < conf->reshape_safe &&
@@ -1380,6 +1406,11 @@ static void raid10_write_request(struct mddev *mddev, struct bio *bio, · 5 unmodified lines
1380 set_mask_bits(&mddev->sb_flags, 0,1406 set_mask_bits(&mddev->sb_flags, 0,
1381 BIT(MD_SB_CHANGE_DEVS) | BIT(MD_SB_CHANGE_PENDING));1407 BIT(MD_SB_CHANGE_DEVS) | BIT(MD_SB_CHANGE_PENDING));
1382 md_wakeup_thread(mddev->thread);1408 md_wakeup_thread(mddev->thread);
1409 if (bio->bi_opf & REQ_NOWAIT) {
1410 allow_barrier(conf);
1411 bio_wouldblock_error(bio);
1412 return;
1413 }
1383 raid10_log(conf->mddev, "wait reshape metadata");1414 raid10_log(conf->mddev, "wait reshape metadata");
1384 wait_event(mddev->sb_wait,1415 wait_event(mddev->sb_wait,
1385 !test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags));1416 !test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags));
@@ -1387,12 +1418,6 @@ static void raid10_write_request(struct mddev *mddev, struct bio *bio, · 1 unmodified line
1387 conf->reshape_safe = mddev->reshape_position;1418 conf->reshape_safe = mddev->reshape_position;
1388 }1419 }
1389 1420
1390 if (conf->pending_count >= max_queued_requests) {
1391 md_wakeup_thread(mddev->thread);
1392 raid10_log(mddev, "wait queued");
1393 wait_event(conf->wait_barrier,
1394 conf->pending_count < max_queued_requests);
1395 }
1396 /* first select target devices under rcu_lock and1421 /* first select target devices under rcu_lock and
1397 * inc refcount on their rdev. Record them by setting1422 * inc refcount on their rdev. Record them by setting
1398 * bios[x] to bio1423 * bios[x] to bio
@@ -1482,7 +1507,7 @@ static void raid10_write_request(struct mddev *mddev, struct bio *bio, · 83 unmodified lines
1482 bio_chain(split, bio);1507 bio_chain(split, bio);
1483 allow_barrier(conf);1508 allow_barrier(conf);
1484 submit_bio_noacct(bio);1509 submit_bio_noacct(bio);
1485 wait_barrier(conf);1510 wait_barrier(conf, false);
1486 bio = split;1511 bio = split;
1487 r10_bio->master_bio = bio;1512 r10_bio->master_bio = bio;
1488 }1513 }
@@ -1607,7 +1632,11 @@ static int raid10_handle_discard(struct mddev *mddev, struct bio *bio) · 118 unmodified lines
1607 if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery))1632 if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery))
1608 return -EAGAIN;1633 return -EAGAIN;
1609 1634
1610 wait_barrier(conf);1635 if (WARN_ON_ONCE(bio->bi_opf & REQ_NOWAIT)) {
1636 bio_wouldblock_error(bio);
1637 return 0;
1638 }
1639 wait_barrier(conf, false);
1611 1640
1612 /*1641 /*
1613 * Check reshape again to avoid reshape happens after checking1642 * Check reshape again to avoid reshape happens after checking
@@ -1649,7 +1678,7 @@ static int raid10_handle_discard(struct mddev *mddev, struct bio *bio) · 35 unmodified lines
1649 allow_barrier(conf);1678 allow_barrier(conf);
1650 /* Resend the fist split part */1679 /* Resend the fist split part */
1651 submit_bio_noacct(split);1680 submit_bio_noacct(split);
1652 wait_barrier(conf);1681 wait_barrier(conf, false);
1653 }1682 }
1654 div_u64_rem(bio_end, stripe_size, &remainder);1683 div_u64_rem(bio_end, stripe_size, &remainder);
1655 if (remainder) {1684 if (remainder) {
@@ -1660,7 +1689,7 @@ static int raid10_handle_discard(struct mddev *mddev, struct bio *bio) · 4 unmodified lines
1660 /* Resend the second split part */1689 /* Resend the second split part */
1661 submit_bio_noacct(bio);1690 submit_bio_noacct(bio);
1662 bio = split;1691 bio = split;
1663 wait_barrier(conf);1692 wait_barrier(conf, false);
1664 }1693 }
1665 1694
1666 bio_start = bio->bi_iter.bi_sector;1695 bio_start = bio->bi_iter.bi_sector;
@@ -1816,7 +1845,7 @@ retry_discard: · 149 unmodified lines
1816 end_disk_offset += geo->stride;1845 end_disk_offset += geo->stride;
1817 atomic_inc(&first_r10bio->remaining);1846 atomic_inc(&first_r10bio->remaining);
1818 raid_end_discard_bio(r10_bio);1847 raid_end_discard_bio(r10_bio);
1819 wait_barrier(conf);1848 wait_barrier(conf, false);
1820 goto retry_discard;1849 goto retry_discard;
1821 }1850 }
1822 1851
@@ -2011,7 +2040,7 @@ static void print_conf(struct r10conf *conf) · 188 unmodified lines
2011 2040
2012static void close_sync(struct r10conf *conf)2041static void close_sync(struct r10conf *conf)
2013{2042{
2014 wait_barrier(conf);2043 wait_barrier(conf, false);
2015 allow_barrier(conf);2044 allow_barrier(conf);
2016 2045
2017 mempool_exit(&conf->r10buf_pool);2046 mempool_exit(&conf->r10buf_pool);
@@ -4819,7 +4848,7 @@ static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr, · 2801 unmodified lines
4819 if (need_flush ||4848 if (need_flush ||
4820 time_after(jiffies, conf->reshape_checkpoint + 10*HZ)) {4849 time_after(jiffies, conf->reshape_checkpoint + 10*HZ)) {
4821 /* Need to update reshape_position in metadata */4850 /* Need to update reshape_position in metadata */
4822 wait_barrier(conf);4851 wait_barrier(conf, false);
4823 mddev->reshape_position = conf->reshape_progress;4852 mddev->reshape_position = conf->reshape_progress;
4824 if (mddev->reshape_backwards)4853 if (mddev->reshape_backwards)
4825 mddev->curr_resync_completed = raid10_size(mddev, 0, 0)4854 mddev->curr_resync_completed = raid10_size(mddev, 0, 0)
@@ -5242,5 +5271,3 @@ MODULE_DESCRIPTION("RAID10 (striped mirror) personality for MD"); · 416 unmodified lines
5242MODULE_ALIAS("md-personality-9"); /* RAID10 */5271MODULE_ALIAS("md-personality-9"); /* RAID10 */
5243MODULE_ALIAS("md-raid10");5272MODULE_ALIAS("md-raid10");
5244MODULE_ALIAS("md-level-10");5273MODULE_ALIAS("md-level-10");
5245
5246module_param(max_queued_requests, int, S_IRUGO|S_IWUSR);
drivers/md/raid5.c+51−16
@@ -2215,10 +2215,9 @@ static void raid_run_ops(struct stripe_head *sh, unsigned long ops_request) · 2214 unmodified lines
2215 struct r5conf *conf = sh->raid_conf;2215 struct r5conf *conf = sh->raid_conf;
2216 int level = conf->level;2216 int level = conf->level;
2217 struct raid5_percpu *percpu;2217 struct raid5_percpu *percpu;
2218 unsigned long cpu;
2219 2218
2220 cpu = get_cpu();2219 local_lock(&conf->percpu->lock);
2221 percpu = per_cpu_ptr(conf->percpu, cpu);2220 percpu = this_cpu_ptr(conf->percpu);
2222 if (test_bit(STRIPE_OP_BIOFILL, &ops_request)) {2221 if (test_bit(STRIPE_OP_BIOFILL, &ops_request)) {
2223 ops_run_biofill(sh);2222 ops_run_biofill(sh);
2224 overlap_clear++;2223 overlap_clear++;
@@ -2271,13 +2270,14 @@ static void raid_run_ops(struct stripe_head *sh, unsigned long ops_request) · 46 unmodified lines
2271 BUG();2270 BUG();
2272 }2271 }
2273 2272
2274 if (overlap_clear && !sh->batch_head)2273 if (overlap_clear && !sh->batch_head) {
2275 for (i = disks; i--; ) {2274 for (i = disks; i--; ) {
2276 struct r5dev *dev = &sh->dev[i];2275 struct r5dev *dev = &sh->dev[i];
2277 if (test_and_clear_bit(R5_Overlap, &dev->flags))2276 if (test_and_clear_bit(R5_Overlap, &dev->flags))
2278 wake_up(&sh->raid_conf->wait_for_overlap);2277 wake_up(&sh->raid_conf->wait_for_overlap);
2279 }2278 }
2280 put_cpu();2279 }
2280 local_unlock(&conf->percpu->lock);
2281}2281}
2282 2282
2283static void free_stripe(struct kmem_cache *sc, struct stripe_head *sh)2283static void free_stripe(struct kmem_cache *sc, struct stripe_head *sh)
@@ -5686,6 +5686,10 @@ static void make_discard_request(struct mddev *mddev, struct bio *bi) · 3402 unmodified lines
5686 struct stripe_head *sh;5686 struct stripe_head *sh;
5687 int stripe_sectors;5687 int stripe_sectors;
5688 5688
5689 /* We need to handle this when io_uring supports discard/trim */
5690 if (WARN_ON_ONCE(bi->bi_opf & REQ_NOWAIT))
5691 return;
5692
5689 if (mddev->reshape_position != MaxSector)5693 if (mddev->reshape_position != MaxSector)
5690 /* Skip discard while reshape is happening */5694 /* Skip discard while reshape is happening */
5691 return;5695 return;
@@ -5819,6 +5823,17 @@ static bool raid5_make_request(struct mddev *mddev, struct bio * bi) · 127 unmodified lines
5819 last_sector = bio_end_sector(bi);5823 last_sector = bio_end_sector(bi);
5820 bi->bi_next = NULL;5824 bi->bi_next = NULL;
5821 5825
5826 /* Bail out if conflicts with reshape and REQ_NOWAIT is set */
5827 if ((bi->bi_opf & REQ_NOWAIT) &&
5828 (conf->reshape_progress != MaxSector) &&
5829 (mddev->reshape_backwards
5830 ? (logical_sector > conf->reshape_progress && logical_sector <= conf->reshape_safe)
5831 : (logical_sector >= conf->reshape_safe && logical_sector < conf->reshape_progress))) {
5832 bio_wouldblock_error(bi);
5833 if (rw == WRITE)
5834 md_write_end(mddev);
5835 return true;
5836 }
5822 md_account_bio(mddev, &bi);5837 md_account_bio(mddev, &bi);
5823 prepare_to_wait(&conf->wait_for_overlap, &w, TASK_UNINTERRUPTIBLE);5838 prepare_to_wait(&conf->wait_for_overlap, &w, TASK_UNINTERRUPTIBLE);
5824 for (; logical_sector < last_sector; logical_sector += RAID5_STRIPE_SECTORS(conf)) {5839 for (; logical_sector < last_sector; logical_sector += RAID5_STRIPE_SECTORS(conf)) {
@@ -7052,6 +7067,7 @@ static int alloc_scratch_buffer(struct r5conf *conf, struct raid5_percpu *percpu · 1227 unmodified lines
7052 return -ENOMEM;7067 return -ENOMEM;
7053 }7068 }
7054 7069
7070 local_lock_init(&percpu->lock);
7055 return 0;7071 return 0;
7056}7072}
7057 7073
@@ -7446,12 +7462,19 @@ static int raid5_run(struct mddev *mddev) · 388 unmodified lines
7446 struct md_rdev *rdev;7462 struct md_rdev *rdev;
7447 struct md_rdev *journal_dev = NULL;7463 struct md_rdev *journal_dev = NULL;
7448 sector_t reshape_offset = 0;7464 sector_t reshape_offset = 0;
7449 int i;7465 int i, ret = 0;
7450 long long min_offset_diff = 0;7466 long long min_offset_diff = 0;
7451 int first = 1;7467 int first = 1;
7452 7468
7453 if (mddev_init_writes_pending(mddev) < 0)7469 if (acct_bioset_init(mddev)) {
7470 pr_err("md/raid456:%s: alloc acct bioset failed.\n", mdname(mddev));
7454 return -ENOMEM;7471 return -ENOMEM;
7472 }
7473
7474 if (mddev_init_writes_pending(mddev) < 0) {
7475 ret = -ENOMEM;
7476 goto exit_acct_set;
7477 }
7455 7478
7456 if (mddev->recovery_cp != MaxSector)7479 if (mddev->recovery_cp != MaxSector)
7457 pr_notice("md/raid:%s: not clean -- starting background reconstruction\n",7480 pr_notice("md/raid:%s: not clean -- starting background reconstruction\n",
@@ -7482,7 +7505,8 @@ static int raid5_run(struct mddev *mddev) · 24 unmodified lines
7482 (mddev->bitmap_info.offset || mddev->bitmap_info.file)) {7505 (mddev->bitmap_info.offset || mddev->bitmap_info.file)) {
7483 pr_notice("md/raid:%s: array cannot have both journal and bitmap\n",7506 pr_notice("md/raid:%s: array cannot have both journal and bitmap\n",
7484 mdname(mddev));7507 mdname(mddev));
7485 return -EINVAL;7508 ret = -EINVAL;
7509 goto exit_acct_set;
7486 }7510 }
7487 7511
7488 if (mddev->reshape_position != MaxSector) {7512 if (mddev->reshape_position != MaxSector) {
@@ -7507,13 +7531,15 @@ static int raid5_run(struct mddev *mddev) · 18 unmodified lines
7507 if (journal_dev) {7531 if (journal_dev) {
7508 pr_warn("md/raid:%s: don't support reshape with journal - aborting.\n",7532 pr_warn("md/raid:%s: don't support reshape with journal - aborting.\n",
7509 mdname(mddev));7533 mdname(mddev));
7510 return -EINVAL;7534 ret = -EINVAL;
7535 goto exit_acct_set;
7511 }7536 }
7512 7537
7513 if (mddev->new_level != mddev->level) {7538 if (mddev->new_level != mddev->level) {
7514 pr_warn("md/raid:%s: unsupported reshape required - aborting.\n",7539 pr_warn("md/raid:%s: unsupported reshape required - aborting.\n",
7515 mdname(mddev));7540 mdname(mddev));
7516 return -EINVAL;7541 ret = -EINVAL;
7542 goto exit_acct_set;
7517 }7543 }
7518 old_disks = mddev->raid_disks - mddev->delta_disks;7544 old_disks = mddev->raid_disks - mddev->delta_disks;
7519 /* reshape_position must be on a new-stripe boundary, and one7545 /* reshape_position must be on a new-stripe boundary, and one
@@ -7529,7 +7555,8 @@ static int raid5_run(struct mddev *mddev) · 9 unmodified lines
7529 if (sector_div(here_new, chunk_sectors * new_data_disks)) {7555 if (sector_div(here_new, chunk_sectors * new_data_disks)) {
7530 pr_warn("md/raid:%s: reshape_position not on a stripe boundary\n",7556 pr_warn("md/raid:%s: reshape_position not on a stripe boundary\n",
7531 mdname(mddev));7557 mdname(mddev));
7532 return -EINVAL;7558 ret = -EINVAL;
7559 goto exit_acct_set;
7533 }7560 }
7534 reshape_offset = here_new * chunk_sectors;7561 reshape_offset = here_new * chunk_sectors;
7535 /* here_new is the stripe we will write to */7562 /* here_new is the stripe we will write to */
@@ -7551,7 +7578,8 @@ static int raid5_run(struct mddev *mddev) · 15 unmodified lines
7551 else if (mddev->ro == 0) {7578 else if (mddev->ro == 0) {
7552 pr_warn("md/raid:%s: in-place reshape must be started in read-only mode - aborting\n",7579 pr_warn("md/raid:%s: in-place reshape must be started in read-only mode - aborting\n",
7553 mdname(mddev));7580 mdname(mddev));
7554 return -EINVAL;7581 ret = -EINVAL;
7582 goto exit_acct_set;
7555 }7583 }
7556 } else if (mddev->reshape_backwards7584 } else if (mddev->reshape_backwards
7557 ? (here_new * chunk_sectors + min_offset_diff <=7585 ? (here_new * chunk_sectors + min_offset_diff <=
@@ -7561,7 +7589,8 @@ static int raid5_run(struct mddev *mddev) · 3 unmodified lines
7561 /* Reading from the same stripe as writing to - bad */7589 /* Reading from the same stripe as writing to - bad */
7562 pr_warn("md/raid:%s: reshape_position too early for auto-recovery - aborting.\n",7590 pr_warn("md/raid:%s: reshape_position too early for auto-recovery - aborting.\n",
7563 mdname(mddev));7591 mdname(mddev));
7564 return -EINVAL;7592 ret = -EINVAL;
7593 goto exit_acct_set;
7565 }7594 }
7566 pr_debug("md/raid:%s: reshape will continue\n", mdname(mddev));7595 pr_debug("md/raid:%s: reshape will continue\n", mdname(mddev));
7567 /* OK, we should be able to continue; */7596 /* OK, we should be able to continue; */
@@ -7585,8 +7614,10 @@ static int raid5_run(struct mddev *mddev) · 17 unmodified lines
7585 else7614 else
7586 conf = mddev->private;7615 conf = mddev->private;
7587 7616
7588 if (IS_ERR(conf))7617 if (IS_ERR(conf)) {
7589 return PTR_ERR(conf);7618 ret = PTR_ERR(conf);
7619 goto exit_acct_set;
7620 }
7590 7621
7591 if (test_bit(MD_HAS_JOURNAL, &mddev->flags)) {7622 if (test_bit(MD_HAS_JOURNAL, &mddev->flags)) {
7592 if (!journal_dev) {7623 if (!journal_dev) {
@@ -7783,7 +7814,10 @@ abort: · 190 unmodified lines
7783 free_conf(conf);7814 free_conf(conf);
7784 mddev->private = NULL;7815 mddev->private = NULL;
7785 pr_warn("md/raid:%s: failed to run raid set.\n", mdname(mddev));7816 pr_warn("md/raid:%s: failed to run raid set.\n", mdname(mddev));
7786 return -EIO;7817 ret = -EIO;
7818exit_acct_set:
7819 acct_bioset_exit(mddev);
7820 return ret;
7787}7821}
7788 7822
7789static void raid5_free(struct mddev *mddev, void *priv)7823static void raid5_free(struct mddev *mddev, void *priv)
@@ -7791,6 +7825,7 @@ static void raid5_free(struct mddev *mddev, void *priv) · 1 unmodified line
7791 struct r5conf *conf = priv;7825 struct r5conf *conf = priv;
7792 7826
7793 free_conf(conf);7827 free_conf(conf);
7828 acct_bioset_exit(mddev);
7794 mddev->to_remove = &raid5_attrs_group;7829 mddev->to_remove = &raid5_attrs_group;
7795}7830}
7796 7831
drivers/md/raid5.h+3−1
@@ -4,6 +4,7 @@ · 3 unmodified lines
4 4
5#include <linux/raid/xor.h>5#include <linux/raid/xor.h>
6#include <linux/dmaengine.h>6#include <linux/dmaengine.h>
7#include <linux/local_lock.h>
7 8
8/*9/*
9 *10 *
@@ -640,7 +641,8 @@ struct r5conf { · 630 unmodified lines
640 * lists and performing address641 * lists and performing address
641 * conversions642 * conversions
642 */643 */
643 int scribble_obj_size;644 int scribble_obj_size;
645 local_lock_t lock;
644 } __percpu *percpu;646 } __percpu *percpu;
645 int scribble_disks;647 int scribble_disks;
646 int scribble_sectors;648 int scribble_sectors;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t