bcachefs: Move fsck_inode_rm() to inode.c
authorKent Overstreet <kent.overstreet@linux.dev>
Fri, 21 Jul 2023 07:20:08 +0000 (03:20 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:10:09 +0000 (17:10 -0400)
Prep work for the new deleted inodes btree

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

index 5338765b3e68ed1b3f44415f59e5550881a71d58..31eb9176eb393bb48db743e55af462f6a846395e 100644 (file)
@@ -219,69 +219,6 @@ static int write_inode(struct btree_trans *trans,
        return ret;
 }
 
-static int fsck_inode_rm(struct btree_trans *trans, u64 inum, u32 snapshot)
-{
-       struct bch_fs *c = trans->c;
-       struct btree_iter iter = { NULL };
-       struct bkey_i_inode_generation delete;
-       struct bch_inode_unpacked inode_u;
-       struct bkey_s_c k;
-       int ret;
-
-       do {
-               ret   = bch2_btree_delete_range_trans(trans, BTREE_ID_extents,
-                                                     SPOS(inum, 0, snapshot),
-                                                     SPOS(inum, U64_MAX, snapshot),
-                                                     0, NULL) ?:
-                       bch2_btree_delete_range_trans(trans, BTREE_ID_dirents,
-                                                     SPOS(inum, 0, snapshot),
-                                                     SPOS(inum, U64_MAX, snapshot),
-                                                     0, NULL) ?:
-                       bch2_btree_delete_range_trans(trans, BTREE_ID_xattrs,
-                                                     SPOS(inum, 0, snapshot),
-                                                     SPOS(inum, U64_MAX, snapshot),
-                                                     0, NULL);
-       } while (ret == -BCH_ERR_transaction_restart_nested);
-       if (ret)
-               goto err;
-retry:
-       bch2_trans_begin(trans);
-
-       k = bch2_bkey_get_iter(trans, &iter, BTREE_ID_inodes,
-                              SPOS(0, inum, snapshot), BTREE_ITER_INTENT);
-       ret = bkey_err(k);
-       if (ret)
-               goto err;
-
-       if (!bkey_is_inode(k.k)) {
-               bch2_fs_inconsistent(c,
-                                    "inode %llu:%u not found when deleting",
-                                    inum, snapshot);
-               ret = -EIO;
-               goto err;
-       }
-
-       bch2_inode_unpack(k, &inode_u);
-
-       /* Subvolume root? */
-       if (inode_u.bi_subvol)
-               bch_warn(c, "deleting inode %llu marked as unlinked, but also a subvolume root!?", inode_u.bi_inum);
-
-       bkey_inode_generation_init(&delete.k_i);
-       delete.k.p = iter.pos;
-       delete.v.bi_generation = cpu_to_le32(inode_u.bi_generation + 1);
-
-       ret   = bch2_trans_update(trans, &iter, &delete.k_i, 0) ?:
-               bch2_trans_commit(trans, NULL, NULL,
-                               BTREE_INSERT_NOFAIL);
-err:
-       bch2_trans_iter_exit(trans, &iter);
-       if (bch2_err_matches(ret, BCH_ERR_transaction_restart))
-               goto retry;
-
-       return ret ?: -BCH_ERR_transaction_restart_nested;
-}
-
 static int __remove_dirent(struct btree_trans *trans, struct bpos pos)
 {
        struct bch_fs *c = trans->c;
@@ -929,7 +866,7 @@ static int check_inode(struct btree_trans *trans,
                bch2_trans_unlock(trans);
                bch2_fs_lazy_rw(c);
 
-               ret = fsck_inode_rm(trans, u.bi_inum, iter->pos.snapshot);
+               ret = bch2_inode_rm_snapshot(trans, u.bi_inum, iter->pos.snapshot);
                if (ret && !bch2_err_matches(ret, BCH_ERR_transaction_restart))
                        bch_err(c, "error in fsck: error while deleting inode: %s",
                                bch2_err_str(ret));
index 8834809d4a6797e0f0ae80209fda529aaf91fe1e..755cf7d177cd03444ba0c5a37194ea22af43ab89 100644 (file)
@@ -923,3 +923,66 @@ void bch2_inode_opts_get(struct bch_io_opts *opts, struct bch_fs *c,
        if (opts->nocow)
                opts->compression = opts->background_compression = opts->data_checksum = opts->erasure_code = 0;
 }
+
+int bch2_inode_rm_snapshot(struct btree_trans *trans, u64 inum, u32 snapshot)
+{
+       struct bch_fs *c = trans->c;
+       struct btree_iter iter = { NULL };
+       struct bkey_i_inode_generation delete;
+       struct bch_inode_unpacked inode_u;
+       struct bkey_s_c k;
+       int ret;
+
+       do {
+               ret   = bch2_btree_delete_range_trans(trans, BTREE_ID_extents,
+                                                     SPOS(inum, 0, snapshot),
+                                                     SPOS(inum, U64_MAX, snapshot),
+                                                     0, NULL) ?:
+                       bch2_btree_delete_range_trans(trans, BTREE_ID_dirents,
+                                                     SPOS(inum, 0, snapshot),
+                                                     SPOS(inum, U64_MAX, snapshot),
+                                                     0, NULL) ?:
+                       bch2_btree_delete_range_trans(trans, BTREE_ID_xattrs,
+                                                     SPOS(inum, 0, snapshot),
+                                                     SPOS(inum, U64_MAX, snapshot),
+                                                     0, NULL);
+       } while (ret == -BCH_ERR_transaction_restart_nested);
+       if (ret)
+               goto err;
+retry:
+       bch2_trans_begin(trans);
+
+       k = bch2_bkey_get_iter(trans, &iter, BTREE_ID_inodes,
+                              SPOS(0, inum, snapshot), BTREE_ITER_INTENT);
+       ret = bkey_err(k);
+       if (ret)
+               goto err;
+
+       if (!bkey_is_inode(k.k)) {
+               bch2_fs_inconsistent(c,
+                                    "inode %llu:%u not found when deleting",
+                                    inum, snapshot);
+               ret = -EIO;
+               goto err;
+       }
+
+       bch2_inode_unpack(k, &inode_u);
+
+       /* Subvolume root? */
+       if (inode_u.bi_subvol)
+               bch_warn(c, "deleting inode %llu marked as unlinked, but also a subvolume root!?", inode_u.bi_inum);
+
+       bkey_inode_generation_init(&delete.k_i);
+       delete.k.p = iter.pos;
+       delete.v.bi_generation = cpu_to_le32(inode_u.bi_generation + 1);
+
+       ret   = bch2_trans_update(trans, &iter, &delete.k_i, 0) ?:
+               bch2_trans_commit(trans, NULL, NULL,
+                               BTREE_INSERT_NOFAIL);
+err:
+       bch2_trans_iter_exit(trans, &iter);
+       if (bch2_err_matches(ret, BCH_ERR_transaction_restart))
+               goto retry;
+
+       return ret ?: -BCH_ERR_transaction_restart_nested;
+}
index 7809d1b6d7a237c6b3b614d1521ed22e6689ead7..1b9dc27e82bd476be4531dda156b49541b86a54d 100644 (file)
@@ -198,4 +198,6 @@ struct bch_opts bch2_inode_opts_to_opts(struct bch_inode_unpacked *);
 void bch2_inode_opts_get(struct bch_io_opts *, struct bch_fs *,
                         struct bch_inode_unpacked *);
 
+int bch2_inode_rm_snapshot(struct btree_trans *, u64, u32);
+
 #endif /* _BCACHEFS_INODE_H */