bcachefs: Move some dirent checks to bch2_dirent_invalid()
authorKent Overstreet <kent.overstreet@gmail.com>
Wed, 7 Apr 2021 00:11:28 +0000 (20:11 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:59 +0000 (17:08 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/dirent.c
fs/bcachefs/fsck.c

index cf4ce2e7f29c1d51cad6c8c14f43822ea26a6079..ec4666143f23693419ffb90b6b153fcf064c7470 100644 (file)
@@ -84,16 +84,24 @@ const char *bch2_dirent_invalid(const struct bch_fs *c, struct bkey_s_c k)
        if (!len)
                return "empty name";
 
-       /*
-        * older versions of bcachefs were buggy and creating dirent
-        * keys that were bigger than necessary:
-        */
-       if (bkey_val_u64s(k.k) > dirent_val_u64s(len + 7))
+       if (bkey_val_u64s(k.k) > dirent_val_u64s(len))
                return "value too big";
 
        if (len > BCH_NAME_MAX)
                return "dirent name too big";
 
+       if (len == 1 && !memcmp(d.v->d_name, ".", 1))
+               return "invalid name";
+
+       if (len == 2 && !memcmp(d.v->d_name, "..", 2))
+               return "invalid name";
+
+       if (memchr(d.v->d_name, '/', len))
+               return "invalid name";
+
+       if (le64_to_cpu(d.v->d_inum) == d.k->p.inode)
+               return "dirent points to own directory";
+
        return NULL;
 }
 
index d65b3e100f78bbb05b59088980652feda4df3c9b..36baff8409cd42ca6b88b5278b9099e9890ed265 100644 (file)
@@ -569,7 +569,6 @@ static int check_dirents(struct bch_fs *c)
        struct btree_trans trans;
        struct btree_iter *iter;
        struct bkey_s_c k;
-       unsigned name_len;
        char buf[200];
        int ret = 0;
 
@@ -628,36 +627,6 @@ retry:
                d = bkey_s_c_to_dirent(k);
                d_inum = le64_to_cpu(d.v->d_inum);
 
-               name_len = bch2_dirent_name_bytes(d);
-
-               if (fsck_err_on(!name_len, c, "empty dirent") ||
-                   fsck_err_on(name_len == 1 &&
-                               !memcmp(d.v->d_name, ".", 1), c,
-                               ". dirent") ||
-                   fsck_err_on(name_len == 2 &&
-                               !memcmp(d.v->d_name, "..", 2), c,
-                               ".. dirent") ||
-                   fsck_err_on(name_len == 2 &&
-                               !memcmp(d.v->d_name, "..", 2), c,
-                               ".. dirent") ||
-                   fsck_err_on(memchr(d.v->d_name, '/', name_len), c,
-                               "dirent name has invalid chars")) {
-                       ret = remove_dirent(&trans, d);
-                       if (ret)
-                               goto err;
-                       continue;
-               }
-
-               if (fsck_err_on(d_inum == d.k->p.inode, c,
-                               "dirent points to own directory:\n%s",
-                               (bch2_bkey_val_to_text(&PBUF(buf), c,
-                                                      k), buf))) {
-                       ret = remove_dirent(&trans, d);
-                       if (ret)
-                               goto err;
-                       continue;
-               }
-
                ret = __bch2_inode_find_by_inum_trans(&trans, d_inum, &target, 0);
                if (ret && ret != -ENOENT)
                        break;