|
@@ -3588,8 +3588,18 @@ static void handle_stripe(struct stripe_head *sh)
|
|
|
|
|
|
finish:
|
|
|
/* wait for this device to become unblocked */
|
|
|
- if (conf->mddev->external && unlikely(s.blocked_rdev))
|
|
|
- md_wait_for_blocked_rdev(s.blocked_rdev, conf->mddev);
|
|
|
+ if (unlikely(s.blocked_rdev)) {
|
|
|
+ if (conf->mddev->external)
|
|
|
+ md_wait_for_blocked_rdev(s.blocked_rdev,
|
|
|
+ conf->mddev);
|
|
|
+ else
|
|
|
+ /* Internal metadata will immediately
|
|
|
+ * be written by raid5d, so we don't
|
|
|
+ * need to wait here.
|
|
|
+ */
|
|
|
+ rdev_dec_pending(s.blocked_rdev,
|
|
|
+ conf->mddev);
|
|
|
+ }
|
|
|
|
|
|
if (s.handle_bad_blocks)
|
|
|
for (i = disks; i--; ) {
|