mirror of
https://github.com/torvalds/linux.git
synced 2026-06-04 20:46:48 +02:00
bcachefs: bch2_snapshot_table_make_room()
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>
This commit is contained in:
parent
ea27e8ca5d
commit
b974357c63
|
|
@ -281,6 +281,16 @@ int bch2_snapshot_validate(struct bch_fs *c, struct bkey_s_c k,
|
|||
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: */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user