Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bcache: Don't use op->insert_collision

When we convert bch_btree_insert() to bch_btree_map_leaf_nodes(), we
won't be passing struct btree_op to bch_btree_insert() anymore - so we
need a different way of returning whether there was a collision (really,
a replace collision).

Signed-off-by: Kent Overstreet <kmo@daterainc.com>

+16 -7
+3
drivers/md/bcache/btree.c
··· 2227 2227 } 2228 2228 } 2229 2229 2230 + if (op->insert_collision) 2231 + return -ESRCH; 2232 + 2230 2233 return ret; 2231 2234 } 2232 2235
+1 -1
drivers/md/bcache/movinggc.c
··· 52 52 bio_for_each_segment_all(bv, bio, i) 53 53 __free_page(bv->bv_page); 54 54 55 - if (io->s.op.insert_collision) 55 + if (io->s.insert_collision) 56 56 trace_bcache_gc_copy_collision(&io->w->key); 57 57 58 58 bch_keybuf_del(&io->s.c->moving_gc_keys, io->w);
+7 -3
drivers/md/bcache/request.c
··· 218 218 struct search *s = container_of(cl, struct search, btree); 219 219 atomic_t *journal_ref = NULL; 220 220 struct bkey *replace_key = s->replace ? &s->replace_key : NULL; 221 + int ret; 221 222 222 223 /* 223 224 * If we're looping, might already be waiting on ··· 237 236 s->flush_journal 238 237 ? &s->cl : NULL); 239 238 240 - if (bch_btree_insert(&s->op, s->c, &s->insert_keys, 241 - journal_ref, replace_key)) { 239 + ret = bch_btree_insert(&s->op, s->c, &s->insert_keys, 240 + journal_ref, replace_key); 241 + if (ret == -ESRCH) { 242 + s->insert_collision = true; 243 + } else if (ret) { 242 244 s->error = -ENOMEM; 243 245 s->insert_data_done = true; 244 246 } ··· 981 977 { 982 978 struct search *s = container_of(cl, struct search, cl); 983 979 984 - if (s->op.insert_collision) 980 + if (s->insert_collision) 985 981 bch_mark_cache_miss_collision(s); 986 982 987 983 if (s->cache_bio) {
+1
drivers/md/bcache/request.h
··· 34 34 35 35 unsigned insert_data_done:1; 36 36 unsigned replace:1; 37 + unsigned insert_collision:1; 37 38 38 39 uint16_t write_prio; 39 40
+4 -3
drivers/md/bcache/writeback.c
··· 142 142 unsigned i; 143 143 struct btree_op op; 144 144 struct keylist keys; 145 + int ret; 145 146 146 147 bch_btree_op_init(&op, -1); 147 148 bch_keylist_init(&keys); ··· 154 153 for (i = 0; i < KEY_PTRS(&w->key); i++) 155 154 atomic_inc(&PTR_BUCKET(dc->disk.c, &w->key, i)->pin); 156 155 157 - bch_btree_insert(&op, dc->disk.c, &keys, NULL, &w->key); 156 + ret = bch_btree_insert(&op, dc->disk.c, &keys, NULL, &w->key); 158 157 159 - if (op.insert_collision) 158 + if (ret) 160 159 trace_bcache_writeback_collision(&w->key); 161 160 162 - atomic_long_inc(op.insert_collision 161 + atomic_long_inc(ret 163 162 ? &dc->disk.c->writeback_keys_failed 164 163 : &dc->disk.c->writeback_keys_done); 165 164 }