md/raid5: ensure whole batch is delayed for all required bitmap updates.
authorNeilBrown <neilb@suse.de>
Thu, 21 May 2015 05:10:01 +0000 (15:10 +1000)
committerNeilBrown <neilb@suse.de>
Thu, 28 May 2015 01:29:14 +0000 (11:29 +1000)
When we add a stripe to a batch, we need to be sure that
head stripe will wait for the bitmap update required for the new
stripe.

Signed-off-by: NeilBrown <neilb@suse.de>
drivers/md/raid5.c

index b9f2b9cc60607e29c2c240b2516e5c8af49091d3..c55a68f37c72518ecafc6b9b8ba7b7bbd88f311e 100644 (file)
@@ -837,6 +837,15 @@ static void stripe_add_to_batch_list(struct r5conf *conf, struct stripe_head *sh
                    < IO_THRESHOLD)
                        md_wakeup_thread(conf->mddev->thread);
 
+       if (test_and_clear_bit(STRIPE_BIT_DELAY, &sh->state)) {
+               int seq = sh->bm_seq;
+               if (test_bit(STRIPE_BIT_DELAY, &sh->batch_head->state) &&
+                   sh->batch_head->bm_seq > seq)
+                       seq = sh->batch_head->bm_seq;
+               set_bit(STRIPE_BIT_DELAY, &sh->batch_head->state);
+               sh->batch_head->bm_seq = seq;
+       }
+
        atomic_inc(&sh->count);
 unlock_out:
        unlock_two_stripes(head, sh);