> On Aug 22, 2019, at 9:13 AM, Guilherme G. Piccoli <gpicc...@canonical.com>
> wrote:
>
> Currently md raid0/linear are not provided with any mechanism to validate
> if an array member got removed or failed. The driver keeps sending BIOs
> regardless of the state of array members, and kernel shows state 'clean'
> in the 'array_state' sysfs attribute. This leads to the following
> situation: if a raid0/linear array member is removed and the array is
> mounted, some user writing to this array won't realize that errors are
> happening unless they check dmesg or perform one fsync per written file.
> Despite udev signaling the member device is gone, 'mdadm' cannot issue the
> STOP_ARRAY ioctl successfully, given the array is mounted.
[...]
> drivers/md/md-linear.c | 9 +++++++++
> drivers/md/md.c | 22 ++++++++++++++++++----
> drivers/md/md.h | 3 +++
> drivers/md/raid0.c | 10 ++++++++++
> 4 files changed, 40 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/md/md-linear.c b/drivers/md/md-linear.c
> index 7354466ddc90..0479ccdbdeeb 100644
> --- a/drivers/md/md-linear.c
> +++ b/drivers/md/md-linear.c
> @@ -258,6 +258,15 @@ static bool linear_make_request(struct mddev *mddev,
> struct bio *bio)
> bio_sector < start_sector))
> goto out_of_bounds;
>
> + if (unlikely(!(tmp_dev->rdev->bdev->bd_disk->flags & GENHD_FL_UP))) {
> + if (!test_bit(MD_BROKEN, &mddev->flags))
> + pr_warn("md: %s: linear array has a missing/failed
> member\n",
> + mdname(mddev));
> + set_bit(MD_BROKEN, &mddev->flags);
> + bio_io_error(bio);
> + return true;
> + }
> +
Maybe we can somehow put this block in a helper and use it in both raid0
and linear code?
Otherwise, looks good to me.
Thanks,
Song