Commit 12fcf66e authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/shli/md

Pull MD fixes from Shaohua Li:
 "Two small patches to fix long-lived raid5 stripe batch bugs, one from
  Dennis and the other from me"

* 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/shli/md:
  md/raid5: preserve STRIPE_ON_UNPLUG_LIST in break_stripe_batch_list
  md/raid5: fix a race condition in stripe batch
parents 24420862 184a09eb
...@@ -811,6 +811,14 @@ static void stripe_add_to_batch_list(struct r5conf *conf, struct stripe_head *sh ...@@ -811,6 +811,14 @@ static void stripe_add_to_batch_list(struct r5conf *conf, struct stripe_head *sh
spin_unlock(&head->batch_head->batch_lock); spin_unlock(&head->batch_head->batch_lock);
goto unlock_out; goto unlock_out;
} }
/*
* We must assign batch_head of this stripe within the
* batch_lock, otherwise clear_batch_ready of batch head
* stripe could clear BATCH_READY bit of this stripe and
* this stripe->batch_head doesn't get assigned, which
* could confuse clear_batch_ready for this stripe
*/
sh->batch_head = head->batch_head;
/* /*
* at this point, head's BATCH_READY could be cleared, but we * at this point, head's BATCH_READY could be cleared, but we
...@@ -818,8 +826,6 @@ static void stripe_add_to_batch_list(struct r5conf *conf, struct stripe_head *sh ...@@ -818,8 +826,6 @@ static void stripe_add_to_batch_list(struct r5conf *conf, struct stripe_head *sh
*/ */
list_add(&sh->batch_list, &head->batch_list); list_add(&sh->batch_list, &head->batch_list);
spin_unlock(&head->batch_head->batch_lock); spin_unlock(&head->batch_head->batch_lock);
sh->batch_head = head->batch_head;
} else { } else {
head->batch_head = head; head->batch_head = head;
sh->batch_head = head->batch_head; sh->batch_head = head->batch_head;
...@@ -4599,7 +4605,8 @@ static void break_stripe_batch_list(struct stripe_head *head_sh, ...@@ -4599,7 +4605,8 @@ static void break_stripe_batch_list(struct stripe_head *head_sh,
set_mask_bits(&sh->state, ~(STRIPE_EXPAND_SYNC_FLAGS | set_mask_bits(&sh->state, ~(STRIPE_EXPAND_SYNC_FLAGS |
(1 << STRIPE_PREREAD_ACTIVE) | (1 << STRIPE_PREREAD_ACTIVE) |
(1 << STRIPE_DEGRADED)), (1 << STRIPE_DEGRADED) |
(1 << STRIPE_ON_UNPLUG_LIST)),
head_sh->state & (1 << STRIPE_INSYNC)); head_sh->state & (1 << STRIPE_INSYNC));
sh->check_state = head_sh->check_state; sh->check_state = head_sh->check_state;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment