summaryrefslogtreecommitdiff
path: root/fs/bcachefs/dirent.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2018-08-22 02:42:00 +0300
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-23 00:08:09 +0300
commit741daa5be5c8d9cccaaac9759eb99893f1beb09b (patch)
tree591117f79d088e55a2c71261db6883aba4005731 /fs/bcachefs/dirent.c
parentcbdf24cef19be489f6885cecb4887fe407cebdfc (diff)
downloadlinux-741daa5be5c8d9cccaaac9759eb99893f1beb09b.tar.xz
bcachefs: Dirent repair code
There was a bug for awhile in previous kernels where we weren't computing dirent name lengths correctly and we weren't zeroing out padding at the end of dirents (due to struct bch_dirent changing size by adding __attribute__((aligned)), and not updating other code to use offsetof). This patch fixes dirents with junk at the end, by going off of the dirent's hash. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/dirent.c')
-rw-r--r--fs/bcachefs/dirent.c14
1 files changed, 1 insertions, 13 deletions
diff --git a/fs/bcachefs/dirent.c b/fs/bcachefs/dirent.c
index d5e174e1e59f..0651f5575131 100644
--- a/fs/bcachefs/dirent.c
+++ b/fs/bcachefs/dirent.c
@@ -16,16 +16,7 @@ unsigned bch2_dirent_name_bytes(struct bkey_s_c_dirent d)
unsigned len = bkey_val_bytes(d.k) -
offsetof(struct bch_dirent, d_name);
- while (len && !d.v->d_name[len - 1])
- --len;
-
- return len;
-}
-
-static unsigned dirent_val_u64s(unsigned len)
-{
- return DIV_ROUND_UP(offsetof(struct bch_dirent, d_name) + len,
- sizeof(u64));
+ return strnlen(d.v->d_name, len);
}
static u64 bch2_dirent_hash(const struct bch_hash_info *info,
@@ -108,9 +99,6 @@ const char *bch2_dirent_invalid(const struct bch_fs *c, struct bkey_s_c k)
if (len > BCH_NAME_MAX)
return "dirent name too big";
- if (memchr(d.v->d_name, '/', len))
- return "dirent name has invalid characters";
-
return NULL;
case BCH_DIRENT_WHITEOUT:
return bkey_val_bytes(k.k) != 0