]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/fsck.c
Update bcachefs sources to c3e4d892b77b mean and variance: Promote to lib/math
[bcachefs-tools-debian] / libbcachefs / fsck.c
index 8cf4bcf9be897185a9cd89527362f9739772e9a5..bc6b56628fdfe58005a394b3ae25465a93cf033d 100644 (file)
@@ -207,10 +207,8 @@ static int fsck_write_inode(struct btree_trans *trans,
                            struct bch_inode_unpacked *inode,
                            u32 snapshot)
 {
-       int ret = commit_do(trans, NULL, NULL,
-                                 BCH_TRANS_COMMIT_no_enospc|
-                                 BCH_TRANS_COMMIT_lazy_rw,
-                                 __write_inode(trans, inode, snapshot));
+       int ret = commit_do(trans, NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
+                           __write_inode(trans, inode, snapshot));
        if (ret)
                bch_err_fn(trans->c, ret);
        return ret;
@@ -353,9 +351,7 @@ static int reattach_inode(struct btree_trans *trans,
                          struct bch_inode_unpacked *inode,
                          u32 inode_snapshot)
 {
-       int ret = commit_do(trans, NULL, NULL,
-                                 BCH_TRANS_COMMIT_lazy_rw|
-                                 BCH_TRANS_COMMIT_no_enospc,
+       int ret = commit_do(trans, NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
                        __reattach_inode(trans, inode, inode_snapshot));
        bch_err_msg(trans->c, ret, "reattaching inode %llu", inode->bi_inum);
        return ret;
@@ -756,9 +752,7 @@ static int hash_redo_key(struct btree_trans *trans,
                                       k.k->p.snapshot, tmp,
                                       BCH_HASH_SET_MUST_CREATE,
                                       BTREE_UPDATE_INTERNAL_SNAPSHOT_NODE) ?:
-               bch2_trans_commit(trans, NULL, NULL,
-                                 BCH_TRANS_COMMIT_no_enospc|
-                                 BCH_TRANS_COMMIT_lazy_rw);
+               bch2_trans_commit(trans, NULL, NULL, BCH_TRANS_COMMIT_no_enospc);
 }
 
 static int hash_check_key(struct btree_trans *trans,
@@ -879,7 +873,7 @@ static int check_inode(struct btree_trans *trans,
                        c, inode_snapshot_mismatch,
                        "inodes in different snapshots don't match")) {
                bch_err(c, "repair not implemented yet");
-               return -EINVAL;
+               return -BCH_ERR_fsck_repair_unimplemented;
        }
 
        if ((u.bi_flags & (BCH_INODE_i_size_dirty|BCH_INODE_unlinked)) &&
@@ -905,12 +899,13 @@ static int check_inode(struct btree_trans *trans,
        if (u.bi_flags & BCH_INODE_unlinked &&
            c->sb.version >= bcachefs_metadata_version_deleted_inodes) {
                ret = check_inode_deleted_list(trans, k.k->p);
-               if (ret)
+               if (ret < 0)
                        return ret;
 
                fsck_err_on(ret, c, unlinked_inode_not_on_deleted_list,
                            "inode %llu:%u unlinked, but not on deleted list",
                            u.bi_inum, k.k->p.snapshot);
+               ret = 0;
        }
 
        if (u.bi_flags & BCH_INODE_unlinked &&
@@ -918,9 +913,6 @@ static int check_inode(struct btree_trans *trans,
             fsck_err(c, inode_unlinked_but_clean,
                      "filesystem marked clean, but inode %llu unlinked",
                      u.bi_inum))) {
-               bch2_trans_unlock(trans);
-               bch2_fs_lazy_rw(c);
-
                ret = bch2_inode_rm_snapshot(trans, u.bi_inum, iter->pos.snapshot);
                bch_err_msg(c, ret, "in fsck deleting inode");
                return ret;
@@ -933,9 +925,6 @@ static int check_inode(struct btree_trans *trans,
                      u.bi_inum))) {
                bch_verbose(c, "truncating inode %llu", u.bi_inum);
 
-               bch2_trans_unlock(trans);
-               bch2_fs_lazy_rw(c);
-
                /*
                 * XXX: need to truncate partial blocks too here - or ideally
                 * just switch units to bytes and that issue goes away
@@ -999,7 +988,6 @@ fsck_err:
        return ret;
 }
 
-noinline_for_stack
 int bch2_check_inodes(struct bch_fs *c)
 {
        bool full = c->opts.fsck;
@@ -1015,7 +1003,7 @@ int bch2_check_inodes(struct bch_fs *c)
        ret = for_each_btree_key_commit(trans, iter, BTREE_ID_inodes,
                        POS_MIN,
                        BTREE_ITER_PREFETCH|BTREE_ITER_ALL_SNAPSHOTS, k,
-                       NULL, NULL, BCH_TRANS_COMMIT_lazy_rw|BCH_TRANS_COMMIT_no_enospc,
+                       NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
                check_inode(trans, &iter, k, &prev, &s, full));
 
        snapshots_seen_exit(&s);
@@ -1229,8 +1217,7 @@ static int overlapping_extents_found(struct btree_trans *trans,
                ret =   bch2_trans_update_extent_overwrite(trans, old_iter,
                                BTREE_UPDATE_INTERNAL_SNAPSHOT_NODE,
                                k1, k2) ?:
-                       bch2_trans_commit(trans, &res, NULL,
-                               BCH_TRANS_COMMIT_lazy_rw|BCH_TRANS_COMMIT_no_enospc);
+                       bch2_trans_commit(trans, &res, NULL, BCH_TRANS_COMMIT_no_enospc);
                bch2_disk_reservation_put(c, &res);
 
                if (ret)
@@ -1469,7 +1456,7 @@ int bch2_check_extents(struct bch_fs *c)
                        POS(BCACHEFS_ROOT_INO, 0),
                        BTREE_ITER_PREFETCH|BTREE_ITER_ALL_SNAPSHOTS, k,
                        &res, NULL,
-                       BCH_TRANS_COMMIT_lazy_rw|BCH_TRANS_COMMIT_no_enospc, ({
+                       BCH_TRANS_COMMIT_no_enospc, ({
                bch2_disk_reservation_put(c, &res);
                check_extent(trans, &iter, k, &w, &s, &extent_ends) ?:
                check_extent_overbig(trans, &iter, k);
@@ -1498,7 +1485,7 @@ int bch2_check_indirect_extents(struct bch_fs *c)
                        POS_MIN,
                        BTREE_ITER_PREFETCH, k,
                        &res, NULL,
-                       BCH_TRANS_COMMIT_lazy_rw|BCH_TRANS_COMMIT_no_enospc, ({
+                       BCH_TRANS_COMMIT_no_enospc, ({
                bch2_disk_reservation_put(c, &res);
                check_extent_overbig(trans, &iter, k);
        }));
@@ -1871,7 +1858,7 @@ int bch2_check_dirents(struct bch_fs *c)
                        BTREE_ITER_PREFETCH|BTREE_ITER_ALL_SNAPSHOTS,
                        k,
                        NULL, NULL,
-                       BCH_TRANS_COMMIT_lazy_rw|BCH_TRANS_COMMIT_no_enospc,
+                       BCH_TRANS_COMMIT_no_enospc,
                check_dirent(trans, &iter, k, &hash_info, &dir, &target, &s));
 
        bch2_trans_put(trans);
@@ -1935,7 +1922,7 @@ int bch2_check_xattrs(struct bch_fs *c)
                        BTREE_ITER_PREFETCH|BTREE_ITER_ALL_SNAPSHOTS,
                        k,
                        NULL, NULL,
-                       BCH_TRANS_COMMIT_lazy_rw|BCH_TRANS_COMMIT_no_enospc,
+                       BCH_TRANS_COMMIT_no_enospc,
                check_xattr(trans, &iter, k, &hash_info, &inode)));
        bch_err_fn(c, ret);
        return ret;
@@ -1966,8 +1953,7 @@ static int check_root_trans(struct btree_trans *trans)
                root_subvol.v.snapshot  = cpu_to_le32(snapshot);
                root_subvol.v.inode     = cpu_to_le64(inum);
                ret = commit_do(trans, NULL, NULL,
-                                     BCH_TRANS_COMMIT_no_enospc|
-                                     BCH_TRANS_COMMIT_lazy_rw,
+                                     BCH_TRANS_COMMIT_no_enospc,
                        bch2_btree_insert_trans(trans, BTREE_ID_subvolumes,
                                            &root_subvol.k_i, 0));
                bch_err_msg(c, ret, "writing root subvol");
@@ -2002,9 +1988,7 @@ int bch2_check_root(struct bch_fs *c)
 {
        int ret;
 
-       ret = bch2_trans_do(c, NULL, NULL,
-                            BCH_TRANS_COMMIT_no_enospc|
-                            BCH_TRANS_COMMIT_lazy_rw,
+       ret = bch2_trans_do(c, NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
                check_root_trans(trans));
        bch_err_fn(c, ret);
        return ret;
@@ -2133,8 +2117,7 @@ static int check_path(struct btree_trans *trans,
                                return 0;
 
                        ret = commit_do(trans, NULL, NULL,
-                                             BCH_TRANS_COMMIT_no_enospc|
-                                             BCH_TRANS_COMMIT_lazy_rw,
+                                             BCH_TRANS_COMMIT_no_enospc,
                                        remove_backpointer(trans, inode));
                        if (ret) {
                                bch_err(c, "error removing dirent: %i", ret);
@@ -2415,7 +2398,7 @@ static int check_nlinks_update_hardlinks(struct bch_fs *c,
                for_each_btree_key_commit(trans, iter, BTREE_ID_inodes,
                                POS(0, range_start),
                                BTREE_ITER_INTENT|BTREE_ITER_PREFETCH|BTREE_ITER_ALL_SNAPSHOTS, k,
-                               NULL, NULL, BCH_TRANS_COMMIT_lazy_rw|BCH_TRANS_COMMIT_no_enospc,
+                               NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
                        check_nlinks_update_inode(trans, &iter, k, links, &idx, range_end)));
        if (ret < 0) {
                bch_err(c, "error in fsck walking inodes: %s", bch2_err_str(ret));
@@ -2500,7 +2483,7 @@ int bch2_fix_reflink_p(struct bch_fs *c)
                                BTREE_ID_extents, POS_MIN,
                                BTREE_ITER_INTENT|BTREE_ITER_PREFETCH|
                                BTREE_ITER_ALL_SNAPSHOTS, k,
-                               NULL, NULL, BCH_TRANS_COMMIT_no_enospc|BCH_TRANS_COMMIT_lazy_rw,
+                               NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
                        fix_reflink_p_key(trans, &iter, k)));
        bch_err_fn(c, ret);
        return ret;