diff options
Diffstat (limited to 'drivers/md/bcache/writeback.c')
-rw-r--r-- | drivers/md/bcache/writeback.c | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c index ba3ee48320f2..b842fbfbf1db 100644 --- a/drivers/md/bcache/writeback.c +++ b/drivers/md/bcache/writeback.c | |||
@@ -114,25 +114,25 @@ static bool dirty_pred(struct keybuf *buf, struct bkey *k) | |||
114 | 114 | ||
115 | static bool dirty_full_stripe_pred(struct keybuf *buf, struct bkey *k) | 115 | static bool dirty_full_stripe_pred(struct keybuf *buf, struct bkey *k) |
116 | { | 116 | { |
117 | uint64_t stripe; | 117 | uint64_t stripe = KEY_START(k); |
118 | unsigned nr_sectors = KEY_SIZE(k); | 118 | unsigned nr_sectors = KEY_SIZE(k); |
119 | struct cached_dev *dc = container_of(buf, struct cached_dev, | 119 | struct cached_dev *dc = container_of(buf, struct cached_dev, |
120 | writeback_keys); | 120 | writeback_keys); |
121 | unsigned stripe_size = 1 << dc->disk.stripe_size_bits; | ||
122 | 121 | ||
123 | if (!KEY_DIRTY(k)) | 122 | if (!KEY_DIRTY(k)) |
124 | return false; | 123 | return false; |
125 | 124 | ||
126 | stripe = KEY_START(k) >> dc->disk.stripe_size_bits; | 125 | do_div(stripe, dc->disk.stripe_size); |
127 | while (1) { | ||
128 | if (atomic_read(dc->disk.stripe_sectors_dirty + stripe) != | ||
129 | stripe_size) | ||
130 | return false; | ||
131 | 126 | ||
132 | if (nr_sectors <= stripe_size) | 127 | while (1) { |
128 | if (atomic_read(dc->disk.stripe_sectors_dirty + stripe) == | ||
129 | dc->disk.stripe_size) | ||
133 | return true; | 130 | return true; |
134 | 131 | ||
135 | nr_sectors -= stripe_size; | 132 | if (nr_sectors <= dc->disk.stripe_size) |
133 | return false; | ||
134 | |||
135 | nr_sectors -= dc->disk.stripe_size; | ||
136 | stripe++; | 136 | stripe++; |
137 | } | 137 | } |
138 | } | 138 | } |
@@ -186,11 +186,12 @@ static void refill_dirty(struct closure *cl) | |||
186 | 186 | ||
187 | for (i = 0; i < dc->disk.nr_stripes; i++) | 187 | for (i = 0; i < dc->disk.nr_stripes; i++) |
188 | if (atomic_read(dc->disk.stripe_sectors_dirty + i) == | 188 | if (atomic_read(dc->disk.stripe_sectors_dirty + i) == |
189 | 1 << dc->disk.stripe_size_bits) | 189 | dc->disk.stripe_size) |
190 | goto full_stripes; | 190 | goto full_stripes; |
191 | 191 | ||
192 | goto normal_refill; | 192 | goto normal_refill; |
193 | full_stripes: | 193 | full_stripes: |
194 | searched_from_start = false; /* not searching entire btree */ | ||
194 | bch_refill_keybuf(dc->disk.c, buf, &end, | 195 | bch_refill_keybuf(dc->disk.c, buf, &end, |
195 | dirty_full_stripe_pred); | 196 | dirty_full_stripe_pred); |
196 | } else { | 197 | } else { |
@@ -252,19 +253,19 @@ void bcache_dev_sectors_dirty_add(struct cache_set *c, unsigned inode, | |||
252 | uint64_t offset, int nr_sectors) | 253 | uint64_t offset, int nr_sectors) |
253 | { | 254 | { |
254 | struct bcache_device *d = c->devices[inode]; | 255 | struct bcache_device *d = c->devices[inode]; |
255 | unsigned stripe_size, stripe_offset; | 256 | unsigned stripe_offset; |
256 | uint64_t stripe; | 257 | uint64_t stripe = offset; |
257 | 258 | ||
258 | if (!d) | 259 | if (!d) |
259 | return; | 260 | return; |
260 | 261 | ||
261 | stripe_size = 1 << d->stripe_size_bits; | 262 | do_div(stripe, d->stripe_size); |
262 | stripe = offset >> d->stripe_size_bits; | 263 | |
263 | stripe_offset = offset & (stripe_size - 1); | 264 | stripe_offset = offset & (d->stripe_size - 1); |
264 | 265 | ||
265 | while (nr_sectors) { | 266 | while (nr_sectors) { |
266 | int s = min_t(unsigned, abs(nr_sectors), | 267 | int s = min_t(unsigned, abs(nr_sectors), |
267 | stripe_size - stripe_offset); | 268 | d->stripe_size - stripe_offset); |
268 | 269 | ||
269 | if (nr_sectors < 0) | 270 | if (nr_sectors < 0) |
270 | s = -s; | 271 | s = -s; |