Re: [PATCH v2] md: do not require mddev_lock() for all options

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Sep 28, 2023 at 5:55 AM Mariusz Tkaczyk
<mariusz.tkaczyk@xxxxxxxxxxxxxxx> wrote:
>
> 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@xxxxxxxxxx>
> Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@xxxxxxxxxxxxxxx>

Applied to md-next. Thanks!

Song


> ---
> Song, feel free to remove second chapter if you think it is confusing.
>
>  drivers/md/md.c | 37 ++++++++++++++++++++-----------------
>  1 file changed, 20 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/md/md.c b/drivers/md/md.c
> index b8f232840f7c..469b1376e66c 100644
> --- a/drivers/md/md.c
> +++ b/drivers/md/md.c
> @@ -4359,6 +4359,18 @@ array_state_store(struct mddev *mddev, const char *buf, size_t len)
>         int err = 0;
>         enum array_state st = match_word(buf, array_states);
>
> +       /* No lock dependent actions */
> +       switch (st) {
> +       case suspended:         /* not supported yet */
> +       case write_pending:     /* cannot be set */
> +       case active_idle:       /* cannot be set */
> +       case broken:            /* cannot be set */
> +       case bad_word:
> +               return -EINVAL;
> +       default:
> +               break;
> +       }
> +
>         if (mddev->pers && (st == active || st == clean) &&
>             mddev->ro != MD_RDONLY) {
>                 /* don't take reconfig_mutex when toggling between
> @@ -4383,23 +4395,16 @@ array_state_store(struct mddev *mddev, const char *buf, size_t len)
>         err = mddev_lock(mddev);
>         if (err)
>                 return err;
> -       err = -EINVAL;
> -       switch(st) {
> -       case bad_word:
> -               break;
> -       case clear:
> -               /* stopping an active array */
> -               err = do_md_stop(mddev, 0, NULL);
> -               break;
> +
> +       switch (st) {
>         case inactive:
> -               /* stopping an active array */
> +               /* stop an active array, return 0 otherwise */
>                 if (mddev->pers)
>                         err = do_md_stop(mddev, 2, NULL);
> -               else
> -                       err = 0; /* already inactive */
>                 break;
> -       case suspended:
> -               break; /* not supported yet */
> +       case clear:
> +               err = do_md_stop(mddev, 0, NULL);
> +               break;
>         case readonly:
>                 if (mddev->pers)
>                         err = md_set_readonly(mddev, NULL);
> @@ -4450,10 +4455,8 @@ array_state_store(struct mddev *mddev, const char *buf, size_t len)
>                         err = do_md_run(mddev);
>                 }
>                 break;
> -       case write_pending:
> -       case active_idle:
> -       case broken:
> -               /* these cannot be set */
> +       default:
> +               err = -EINVAL;
>                 break;
>         }
>
> --
> 2.26.2
>




[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux