summaryrefslogtreecommitdiff
path: root/fs/bcachefs/journal.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-03-03 18:39:07 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:08:17 -0400
commit2384db8f32a2df9e71cd3003d213b48f64cbde1e (patch)
treed99a0826ca17f3063c647139693793f8f4c5a6d4 /fs/bcachefs/journal.c
parent0ce2dbbe9915af85b2ebafe6dfeca6813ba5e13c (diff)
downloadlwn-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.c13
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;
}