bcachefs: Check return code from need_whiteout_for_snapshot()
authorKent Overstreet <kent.overstreet@linux.dev>
Tue, 28 Mar 2023 23:15:53 +0000 (19:15 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:58 +0000 (17:09 -0400)
This could return a transaction restart; we need to check for that.

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

index ba3191016575046b250050def40c92be23edef55..da9840edc0236774df273512f304c720458bc1b1 100644 (file)
@@ -1426,10 +1426,15 @@ int bch2_trans_update_extent(struct btree_trans *trans,
                        update->k.p = k.k->p;
                        update->k.p.snapshot = insert->k.p.snapshot;
 
-                       if (insert->k.p.snapshot != k.k->p.snapshot ||
-                           (btree_type_has_snapshots(btree_id) &&
-                            need_whiteout_for_snapshot(trans, btree_id, update->k.p)))
+                       if (insert->k.p.snapshot != k.k->p.snapshot) {
                                update->k.type = KEY_TYPE_whiteout;
+                       } else if (btree_type_has_snapshots(btree_id)) {
+                               ret = need_whiteout_for_snapshot(trans, btree_id, update->k.p);
+                               if (ret < 0)
+                                       goto err;
+                               if (ret)
+                                       update->k.type = KEY_TYPE_whiteout;
+                       }
 
                        ret = bch2_btree_insert_nonextent(trans, btree_id, update,
                                                  BTREE_UPDATE_INTERNAL_SNAPSHOT_NODE|flags);