|
@@ -3534,10 +3534,27 @@ unhash:
|
|
|
struct stripe_head, batch_list);
|
|
|
list_del_init(&sh->batch_list);
|
|
|
|
|
|
- set_mask_bits(&sh->state, ~STRIPE_EXPAND_SYNC_FLAG,
|
|
|
- head_sh->state & ~((1 << STRIPE_ACTIVE) |
|
|
|
- (1 << STRIPE_PREREAD_ACTIVE) |
|
|
|
- STRIPE_EXPAND_SYNC_FLAG));
|
|
|
+ WARN_ON_ONCE(sh->state & ((1 << STRIPE_ACTIVE) |
|
|
|
+ (1 << STRIPE_SYNCING) |
|
|
|
+ (1 << STRIPE_REPLACED) |
|
|
|
+ (1 << STRIPE_PREREAD_ACTIVE) |
|
|
|
+ (1 << STRIPE_DELAYED) |
|
|
|
+ (1 << STRIPE_BIT_DELAY) |
|
|
|
+ (1 << STRIPE_FULL_WRITE) |
|
|
|
+ (1 << STRIPE_BIOFILL_RUN) |
|
|
|
+ (1 << STRIPE_COMPUTE_RUN) |
|
|
|
+ (1 << STRIPE_OPS_REQ_PENDING) |
|
|
|
+ (1 << STRIPE_DISCARD) |
|
|
|
+ (1 << STRIPE_BATCH_READY) |
|
|
|
+ (1 << STRIPE_BATCH_ERR) |
|
|
|
+ (1 << STRIPE_BITMAP_PENDING)));
|
|
|
+ WARN_ON_ONCE(head_sh->state & ((1 << STRIPE_DISCARD) |
|
|
|
+ (1 << STRIPE_REPLACED)));
|
|
|
+
|
|
|
+ set_mask_bits(&sh->state, ~(STRIPE_EXPAND_SYNC_FLAGS |
|
|
|
+ (1 << STRIPE_DEGRADED)),
|
|
|
+ head_sh->state & (1 << STRIPE_INSYNC));
|
|
|
+
|
|
|
sh->check_state = head_sh->check_state;
|
|
|
sh->reconstruct_state = head_sh->reconstruct_state;
|
|
|
for (i = 0; i < sh->disks; i++) {
|
|
@@ -3549,7 +3566,7 @@ unhash:
|
|
|
spin_lock_irq(&sh->stripe_lock);
|
|
|
sh->batch_head = NULL;
|
|
|
spin_unlock_irq(&sh->stripe_lock);
|
|
|
- if (sh->state & STRIPE_EXPAND_SYNC_FLAG)
|
|
|
+ if (sh->state & STRIPE_EXPAND_SYNC_FLAGS)
|
|
|
set_bit(STRIPE_HANDLE, &sh->state);
|
|
|
release_stripe(sh);
|
|
|
}
|
|
@@ -3559,7 +3576,7 @@ unhash:
|
|
|
spin_unlock_irq(&head_sh->stripe_lock);
|
|
|
if (wakeup_nr)
|
|
|
wake_up(&conf->wait_for_overlap);
|
|
|
- if (head_sh->state & STRIPE_EXPAND_SYNC_FLAG)
|
|
|
+ if (head_sh->state & STRIPE_EXPAND_SYNC_FLAGS)
|
|
|
set_bit(STRIPE_HANDLE, &head_sh->state);
|
|
|
}
|
|
|
|
|
@@ -4246,11 +4263,27 @@ static void break_stripe_batch_list(struct stripe_head *head_sh,
|
|
|
|
|
|
list_del_init(&sh->batch_list);
|
|
|
|
|
|
- set_mask_bits(&sh->state, ~STRIPE_EXPAND_SYNC_FLAG,
|
|
|
- head_sh->state & ~((1 << STRIPE_ACTIVE) |
|
|
|
- (1 << STRIPE_PREREAD_ACTIVE) |
|
|
|
- (1 << STRIPE_DEGRADED) |
|
|
|
- STRIPE_EXPAND_SYNC_FLAG));
|
|
|
+ WARN_ON_ONCE(sh->state & ((1 << STRIPE_ACTIVE) |
|
|
|
+ (1 << STRIPE_SYNCING) |
|
|
|
+ (1 << STRIPE_REPLACED) |
|
|
|
+ (1 << STRIPE_PREREAD_ACTIVE) |
|
|
|
+ (1 << STRIPE_DELAYED) |
|
|
|
+ (1 << STRIPE_BIT_DELAY) |
|
|
|
+ (1 << STRIPE_FULL_WRITE) |
|
|
|
+ (1 << STRIPE_BIOFILL_RUN) |
|
|
|
+ (1 << STRIPE_COMPUTE_RUN) |
|
|
|
+ (1 << STRIPE_OPS_REQ_PENDING) |
|
|
|
+ (1 << STRIPE_DISCARD) |
|
|
|
+ (1 << STRIPE_BATCH_READY) |
|
|
|
+ (1 << STRIPE_BATCH_ERR) |
|
|
|
+ (1 << STRIPE_BITMAP_PENDING)));
|
|
|
+ WARN_ON_ONCE(head_sh->state & ((1 << STRIPE_DISCARD) |
|
|
|
+ (1 << STRIPE_REPLACED)));
|
|
|
+
|
|
|
+ set_mask_bits(&sh->state, ~(STRIPE_EXPAND_SYNC_FLAGS |
|
|
|
+ (1 << STRIPE_DEGRADED)),
|
|
|
+ head_sh->state & (1 << STRIPE_INSYNC));
|
|
|
+
|
|
|
sh->check_state = head_sh->check_state;
|
|
|
sh->reconstruct_state = head_sh->reconstruct_state;
|
|
|
for (i = 0; i < sh->disks; i++) {
|