Ver código fonte

[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 anos atrás
pai
commit
45dc2de1e5
2 arquivos alterados com 28 adições e 1 exclusões
  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)