diff options
author | NeilBrown <neilb@suse.de> | 2015-05-21 15:10:01 +1000 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2015-05-28 11:29:14 +1000 |
commit | 2b6b24574256c05be145936f1493aec74c6904e5 (patch) | |
tree | 76ccb20859a5693323f1130411b4b8c565967b99 /drivers/md | |
parent | 8532e3439087de69bb1b71fd6be2baa6fc196a55 (diff) | |
download | linux-2b6b24574256c05be145936f1493aec74c6904e5.tar.gz linux-2b6b24574256c05be145936f1493aec74c6904e5.tar.bz2 linux-2b6b24574256c05be145936f1493aec74c6904e5.zip |
md/raid5: ensure whole batch is delayed for all required bitmap updates.
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>
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/raid5.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index b9f2b9cc6060..c55a68f37c72 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -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); |