diff options
-rw-r--r-- | fs/bcachefs/bcachefs_format.h | 4 | ||||
-rw-r--r-- | fs/bcachefs/dirent.c | 6 |
2 files changed, 6 insertions, 4 deletions
diff --git a/fs/bcachefs/bcachefs_format.h b/fs/bcachefs/bcachefs_format.h index 5ec218ee3569..23bae622309c 100644 --- a/fs/bcachefs/bcachefs_format.h +++ b/fs/bcachefs/bcachefs_format.h @@ -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 */ diff --git a/fs/bcachefs/dirent.c b/fs/bcachefs/dirent.c index 6f9eb88c7dba..a7559ab03802 100644 --- a/fs/bcachefs/dirent.c +++ b/fs/bcachefs/dirent.c @@ -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; |