lkml.org 
[lkml]   [2021]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 265/917] md: update superblock after changing rdev flags in state_store
    Date
    From: Xiao Ni <xni@redhat.com>

    [ Upstream commit 8b9e2291e355a0eafdd5b1e21a94a6659f24b351 ]

    When the in memory flag is changed, we need to persist the change in the
    rdev superblock flags. This is needed for "writemostly" and "failfast".

    Reviewed-by: Li Feng <fengli@smartx.com>
    Signed-off-by: Xiao Ni <xni@redhat.com>
    Signed-off-by: Song Liu <songliubraving@fb.com>
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/md/md.c | 11 ++++++++++-
    1 file changed, 10 insertions(+), 1 deletion(-)

    diff --git a/drivers/md/md.c b/drivers/md/md.c
    index 6c0c3d0d905aa..e89eb467f1429 100644
    --- a/drivers/md/md.c
    +++ b/drivers/md/md.c
    @@ -2976,7 +2976,11 @@ state_store(struct md_rdev *rdev, const char *buf, size_t len)
    * -write_error - clears WriteErrorSeen
    * {,-}failfast - set/clear FailFast
    */
    +
    + struct mddev *mddev = rdev->mddev;
    int err = -EINVAL;
    + bool need_update_sb = false;
    +
    if (cmd_match(buf, "faulty") && rdev->mddev->pers) {
    md_error(rdev->mddev, rdev);
    if (test_bit(Faulty, &rdev->flags))
    @@ -2991,7 +2995,6 @@ state_store(struct md_rdev *rdev, const char *buf, size_t len)
    if (rdev->raid_disk >= 0)
    err = -EBUSY;
    else {
    - struct mddev *mddev = rdev->mddev;
    err = 0;
    if (mddev_is_clustered(mddev))
    err = md_cluster_ops->remove_disk(mddev, rdev);
    @@ -3008,10 +3011,12 @@ state_store(struct md_rdev *rdev, const char *buf, size_t len)
    } else if (cmd_match(buf, "writemostly")) {
    set_bit(WriteMostly, &rdev->flags);
    mddev_create_serial_pool(rdev->mddev, rdev, false);
    + need_update_sb = true;
    err = 0;
    } else if (cmd_match(buf, "-writemostly")) {
    mddev_destroy_serial_pool(rdev->mddev, rdev, false);
    clear_bit(WriteMostly, &rdev->flags);
    + need_update_sb = true;
    err = 0;
    } else if (cmd_match(buf, "blocked")) {
    set_bit(Blocked, &rdev->flags);
    @@ -3037,9 +3042,11 @@ state_store(struct md_rdev *rdev, const char *buf, size_t len)
    err = 0;
    } else if (cmd_match(buf, "failfast")) {
    set_bit(FailFast, &rdev->flags);
    + need_update_sb = true;
    err = 0;
    } else if (cmd_match(buf, "-failfast")) {
    clear_bit(FailFast, &rdev->flags);
    + need_update_sb = true;
    err = 0;
    } else if (cmd_match(buf, "-insync") && rdev->raid_disk >= 0 &&
    !test_bit(Journal, &rdev->flags)) {
    @@ -3118,6 +3125,8 @@ state_store(struct md_rdev *rdev, const char *buf, size_t len)
    clear_bit(ExternalBbl, &rdev->flags);
    err = 0;
    }
    + if (need_update_sb)
    + md_update_sb(mddev, 1);
    if (!err)
    sysfs_notify_dirent_safe(rdev->sysfs_state);
    return err ? err : len;
    --
    2.33.0


    \
     
     \ /
      Last update: 2021-11-16 00:34    [W:2.089 / U:1.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site