md: update superblock after changing rdev flags in state_store
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>
This commit is contained in:
parent
5467948604
commit
8b9e2291e3
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue