[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>
This commit is contained in:
NeilBrown 2006-06-26 00:27:58 -07:00 committed by Linus Torvalds
parent 9e653b6342
commit 45dc2de1e5
2 changed files with 28 additions and 1 deletions

View File

@ -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

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