dm cache: fix a harmless race when working out if a block is discarded
authorJoe Thornber <ejt@redhat.com>
Tue, 25 Nov 2014 13:14:57 +0000 (13:14 +0000)
committerMike Snitzer <snitzer@redhat.com>
Mon, 1 Dec 2014 16:30:11 +0000 (11:30 -0500)
It is more correct to hold the cell before checking the discard state.
These flags are only used as hints to the policy so this change will
have negligable effect.

Signed-off-by: Joe Thornber <ejt@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
drivers/md/dm-cache-target.c

index 2c66315553f27f97e1ed4dcd78586d9902f62bf4..161bbd6652f8e3b24b2345b83b5a458225ba86cb 100644 (file)
@@ -1432,9 +1432,8 @@ static void process_bio(struct cache *cache, struct prealloc *structs,
        dm_oblock_t block = get_bio_block(cache, bio);
        struct dm_bio_prison_cell *cell_prealloc, *old_ocell, *new_ocell;
        struct policy_result lookup_result;
-       bool discarded_block = is_discarded_oblock(cache, block);
        bool passthrough = passthrough_mode(&cache->features);
-       bool can_migrate = !passthrough && (discarded_block || spare_migration_bandwidth(cache));
+       bool discarded_block, can_migrate;
 
        /*
         * Check to see if that block is currently migrating.
@@ -1446,6 +1445,9 @@ static void process_bio(struct cache *cache, struct prealloc *structs,
        if (r > 0)
                return;
 
+       discarded_block = is_discarded_oblock(cache, block);
+       can_migrate = !passthrough && (discarded_block || spare_migration_bandwidth(cache));
+
        r = policy_map(cache->policy, block, true, can_migrate, discarded_block,
                       bio, &lookup_result);