summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2015-04-16 18:01:57 -0700
committerKent Overstreet <kent.overstreet@gmail.com>2016-10-07 12:33:53 -0800
commitdad5f473e5e06f830368ce1732f2d29bbf827630 (patch)
tree282c90ac2770218c217e6f1144455871fe23709d
parent5bf6db539803ee8a76368c5dfe0deba28b879b15 (diff)
bcache: Add bch_btree_update()
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r--drivers/md/bcache/btree.c29
-rw-r--r--drivers/md/bcache/btree.h2
-rw-r--r--drivers/md/bcache/inode.c8
-rw-r--r--drivers/md/bcache/inode.h9
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 *);