diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-03-03 18:39:07 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:08:17 -0400 |
commit | 2384db8f32a2df9e71cd3003d213b48f64cbde1e (patch) | |
tree | d99a0826ca17f3063c647139693793f8f4c5a6d4 /fs/bcachefs/journal.c | |
parent | 0ce2dbbe9915af85b2ebafe6dfeca6813ba5e13c (diff) | |
download | lwn-2384db8f32a2df9e71cd3003d213b48f64cbde1e.tar.gz lwn-2384db8f32a2df9e71cd3003d213b48f64cbde1e.zip |
bcachefs: Separate discards from rest of journal reclaim
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/journal.c')
-rw-r--r-- | fs/bcachefs/journal.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/fs/bcachefs/journal.c b/fs/bcachefs/journal.c index 17add726f2ac..80d7980cf5aa 100644 --- a/fs/bcachefs/journal.c +++ b/fs/bcachefs/journal.c @@ -322,6 +322,7 @@ static int __journal_res_get(struct journal *j, struct journal_res *res, { struct bch_fs *c = container_of(j, struct bch_fs, journal); struct journal_buf *buf; + bool can_discard; int ret; retry: if (journal_res_get_fast(j, res, flags)) @@ -370,18 +371,28 @@ retry: !j->res_get_blocked_start) j->res_get_blocked_start = local_clock() ?: 1; + can_discard = j->can_discard; spin_unlock(&j->lock); if (!ret) goto retry; + if (ret == -ENOSPC) { /* * Journal is full - can't rely on reclaim from work item due to * freezing: */ trace_journal_full(c); - if (!(flags & JOURNAL_RES_GET_NONBLOCK)) + + if (!(flags & JOURNAL_RES_GET_NONBLOCK)) { + if (can_discard) { + bch2_journal_do_discards(j); + goto retry; + } + bch2_journal_reclaim_work(&j->reclaim_work.work); + } + ret = -EAGAIN; } |