aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/raid5.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/raid5.c')
-rw-r--r--drivers/md/raid5.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index 049a958d3c1e..90414a4e0d49 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -811,6 +811,14 @@ static void stripe_add_to_batch_list(struct r5conf *conf, struct stripe_head *sh
811 spin_unlock(&head->batch_head->batch_lock); 811 spin_unlock(&head->batch_head->batch_lock);
812 goto unlock_out; 812 goto unlock_out;
813 } 813 }
814 /*
815 * We must assign batch_head of this stripe within the
816 * batch_lock, otherwise clear_batch_ready of batch head
817 * stripe could clear BATCH_READY bit of this stripe and
818 * this stripe->batch_head doesn't get assigned, which
819 * could confuse clear_batch_ready for this stripe
820 */
821 sh->batch_head = head->batch_head;
814 822
815 /* 823 /*
816 * at this point, head's BATCH_READY could be cleared, but we 824 * 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 */ 826 */
819 list_add(&sh->batch_list, &head->batch_list); 827 list_add(&sh->batch_list, &head->batch_list);
820 spin_unlock(&head->batch_head->batch_lock); 828 spin_unlock(&head->batch_head->batch_lock);
821
822 sh->batch_head = head->batch_head;
823 } else { 829 } else {
824 head->batch_head = head; 830 head->batch_head = head;
825 sh->batch_head = head->batch_head; 831 sh->batch_head = head->batch_head;