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:
committed by
Mike Snitzer
parent
f29a3147e2
commit
1e32134a5a
@@ -988,10 +988,14 @@ static void migration_success_post_commit(struct dm_cache_migration *mg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
if (mg->requeue_holder) {
|
||||||
clear_dirty(cache, mg->new_oblock, mg->cblock);
|
clear_dirty(cache, mg->new_oblock, mg->cblock);
|
||||||
if (mg->requeue_holder)
|
|
||||||
cell_defer(cache, mg->new_ocell, true);
|
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);
|
bio_endio(mg->new_ocell->holder, 0);
|
||||||
cell_defer(cache, mg->new_ocell, false);
|
cell_defer(cache, mg->new_ocell, false);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user