bcachefs: bch2_snapshot_table_make_room()
authorKent Overstreet <kent.overstreet@linux.dev>
Wed, 2 Apr 2025 18:40:06 +0000 (14:40 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Thu, 22 May 2025 00:13:50 +0000 (20:13 -0400)
Add a better helper for check_snapshot_exists().

create_snapids() can't be changed to use this, unfortunately, because
the transaction that creates new snapshot will also be inserting other
keys (e.g. root inode) that reference that snapshot ID, and they expect
the snapshot table to already be updated.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/snapshot.c

index fec569c7deb1c7bf703161f42dd5d8db459e2c81..2eede851572c1a3bec94535bbcb9b72dce04edb2 100644 (file)
@@ -281,6 +281,16 @@ fsck_err:
        return ret;
 }
 
+static int bch2_snapshot_table_make_room(struct bch_fs *c, u32 id)
+{
+       mutex_lock(&c->snapshot_table_lock);
+       int ret = snapshot_t_mut(c, id)
+               ? 0
+               : -BCH_ERR_ENOMEM_mark_snapshot;
+       mutex_unlock(&c->snapshot_table_lock);
+       return ret;
+}
+
 static int __bch2_mark_snapshot(struct btree_trans *trans,
                       enum btree_id btree, unsigned level,
                       struct bkey_s_c old, struct bkey_s_c new,
@@ -887,9 +897,8 @@ static int check_snapshot_exists(struct btree_trans *trans, u32 id)
        }
        bch2_trans_iter_exit(trans, &iter);
 
-       return  bch2_btree_insert_trans(trans, BTREE_ID_snapshots, &snapshot->k_i, 0) ?:
-               bch2_mark_snapshot(trans, BTREE_ID_snapshots, 0,
-                                  bkey_s_c_null, bkey_i_to_s(&snapshot->k_i), 0);
+       return  bch2_snapshot_table_make_room(c, id) ?:
+               bch2_btree_insert_trans(trans, BTREE_ID_snapshots, &snapshot->k_i, 0);
 }
 
 /* Figure out which snapshot nodes belong in the same tree: */