diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2016-08-05 22:23:11 -0800 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2016-08-05 22:23:11 -0800 |
commit | 435056ec0bed1984039ff9c10507e599ffee402c (patch) | |
tree | 4975990b7cb91c6f034205b8f2d8490dc0df96a2 | |
parent | 7efc97e6e17cdf0d75e14f918a1ddd5f7f58381e (diff) |
bcache: Combine bch_btree_insert_trans() with bch_btree_insert_at()
-rw-r--r-- | drivers/md/bcache/btree_update.c | 32 | ||||
-rw-r--r-- | drivers/md/bcache/btree_update.h | 80 | ||||
-rw-r--r-- | drivers/md/bcache/dirent.c | 20 | ||||
-rw-r--r-- | drivers/md/bcache/fs-gc.c | 5 | ||||
-rw-r--r-- | drivers/md/bcache/fs-io.c | 39 | ||||
-rw-r--r-- | drivers/md/bcache/fs.c | 8 | ||||
-rw-r--r-- | drivers/md/bcache/inode.c | 5 | ||||
-rw-r--r-- | drivers/md/bcache/migrate.c | 5 | ||||
-rw-r--r-- | drivers/md/bcache/str_hash.h | 11 |
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, ©.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, ©.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: |