diff options
Diffstat (limited to 'drivers/md/dm-cache-target.c')
| -rw-r--r-- | drivers/md/dm-cache-target.c | 26 | 
1 files changed, 9 insertions, 17 deletions
diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c index 447d030036d1..89fdfb49d564 100644 --- a/drivers/md/dm-cache-target.c +++ b/drivers/md/dm-cache-target.c @@ -744,21 +744,14 @@ static void check_if_tick_bio_needed(struct cache *cache, struct bio *bio)  	spin_unlock_irq(&cache->lock);  } -static void __remap_to_origin_clear_discard(struct cache *cache, struct bio *bio, -					    dm_oblock_t oblock, bool bio_has_pbd) -{ -	if (bio_has_pbd) -		check_if_tick_bio_needed(cache, bio); -	remap_to_origin(cache, bio); -	if (bio_data_dir(bio) == WRITE) -		clear_discard(cache, oblock_to_dblock(cache, oblock)); -} -  static void remap_to_origin_clear_discard(struct cache *cache, struct bio *bio,  					  dm_oblock_t oblock)  {  	// FIXME: check_if_tick_bio_needed() is called way too much through this interface -	__remap_to_origin_clear_discard(cache, bio, oblock, true); +	check_if_tick_bio_needed(cache, bio); +	remap_to_origin(cache, bio); +	if (bio_data_dir(bio) == WRITE) +		clear_discard(cache, oblock_to_dblock(cache, oblock));  }  static void remap_to_cache_dirty(struct cache *cache, struct bio *bio, @@ -826,16 +819,15 @@ static void issue_op(struct bio *bio, void *context)  static void remap_to_origin_and_cache(struct cache *cache, struct bio *bio,  				      dm_oblock_t oblock, dm_cblock_t cblock)  { -	struct bio *origin_bio = bio_clone_fast(bio, GFP_NOIO, &cache->bs); +	struct bio *origin_bio = bio_alloc_clone(cache->origin_dev->bdev, bio, +						 GFP_NOIO, &cache->bs);  	BUG_ON(!origin_bio);  	bio_chain(origin_bio, bio); -	/* -	 * Passing false to __remap_to_origin_clear_discard() skips -	 * all code that might use per_bio_data (since clone doesn't have it) -	 */ -	__remap_to_origin_clear_discard(cache, origin_bio, oblock, false); + +	if (bio_data_dir(origin_bio) == WRITE) +		clear_discard(cache, oblock_to_dblock(cache, oblock));  	submit_bio(origin_bio);  	remap_to_cache(cache, bio, cblock);  |