bcachefs: Ensure bucket gen gc completes
authorKent Overstreet <kent.overstreet@gmail.com>
Tue, 13 Apr 2021 19:10:39 +0000 (15:10 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:00 +0000 (17:09 -0400)
We don't want it to block, if it can't allocate it should just continue
instead of possibly deadlocking.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_gc.c

index 9f47db77c66b7d4f9481773de2267e1e892f3de3..c14794cf1be8b79fbd4178779c7ddbe628928e2b 100644 (file)
@@ -1181,7 +1181,7 @@ static int bch2_gc_btree_gens(struct bch_fs *c, enum btree_id btree_id)
        struct btree_iter *iter;
        struct bkey_s_c k;
        struct bkey_buf sk;
-       int ret = 0;
+       int ret = 0, commit_err = 0;
 
        bch2_bkey_buf_init(&sk);
        bch2_trans_init(&trans, c, 0, 0);
@@ -1195,18 +1195,18 @@ static int bch2_gc_btree_gens(struct bch_fs *c, enum btree_id btree_id)
               !(ret = bkey_err(k))) {
                c->gc_gens_pos = iter->pos;
 
-               if (gc_btree_gens_key(c, k)) {
+               if (gc_btree_gens_key(c, k) && !commit_err) {
                        bch2_bkey_buf_reassemble(&sk, c, k);
                        bch2_extent_normalize(c, bkey_i_to_s(sk.k));
 
                        bch2_trans_update(&trans, iter, sk.k, 0);
 
-                       ret = bch2_trans_commit(&trans, NULL, NULL,
-                                               BTREE_INSERT_NOFAIL);
-                       if (ret == -EINTR)
+                       commit_err = bch2_trans_commit(&trans, NULL, NULL,
+                                                      BTREE_INSERT_NOWAIT|
+                                                      BTREE_INSERT_NOFAIL);
+                       if (commit_err == -EINTR) {
+                               commit_err = 0;
                                continue;
-                       if (ret) {
-                               break;
                        }
                }