summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/md/bcache/btree_update.c95
-rw-r--r--drivers/md/bcache/btree_update.h17
-rw-r--r--drivers/md/bcache/dirent.c7
-rw-r--r--drivers/md/bcache/fs-gc.c6
-rw-r--r--drivers/md/bcache/fs-io.c8
-rw-r--r--drivers/md/bcache/fs.c3
-rw-r--r--drivers/md/bcache/inode.c11
-rw-r--r--drivers/md/bcache/io.c20
-rw-r--r--drivers/md/bcache/journal.c3
-rw-r--r--drivers/md/bcache/migrate.c5
-rw-r--r--drivers/md/bcache/super.c3
-rw-r--r--drivers/md/bcache/writeback.c3
-rw-r--r--drivers/md/bcache/xattr.c5
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(&copy.k),
- &disk_res,
+ ret = bch_btree_insert_at(&dst, &copy.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);
}