[PATCH] md: Allow rdev state to be set via sysfs
authorNeilBrown <neilb@suse.de>
Mon, 26 Jun 2006 07:27:58 +0000 (00:27 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Mon, 26 Jun 2006 16:58:39 +0000 (09:58 -0700)
The md/dev-XXX/state file can now be written:

 "faulty" simulates an error on the device
 "remove" removes the device from the array (if it is not busy)

Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Documentation/md.txt
drivers/md/md.c

index df0b455..4cf5972 100644 (file)
@@ -302,6 +302,9 @@ Each directory contains:
                         This includes spares that are in the process
                         of being recoverred to
        This list make grow in future.
                         This includes spares that are in the process
                         of being recoverred to
        This list make grow in future.
+       This can be written to.
+       Writing "faulty"  simulates a failure on the device.
+       Writing "remove" removes the device from the array.
 
       errors
        An approximate count of read errors that have been detected on
 
       errors
        An approximate count of read errors that have been detected on
index f6562ee..4b74c77 100644 (file)
@@ -1745,8 +1745,32 @@ state_show(mdk_rdev_t *rdev, char *page)
        return len+sprintf(page+len, "\n");
 }
 
        return len+sprintf(page+len, "\n");
 }
 
+static ssize_t
+state_store(mdk_rdev_t *rdev, const char *buf, size_t len)
+{
+       /* can write
+        *  faulty  - simulates and error
+        *  remove  - disconnects the device
+        */
+       int err = -EINVAL;
+       if (cmd_match(buf, "faulty") && rdev->mddev->pers) {
+               md_error(rdev->mddev, rdev);
+               err = 0;
+       } else if (cmd_match(buf, "remove")) {
+               if (rdev->raid_disk >= 0)
+                       err = -EBUSY;
+               else {
+                       mddev_t *mddev = rdev->mddev;
+                       kick_rdev_from_array(rdev);
+                       md_update_sb(mddev);
+                       md_new_event(mddev);
+                       err = 0;
+               }
+       }
+       return err ? err : len;
+}
 static struct rdev_sysfs_entry
 static struct rdev_sysfs_entry
-rdev_state = __ATTR_RO(state);
+rdev_state = __ATTR(state, 0644, state_show, state_store);
 
 static ssize_t
 super_show(mdk_rdev_t *rdev, char *page)
 
 static ssize_t
 super_show(mdk_rdev_t *rdev, char *page)