Commit a0d11fee authored by Kent Overstreet's avatar Kent Overstreet
Browse files

bcachefs: Don't use commit_do() unnecessarily



Using commit_do() to call alloc_sectors_start_trans() breaks when we're
randomly injecting transaction restarts - the restart in the commit
causes us to leak the lock that alloc_sectorS_start_trans() takes.

Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 6bee2a04
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1977,7 +1977,7 @@ static void bch2_do_discards_fast_work(struct work_struct *work)
					     ca->mi.bucket_size,
					     GFP_KERNEL);

		int ret = bch2_trans_do(c, NULL, NULL,
		int ret = bch2_trans_commit_do(c, NULL, NULL,
			BCH_WATERMARK_btree|
			BCH_TRANS_COMMIT_no_enospc,
			bch2_clear_bucket_needs_discard(trans, POS(ca->dev_idx, bucket)));
+1 −1
Original line number Diff line number Diff line
@@ -684,7 +684,7 @@ struct open_bucket *bch2_bucket_alloc(struct bch_fs *c, struct bch_dev *ca,
	struct bch_dev_usage usage;
	struct open_bucket *ob;

	bch2_trans_do(c, NULL, NULL, 0,
	bch2_trans_do(c,
		      PTR_ERR_OR_ZERO(ob = bch2_bucket_alloc_trans(trans, ca, watermark,
							data_type, cl, false, &usage)));
	return ob;
+1 −1
Original line number Diff line number Diff line
@@ -1871,7 +1871,7 @@ static void btree_node_write_work(struct work_struct *work)

		}
	} else {
		ret = bch2_trans_do(c, NULL, NULL, 0,
		ret = bch2_trans_do(c,
			bch2_btree_node_update_key_get_iter(trans, b, &wbio->key,
					BCH_WATERMARK_interior_updates|
					BCH_TRANS_COMMIT_journal_reclaim|
+2 −0
Original line number Diff line number Diff line
@@ -912,6 +912,8 @@ struct bkey_s_c bch2_btree_iter_peek_and_restart_outlined(struct btree_iter *);
	_ret;								\
})

#define bch2_trans_do(_c, _do)	bch2_trans_run(_c, lockrestart_do(trans, _do))

struct btree_trans *__bch2_trans_get(struct bch_fs *, unsigned);
void bch2_trans_put(struct btree_trans *);

+2 −2
Original line number Diff line number Diff line
@@ -668,7 +668,7 @@ int bch2_btree_insert(struct bch_fs *c, enum btree_id id, struct bkey_i *k,
		      struct disk_reservation *disk_res, int flags,
		      enum btree_iter_update_trigger_flags iter_flags)
{
	return bch2_trans_do(c, disk_res, NULL, flags,
	return bch2_trans_commit_do(c, disk_res, NULL, flags,
			     bch2_btree_insert_trans(trans, id, k, iter_flags));
}

@@ -865,7 +865,7 @@ __bch2_fs_log_msg(struct bch_fs *c, unsigned commit_flags, const char *fmt,
		memcpy(l->d, buf.buf, buf.pos);
		c->journal.early_journal_entries.nr += jset_u64s(u64s);
	} else {
		ret = bch2_trans_do(c, NULL, NULL,
		ret = bch2_trans_commit_do(c, NULL, NULL,
			BCH_TRANS_COMMIT_lazy_rw|commit_flags,
			__bch2_trans_log_msg(trans, &buf, u64s));
	}
Loading