瀏覽代碼

[PATCH] md: Allow rdev state to be set via sysfs

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>
NeilBrown 19 年之前
父節點
當前提交
45dc2de1e5
共有 2 個文件被更改,包括 28 次插入1 次删除
  1. 3 0
      Documentation/md.txt
  2. 25 1
      drivers/md/md.c

+ 3 - 0
Documentation/md.txt

@@ -302,6 +302,9 @@ Each directory contains:
 			 This includes spares that are in the process
 			 This includes spares that are in the process
 			 of being recoverred to
 			 of being recoverred to
 	This list make grow in future.
 	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
       errors
 	An approximate count of read errors that have been detected on
 	An approximate count of read errors that have been detected on

+ 25 - 1
drivers/md/md.c

@@ -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
 static ssize_t
 super_show(mdk_rdev_t *rdev, char *page)
 super_show(mdk_rdev_t *rdev, char *page)