aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/bcache/writeback.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/bcache/writeback.c')
-rw-r--r--drivers/md/bcache/writeback.c33
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
115static bool dirty_full_stripe_pred(struct keybuf *buf, struct bkey *k) 115static 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;
193full_stripes: 193full_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;