diff options
-rw-r--r-- | drivers/md/bcache/btree_update.c | 95 | ||||
-rw-r--r-- | drivers/md/bcache/btree_update.h | 17 | ||||
-rw-r--r-- | drivers/md/bcache/dirent.c | 7 | ||||
-rw-r--r-- | drivers/md/bcache/fs-gc.c | 6 | ||||
-rw-r--r-- | drivers/md/bcache/fs-io.c | 8 | ||||
-rw-r--r-- | drivers/md/bcache/fs.c | 3 | ||||
-rw-r--r-- | drivers/md/bcache/inode.c | 11 | ||||
-rw-r--r-- | drivers/md/bcache/io.c | 20 | ||||
-rw-r--r-- | drivers/md/bcache/journal.c | 3 | ||||
-rw-r--r-- | drivers/md/bcache/migrate.c | 5 | ||||
-rw-r--r-- | drivers/md/bcache/super.c | 3 | ||||
-rw-r--r-- | drivers/md/bcache/writeback.c | 3 | ||||
-rw-r--r-- | drivers/md/bcache/xattr.c | 5 |
13 files changed, 92 insertions, 94 deletions
diff --git a/drivers/md/bcache/btree_update.c b/drivers/md/bcache/btree_update.c index 354e11412cbb..c50e4474c312 100644 --- a/drivers/md/bcache/btree_update.c +++ b/drivers/md/bcache/btree_update.c @@ -1527,8 +1527,8 @@ btree_insert_key(struct btree_iter *iter, struct btree *b, return ret; } -static bool same_leaf_as_prev(struct btree_insert_multi *m, - struct btree_insert_multi *i) +static bool same_leaf_as_prev(struct btree_insert_trans *m, + struct btree_insert_trans *i) { /* * Because we sorted the transaction entries, if multiple iterators @@ -1537,18 +1537,18 @@ static bool same_leaf_as_prev(struct btree_insert_multi *m, return i != m && i[0].iter->nodes[0] == i[-1].iter->nodes[0]; } -static void multi_lock_write(struct btree_insert_multi *m, unsigned nr) +static void multi_lock_write(struct btree_insert_trans *m, unsigned nr) { - struct btree_insert_multi *i; + struct btree_insert_trans *i; for (i = m; i < m + nr; i++) if (!same_leaf_as_prev(m, i)) btree_node_lock_for_insert(i->iter->nodes[0], i->iter); } -static void multi_unlock_write(struct btree_insert_multi *m, unsigned nr) +static void multi_unlock_write(struct btree_insert_trans *m, unsigned nr) { - struct btree_insert_multi *i; + struct btree_insert_trans *i; for (i = m; i < m + nr; i++) if (!same_leaf_as_prev(m, i)) @@ -1557,14 +1557,14 @@ static void multi_unlock_write(struct btree_insert_multi *m, unsigned nr) /* Normal update interface: */ -int bch_btree_insert_at_multi(struct btree_insert_multi *m, unsigned nr, - struct disk_reservation *disk_res, - struct btree_insert_hook *hook, - u64 *journal_seq, unsigned flags) +int bch_btree_insert_trans(struct btree_insert_trans *m, unsigned nr, + struct disk_reservation *disk_res, + struct btree_insert_hook *hook, + u64 *journal_seq, unsigned flags) { struct cache_set *c = m[0].iter->c; struct journal_res res = { 0, 0 }; - struct btree_insert_multi *i; + struct btree_insert_trans *i; struct btree_iter *split; unsigned u64s; bool swapped; @@ -1748,38 +1748,48 @@ err: * -EIO: journal or btree node IO error */ int bch_btree_insert_at(struct btree_iter *iter, - struct keylist *insert_keys, + struct bkey_i *insert_key, struct disk_reservation *disk_res, struct btree_insert_hook *hook, u64 *journal_seq, unsigned flags) { - verify_keys_sorted(insert_keys); + struct btree_insert_trans m = { + .iter = iter, + .k = insert_key, + .done = false, + }; - while (1) { - struct btree_insert_multi m = { - .iter = iter, - .k = bch_keylist_front(insert_keys), - .done = false, - }; + int ret = bch_btree_insert_trans(&m, 1, disk_res, + hook, journal_seq, flags); + BUG_ON(!ret != m.done); - int ret = bch_btree_insert_at_multi(&m, 1, disk_res, hook, - journal_seq, flags); - BUG_ON(!ret != m.done); + return ret; +} + +int bch_btree_insert_list_at(struct btree_iter *iter, + struct keylist *keys, + struct disk_reservation *disk_res, + struct btree_insert_hook *hook, + u64 *journal_seq, unsigned flags) +{ + BUG_ON(flags & BTREE_INSERT_ATOMIC); + BUG_ON(bch_keylist_empty(keys)); + verify_keys_sorted(keys); + while (1) { + /* need to traverse between each insert */ + int ret = bch_btree_iter_traverse(iter); if (ret) return ret; - bch_keylist_dequeue(insert_keys); - if (bch_keylist_empty(insert_keys)) - return 0; - - /* - * need to traverse between each insert - might be inserting an - * extent that spanned leaf nodes: - */ - ret = bch_btree_iter_traverse(iter); + ret = bch_btree_insert_at(iter, bch_keylist_front(keys), + disk_res, hook, journal_seq, flags); if (ret) return ret; + + bch_keylist_dequeue(keys); + if (bch_keylist_empty(keys)) + return 0; } } @@ -1813,8 +1823,8 @@ int bch_btree_insert_check_key(struct btree_iter *iter, bch_btree_iter_rewind(iter, bkey_start_pos(&check_key->k)); - ret = bch_btree_insert_at(iter, &keylist_single(&tmp.key), - NULL, NULL, NULL, BTREE_INSERT_ATOMIC); + ret = bch_btree_insert_at(iter, &tmp.key, NULL, NULL, + NULL, BTREE_INSERT_ATOMIC); bch_btree_iter_set_pos(iter, saved_pos); @@ -1829,7 +1839,7 @@ int bch_btree_insert_check_key(struct btree_iter *iter, * @hook: insert callback */ int bch_btree_insert(struct cache_set *c, enum btree_id id, - struct keylist *keys, + struct bkey_i *k, struct disk_reservation *disk_res, struct btree_insert_hook *hook, u64 *journal_seq, int flags) @@ -1837,14 +1847,13 @@ int bch_btree_insert(struct cache_set *c, enum btree_id id, struct btree_iter iter; int ret, ret2; - bch_btree_iter_init_intent(&iter, c, id, - bkey_start_pos(&bch_keylist_front(keys)->k)); + bch_btree_iter_init_intent(&iter, c, id, bkey_start_pos(&k->k)); ret = bch_btree_iter_traverse(&iter); if (unlikely(ret)) goto out; - ret = bch_btree_insert_at(&iter, keys, disk_res, + ret = bch_btree_insert_at(&iter, k, disk_res, hook, journal_seq, flags); out: ret2 = bch_btree_iter_unlock(&iter); @@ -1871,8 +1880,7 @@ int bch_btree_update(struct cache_set *c, enum btree_id id, if (!u.k || bkey_deleted(u.k)) return -ENOENT; - ret = bch_btree_insert_at(&iter, &keylist_single(k), NULL, - NULL, journal_seq, 0); + ret = bch_btree_insert_at(&iter, k, NULL, NULL, journal_seq, 0); ret2 = bch_btree_iter_unlock(&iter); return ret ?: ret2; @@ -1934,9 +1942,8 @@ int bch_btree_delete_range(struct cache_set *c, enum btree_id id, bch_cut_back(end, &delete.k); } - ret = bch_btree_insert_at(&iter, &keylist_single(&delete), - NULL, hook, journal_seq, - BTREE_INSERT_NOFAIL); + ret = bch_btree_insert_at(&iter, &delete, NULL, hook, + journal_seq, BTREE_INSERT_NOFAIL); if (ret) break; @@ -1982,8 +1989,8 @@ int bch_btree_node_rewrite(struct btree *b, struct btree_iter *iter, bool wait) if (parent) { bch_btree_insert_node(parent, iter, - &keylist_single(&n->key), - reserve, as); + &keylist_single(&n->key), + reserve, as); } else { bch_btree_set_root(iter, n, as, reserve); } diff --git a/drivers/md/bcache/btree_update.h b/drivers/md/bcache/btree_update.h index 19e6e7505bbe..09aee49cc606 100644 --- a/drivers/md/bcache/btree_update.h +++ b/drivers/md/bcache/btree_update.h @@ -235,24 +235,27 @@ void bch_btree_insert_node(struct btree *, struct btree_iter *, */ #define BTREE_INSERT_NO_MARK_KEY (1 << 2) -int bch_btree_insert_at(struct btree_iter *, struct keylist *, +int bch_btree_insert_at(struct btree_iter *, struct bkey_i *, struct disk_reservation *, struct btree_insert_hook *, u64 *, unsigned); +int bch_btree_insert_list_at(struct btree_iter *, struct keylist *, + struct disk_reservation *, + struct btree_insert_hook *, u64 *, unsigned); -struct btree_insert_multi { +struct btree_insert_trans { struct btree_iter *iter; struct bkey_i *k; /* true if entire key was inserted - can only be false for extents */ bool done; }; -int bch_btree_insert_at_multi(struct btree_insert_multi[], unsigned, - struct disk_reservation *, - struct btree_insert_hook *, - u64 *, unsigned); +int bch_btree_insert_trans(struct btree_insert_trans[], unsigned, + struct disk_reservation *, + struct btree_insert_hook *, + u64 *, unsigned); int bch_btree_insert_check_key(struct btree_iter *, struct bkey_i *); -int bch_btree_insert(struct cache_set *, enum btree_id, struct keylist *, +int bch_btree_insert(struct cache_set *, enum btree_id, struct bkey_i *, struct disk_reservation *, struct btree_insert_hook *, u64 *, int flags); int bch_btree_update(struct cache_set *, enum btree_id, diff --git a/drivers/md/bcache/dirent.c b/drivers/md/bcache/dirent.c index b5af7bff508b..5815ad5befc5 100644 --- a/drivers/md/bcache/dirent.c +++ b/drivers/md/bcache/dirent.c @@ -209,7 +209,7 @@ int bch_dirent_create(struct inode *dir, u8 type, dirent->k.p = k.k->p; - ret = bch_btree_insert_at(&iter, &keylist_single(&dirent->k_i), + ret = bch_btree_insert_at(&iter, &dirent->k_i, NULL, NULL, &ei->journal_seq, BTREE_INSERT_ATOMIC); /* @@ -324,7 +324,7 @@ int bch_dirent_rename(struct cache_set *c, new_dst->v.d_inum = old_src_d.v->d_inum; new_dst->v.d_type = old_src_d.v->d_type; - ret = bch_btree_insert_at_multi((struct btree_insert_multi[]) { + ret = bch_btree_insert_trans((struct btree_insert_trans[]) { { &src_iter, &new_src->k_i, }, { &dst_iter, &new_dst->k_i, }}, 2, NULL, NULL, journal_seq, @@ -365,8 +365,7 @@ int bch_dirent_delete(struct inode *dir, const struct qstr *name) delete.k.p = k.k->p; delete.k.type = BCH_DIRENT_WHITEOUT; - ret = bch_btree_insert_at(&iter, - &keylist_single(&delete), + ret = bch_btree_insert_at(&iter, &delete, NULL, NULL, &ei->journal_seq, BTREE_INSERT_NOFAIL| BTREE_INSERT_ATOMIC); diff --git a/drivers/md/bcache/fs-gc.c b/drivers/md/bcache/fs-gc.c index fa41959c8831..168d56f90d99 100644 --- a/drivers/md/bcache/fs-gc.c +++ b/drivers/md/bcache/fs-gc.c @@ -172,10 +172,8 @@ static int bch_gc_do_inode(struct cache_set *c, struct btree_iter *iter, if (i_flags & BCH_INODE_I_SECTORS_DIRTY) update.v.i_sectors = cpu_to_le64(i_sectors); - return bch_btree_insert_at(iter, - &keylist_single(&update.k_i), - NULL, NULL, NULL, - BTREE_INSERT_NOFAIL); + return bch_btree_insert_at(iter, &update.k_i, NULL, NULL, + NULL, BTREE_INSERT_NOFAIL); } return 0; diff --git a/drivers/md/bcache/fs-io.c b/drivers/md/bcache/fs-io.c index b1473dc2a133..e3d805b30700 100644 --- a/drivers/md/bcache/fs-io.c +++ b/drivers/md/bcache/fs-io.c @@ -2185,9 +2185,7 @@ static long bch_fcollapse(struct inode *inode, loff_t offset, loff_t len) false, false); BUG_ON(ret); - ret = bch_btree_insert_at(&dst, - &keylist_single(©.k), - &disk_res, + ret = bch_btree_insert_at(&dst, ©.k, &disk_res, &i_sectors_hook.hook, &ei->journal_seq, BTREE_INSERT_ATOMIC| @@ -2349,9 +2347,7 @@ static long bch_fallocate(struct inode *inode, int mode, goto err_put_sectors_dirty; } - ret = bch_btree_insert_at(&iter, - &keylist_single(&reservation), - &disk_res, + ret = bch_btree_insert_at(&iter, &reservation, &disk_res, &i_sectors_hook.hook, &ei->journal_seq, BTREE_INSERT_ATOMIC| diff --git a/drivers/md/bcache/fs.c b/drivers/md/bcache/fs.c index 75dcf3638f73..5a91779b6709 100644 --- a/drivers/md/bcache/fs.c +++ b/drivers/md/bcache/fs.c @@ -132,8 +132,7 @@ int __must_check __bch_write_inode(struct cache_set *c, bi->i_mtime = cpu_to_le64(timespec_to_ns(&inode->i_mtime)); bi->i_ctime = cpu_to_le64(timespec_to_ns(&inode->i_ctime)); - ret = bch_btree_insert_at(&iter, - &keylist_single(&new_inode.k_i), + ret = bch_btree_insert_at(&iter, &new_inode.k_i, NULL, NULL, &ei->journal_seq, BTREE_INSERT_ATOMIC| BTREE_INSERT_NOFAIL); diff --git a/drivers/md/bcache/inode.c b/drivers/md/bcache/inode.c index 58e853c03360..cf028019f9c0 100644 --- a/drivers/md/bcache/inode.c +++ b/drivers/md/bcache/inode.c @@ -134,9 +134,8 @@ again: pr_debug("inserting inode %llu (size %u)", inode->k.p.inode, inode->k.u64s); - ret = bch_btree_insert_at(&iter, &keylist_single(inode), - NULL, NULL, NULL, - BTREE_INSERT_ATOMIC); + ret = bch_btree_insert_at(&iter, inode, NULL, NULL, + NULL, BTREE_INSERT_ATOMIC); if (ret == -EINTR) continue; @@ -204,10 +203,8 @@ int bch_inode_rm(struct cache_set *c, u64 inode_nr) bkey_init(&delete.k); delete.k.p.inode = inode_nr; - return bch_btree_insert(c, BTREE_ID_INODES, - &keylist_single(&delete), - NULL, NULL, NULL, - BTREE_INSERT_NOFAIL); + return bch_btree_insert(c, BTREE_ID_INODES, &delete, NULL, + NULL, NULL, BTREE_INSERT_NOFAIL); } int bch_inode_update(struct cache_set *c, struct bkey_i *inode, diff --git a/drivers/md/bcache/io.c b/drivers/md/bcache/io.c index dae22aa966d1..907661d6bb60 100644 --- a/drivers/md/bcache/io.c +++ b/drivers/md/bcache/io.c @@ -589,20 +589,24 @@ static u64 keylist_sectors(struct keylist *keys) static void bch_write_index(struct closure *cl) { struct bch_write_op *op = container_of(cl, struct bch_write_op, cl); + struct keylist *keys = &op->insert_keys; + struct btree_iter iter; + u64 sectors_start = keylist_sectors(keys); unsigned i; - u64 sectors_start = keylist_sectors(&op->insert_keys); int ret; op->flags |= BCH_WRITE_LOOPED; - ret = bch_btree_insert(op->c, BTREE_ID_EXTENTS, - &op->insert_keys, - &op->res, - op->insert_hook, - op_journal_seq(op), - BTREE_INSERT_NOFAIL); + bch_btree_iter_init_intent(&iter, op->c, BTREE_ID_EXTENTS, + bkey_start_pos(&bch_keylist_front(keys)->k)); + + ret = bch_btree_insert_list_at(&iter, keys, &op->res, + op->insert_hook, + op_journal_seq(op), + BTREE_INSERT_NOFAIL); + bch_btree_iter_unlock(&iter); - op->written += sectors_start - keylist_sectors(&op->insert_keys); + op->written += sectors_start - keylist_sectors(keys); if (ret) { __bcache_io_error(op->c, "btree IO error"); diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c index 61ceb59cc15b..c2906a20c38c 100644 --- a/drivers/md/bcache/journal.c +++ b/drivers/md/bcache/journal.c @@ -1001,8 +1001,7 @@ int bch_journal_replay(struct cache_set *c, struct list_head *list) for_each_jset_key(k, _n, jkeys, &i->j) { trace_bcache_journal_replay_key(&k->k); - ret = bch_btree_insert(c, jkeys->btree_id, - &keylist_single(k), + ret = bch_btree_insert(c, jkeys->btree_id, k, NULL, NULL, NULL, BTREE_INSERT_NOFAIL| BTREE_INSERT_NO_MARK_KEY); diff --git a/drivers/md/bcache/migrate.c b/drivers/md/bcache/migrate.c index a23a9ed695d4..213fb0ed754f 100644 --- a/drivers/md/bcache/migrate.c +++ b/drivers/md/bcache/migrate.c @@ -382,9 +382,8 @@ static int bch_flag_key_bad(struct btree_iter *iter, */ bch_extent_normalize(c, e.s); - return bch_btree_insert_at(iter, &keylist_single(&tmp.key), - NULL, NULL, NULL, - BTREE_INSERT_ATOMIC); + return bch_btree_insert_at(iter, &tmp.key, NULL, NULL, + NULL, BTREE_INSERT_ATOMIC); } /* diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index 6c75d67da7f6..891e69aaef32 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c @@ -1410,8 +1410,7 @@ static const char *run_cache_set(struct cache_set *c) SET_INODE_STR_HASH_TYPE(&inode.v, c->sb.str_hash_type); err = "error creating root directory"; - if (bch_btree_insert(c, BTREE_ID_INODES, - &keylist_single(&inode.k_i), + if (bch_btree_insert(c, BTREE_ID_INODES, &inode.k_i, NULL, NULL, NULL, 0)) goto err; diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c index 01650b86da0c..cb7bc86a5a3d 100644 --- a/drivers/md/bcache/writeback.c +++ b/drivers/md/bcache/writeback.c @@ -118,8 +118,7 @@ static void write_dirty_finish(struct closure *cl) io->replace.hook.fn = bch_extent_cmpxchg; bkey_extent_set_cached(&tmp.k.k, true); - ret = bch_btree_insert(dc->disk.c, BTREE_ID_EXTENTS, - &keylist_single(&tmp.k), + ret = bch_btree_insert(dc->disk.c, BTREE_ID_EXTENTS, &tmp.k, NULL, &io->replace.hook, NULL, 0); if (io->replace.successes == 0) trace_bcache_writeback_collision(&io->replace.key.k); diff --git a/drivers/md/bcache/xattr.c b/drivers/md/bcache/xattr.c index 7cdac88c1b3e..3bfe616d817e 100644 --- a/drivers/md/bcache/xattr.c +++ b/drivers/md/bcache/xattr.c @@ -225,7 +225,7 @@ int bch_xattr_set(struct inode *inode, const char *name, bch_keylist_enqueue(&keys); - ret = bch_btree_insert_at(&iter, &keys, NULL, NULL, + ret = bch_btree_insert_at(&iter, &xattr->k_i, NULL, NULL, &ei->journal_seq, insert_flags); bch_keylist_free(&keys); @@ -236,8 +236,7 @@ int bch_xattr_set(struct inode *inode, const char *name, whiteout.k.type = BCH_XATTR_WHITEOUT; whiteout.k.p = k.k->p; - ret = bch_btree_insert_at(&iter, - &keylist_single(&whiteout), + ret = bch_btree_insert_at(&iter, &whiteout, NULL, NULL, &ei->journal_seq, insert_flags); } |