All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] raid0: fix set_disk_faulty doesn't return -EBUSY
@ 2023-03-21  8:56 Wu Guanghao
  2023-03-21 10:18 ` Mariusz Tkaczyk
  0 siblings, 1 reply; 5+ messages in thread
From: Wu Guanghao @ 2023-03-21  8:56 UTC (permalink / raw)
  To: song, linux-raid; +Cc: liuzhiqiang (I), louhongxiang

The latest kernel version will not report an error through mdadm set_disk_faulty.

$ lsblk
sdb                                           8:16   0   10G  0 disk
└─md0                                         9:0    0 19.9G  0 raid0
sdc                                           8:32   0   10G  0 disk
└─md0                                         9:0    0 19.9G  0 raid0

old kernel:
...
$ mdadm /dev/md0 -f /dev/sdb
mdadm: set device faulty failed for /dev/sdb:  Device or resource busy
...

latest kernel:
...
$ mdadm /dev/md0 -f /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
...

The old kernel judges whether the Faulty flag is set in rdev->flags,
and returns -EBUSY if not. And The latest kernel only return -EBUSY
if the MD_BROKEN flag is set in mddev->flags. raid0 doesn't set error_handler,
so MD_BROKEN will not be set, it will return 0.

So if error_handler isn't set for a raid type, also return -EBUSY.

Fixes: 9631abdbf406 ("md: Set MD_BROKEN for RAID1 and RAID10")
Signed-off-by: Wu Guanghao <wuguanghao3@huawei.com>
---
 drivers/md/md.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/md/md.c b/drivers/md/md.c
index 927a43db5dfb..b1786ff60d97 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -2928,10 +2928,10 @@ state_store(struct md_rdev *rdev, const char *buf, size_t len)
        int err = -EINVAL;
        bool need_update_sb = false;

-       if (cmd_match(buf, "faulty") && rdev->mddev->pers) {
-               md_error(rdev->mddev, rdev);
+       if (cmd_match(buf, "faulty") && mddev->pers) {
+               md_error(mddev, rdev);

-               if (test_bit(MD_BROKEN, &rdev->mddev->flags))
+               if (!mddev->pers->error_handler || test_bit(MD_BROKEN, &mddev->flags))
                        err = -EBUSY;
                else
                        err = 0;
@@ -7421,7 +7421,7 @@ static int set_disk_faulty(struct mddev *mddev, dev_t dev)
                err =  -ENODEV;
        else {
                md_error(mddev, rdev);
-               if (test_bit(MD_BROKEN, &mddev->flags))
+               if (!mddev->pers->error_handler || test_bit(MD_BROKEN, &mddev->flags))
                        err = -EBUSY;
        }
        rcu_read_unlock();
--
2.27.0
.

^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2023-03-22  8:38 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-21  8:56 [PATCH] raid0: fix set_disk_faulty doesn't return -EBUSY Wu Guanghao
2023-03-21 10:18 ` Mariusz Tkaczyk
2023-03-22  2:24   ` Wu Guanghao
2023-03-22  7:05     ` Mariusz Tkaczyk
2023-03-22  8:38       ` Wu Guanghao

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.