summaryrefslogtreecommitdiff
path: root/drivers/md/bcache/writeback.h
diff options
context:
space:
mode:
authorKent Overstreet <kmo@daterainc.com>2013-08-17 13:13:15 +0400
committerKent Overstreet <kmo@daterainc.com>2013-11-11 09:55:55 +0400
commit2d679fc75678551485df62274edaed452becd16d (patch)
tree5ac694ced25578b0b54893f69d74bbcaa65b0b67 /drivers/md/bcache/writeback.h
parent77c320eb46e216c17aee5c943949229ccfed6904 (diff)
downloadlinux-2d679fc75678551485df62274edaed452becd16d.tar.xz
bcache: Stripe size isn't necessarily a power of two
Originally I got this right... except that the divides didn't use do_div(), which broke 32 bit kernels. When I went to fix that, I forgot that the raid stripe size usually isn't a power of two... doh Signed-off-by: Kent Overstreet <kmo@daterainc.com>
Diffstat (limited to 'drivers/md/bcache/writeback.h')
-rw-r--r--drivers/md/bcache/writeback.h8
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/md/bcache/writeback.h b/drivers/md/bcache/writeback.h
index c91f61bb95b6..34961888b5a9 100644
--- a/drivers/md/bcache/writeback.h
+++ b/drivers/md/bcache/writeback.h
@@ -18,16 +18,18 @@ static inline bool bcache_dev_stripe_dirty(struct bcache_device *d,
uint64_t offset,
unsigned nr_sectors)
{
- uint64_t stripe = offset >> d->stripe_size_bits;
+ uint64_t stripe = offset;
+
+ do_div(stripe, d->stripe_size);
while (1) {
if (atomic_read(d->stripe_sectors_dirty + stripe))
return true;
- if (nr_sectors <= 1 << d->stripe_size_bits)
+ if (nr_sectors <= d->stripe_size)
return false;
- nr_sectors -= 1 << d->stripe_size_bits;
+ nr_sectors -= d->stripe_size;
stripe++;
}
}