diff options
| author | Joe Thornber <ejt@redhat.com> | 2013-03-20 17:21:25 +0000 | 
|---|---|---|
| committer | Alasdair G Kergon <agk@redhat.com> | 2013-03-20 17:21:25 +0000 | 
| commit | 414dd67d50a6b9a11af23bbb68e8fae13d726c8b (patch) | |
| tree | 3a8978760d54eb1f50f524ca66f1273c4d864c82 /drivers/md/dm-cache-target.c | |
| parent | 3b6b7813b198b578aa7e04e4047ddb8225c37b7f (diff) | |
| download | olio-linux-3.10-414dd67d50a6b9a11af23bbb68e8fae13d726c8b.tar.xz olio-linux-3.10-414dd67d50a6b9a11af23bbb68e8fae13d726c8b.zip  | |
dm cache: avoid 64 bit division on 32 bit
Squash various 32bit link errors.
  >> on i386:
  >> drivers/built-in.o: In function `is_discarded_oblock':
  >> dm-cache-target.c:(.text+0x1ea28e): undefined reference to `__udivdi3'
  ...
Reported-by: Randy Dunlap <rdunlap@infradead.org>
Signed-off-by: Joe Thornber <ejt@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
Diffstat (limited to 'drivers/md/dm-cache-target.c')
| -rw-r--r-- | drivers/md/dm-cache-target.c | 21 | 
1 files changed, 14 insertions, 7 deletions
diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c index 0f4e84b15c3..5ad227f0cea 100644 --- a/drivers/md/dm-cache-target.c +++ b/drivers/md/dm-cache-target.c @@ -158,7 +158,7 @@ struct cache {  	/*  	 * origin_blocks entries, discarded if set.  	 */ -	sector_t discard_block_size; /* a power of 2 times sectors per block */ +	uint32_t discard_block_size; /* a power of 2 times sectors per block */  	dm_dblock_t discard_nr_blocks;  	unsigned long *discard_bitset; @@ -412,17 +412,24 @@ static bool block_size_is_power_of_two(struct cache *cache)  	return cache->sectors_per_block_shift >= 0;  } +static dm_block_t block_div(dm_block_t b, uint32_t n) +{ +	do_div(b, n); + +	return b; +} +  static dm_dblock_t oblock_to_dblock(struct cache *cache, dm_oblock_t oblock)  { -	sector_t discard_blocks = cache->discard_block_size; +	uint32_t discard_blocks = cache->discard_block_size;  	dm_block_t b = from_oblock(oblock);  	if (!block_size_is_power_of_two(cache)) -		(void) sector_div(discard_blocks, cache->sectors_per_block); +		discard_blocks = discard_blocks / cache->sectors_per_block;  	else  		discard_blocks >>= cache->sectors_per_block_shift; -	(void) sector_div(b, discard_blocks); +	b = block_div(b, discard_blocks);  	return to_dblock(b);  } @@ -1002,7 +1009,7 @@ static void process_discard_bio(struct cache *cache, struct bio *bio)  	dm_block_t end_block = bio->bi_sector + bio_sectors(bio);  	dm_block_t b; -	(void) sector_div(end_block, cache->discard_block_size); +	end_block = block_div(end_block, cache->discard_block_size);  	for (b = start_block; b < end_block; b++)  		set_discard(cache, to_dblock(b)); @@ -1835,7 +1842,7 @@ static int cache_create(struct cache_args *ca, struct cache **result)  	/* FIXME: factor out this whole section */  	origin_blocks = cache->origin_sectors = ca->origin_sectors; -	(void) sector_div(origin_blocks, ca->block_size); +	origin_blocks = block_div(origin_blocks, ca->block_size);  	cache->origin_blocks = to_oblock(origin_blocks);  	cache->sectors_per_block = ca->block_size; @@ -1848,7 +1855,7 @@ static int cache_create(struct cache_args *ca, struct cache **result)  		dm_block_t cache_size = ca->cache_sectors;  		cache->sectors_per_block_shift = -1; -		(void) sector_div(cache_size, ca->block_size); +		cache_size = block_div(cache_size, ca->block_size);  		cache->cache_size = to_cblock(cache_size);  	} else {  		cache->sectors_per_block_shift = __ffs(ca->block_size);  |