Skip to content

Commit c502b5b

Browse files
author
Kent Overstreet
committed
bcachefs; Fix deadlock in bch2_btree_update_start()
BCH_TRANS_COMMIT_journal_reclaim with watermark != BCH_WATERMARK_reclaim means nonblocking, and we need the journal_res_get() in btree_update_start() to respect that. In a future refactoring we'll be deleting BCH_TRANS_COMMIT_journal_reclaim and replacing it with an explicit BCH_TRANS_COMMIT_nonblocking. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
1 parent b38114d commit c502b5b

File tree

1 file changed

+9
-4
lines changed

1 file changed

+9
-4
lines changed

fs/bcachefs/btree_update_interior.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1067,13 +1067,18 @@ bch2_btree_update_start(struct btree_trans *trans, struct btree_path *path,
10671067
flags &= ~BCH_WATERMARK_MASK;
10681068
flags |= watermark;
10691069

1070-
if (!(flags & BCH_TRANS_COMMIT_journal_reclaim) &&
1071-
watermark < c->journal.watermark) {
1070+
if (watermark < c->journal.watermark) {
10721071
struct journal_res res = { 0 };
1072+
unsigned journal_flags = watermark|JOURNAL_RES_GET_CHECK;
1073+
1074+
if ((flags & BCH_TRANS_COMMIT_journal_reclaim) &&
1075+
watermark != BCH_WATERMARK_reclaim)
1076+
journal_flags |= JOURNAL_RES_GET_NONBLOCK;
10731077

10741078
ret = drop_locks_do(trans,
1075-
bch2_journal_res_get(&c->journal, &res, 1,
1076-
watermark|JOURNAL_RES_GET_CHECK));
1079+
bch2_journal_res_get(&c->journal, &res, 1, journal_flags));
1080+
if (bch2_err_matches(ret, BCH_ERR_operation_blocked))
1081+
ret = -BCH_ERR_journal_reclaim_would_deadlock;
10771082
if (ret)
10781083
return ERR_PTR(ret);
10791084
}

0 commit comments

Comments
 (0)