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.h | |
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.h')
-rw-r--r-- | fs/bcachefs/dirent.h | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/fs/bcachefs/dirent.h b/fs/bcachefs/dirent.h index ac28f83d6b2d..30d2143d4ca7 100644 --- a/fs/bcachefs/dirent.h +++ b/fs/bcachefs/dirent.h @@ -23,6 +23,12 @@ struct bch_inode_info; unsigned bch2_dirent_name_bytes(struct bkey_s_c_dirent); +static inline unsigned dirent_val_u64s(unsigned len) +{ + return DIV_ROUND_UP(offsetof(struct bch_dirent, d_name) + len, + sizeof(u64)); +} + int __bch2_dirent_create(struct btree_trans *, u64, const struct bch_hash_info *, u8, const struct qstr *, u64, int); |