summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2016-08-05 22:23:11 -0800
committerKent Overstreet <kent.overstreet@gmail.com>2016-08-05 22:23:11 -0800
commit435056ec0bed1984039ff9c10507e599ffee402c (patch)
tree4975990b7cb91c6f034205b8f2d8490dc0df96a2
parent7efc97e6e17cdf0d75e14f918a1ddd5f7f58381e (diff)
bcache: Combine bch_btree_insert_trans() with bch_btree_insert_at()
-rw-r--r--drivers/md/bcache/btree_update.c32
-rw-r--r--drivers/md/bcache/btree_update.h80
-rw-r--r--drivers/md/bcache/dirent.c20
-rw-r--r--drivers/md/bcache/fs-gc.c5
-rw-r--r--drivers/md/bcache/fs-io.c39
-rw-r--r--drivers/md/bcache/fs.c8
-rw-r--r--drivers/md/bcache/inode.c5
-rw-r--r--drivers/md/bcache/migrate.c5
-rw-r--r--drivers/md/bcache/str_hash.h11
9 files changed, 100 insertions, 105 deletions
diff --git a/drivers/md/bcache/btree_update.c b/drivers/md/bcache/btree_update.c
index 176acff8ea53..e87df3734882 100644
--- a/drivers/md/bcache/btree_update.c
+++ b/drivers/md/bcache/btree_update.c
@@ -1560,7 +1560,7 @@ static int btree_trans_entry_cmp(const void *_l, const void *_r)
/* Normal update interface: */
/**
- * bch_btree_trans - insert keys at given iterator positions
+ * __bch_btree_insert_at - insert keys at given iterator positions
*
* This is main entry point for btree updates.
*
@@ -1570,10 +1570,10 @@ static int btree_trans_entry_cmp(const void *_l, const void *_r)
* -EROFS: cache set read only
* -EIO: journal or btree node IO error
*/
-int bch_btree_insert_trans(struct btree_insert *trans,
- struct disk_reservation *disk_res,
- struct extent_insert_hook *hook,
- u64 *journal_seq, unsigned flags)
+int __bch_btree_insert_at(struct btree_insert *trans,
+ struct disk_reservation *disk_res,
+ struct extent_insert_hook *hook,
+ u64 *journal_seq, unsigned flags)
{
struct cache_set *c = trans->c;
struct journal_res res = { 0, 0 };
@@ -1751,8 +1751,9 @@ int bch_btree_insert_list_at(struct btree_iter *iter,
if (ret)
return ret;
- ret = bch_btree_insert_at(iter, bch_keylist_front(keys),
- disk_res, hook, journal_seq, flags);
+ ret = bch_btree_insert_at(iter->c, disk_res, hook,
+ journal_seq, flags,
+ BTREE_INSERT_ENTRY(iter, bch_keylist_front(keys)));
if (ret)
return ret;
@@ -1792,8 +1793,9 @@ int bch_btree_insert_check_key(struct btree_iter *iter,
bkey_copy(&tmp.key, check_key);
- ret = bch_btree_insert_at(iter, &tmp.key, NULL, NULL,
- NULL, BTREE_INSERT_ATOMIC);
+ ret = bch_btree_insert_at(iter->c, NULL, NULL, NULL,
+ BTREE_INSERT_ATOMIC,
+ BTREE_INSERT_ENTRY(iter, &tmp.key));
bch_btree_iter_rewind(iter, saved_pos);
@@ -1822,8 +1824,8 @@ int bch_btree_insert(struct cache_set *c, enum btree_id id,
if (unlikely(ret))
goto out;
- ret = bch_btree_insert_at(&iter, k, disk_res,
- hook, journal_seq, flags);
+ ret = bch_btree_insert_at(c, disk_res, hook, journal_seq, flags,
+ BTREE_INSERT_ENTRY(&iter, k));
out: ret2 = bch_btree_iter_unlock(&iter);
return ret ?: ret2;
@@ -1849,7 +1851,8 @@ 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, k, NULL, NULL, journal_seq, 0);
+ ret = bch_btree_insert_at(c, NULL, NULL, journal_seq, 0,
+ BTREE_INSERT_ENTRY(&iter, k));
ret2 = bch_btree_iter_unlock(&iter);
return ret ?: ret2;
@@ -1912,8 +1915,9 @@ 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, &delete, disk_res, hook,
- journal_seq, BTREE_INSERT_NOFAIL);
+ ret = bch_btree_insert_at(c, disk_res, hook, journal_seq,
+ BTREE_INSERT_NOFAIL,
+ BTREE_INSERT_ENTRY(&iter, &delete));
if (ret)
break;
diff --git a/drivers/md/bcache/btree_update.h b/drivers/md/bcache/btree_update.h
index ba18a8d8e9c8..7b22451110e5 100644
--- a/drivers/md/bcache/btree_update.h
+++ b/drivers/md/bcache/btree_update.h
@@ -191,8 +191,9 @@ void bch_btree_insert_node(struct btree *, struct btree_iter *,
struct btree_insert {
struct cache_set *c;
- unsigned nr;
+
bool did_work;
+ unsigned nr;
struct btree_insert_entry {
struct btree_iter *iter;
struct bkey_i *k;
@@ -204,28 +205,24 @@ struct btree_insert {
} *entries;
};
-int bch_btree_insert_trans(struct btree_insert *,
- struct disk_reservation *,
- struct extent_insert_hook *,
- u64 *, unsigned);
+int __bch_btree_insert_at(struct btree_insert *,
+ struct disk_reservation *,
+ struct extent_insert_hook *,
+ u64 *, unsigned);
-/*
- * Don't drop/retake locks: instead return -EINTR if need to upgrade to intent
- * locks, -EAGAIN if need to wait on btree reserve
- */
-#define BTREE_INSERT_ATOMIC (1 << 0)
-/* Don't check for -ENOSPC: */
-#define BTREE_INSERT_NOFAIL (1 << 1)
+#define _TENTH_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9, N, ...) N
+#define COUNT_ARGS(...) _TENTH_ARG(__VA_ARGS__, 9, 8, 7, 6, 5, 4, 3, 2, 1)
-/*
- * Don't account key being insert (bch_mark_key) - only for journal replay,
- * where we've already marked the new keys:
- */
-#define BTREE_INSERT_NO_MARK_KEY (1 << 2)
+#define BTREE_INSERT_ENTRY(_iter, _k) \
+ ((struct btree_insert_entry) { \
+ .iter = (_iter), \
+ .k = (_k), \
+ .done = false, \
+ })
/**
- * bch_btree_insert_at - insert a key at iterator's current position
+ * bch_btree_insert_at - insert one or more keys at iterator positions
* @iter: btree iterator
* @insert_key: key to insert
* @disk_res: disk reservation
@@ -237,28 +234,31 @@ int bch_btree_insert_trans(struct btree_insert *,
* -EROFS: cache set read only
* -EIO: journal or btree node IO error
*/
-static inline int bch_btree_insert_at(struct btree_iter *iter,
- struct bkey_i *insert_key,
- struct disk_reservation *disk_res,
- struct extent_insert_hook *hook,
- u64 *journal_seq, unsigned flags)
-{
- struct btree_insert m = {
- .c = iter->c,
- .nr = 1,
- .entries = &(struct btree_insert_entry) {
- .iter = iter,
- .k = insert_key,
- .done = false,
- },
- };
-
- int ret = bch_btree_insert_trans(&m, disk_res,
- hook, journal_seq, flags);
- BUG_ON(!ret != m.entries[0].done);
-
- return ret;
-}
+#define bch_btree_insert_at(_c, _disk_res, _hook, \
+ _journal_seq, _flags, ...) \
+ __bch_btree_insert_at(&(struct btree_insert) { \
+ .c = _c, \
+ .did_work = false, \
+ .nr = COUNT_ARGS(__VA_ARGS__), \
+ .entries = (struct btree_insert_entry[]) { \
+ __VA_ARGS__ \
+ }}, \
+ _disk_res, _hook, _journal_seq, _flags)
+
+/*
+ * Don't drop/retake locks: instead return -EINTR if need to upgrade to intent
+ * locks, -EAGAIN if need to wait on btree reserve
+ */
+#define BTREE_INSERT_ATOMIC (1 << 0)
+
+/* Don't check for -ENOSPC: */
+#define BTREE_INSERT_NOFAIL (1 << 1)
+
+/*
+ * Don't account key being insert (bch_mark_key) - only for journal replay,
+ * where we've already marked the new keys:
+ */
+#define BTREE_INSERT_NO_MARK_KEY (1 << 2)
int bch_btree_insert_list_at(struct btree_iter *, struct keylist *,
struct disk_reservation *,
diff --git a/drivers/md/bcache/dirent.c b/drivers/md/bcache/dirent.c
index 35f5c505f15d..b81c64683d07 100644
--- a/drivers/md/bcache/dirent.c
+++ b/drivers/md/bcache/dirent.c
@@ -291,10 +291,11 @@ int bch_dirent_rename(struct cache_set *c,
* __dirent_find_hole() found
*/
new_dst->k.p = src_iter.pos;
- ret = bch_btree_insert_at(&src_iter,
- &new_dst->k_i, NULL, NULL,
+ ret = bch_btree_insert_at(c, NULL, NULL,
journal_seq,
- BTREE_INSERT_ATOMIC);
+ BTREE_INSERT_ATOMIC,
+ BTREE_INSERT_ENTRY(&src_iter,
+ &new_dst->k_i));
goto insert_done;
}
@@ -326,15 +327,10 @@ int bch_dirent_rename(struct cache_set *c,
new_src->k.p = src_iter.pos;
new_dst->k.p = dst_iter.pos;
- ret = bch_btree_insert_trans(&(struct btree_insert) {
- .c = c,
- .nr = 2,
- .entries = (struct btree_insert_entry[]) {
- { &src_iter, &new_src->k_i, },
- { &dst_iter, &new_dst->k_i, }
- }},
- NULL, NULL, journal_seq,
- BTREE_INSERT_ATOMIC);
+ ret = bch_btree_insert_at(c, NULL, NULL, journal_seq,
+ BTREE_INSERT_ATOMIC,
+ BTREE_INSERT_ENTRY(&src_iter, &new_src->k_i),
+ BTREE_INSERT_ENTRY(&dst_iter, &new_dst->k_i));
insert_done:
bch_btree_iter_unlink(&whiteout_iter);
bch_btree_iter_unlock(&src_iter);
diff --git a/drivers/md/bcache/fs-gc.c b/drivers/md/bcache/fs-gc.c
index b54105aa0521..99a9a7ac5679 100644
--- a/drivers/md/bcache/fs-gc.c
+++ b/drivers/md/bcache/fs-gc.c
@@ -172,8 +172,9 @@ 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, &update.k_i, NULL, NULL,
- NULL, BTREE_INSERT_NOFAIL);
+ return bch_btree_insert_at(c, NULL, NULL, NULL,
+ BTREE_INSERT_NOFAIL,
+ BTREE_INSERT_ENTRY(iter, &update.k_i));
}
return 0;
diff --git a/drivers/md/bcache/fs-io.c b/drivers/md/bcache/fs-io.c
index 5be0bca75f85..651f39dd9e96 100644
--- a/drivers/md/bcache/fs-io.c
+++ b/drivers/md/bcache/fs-io.c
@@ -296,14 +296,6 @@ static int bchfs_write_index_update(struct bch_write_op *wop)
hook.need_inode_update = true;
if (hook.need_inode_update) {
- struct btree_insert trans = {
- .c = wop->c,
- .nr = 2,
- .entries = (struct btree_insert_entry[]) {
- { .iter = &extent_iter, .k = k },
- { .iter = &inode_iter, .k = &hook.new_inode.k_i },
- },
- };
struct bkey_s_c inode;
ret = bch_btree_iter_traverse(&inode_iter);
@@ -322,17 +314,16 @@ static int bchfs_write_index_update(struct bch_write_op *wop)
bkey_reassemble(&hook.new_inode.k_i, inode);
- ret = bch_btree_insert_trans(&trans, &wop->res,
- &hook.hook,
- op_journal_seq(wop),
- BTREE_INSERT_NOFAIL|
- BTREE_INSERT_ATOMIC);
+ ret = bch_btree_insert_at(wop->c, &wop->res,
+ &hook.hook, op_journal_seq(wop),
+ BTREE_INSERT_NOFAIL|BTREE_INSERT_ATOMIC,
+ BTREE_INSERT_ENTRY(&extent_iter, k),
+ BTREE_INSERT_ENTRY(&inode_iter, &hook.new_inode.k_i));
} else {
- ret = bch_btree_insert_at(&extent_iter, k,
- &wop->res, &hook.hook,
- op_journal_seq(wop),
- BTREE_INSERT_NOFAIL|
- BTREE_INSERT_ATOMIC);
+ ret = bch_btree_insert_at(wop->c, &wop->res,
+ &hook.hook, op_journal_seq(wop),
+ BTREE_INSERT_NOFAIL|BTREE_INSERT_ATOMIC,
+ BTREE_INSERT_ENTRY(&extent_iter, k));
}
if (ret == -EINTR)
@@ -1946,11 +1937,11 @@ static long bch_fcollapse(struct inode *inode, loff_t offset, loff_t len)
BCH_DISK_RESERVATION_NOFAIL);
BUG_ON(ret);
- ret = bch_btree_insert_at(&dst, &copy.k, &disk_res,
- &i_sectors_hook.hook,
+ ret = bch_btree_insert_at(c, &disk_res, &i_sectors_hook.hook,
&ei->journal_seq,
BTREE_INSERT_ATOMIC|
- BTREE_INSERT_NOFAIL);
+ BTREE_INSERT_NOFAIL,
+ BTREE_INSERT_ENTRY(&dst, &copy.k));
bch_disk_reservation_put(c, &disk_res);
if (ret < 0 && ret != -EINTR)
@@ -2094,11 +2085,11 @@ static long bch_fallocate(struct inode *inode, int mode,
goto err_put_sectors_dirty;
}
- ret = bch_btree_insert_at(&iter, &reservation, &disk_res,
- &i_sectors_hook.hook,
+ ret = bch_btree_insert_at(c, &disk_res, &i_sectors_hook.hook,
&ei->journal_seq,
BTREE_INSERT_ATOMIC|
- BTREE_INSERT_NOFAIL);
+ BTREE_INSERT_NOFAIL,
+ BTREE_INSERT_ENTRY(&iter, &reservation));
bch_disk_reservation_put(c, &disk_res);
if (ret < 0 && ret != -EINTR)
diff --git a/drivers/md/bcache/fs.c b/drivers/md/bcache/fs.c
index 7947dac55017..432b1581c586 100644
--- a/drivers/md/bcache/fs.c
+++ b/drivers/md/bcache/fs.c
@@ -98,10 +98,10 @@ 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, &new_inode.k_i,
- NULL, NULL, &ei->journal_seq,
- BTREE_INSERT_ATOMIC|
- BTREE_INSERT_NOFAIL);
+ ret = bch_btree_insert_at(c, NULL, NULL, &ei->journal_seq,
+ BTREE_INSERT_ATOMIC|
+ BTREE_INSERT_NOFAIL,
+ BTREE_INSERT_ENTRY(&iter, &new_inode.k_i));
} while (ret == -EINTR);
if (!ret) {
diff --git a/drivers/md/bcache/inode.c b/drivers/md/bcache/inode.c
index 58821fd75463..7cbe9b5dc757 100644
--- a/drivers/md/bcache/inode.c
+++ b/drivers/md/bcache/inode.c
@@ -140,8 +140,9 @@ again:
pr_debug("inserting inode %llu (size %u)",
inode->k.p.inode, inode->k.u64s);
- ret = bch_btree_insert_at(&iter, inode, NULL, NULL,
- NULL, BTREE_INSERT_ATOMIC);
+ ret = bch_btree_insert_at(c, NULL, NULL, NULL,
+ BTREE_INSERT_ATOMIC,
+ BTREE_INSERT_ENTRY(&iter, inode));
if (ret == -EINTR)
continue;
diff --git a/drivers/md/bcache/migrate.c b/drivers/md/bcache/migrate.c
index 236e0e469b4f..c33606865eb2 100644
--- a/drivers/md/bcache/migrate.c
+++ b/drivers/md/bcache/migrate.c
@@ -384,8 +384,9 @@ static int bch_flag_key_bad(struct btree_iter *iter,
*/
bch_extent_normalize(c, e.s);
- return bch_btree_insert_at(iter, &tmp.key, NULL, NULL,
- NULL, BTREE_INSERT_ATOMIC);
+ return bch_btree_insert_at(c, NULL, NULL, NULL,
+ BTREE_INSERT_ATOMIC,
+ BTREE_INSERT_ENTRY(iter, &tmp.key));
}
/*
diff --git a/drivers/md/bcache/str_hash.h b/drivers/md/bcache/str_hash.h
index d296e9e92894..daee0c0cefc3 100644
--- a/drivers/md/bcache/str_hash.h
+++ b/drivers/md/bcache/str_hash.h
@@ -299,8 +299,9 @@ static inline int bch_hash_set(const struct bch_hash_desc desc,
}
insert->k.p = iter.pos;
- ret = bch_btree_insert_at(&iter, insert, NULL, NULL,
- journal_seq, BTREE_INSERT_ATOMIC);
+ ret = bch_btree_insert_at(c, NULL, NULL, journal_seq,
+ BTREE_INSERT_ATOMIC,
+ BTREE_INSERT_ENTRY(&iter, insert));
/* unlock before traversing hashed_slot: */
bch_btree_iter_unlock(&iter);
@@ -344,10 +345,10 @@ static inline int bch_hash_delete(const struct bch_hash_desc desc,
? desc.whiteout_type
: KEY_TYPE_DELETED;
- ret = bch_btree_insert_at(&iter, &delete,
- NULL, NULL, journal_seq,
+ ret = bch_btree_insert_at(c, NULL, NULL, journal_seq,
BTREE_INSERT_NOFAIL|
- BTREE_INSERT_ATOMIC);
+ BTREE_INSERT_ATOMIC,
+ BTREE_INSERT_ENTRY(&iter, &delete));
/*
* Need to hold whiteout iter locked while we do the delete, if
* we're not leaving a whiteout: