diff options
author | NeilBrown <neilb@suse.de> | 2006-06-26 09:27:58 +0200 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-26 18:58:39 +0200 |
commit | 45dc2de1e53a29f898b81326b8a16e6192d52e4e (patch) | |
tree | a1076950eef59cbe525435522d83757390f23c42 | |
parent | [PATCH] md: Set/get state of array via sysfs (diff) | |
download | linux-45dc2de1e53a29f898b81326b8a16e6192d52e4e.tar.xz linux-45dc2de1e53a29f898b81326b8a16e6192d52e4e.zip |
[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>
-rw-r--r-- | Documentation/md.txt | 3 | ||||
-rw-r--r-- | drivers/md/md.c | 26 |
2 files changed, 28 insertions, 1 deletions
diff --git a/Documentation/md.txt b/Documentation/md.txt index df0b45515775..4cf5972821a9 100644 --- a/Documentation/md.txt +++ b/Documentation/md.txt @@ -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 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 diff --git a/drivers/md/md.c b/drivers/md/md.c index f6562ee4c6fc..4b74c77213c3 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -1745,8 +1745,32 @@ state_show(mdk_rdev_t *rdev, char *page) 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 -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) |