md: add 'write_error' flag to component devices.
If a device has ever seen a write error, we will want to handle known-bad-blocks differently. So create an appropriate state flag and export it via sysfs. Signed-off-by: NeilBrown <neilb@suse.de> Reviewed-by: Namhyung Kim <namhyung@gmail.com>
This commit is contained in:
parent
06f603851f
commit
d7a9d443bc
@ -2516,6 +2516,10 @@ state_show(mdk_rdev_t *rdev, char *page)
|
||||
len += sprintf(page+len, "%sspare", sep);
|
||||
sep = ",";
|
||||
}
|
||||
if (test_bit(WriteErrorSeen, &rdev->flags)) {
|
||||
len += sprintf(page+len, "%swrite_error", sep);
|
||||
sep = ",";
|
||||
}
|
||||
return len+sprintf(page+len, "\n");
|
||||
}
|
||||
|
||||
@ -2530,6 +2534,8 @@ state_store(mdk_rdev_t *rdev, const char *buf, size_t len)
|
||||
* blocked - sets the Blocked flag
|
||||
* -blocked - clears the Blocked flag
|
||||
* insync - sets Insync providing device isn't active
|
||||
* write_error - sets WriteErrorSeen
|
||||
* -write_error - clears WriteErrorSeen
|
||||
*/
|
||||
int err = -EINVAL;
|
||||
if (cmd_match(buf, "faulty") && rdev->mddev->pers) {
|
||||
@ -2565,6 +2571,12 @@ state_store(mdk_rdev_t *rdev, const char *buf, size_t len)
|
||||
} else if (cmd_match(buf, "insync") && rdev->raid_disk == -1) {
|
||||
set_bit(In_sync, &rdev->flags);
|
||||
err = 0;
|
||||
} else if (cmd_match(buf, "write_error")) {
|
||||
set_bit(WriteErrorSeen, &rdev->flags);
|
||||
err = 0;
|
||||
} else if (cmd_match(buf, "-write_error")) {
|
||||
clear_bit(WriteErrorSeen, &rdev->flags);
|
||||
err = 0;
|
||||
}
|
||||
if (!err)
|
||||
sysfs_notify_dirent_safe(rdev->sysfs_state);
|
||||
|
@ -84,6 +84,9 @@ struct mdk_rdev_s
|
||||
#define Blocked 8 /* An error occurred on an externally
|
||||
* managed array, don't allow writes
|
||||
* until it is cleared */
|
||||
#define WriteErrorSeen 9 /* A write error has been seen on this
|
||||
* device
|
||||
*/
|
||||
wait_queue_head_t blocked_wait;
|
||||
|
||||
int desc_nr; /* descriptor index in the superblock */
|
||||
|
Loading…
Reference in New Issue
Block a user