bcache: Add explicit keylist arg to btree_insert()
authorKent Overstreet <kmo@daterainc.com>
Wed, 11 Sep 2013 01:46:36 +0000 (18:46 -0700)
committerKent Overstreet <kmo@daterainc.com>
Mon, 11 Nov 2013 05:55:59 +0000 (21:55 -0800)
Some refactoring - better to explicitly pass stuff around instead of
having it all in the "big bag of state", struct btree_op. Going to prune
struct btree_op quite a bit over time.

Signed-off-by: Kent Overstreet <kmo@daterainc.com>
drivers/md/bcache/btree.c
drivers/md/bcache/btree.h
drivers/md/bcache/journal.c
drivers/md/bcache/request.c
drivers/md/bcache/writeback.c

index 08a85327431cdf81252b118363cbeedded1ddab6..fc3cae5c94b294bf3437b475880f51d5e24e69c4 100644 (file)
@@ -2109,30 +2109,32 @@ out:
        return ret;
 }
 
-static int bch_btree_insert_recurse(struct btree *b, struct btree_op *op)
+static int bch_btree_insert_recurse(struct btree *b, struct btree_op *op,
+                                   struct keylist *keys)
 {
-       if (bch_keylist_empty(&op->keys))
+       if (bch_keylist_empty(keys))
                return 0;
 
        if (b->level) {
-               struct bkey *insert = op->keys.bottom;
-               struct bkey *k = bch_next_recurse_key(b, &START_KEY(insert));
+               struct bkey *k;
 
+               k = bch_next_recurse_key(b, &START_KEY(keys->bottom));
                if (!k) {
                        btree_bug(b, "no key to recurse on at level %i/%i",
                                  b->level, b->c->root->level);
 
-                       op->keys.top = op->keys.bottom;
+                       keys->top = keys->bottom;
                        return -EIO;
                }
 
-               return btree(insert_recurse, k, b, op);
+               return btree(insert_recurse, k, b, op, keys);
        } else {
-               return bch_btree_insert_node(b, op, &op->keys);
+               return bch_btree_insert_node(b, op, keys);
        }
 }
 
-int bch_btree_insert(struct btree_op *op, struct cache_set *c)
+int bch_btree_insert(struct btree_op *op, struct cache_set *c,
+                    struct keylist *keys)
 {
        int ret = 0;
 
@@ -2142,11 +2144,11 @@ int bch_btree_insert(struct btree_op *op, struct cache_set *c)
         */
        clear_closure_blocking(&op->cl);
 
-       BUG_ON(bch_keylist_empty(&op->keys));
+       BUG_ON(bch_keylist_empty(keys));
 
-       while (!bch_keylist_empty(&op->keys)) {
+       while (!bch_keylist_empty(keys)) {
                op->lock = 0;
-               ret = btree_root(insert_recurse, c, op);
+               ret = btree_root(insert_recurse, c, op, keys);
 
                if (ret == -EAGAIN) {
                        ret = 0;
@@ -2157,7 +2159,7 @@ int bch_btree_insert(struct btree_op *op, struct cache_set *c)
                        pr_err("error %i trying to insert key for %s",
                               ret, op_type(op));
 
-                       while ((k = bch_keylist_pop(&op->keys)))
+                       while ((k = bch_keylist_pop(keys)))
                                bkey_put(c, k, 0);
                }
        }
index 73bd62105e39ab97d841b05fd8091861659f3366..967aacd2062544b3f854814b22f1d0e93f50001f 100644 (file)
@@ -384,7 +384,7 @@ struct btree *bch_btree_node_get(struct cache_set *, struct bkey *,
 
 int bch_btree_insert_check_key(struct btree *, struct btree_op *,
                               struct bkey *);
-int bch_btree_insert(struct btree_op *, struct cache_set *);
+int bch_btree_insert(struct btree_op *, struct cache_set *, struct keylist *);
 
 int bch_btree_search_recurse(struct btree *, struct btree_op *);
 
index 9e8775872dbad233a25eafb5253963c6a5268edc..5abe5d5fc18339ed00380befc7357d454fdc12aa 100644 (file)
@@ -320,7 +320,7 @@ int bch_journal_replay(struct cache_set *s, struct list_head *list,
                        op->journal = i->pin;
                        atomic_inc(op->journal);
 
-                       ret = bch_btree_insert(op, s);
+                       ret = bch_btree_insert(op, s, &op->keys);
                        if (ret)
                                goto err;
 
index 9ed334ca484d337b8b26eeaa8ae121df989d68a5..7fd84ce9e83546cac16a7f5374d457343bafaec3 100644 (file)
@@ -607,7 +607,7 @@ void bch_btree_insert_async(struct closure *cl)
        struct btree_op *op = container_of(cl, struct btree_op, cl);
        struct search *s = container_of(op, struct search, op);
 
-       if (bch_btree_insert(op, op->c)) {
+       if (bch_btree_insert(op, op->c, &op->keys)) {
                s->error                = -ENOMEM;
                op->insert_data_done    = true;
        }
index b842fbfbf1db2912225b56d2aef4195cb5054daf..8ffc8ec7231d4dad519ae905c7ef2ea8e7eab90a 100644 (file)
@@ -311,7 +311,7 @@ static void write_dirty_finish(struct closure *cl)
                for (i = 0; i < KEY_PTRS(&w->key); i++)
                        atomic_inc(&PTR_BUCKET(dc->disk.c, &w->key, i)->pin);
 
-               bch_btree_insert(&op, dc->disk.c);
+               bch_btree_insert(&op, dc->disk.c, &op.keys);
                closure_sync(&op.cl);
 
                if (op.insert_collision)