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

Bug#601198: mdadm: Says it sets faulty even when it actually doesn't



found 601198 linux-2.6/2.6.32-41
tags 601198 + patch moreinfo
quit

Hi Mike,

Mike Hommey wrote:

> Just had this scary experience this morning, where I thought I did
> something really wrong, being that I setted faulty the only remaining
> active device from a raid 1 array during recovery, when I meant to
> set the other one faulty:
[...]
> # mdadm --set-faulty /dev/md0 /dev/sdb2
> mdadm: set /dev/sdb2 faulty in /dev/md0
>
> Here I thought I was screwed, but it turns out it really didn't happen.
>
> For people's blood pressure, it would better if it managed to say it
> failed doing the requested operation.

Said to be fixed by v3.1-rc5~4^2~5 (md: report failure if a 'set
faulty' request doesn't, 2011-08-25).

Do you think this is worth fixing in squeeze?  If so, please test the
attached patch.

Thanks,
Jonathan
From: NeilBrown <neilb@suse.de>
Date: Thu, 25 Aug 2011 14:42:51 +1000
Subject: md: report failure if a 'set faulty' request doesn't.

commit 5ef56c8fecedf403a346d02140e52a072d693d6b upstream.

Sometimes a device will refuse to be set faulty.  e.g. RAID1 will
never let the last working device become faulty.

So check if "md_error()" did manage to set the faulty flag and fail
with EBUSY if it didn't.

Resolves-Debian-Bug: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=601198
Reported-by: Mike Hommey <mh+reportbug@glandium.org>
Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 drivers/md/md.c |    7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/md/md.c b/drivers/md/md.c
index 4ce6e2fa4b53..f585062e7204 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -2180,7 +2180,10 @@ state_store(mdk_rdev_t *rdev, const char *buf, size_t len)
 	int err = -EINVAL;
 	if (cmd_match(buf, "faulty") && rdev->mddev->pers) {
 		md_error(rdev->mddev, rdev);
-		err = 0;
+		if (test_bit(Faulty, &rdev->flags))
+			err = 0;
+		else
+			err = -EBUSY;
 	} else if (cmd_match(buf, "remove")) {
 		if (rdev->raid_disk >= 0)
 			err = -EBUSY;
@@ -5321,6 +5324,8 @@ static int set_disk_faulty(mddev_t *mddev, dev_t dev)
 		return -ENODEV;
 
 	md_error(mddev, rdev);
+	if (!test_bit(Faulty, &rdev->flags))
+		return -EBUSY;
 	return 0;
 }
 
-- 
1.7.10.rc1


Reply to: