aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2011-07-27 21:31:48 -0400
committerNeilBrown <neilb@suse.de>2011-07-27 21:31:48 -0400
commitd7a9d443bc8a75a24873c0506f50051edfedc714 (patch)
tree6255771f6cca87698dcc8eb11d62e7fc217b8d0b /drivers/md
parent06f603851fa90bcd236328438278d4dc8b655495 (diff)
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>
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/md.c12
-rw-r--r--drivers/md/md.h3
2 files changed, 15 insertions, 0 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 48217e8aa0e..1520d18c5af 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -2516,6 +2516,10 @@ state_show(mdk_rdev_t *rdev, char *page)
2516 len += sprintf(page+len, "%sspare", sep); 2516 len += sprintf(page+len, "%sspare", sep);
2517 sep = ","; 2517 sep = ",";
2518 } 2518 }
2519 if (test_bit(WriteErrorSeen, &rdev->flags)) {
2520 len += sprintf(page+len, "%swrite_error", sep);
2521 sep = ",";
2522 }
2519 return len+sprintf(page+len, "\n"); 2523 return len+sprintf(page+len, "\n");
2520} 2524}
2521 2525
@@ -2530,6 +2534,8 @@ state_store(mdk_rdev_t *rdev, const char *buf, size_t len)
2530 * blocked - sets the Blocked flag 2534 * blocked - sets the Blocked flag
2531 * -blocked - clears the Blocked flag 2535 * -blocked - clears the Blocked flag
2532 * insync - sets Insync providing device isn't active 2536 * insync - sets Insync providing device isn't active
2537 * write_error - sets WriteErrorSeen
2538 * -write_error - clears WriteErrorSeen
2533 */ 2539 */
2534 int err = -EINVAL; 2540 int err = -EINVAL;
2535 if (cmd_match(buf, "faulty") && rdev->mddev->pers) { 2541 if (cmd_match(buf, "faulty") && rdev->mddev->pers) {
@@ -2565,6 +2571,12 @@ state_store(mdk_rdev_t *rdev, const char *buf, size_t len)
2565 } else if (cmd_match(buf, "insync") && rdev->raid_disk == -1) { 2571 } else if (cmd_match(buf, "insync") && rdev->raid_disk == -1) {
2566 set_bit(In_sync, &rdev->flags); 2572 set_bit(In_sync, &rdev->flags);
2567 err = 0; 2573 err = 0;
2574 } else if (cmd_match(buf, "write_error")) {
2575 set_bit(WriteErrorSeen, &rdev->flags);
2576 err = 0;
2577 } else if (cmd_match(buf, "-write_error")) {
2578 clear_bit(WriteErrorSeen, &rdev->flags);
2579 err = 0;
2568 } 2580 }
2569 if (!err) 2581 if (!err)
2570 sysfs_notify_dirent_safe(rdev->sysfs_state); 2582 sysfs_notify_dirent_safe(rdev->sysfs_state);
diff --git a/drivers/md/md.h b/drivers/md/md.h
index 7c3192c0a29..fa4b607854a 100644
--- a/drivers/md/md.h
+++ b/drivers/md/md.h
@@ -84,6 +84,9 @@ struct mdk_rdev_s
84#define Blocked 8 /* An error occurred on an externally 84#define Blocked 8 /* An error occurred on an externally
85 * managed array, don't allow writes 85 * managed array, don't allow writes
86 * until it is cleared */ 86 * until it is cleared */
87#define WriteErrorSeen 9 /* A write error has been seen on this
88 * device
89 */
87 wait_queue_head_t blocked_wait; 90 wait_queue_head_t blocked_wait;
88 91
89 int desc_nr; /* descriptor index in the superblock */ 92 int desc_nr; /* descriptor index in the superblock */