Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

md: use new apis to suspend array before mddev_create/destroy_serial_pool

mddev_create/destroy_serial_pool() will be called from several places
where mddev_suspend() will be called later.

Prepare to remove the mddev_suspend() from
mddev_create/destroy_serial_pool().

Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Signed-off-by: Song Liu <song@kernel.org>
Link: https://lore.kernel.org/r/20231010151958.145896-14-yukuai1@huaweicloud.com

authored by

Yu Kuai and committed by
Song Liu
58226942 1b0a2d95

+18 -16
+2 -2
drivers/md/md-autodetect.c
··· 175 175 return; 176 176 } 177 177 178 - err = mddev_lock(mddev); 178 + err = mddev_suspend_and_lock(mddev); 179 179 if (err) { 180 180 pr_err("md: failed to lock array %s\n", name); 181 181 goto out_mddev_put; ··· 221 221 if (err) 222 222 pr_warn("md: starting %s failed\n", name); 223 223 out_unlock: 224 - mddev_unlock(mddev); 224 + mddev_unlock_and_resume(mddev); 225 225 out_mddev_put: 226 226 mddev_put(mddev); 227 227 }
+4 -4
drivers/md/md-bitmap.c
··· 2537 2537 if (backlog > COUNTER_MAX) 2538 2538 return -EINVAL; 2539 2539 2540 - rv = mddev_lock(mddev); 2540 + rv = mddev_suspend_and_lock(mddev); 2541 2541 if (rv) 2542 2542 return rv; 2543 2543 ··· 2562 2562 if (!backlog && mddev->serial_info_pool) { 2563 2563 /* serial_info_pool is not needed if backlog is zero */ 2564 2564 if (!mddev->serialize_policy) 2565 - mddev_destroy_serial_pool(mddev, NULL, false); 2565 + mddev_destroy_serial_pool(mddev, NULL, true); 2566 2566 } else if (backlog && !mddev->serial_info_pool) { 2567 2567 /* serial_info_pool is needed since backlog is not zero */ 2568 2568 rdev_for_each(rdev, mddev) 2569 - mddev_create_serial_pool(mddev, rdev, false); 2569 + mddev_create_serial_pool(mddev, rdev, true); 2570 2570 } 2571 2571 if (old_mwb != backlog) 2572 2572 md_bitmap_update_sb(mddev->bitmap); 2573 2573 2574 - mddev_unlock(mddev); 2574 + mddev_unlock_and_resume(mddev); 2575 2575 return len; 2576 2576 } 2577 2577
+12 -10
drivers/md/md.c
··· 2557 2557 pr_debug("md: bind<%s>\n", b); 2558 2558 2559 2559 if (mddev->raid_disks) 2560 - mddev_create_serial_pool(mddev, rdev, false); 2560 + mddev_create_serial_pool(mddev, rdev, true); 2561 2561 2562 2562 if ((err = kobject_add(&rdev->kobj, &mddev->kobj, "dev-%s", b))) 2563 2563 goto fail; ··· 3077 3077 } 3078 3078 } else if (cmd_match(buf, "writemostly")) { 3079 3079 set_bit(WriteMostly, &rdev->flags); 3080 - mddev_create_serial_pool(rdev->mddev, rdev, false); 3080 + mddev_create_serial_pool(rdev->mddev, rdev, true); 3081 3081 need_update_sb = true; 3082 3082 err = 0; 3083 3083 } else if (cmd_match(buf, "-writemostly")) { 3084 - mddev_destroy_serial_pool(rdev->mddev, rdev, false); 3084 + mddev_destroy_serial_pool(rdev->mddev, rdev, true); 3085 3085 clear_bit(WriteMostly, &rdev->flags); 3086 3086 need_update_sb = true; 3087 3087 err = 0; ··· 3707 3707 if (entry->store == state_store) { 3708 3708 if (cmd_match(page, "remove")) 3709 3709 kn = sysfs_break_active_protection(kobj, attr); 3710 - if (cmd_match(page, "remove") || cmd_match(page, "re-add")) 3710 + if (cmd_match(page, "remove") || cmd_match(page, "re-add") || 3711 + cmd_match(page, "writemostly") || 3712 + cmd_match(page, "-writemostly")) 3711 3713 suspend = true; 3712 3714 } 3713 3715 ··· 4686 4684 minor != MINOR(dev)) 4687 4685 return -EOVERFLOW; 4688 4686 4689 - err = mddev_lock(mddev); 4687 + err = mddev_suspend_and_lock(mddev); 4690 4688 if (err) 4691 4689 return err; 4692 4690 if (mddev->persistent) { ··· 4707 4705 rdev = md_import_device(dev, -1, -1); 4708 4706 4709 4707 if (IS_ERR(rdev)) { 4710 - mddev_unlock(mddev); 4708 + mddev_unlock_and_resume(mddev); 4711 4709 return PTR_ERR(rdev); 4712 4710 } 4713 4711 err = bind_rdev_to_array(rdev, mddev); 4714 4712 out: 4715 4713 if (err) 4716 4714 export_rdev(rdev, mddev); 4717 - mddev_unlock(mddev); 4715 + mddev_unlock_and_resume(mddev); 4718 4716 if (!err) 4719 4717 md_new_event(); 4720 4718 return err ? err : len; ··· 6651 6649 if (IS_ERR(mddev)) 6652 6650 break; 6653 6651 6654 - if (mddev_lock(mddev)) 6652 + if (mddev_suspend_and_lock(mddev)) 6655 6653 pr_warn("md: %s locked, cannot run\n", mdname(mddev)); 6656 6654 else if (mddev->raid_disks || mddev->major_version 6657 6655 || !list_empty(&mddev->disks)) { 6658 6656 pr_warn("md: %s already running, cannot run %pg\n", 6659 6657 mdname(mddev), rdev0->bdev); 6660 - mddev_unlock(mddev); 6658 + mddev_unlock_and_resume(mddev); 6661 6659 } else { 6662 6660 pr_debug("md: created %s\n", mdname(mddev)); 6663 6661 mddev->persistent = 1; ··· 6667 6665 export_rdev(rdev, mddev); 6668 6666 } 6669 6667 autorun_array(mddev); 6670 - mddev_unlock(mddev); 6668 + mddev_unlock_and_resume(mddev); 6671 6669 } 6672 6670 /* on success, candidates will be empty, on error 6673 6671 * it won't...