diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2018-08-22 02:42:00 +0300 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-23 00:08:09 +0300 |
commit | 741daa5be5c8d9cccaaac9759eb99893f1beb09b (patch) | |
tree | 591117f79d088e55a2c71261db6883aba4005731 /fs/bcachefs/dirent.c | |
parent | cbdf24cef19be489f6885cecb4887fe407cebdfc (diff) | |
download | linux-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.c | 14 |
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 |