Skip to content

Commit 2338c35

Browse files
XiaoNi87gregkh
authored andcommitted
md: update superblock after changing rdev flags in state_store
[ Upstream commit 8b9e229 ] 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>
1 parent b34ea3c commit 2338c35

1 file changed

Lines changed: 10 additions & 1 deletion

File tree

drivers/md/md.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3024,7 +3024,11 @@ state_store(struct md_rdev *rdev, const char *buf, size_t len)
30243024
* -write_error - clears WriteErrorSeen
30253025
* {,-}failfast - set/clear FailFast
30263026
*/
3027+
3028+
struct mddev *mddev = rdev->mddev;
30273029
int err = -EINVAL;
3030+
bool need_update_sb = false;
3031+
30283032
if (cmd_match(buf, "faulty") && rdev->mddev->pers) {
30293033
md_error(rdev->mddev, rdev);
30303034
if (test_bit(Faulty, &rdev->flags))
@@ -3039,7 +3043,6 @@ state_store(struct md_rdev *rdev, const char *buf, size_t len)
30393043
if (rdev->raid_disk >= 0)
30403044
err = -EBUSY;
30413045
else {
3042-
struct mddev *mddev = rdev->mddev;
30433046
err = 0;
30443047
if (mddev_is_clustered(mddev))
30453048
err = md_cluster_ops->remove_disk(mddev, rdev);
@@ -3056,10 +3059,12 @@ state_store(struct md_rdev *rdev, const char *buf, size_t len)
30563059
} else if (cmd_match(buf, "writemostly")) {
30573060
set_bit(WriteMostly, &rdev->flags);
30583061
mddev_create_serial_pool(rdev->mddev, rdev, false);
3062+
need_update_sb = true;
30593063
err = 0;
30603064
} else if (cmd_match(buf, "-writemostly")) {
30613065
mddev_destroy_serial_pool(rdev->mddev, rdev, false);
30623066
clear_bit(WriteMostly, &rdev->flags);
3067+
need_update_sb = true;
30633068
err = 0;
30643069
} else if (cmd_match(buf, "blocked")) {
30653070
set_bit(Blocked, &rdev->flags);
@@ -3085,9 +3090,11 @@ state_store(struct md_rdev *rdev, const char *buf, size_t len)
30853090
err = 0;
30863091
} else if (cmd_match(buf, "failfast")) {
30873092
set_bit(FailFast, &rdev->flags);
3093+
need_update_sb = true;
30883094
err = 0;
30893095
} else if (cmd_match(buf, "-failfast")) {
30903096
clear_bit(FailFast, &rdev->flags);
3097+
need_update_sb = true;
30913098
err = 0;
30923099
} else if (cmd_match(buf, "-insync") && rdev->raid_disk >= 0 &&
30933100
!test_bit(Journal, &rdev->flags)) {
@@ -3166,6 +3173,8 @@ state_store(struct md_rdev *rdev, const char *buf, size_t len)
31663173
clear_bit(ExternalBbl, &rdev->flags);
31673174
err = 0;
31683175
}
3176+
if (need_update_sb)
3177+
md_update_sb(mddev, 1);
31693178
if (!err)
31703179
sysfs_notify_dirent_safe(rdev->sysfs_state);
31713180
return err ? err : len;

0 commit comments

Comments
 (0)