mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
bcachefs: Ensure intent locks are marked before taking write locks
Locks must be correctly marked for the cycle detector to work. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
38474c2642
commit
1bb9123301
1 changed files with 8 additions and 2 deletions
|
@ -214,9 +214,13 @@ bkey_cached_alloc(struct btree_trans *trans, struct btree_path *path)
|
|||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
ret = btree_node_lock_nopath(trans, &ck->c, SIX_LOCK_write);
|
||||
path->l[0].b = (void *) ck;
|
||||
path->l[0].lock_seq = ck->c.lock.state.seq;
|
||||
mark_btree_node_locked(trans, path, 0, SIX_LOCK_intent);
|
||||
|
||||
ret = bch2_btree_node_lock_write(trans, path, &ck->c);
|
||||
if (unlikely(ret)) {
|
||||
six_unlock_intent(&ck->c.lock);
|
||||
btree_node_unlock(trans, path, 0);
|
||||
bkey_cached_move_to_freelist(bc, ck);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
@ -285,6 +289,7 @@ btree_key_cache_create(struct btree_trans *trans, struct btree_path *path)
|
|||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
mark_btree_node_locked(trans, path, 0, SIX_LOCK_intent);
|
||||
was_new = false;
|
||||
} else {
|
||||
if (path->btree_id == BTREE_ID_subvolumes)
|
||||
|
@ -311,6 +316,7 @@ btree_key_cache_create(struct btree_trans *trans, struct btree_path *path)
|
|||
bkey_cached_free_fast(bc, ck);
|
||||
}
|
||||
|
||||
mark_btree_node_locked(trans, path, 0, BTREE_NODE_UNLOCKED);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue