diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2015-04-16 18:01:57 -0700 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2016-10-07 12:33:53 -0800 |
commit | dad5f473e5e06f830368ce1732f2d29bbf827630 (patch) | |
tree | 282c90ac2770218c217e6f1144455871fe23709d | |
parent | 5bf6db539803ee8a76368c5dfe0deba28b879b15 (diff) |
bcache: Add bch_btree_update()
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r-- | drivers/md/bcache/btree.c | 29 | ||||
-rw-r--r-- | drivers/md/bcache/btree.h | 2 | ||||
-rw-r--r-- | drivers/md/bcache/inode.c | 8 | ||||
-rw-r--r-- | drivers/md/bcache/inode.h | 9 |
4 files changed, 38 insertions, 10 deletions
diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c index 58508e1bbc52..b6f8046ac8e1 100644 --- a/drivers/md/bcache/btree.c +++ b/drivers/md/bcache/btree.c @@ -2486,6 +2486,35 @@ out: ret2 = bch_btree_iter_unlock(&iter); return ret ?: ret2; } +/** + * bch_btree_update - like bch_btree_insert(), but asserts that we're + * overwriting an existing key + */ +int bch_btree_update(struct cache_set *c, enum btree_id id, struct bkey_i *k, + struct closure *persistent, u64 *journal_seq) +{ + struct btree_iter iter; + struct bkey_s_c u; + int ret, ret2; + + EBUG_ON(id == BTREE_ID_EXTENTS); + + bch_btree_iter_init_intent(&iter, c, id, k->k.p); + + ret = bch_btree_iter_traverse(&iter); + if (unlikely(ret)) + goto out; + + u = bch_btree_iter_peek_with_holes(&iter); + BUG_ON(!u.k || bkey_deleted(u.k)); + + ret = bch_btree_insert_at(&iter, &keylist_single(k), NULL, + persistent, journal_seq, 0); +out: ret2 = bch_btree_iter_unlock(&iter); + + return ret ?: ret2; +} + /* Btree iterator: */ int bch_btree_iter_unlock(struct btree_iter *iter) diff --git a/drivers/md/bcache/btree.h b/drivers/md/bcache/btree.h index 588709c0e413..e777ec4bdb8e 100644 --- a/drivers/md/bcache/btree.h +++ b/drivers/md/bcache/btree.h @@ -471,6 +471,8 @@ int bch_btree_insert_at(struct btree_iter *, struct keylist *, int bch_btree_insert_check_key(struct btree_iter *, struct bkey_i *); int bch_btree_insert(struct cache_set *, enum btree_id, struct keylist *, struct bch_replace_info *, struct closure *, u64 *); +int bch_btree_update(struct cache_set *, enum btree_id, struct bkey_i *, + struct closure *, u64 *); int bch_btree_node_rewrite(struct btree *, struct btree_iter *, bool); diff --git a/drivers/md/bcache/inode.c b/drivers/md/bcache/inode.c index e5a3b34b6166..09b21f509013 100644 --- a/drivers/md/bcache/inode.c +++ b/drivers/md/bcache/inode.c @@ -155,14 +155,6 @@ again: return -ENOSPC; } -int bch_inode_update(struct cache_set *c, struct bkey_i *inode, - struct closure *cl, u64 *journal_seq) -{ - return bch_btree_insert(c, BTREE_ID_INODES, - &keylist_single(inode), - NULL, cl, journal_seq); -} - int bch_inode_truncate(struct cache_set *c, u64 inode_nr, u64 new_size) { return bch_discard(c, POS(inode_nr, new_size), POS(inode_nr + 1, 0), 0); diff --git a/drivers/md/bcache/inode.h b/drivers/md/bcache/inode.h index 0e566afc409f..6561e1e71ee6 100644 --- a/drivers/md/bcache/inode.h +++ b/drivers/md/bcache/inode.h @@ -7,11 +7,16 @@ extern const struct bkey_ops bch_bkey_inode_ops; ssize_t bch_inode_status(char *, size_t, const struct bkey *); int bch_inode_create(struct cache_set *, struct bkey_i *, u64, u64, u64 *); -int bch_inode_update(struct cache_set *, struct bkey_i *, - struct closure *, u64 *); int bch_inode_truncate(struct cache_set *, u64, u64); int bch_inode_rm(struct cache_set *, u64); +static inline int bch_inode_update(struct cache_set *c, struct bkey_i *inode, + struct closure *cl, u64 *journal_seq) +{ + return bch_btree_update(c, BTREE_ID_INODES, inode, + cl, journal_seq); +} + int bch_blockdev_inode_find_by_uuid(struct cache_set *, uuid_le *, struct bkey_i_inode_blockdev *); |