mirror of https://gitee.com/openkylin/linux.git
[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:
parent
9e653b6342
commit
45dc2de1e5
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue