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

bcachefs: Check if stuck in journal_res_get()

Like how we already do when the allocator seems to be stuck, check if
we're waiting too long for a journal reservation and print some debug
info.

This is specifically to track down
https://github.com/koverstreet/bcachefs/issues/656



which is showing up in userspace where we don't have sysfs/debugfs to
get the journal debug info.

Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 04b670de
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -603,6 +603,19 @@ int bch2_journal_res_get_slowpath(struct journal *j, struct journal_res *res,
{
	int ret;

	if (closure_wait_event_timeout(&j->async_wait,
		   (ret = __journal_res_get(j, res, flags)) != -BCH_ERR_journal_res_get_blocked ||
		   (flags & JOURNAL_RES_GET_NONBLOCK),
		   HZ * 10))
		return ret;

	struct bch_fs *c = container_of(j, struct bch_fs, journal);
	struct printbuf buf = PRINTBUF;
	bch2_journal_debug_to_text(&buf, j);
	bch_err(c, "Journal stuck? Waited for 10 seconds...\n%s",
		buf.buf);
	printbuf_exit(&buf);

	closure_wait_event(&j->async_wait,
		   (ret = __journal_res_get(j, res, flags)) != -BCH_ERR_journal_res_get_blocked ||
		   (flags & JOURNAL_RES_GET_NONBLOCK));