bcachefs: Lower BCH_NAME_MAX to 512
authorJoshua Ashton <joshua@froggi.es>
Sun, 13 Aug 2023 15:53:45 +0000 (16:53 +0100)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:10:11 +0000 (17:10 -0400)
To ensure we aren't shooting ourselves in the foot after merge for
potentially doing future revisions for dirent or for storing multiple
names for casefolding, limit this to 512 for now.

Previously this define was linked to the max size a d_name in
bch_dirent could be.

Signed-off-by: Joshua Ashton <joshua@froggi.es>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/bcachefs_format.h
fs/bcachefs/dirent.c

index 5ec218ee356947140c4e91f32a38c65c6609db54..23bae622309c5ff0c33a1797277b9fd172219b19 100644 (file)
@@ -916,9 +916,7 @@ struct bch_dirent {
 #define DT_SUBVOL      16
 #define BCH_DT_MAX     17
 
-#define BCH_NAME_MAX   ((unsigned) (U8_MAX * sizeof(__u64) -           \
-                        sizeof(struct bkey) -                          \
-                        offsetof(struct bch_dirent, d_name)))
+#define BCH_NAME_MAX   512
 
 /* Xattrs */
 
index 6f9eb88c7dba9fb7448149b88d27f676208e03d8..a7559ab03802cb3a39a6dc17d563cb9f3dced5a4 100644 (file)
@@ -115,7 +115,11 @@ int bch2_dirent_invalid(const struct bch_fs *c, struct bkey_s_c k,
                return -BCH_ERR_invalid_bkey;
        }
 
-       if (d_name.len > BCH_NAME_MAX) {
+       /*
+        * Check new keys don't exceed the max length
+        * (older keys may be larger.)
+        */
+       if ((flags & BKEY_INVALID_COMMIT) && d_name.len > BCH_NAME_MAX) {
                prt_printf(err, "dirent name too big (%u > %u)",
                       d_name.len, BCH_NAME_MAX);
                return -BCH_ERR_invalid_bkey;