diff options
Diffstat (limited to 'drivers/md/md.h')
-rw-r--r-- | drivers/md/md.h | 80 |
1 files changed, 48 insertions, 32 deletions
diff --git a/drivers/md/md.h b/drivers/md/md.h index 670c10e6b484..44c63dfeeb2b 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h | |||
@@ -72,34 +72,7 @@ struct md_rdev { | |||
72 | * This reduces the burden of testing multiple flags in many cases | 72 | * This reduces the burden of testing multiple flags in many cases |
73 | */ | 73 | */ |
74 | 74 | ||
75 | unsigned long flags; | 75 | unsigned long flags; /* bit set of 'enum flag_bits' bits. */ |
76 | #define Faulty 1 /* device is known to have a fault */ | ||
77 | #define In_sync 2 /* device is in_sync with rest of array */ | ||
78 | #define WriteMostly 4 /* Avoid reading if at all possible */ | ||
79 | #define AutoDetected 7 /* added by auto-detect */ | ||
80 | #define Blocked 8 /* An error occurred but has not yet | ||
81 | * been acknowledged by the metadata | ||
82 | * handler, so don't allow writes | ||
83 | * until it is cleared */ | ||
84 | #define WriteErrorSeen 9 /* A write error has been seen on this | ||
85 | * device | ||
86 | */ | ||
87 | #define FaultRecorded 10 /* Intermediate state for clearing | ||
88 | * Blocked. The Fault is/will-be | ||
89 | * recorded in the metadata, but that | ||
90 | * metadata hasn't been stored safely | ||
91 | * on disk yet. | ||
92 | */ | ||
93 | #define BlockedBadBlocks 11 /* A writer is blocked because they | ||
94 | * found an unacknowledged bad-block. | ||
95 | * This can safely be cleared at any | ||
96 | * time, and the writer will re-check. | ||
97 | * It may be set at any time, and at | ||
98 | * worst the writer will timeout and | ||
99 | * re-check. So setting it as | ||
100 | * accurately as possible is good, but | ||
101 | * not absolutely critical. | ||
102 | */ | ||
103 | wait_queue_head_t blocked_wait; | 76 | wait_queue_head_t blocked_wait; |
104 | 77 | ||
105 | int desc_nr; /* descriptor index in the superblock */ | 78 | int desc_nr; /* descriptor index in the superblock */ |
@@ -152,6 +125,44 @@ struct md_rdev { | |||
152 | sector_t size; /* in sectors */ | 125 | sector_t size; /* in sectors */ |
153 | } badblocks; | 126 | } badblocks; |
154 | }; | 127 | }; |
128 | enum flag_bits { | ||
129 | Faulty, /* device is known to have a fault */ | ||
130 | In_sync, /* device is in_sync with rest of array */ | ||
131 | WriteMostly, /* Avoid reading if at all possible */ | ||
132 | AutoDetected, /* added by auto-detect */ | ||
133 | Blocked, /* An error occurred but has not yet | ||
134 | * been acknowledged by the metadata | ||
135 | * handler, so don't allow writes | ||
136 | * until it is cleared */ | ||
137 | WriteErrorSeen, /* A write error has been seen on this | ||
138 | * device | ||
139 | */ | ||
140 | FaultRecorded, /* Intermediate state for clearing | ||
141 | * Blocked. The Fault is/will-be | ||
142 | * recorded in the metadata, but that | ||
143 | * metadata hasn't been stored safely | ||
144 | * on disk yet. | ||
145 | */ | ||
146 | BlockedBadBlocks, /* A writer is blocked because they | ||
147 | * found an unacknowledged bad-block. | ||
148 | * This can safely be cleared at any | ||
149 | * time, and the writer will re-check. | ||
150 | * It may be set at any time, and at | ||
151 | * worst the writer will timeout and | ||
152 | * re-check. So setting it as | ||
153 | * accurately as possible is good, but | ||
154 | * not absolutely critical. | ||
155 | */ | ||
156 | WantReplacement, /* This device is a candidate to be | ||
157 | * hot-replaced, either because it has | ||
158 | * reported some faults, or because | ||
159 | * of explicit request. | ||
160 | */ | ||
161 | Replacement, /* This device is a replacement for | ||
162 | * a want_replacement device with same | ||
163 | * raid_disk number. | ||
164 | */ | ||
165 | }; | ||
155 | 166 | ||
156 | #define BB_LEN_MASK (0x00000000000001FFULL) | 167 | #define BB_LEN_MASK (0x00000000000001FFULL) |
157 | #define BB_OFFSET_MASK (0x7FFFFFFFFFFFFE00ULL) | 168 | #define BB_OFFSET_MASK (0x7FFFFFFFFFFFFE00ULL) |
@@ -482,15 +493,20 @@ static inline char * mdname (struct mddev * mddev) | |||
482 | static inline int sysfs_link_rdev(struct mddev *mddev, struct md_rdev *rdev) | 493 | static inline int sysfs_link_rdev(struct mddev *mddev, struct md_rdev *rdev) |
483 | { | 494 | { |
484 | char nm[20]; | 495 | char nm[20]; |
485 | sprintf(nm, "rd%d", rdev->raid_disk); | 496 | if (!test_bit(Replacement, &rdev->flags)) { |
486 | return sysfs_create_link(&mddev->kobj, &rdev->kobj, nm); | 497 | sprintf(nm, "rd%d", rdev->raid_disk); |
498 | return sysfs_create_link(&mddev->kobj, &rdev->kobj, nm); | ||
499 | } else | ||
500 | return 0; | ||
487 | } | 501 | } |
488 | 502 | ||
489 | static inline void sysfs_unlink_rdev(struct mddev *mddev, struct md_rdev *rdev) | 503 | static inline void sysfs_unlink_rdev(struct mddev *mddev, struct md_rdev *rdev) |
490 | { | 504 | { |
491 | char nm[20]; | 505 | char nm[20]; |
492 | sprintf(nm, "rd%d", rdev->raid_disk); | 506 | if (!test_bit(Replacement, &rdev->flags)) { |
493 | sysfs_remove_link(&mddev->kobj, nm); | 507 | sprintf(nm, "rd%d", rdev->raid_disk); |
508 | sysfs_remove_link(&mddev->kobj, nm); | ||
509 | } | ||
494 | } | 510 | } |
495 | 511 | ||
496 | /* | 512 | /* |