diff options
| author | Shaohua Li <shli@kernel.org> | 2012-12-14 11:15:36 +0800 | 
|---|---|---|
| committer | Jens Axboe <axboe@kernel.dk> | 2012-12-14 20:46:04 +0100 | 
| commit | 8dd2cb7e880d2f77fba53b523c99133ad5054cfd (patch) | |
| tree | ea51e89f8c8bf9ca8e888d68ecf6732a52e8e99d /block/blk-settings.c | |
| parent | 75274551c81796b636c5acb0c2597dec7ec2e6c4 (diff) | |
| download | linux-8dd2cb7e880d2f77fba53b523c99133ad5054cfd.tar.bz2 | |
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>
Diffstat (limited to 'block/blk-settings.c')
| -rw-r--r-- | block/blk-settings.c | 6 | 
1 files changed, 3 insertions, 3 deletions
| diff --git a/block/blk-settings.c b/block/blk-settings.c index 779bb7646bcd..c50ecf0ea3b1 100644 --- a/block/blk-settings.c +++ b/block/blk-settings.c @@ -611,7 +611,7 @@ int blk_stack_limits(struct queue_limits *t, struct queue_limits *b,  			bottom = b->discard_granularity + alignment;  			/* Verify that top and bottom intervals line up */ -			if (max(top, bottom) & (min(top, bottom) - 1)) +			if ((max(top, bottom) % min(top, bottom)) != 0)  				t->discard_misaligned = 1;  		} @@ -619,8 +619,8 @@ int blk_stack_limits(struct queue_limits *t, struct queue_limits *b,  						      b->max_discard_sectors);  		t->discard_granularity = max(t->discard_granularity,  					     b->discard_granularity); -		t->discard_alignment = lcm(t->discard_alignment, alignment) & -			(t->discard_granularity - 1); +		t->discard_alignment = lcm(t->discard_alignment, alignment) % +			t->discard_granularity;  	}  	return ret; |