block: discard granularity might not be power of 2
In MD raid case, discard granularity might not be power of 2, for example, a 4-disk raid5 has 3*chunk_size discard granularity. Correct the calculation for such cases. Reported-by: Neil Brown <neilb@suse.de> Signed-off-by: Shaohua Li <shli@fusionio.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
@@ -1188,13 +1188,14 @@ static inline int queue_discard_alignment(struct request_queue *q)
|
||||
|
||||
static inline int queue_limit_discard_alignment(struct queue_limits *lim, sector_t sector)
|
||||
{
|
||||
unsigned int alignment = (sector << 9) & (lim->discard_granularity - 1);
|
||||
sector_t alignment = sector << 9;
|
||||
alignment = sector_div(alignment, lim->discard_granularity);
|
||||
|
||||
if (!lim->max_discard_sectors)
|
||||
return 0;
|
||||
|
||||
return (lim->discard_granularity + lim->discard_alignment - alignment)
|
||||
& (lim->discard_granularity - 1);
|
||||
alignment = lim->discard_granularity + lim->discard_alignment - alignment;
|
||||
return sector_div(alignment, lim->discard_granularity);
|
||||
}
|
||||
|
||||
static inline int bdev_discard_alignment(struct block_device *bdev)
|
||||
|
Reference in New Issue
Block a user