diff options
-rw-r--r-- | drivers/md/md.c | 12 | ||||
-rw-r--r-- | drivers/md/md.h | 3 |
2 files changed, 15 insertions, 0 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 48217e8aa0eb..1520d18c5af5 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 7c3192c0a29a..fa4b607854ac 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 */ |