dm cache: dirty flag was mistakenly being cleared when promoting via overwrite
If the incoming bio is a WRITE and completely covers a block then we don't bother to do any copying for a promotion operation. Once this is done the cache block and origin block will be different, so we need to set it to 'dirty'. Signed-off-by: Joe Thornber <ejt@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com> Cc: stable@vger.kernel.org
This commit is contained in:
parent
f29a3147e2
commit
1e32134a5a
1 changed files with 7 additions and 3 deletions
|
@ -988,10 +988,14 @@ static void migration_success_post_commit(struct dm_cache_migration *mg)
|
|||
}
|
||||
|
||||
} else {
|
||||
clear_dirty(cache, mg->new_oblock, mg->cblock);
|
||||
if (mg->requeue_holder)
|
||||
if (mg->requeue_holder) {
|
||||
clear_dirty(cache, mg->new_oblock, mg->cblock);
|
||||
cell_defer(cache, mg->new_ocell, true);
|
||||
else {
|
||||
} else {
|
||||
/*
|
||||
* The block was promoted via an overwrite, so it's dirty.
|
||||
*/
|
||||
set_dirty(cache, mg->new_oblock, mg->cblock);
|
||||
bio_endio(mg->new_ocell->holder, 0);
|
||||
cell_defer(cache, mg->new_ocell, false);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue