aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-09-13 13:04:10 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-09-13 13:04:10 -0400
commit186cec317e87b85b296713426fa39eaa41ec6056 (patch)
tree644a7b274d151973e4c3d16277636f440256aa70
parent645cc09381a14892a19f972cf36b90e2f7bdff8b (diff)
parent40aa978eccec61347cd47b97c598df49acde8be5 (diff)
Merge tag 'dm-3.17-fix2' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm
Pull device mapper fix from Mike Snitzer: "Fix a race in the DM cache target that caused dirty blocks to be marked as clean. This could cause no writeback to occur or spurious dirty block counts" * tag 'dm-3.17-fix2' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm: dm cache: fix race causing dirty blocks to be marked as clean
-rw-r--r--drivers/md/dm-cache-target.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c
index 1af40ee209e2..7130505c2425 100644
--- a/drivers/md/dm-cache-target.c
+++ b/drivers/md/dm-cache-target.c
@@ -895,8 +895,8 @@ static void migration_success_pre_commit(struct dm_cache_migration *mg)
895 struct cache *cache = mg->cache; 895 struct cache *cache = mg->cache;
896 896
897 if (mg->writeback) { 897 if (mg->writeback) {
898 cell_defer(cache, mg->old_ocell, false);
899 clear_dirty(cache, mg->old_oblock, mg->cblock); 898 clear_dirty(cache, mg->old_oblock, mg->cblock);
899 cell_defer(cache, mg->old_ocell, false);
900 cleanup_migration(mg); 900 cleanup_migration(mg);
901 return; 901 return;
902 902
@@ -951,13 +951,13 @@ static void migration_success_post_commit(struct dm_cache_migration *mg)
951 } 951 }
952 952
953 } else { 953 } else {
954 clear_dirty(cache, mg->new_oblock, mg->cblock);
954 if (mg->requeue_holder) 955 if (mg->requeue_holder)
955 cell_defer(cache, mg->new_ocell, true); 956 cell_defer(cache, mg->new_ocell, true);
956 else { 957 else {
957 bio_endio(mg->new_ocell->holder, 0); 958 bio_endio(mg->new_ocell->holder, 0);
958 cell_defer(cache, mg->new_ocell, false); 959 cell_defer(cache, mg->new_ocell, false);
959 } 960 }
960 clear_dirty(cache, mg->new_oblock, mg->cblock);
961 cleanup_migration(mg); 961 cleanup_migration(mg);
962 } 962 }
963} 963}