diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2022-04-02 16:36:29 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2022-04-02 16:36:29 -0400 |
commit | 32aabbc4e547592f957de7d4b093986e55981085 (patch) | |
tree | a587cf13dd8e1ed9cf3e9f46898a5b3e3228296c /libbcachefs/alloc_background.c | |
parent | 70f2681838973f20a918b518f82d382b3556963d (diff) |
Update bcachefs sources to ab3b6e7dd6 bcachefs: Fix pr_buf() calls
Diffstat (limited to 'libbcachefs/alloc_background.c')
-rw-r--r-- | libbcachefs/alloc_background.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/libbcachefs/alloc_background.c b/libbcachefs/alloc_background.c index 1188239..e8a34ec 100644 --- a/libbcachefs/alloc_background.c +++ b/libbcachefs/alloc_background.c @@ -886,7 +886,7 @@ static int bch2_clear_need_discard(struct btree_trans *trans, struct bpos pos, GFP_KERNEL, 0); *discard_done = true; - ret = bch2_trans_relock(trans); + ret = bch2_trans_relock(trans) ? 0 : -EINTR; if (ret) goto out; } @@ -907,6 +907,7 @@ static void bch2_do_discards_work(struct work_struct *work) struct btree_trans trans; struct btree_iter iter; struct bkey_s_c k; + u64 seen = 0, open = 0, need_journal_commit = 0, discarded = 0; int ret; bch2_trans_init(&trans, c, 0, 0); @@ -929,11 +930,19 @@ static void bch2_do_discards_work(struct work_struct *work) } } + seen++; + + if (bch2_bucket_is_open_safe(c, k.k->p.inode, k.k->p.offset)) { + open++; + continue; + } + if (bch2_bucket_needs_journal_commit(&c->buckets_waiting_for_journal, c->journal.flushed_seq_ondisk, - k.k->p.inode, k.k->p.offset) || - bch2_bucket_is_open_safe(c, k.k->p.inode, k.k->p.offset)) + k.k->p.inode, k.k->p.offset)) { + need_journal_commit++; continue; + } ret = __bch2_trans_do(&trans, NULL, NULL, BTREE_INSERT_USE_RESERVE| @@ -941,6 +950,8 @@ static void bch2_do_discards_work(struct work_struct *work) bch2_clear_need_discard(&trans, k.k->p, ca, &discard_done)); if (ret) break; + + discarded++; } bch2_trans_iter_exit(&trans, &iter); @@ -948,7 +959,13 @@ static void bch2_do_discards_work(struct work_struct *work) percpu_ref_put(&ca->io_ref); bch2_trans_exit(&trans); + + if (need_journal_commit * 2 > seen) + bch2_journal_flush_async(&c->journal, NULL); + percpu_ref_put(&c->writes); + + trace_do_discards(c, seen, open, need_journal_commit, discarded, ret); } void bch2_do_discards(struct bch_fs *c) |