bcachefs: Fix a transaction path overflow
authorKent Overstreet <kent.overstreet@linux.dev>
Fri, 18 Nov 2022 00:07:40 +0000 (19:07 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:46 +0000 (17:09 -0400)
It turns out we need bch2_extent_trim_atomi() even when we're deleting
extents one at a time because it's possible for one reflink_p to
reference arbitrarily many reflink_v extents. This doesn't normally
happen, but the data move path can fragment existing extents in the
background.

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

index 4161cd850eb802f73ba4c6562eaaf01a6397d71c..f026e2f70dcdf8e308842328218d31448e20042e 100644 (file)
@@ -599,7 +599,6 @@ static int bch2_inode_delete_keys(struct btree_trans *trans,
         * iterator:
         */
        bch2_trans_iter_init(trans, &iter, id, POS(inum.inum, 0),
-                            BTREE_ITER_NOT_EXTENTS|
                             BTREE_ITER_INTENT);
 
        while (1) {
@@ -622,6 +621,14 @@ static int bch2_inode_delete_keys(struct btree_trans *trans,
                bkey_init(&delete.k);
                delete.k.p = iter.pos;
 
+               if (iter.flags & BTREE_ITER_IS_EXTENTS) {
+                       bch2_key_resize(&delete.k, k.k->p.offset - iter.pos.offset);
+
+                       ret = bch2_extent_trim_atomic(trans, &iter, &delete);
+                       if (ret)
+                               goto err;
+               }
+
                ret = bch2_trans_update(trans, &iter, &delete, 0) ?:
                      bch2_trans_commit(trans, NULL, NULL,
                                        BTREE_INSERT_NOFAIL);