Skip to content

Commit 09f894a

Browse files
mtkaczykliu-song-6
authored andcommitted
md: do not require mddev_lock() for all options in array_state_store()
We don't need to lock device to reject not supported request in array_state_store(). No functional changes intended. There are differences between ioctl and sysfs handling during stopping. With this change, it will be easier to add additional steps which needs to be completed before mddev_lock() is taken. Reviewed-by: Yu Kuai <yukuai3@huawei.com> Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com> Signed-off-by: Song Liu <song@kernel.org> Link: https://lore.kernel.org/r/20230928125517.12356-1-mariusz.tkaczyk@linux.intel.com
1 parent cf1b6d4 commit 09f894a

1 file changed

Lines changed: 20 additions & 17 deletions

File tree

drivers/md/md.c

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4415,6 +4415,18 @@ array_state_store(struct mddev *mddev, const char *buf, size_t len)
44154415
int err = 0;
44164416
enum array_state st = match_word(buf, array_states);
44174417

4418+
/* No lock dependent actions */
4419+
switch (st) {
4420+
case suspended: /* not supported yet */
4421+
case write_pending: /* cannot be set */
4422+
case active_idle: /* cannot be set */
4423+
case broken: /* cannot be set */
4424+
case bad_word:
4425+
return -EINVAL;
4426+
default:
4427+
break;
4428+
}
4429+
44184430
if (mddev->pers && (st == active || st == clean) &&
44194431
mddev->ro != MD_RDONLY) {
44204432
/* don't take reconfig_mutex when toggling between
@@ -4439,23 +4451,16 @@ array_state_store(struct mddev *mddev, const char *buf, size_t len)
44394451
err = mddev_lock(mddev);
44404452
if (err)
44414453
return err;
4442-
err = -EINVAL;
4443-
switch(st) {
4444-
case bad_word:
4445-
break;
4446-
case clear:
4447-
/* stopping an active array */
4448-
err = do_md_stop(mddev, 0, NULL);
4449-
break;
4454+
4455+
switch (st) {
44504456
case inactive:
4451-
/* stopping an active array */
4457+
/* stop an active array, return 0 otherwise */
44524458
if (mddev->pers)
44534459
err = do_md_stop(mddev, 2, NULL);
4454-
else
4455-
err = 0; /* already inactive */
44564460
break;
4457-
case suspended:
4458-
break; /* not supported yet */
4461+
case clear:
4462+
err = do_md_stop(mddev, 0, NULL);
4463+
break;
44594464
case readonly:
44604465
if (mddev->pers)
44614466
err = md_set_readonly(mddev, NULL);
@@ -4506,10 +4511,8 @@ array_state_store(struct mddev *mddev, const char *buf, size_t len)
45064511
err = do_md_run(mddev);
45074512
}
45084513
break;
4509-
case write_pending:
4510-
case active_idle:
4511-
case broken:
4512-
/* these cannot be set */
4514+
default:
4515+
err = -EINVAL;
45134516
break;
45144517
}
45154518

0 commit comments

Comments
 (0)