113 lines
3.9 KiB
Diff
113 lines
3.9 KiB
Diff
From 152c28eef5bd508af933704d19146352769dd6e8 Mon Sep 17 00:00:00 2001
|
|
From: Kent Overstreet <kent.overstreet@linux.dev>
|
|
Date: Mon, 9 Dec 2024 01:31:43 -0500
|
|
Subject: [PATCH 193/233] bcachefs: bch2_snapshot_exists()
|
|
Content-Type: text/plain; charset="utf-8"
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
bch2_snapshot_equiv() is going away; convert users that just wanted to
|
|
know if the snapshot exists to something better
|
|
|
|
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
|
|
Signed-off-by: Alexander Miroshnichenko <alex@millerson.name>
|
|
---
|
|
fs/bcachefs/data_update.c | 2 +-
|
|
fs/bcachefs/snapshot.c | 7 ++++---
|
|
fs/bcachefs/snapshot.h | 15 +++++++++++++++
|
|
fs/bcachefs/subvolume_types.h | 1 +
|
|
4 files changed, 21 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/fs/bcachefs/data_update.c b/fs/bcachefs/data_update.c
|
|
index 31b2aeb0c6e6..585214931e05 100644
|
|
--- a/fs/bcachefs/data_update.c
|
|
+++ b/fs/bcachefs/data_update.c
|
|
@@ -620,7 +620,7 @@ int bch2_data_update_init(struct btree_trans *trans,
|
|
* and we have to check for this because we go rw before repairing the
|
|
* snapshots table - just skip it, we can move it later.
|
|
*/
|
|
- if (unlikely(k.k->p.snapshot && !bch2_snapshot_equiv(c, k.k->p.snapshot)))
|
|
+ if (unlikely(k.k->p.snapshot && !bch2_snapshot_exists(c, k.k->p.snapshot)))
|
|
return -BCH_ERR_data_update_done;
|
|
|
|
if (!bkey_get_dev_refs(c, k))
|
|
diff --git a/fs/bcachefs/snapshot.c b/fs/bcachefs/snapshot.c
|
|
index f65f7b191d31..ac664888847f 100644
|
|
--- a/fs/bcachefs/snapshot.c
|
|
+++ b/fs/bcachefs/snapshot.c
|
|
@@ -318,6 +318,7 @@ static int __bch2_mark_snapshot(struct btree_trans *trans,
|
|
if (new.k->type == KEY_TYPE_snapshot) {
|
|
struct bkey_s_c_snapshot s = bkey_s_c_to_snapshot(new);
|
|
|
|
+ t->live = true;
|
|
t->parent = le32_to_cpu(s.v->parent);
|
|
t->children[0] = le32_to_cpu(s.v->children[0]);
|
|
t->children[1] = le32_to_cpu(s.v->children[1]);
|
|
@@ -914,7 +915,7 @@ static int check_snapshot_exists(struct btree_trans *trans, u32 id)
|
|
{
|
|
struct bch_fs *c = trans->c;
|
|
|
|
- if (bch2_snapshot_equiv(c, id))
|
|
+ if (bch2_snapshot_exists(c, id))
|
|
return 0;
|
|
|
|
/* Do we need to reconstruct the snapshot_tree entry as well? */
|
|
@@ -1062,7 +1063,7 @@ int bch2_reconstruct_snapshots(struct bch_fs *c)
|
|
snapshot_id_list_to_text(&buf, t);
|
|
|
|
darray_for_each(*t, id) {
|
|
- if (fsck_err_on(!bch2_snapshot_equiv(c, *id),
|
|
+ if (fsck_err_on(!bch2_snapshot_exists(c, *id),
|
|
trans, snapshot_node_missing,
|
|
"snapshot node %u from tree %s missing, recreate?", *id, buf.buf)) {
|
|
if (t->nr > 1) {
|
|
@@ -1095,7 +1096,7 @@ int bch2_check_key_has_snapshot(struct btree_trans *trans,
|
|
struct printbuf buf = PRINTBUF;
|
|
int ret = 0;
|
|
|
|
- if (fsck_err_on(!bch2_snapshot_equiv(c, k.k->p.snapshot),
|
|
+ if (fsck_err_on(!bch2_snapshot_exists(c, k.k->p.snapshot),
|
|
trans, bkey_in_missing_snapshot,
|
|
"key in missing snapshot %s, delete?",
|
|
(bch2_btree_id_to_text(&buf, iter->btree_id),
|
|
diff --git a/fs/bcachefs/snapshot.h b/fs/bcachefs/snapshot.h
|
|
index ae23d45fad66..3ff0ffa774f5 100644
|
|
--- a/fs/bcachefs/snapshot.h
|
|
+++ b/fs/bcachefs/snapshot.h
|
|
@@ -119,6 +119,21 @@ static inline u32 bch2_snapshot_root(struct bch_fs *c, u32 id)
|
|
return id;
|
|
}
|
|
|
|
+static inline bool __bch2_snapshot_exists(struct bch_fs *c, u32 id)
|
|
+{
|
|
+ const struct snapshot_t *s = snapshot_t(c, id);
|
|
+ return s ? s->live : 0;
|
|
+}
|
|
+
|
|
+static inline bool bch2_snapshot_exists(struct bch_fs *c, u32 id)
|
|
+{
|
|
+ rcu_read_lock();
|
|
+ bool ret = __bch2_snapshot_exists(c, id);
|
|
+ rcu_read_unlock();
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
static inline u32 __bch2_snapshot_equiv(struct bch_fs *c, u32 id)
|
|
{
|
|
const struct snapshot_t *s = snapshot_t(c, id);
|
|
diff --git a/fs/bcachefs/subvolume_types.h b/fs/bcachefs/subvolume_types.h
|
|
index f2ec4277c2a5..8a7f7e87c381 100644
|
|
--- a/fs/bcachefs/subvolume_types.h
|
|
+++ b/fs/bcachefs/subvolume_types.h
|
|
@@ -9,6 +9,7 @@ typedef DARRAY(u32) snapshot_id_list;
|
|
#define IS_ANCESTOR_BITMAP 128
|
|
|
|
struct snapshot_t {
|
|
+ bool live;
|
|
u32 parent;
|
|
u32 skip[3];
|
|
u32 depth;
|
|
--
|
|
2.45.2
|
|
|