From: Artem Blagodarenko Replace open-coded checks for directory tail entries with a call to ext4_dir_entry_is_tail(). This helper will also be used by upcoming changes. Signed-off-by: Artem Blagodarenko Reviewed-by: Andreas Dilger --- fs/ext4/ext4.h | 16 ++++++++++++++++ fs/ext4/namei.c | 14 ++++++-------- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index aa8a37566a38..f8d8d92391bf 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -4002,6 +4002,22 @@ static inline void ext4_clear_io_unwritten_flag(ext4_io_end_t *io_end) io_end->flag &= ~EXT4_IO_END_UNWRITTEN; } +/* + * ext4_dir_entry_is_tail() - Check if a directory entry is a tail entry. + * @de: directory entry to check + * + * Returns true if @de is a directory block tail entry (checksum record). + */ +static inline bool ext4_dir_entry_is_tail(struct ext4_dir_entry_2 *de) +{ + struct ext4_dir_entry_tail *t = (struct ext4_dir_entry_tail *)de; + + return !t->det_reserved_zero1 && + le16_to_cpu(t->det_rec_len) == sizeof(*t) && + !t->det_reserved_zero2 && + t->det_reserved_ft == EXT4_FT_DIR_CSUM; +} + extern const struct iomap_ops ext4_iomap_ops; extern const struct iomap_ops ext4_iomap_report_ops; diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index c2f330c75c81..da12911bd754 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c @@ -331,14 +331,10 @@ static struct ext4_dir_entry_tail *get_dirent_tail(struct inode *inode, t = (struct ext4_dir_entry_tail *)d; #else - t = EXT4_DIRENT_TAIL(bh->b_data, EXT4_BLOCK_SIZE(inode->i_sb)); + t = EXT4_DIRENT_TAIL(bh->b_data, blocksize); #endif - if (t->det_reserved_zero1 || - (ext4_rec_len_from_disk(t->det_rec_len, blocksize) != - sizeof(struct ext4_dir_entry_tail)) || - t->det_reserved_zero2 || - t->det_reserved_ft != EXT4_FT_DIR_CSUM) + if (!ext4_dir_entry_is_tail((struct ext4_dir_entry_2 *)t)) return NULL; return t; @@ -478,7 +474,8 @@ static int ext4_dx_csum_verify(struct inode *inode, return 0; } if (count > limit) { - EXT4_ERROR_INODE(inode, "dir seems corrupt? Run e2fsck -D."); + EXT4_ERROR_INODE(inode, "dir seems corrupt (%i > %i)? " + "Run e2fsck -D.", count, limit); return 0; } t = (struct dx_tail *)(((struct dx_entry *)c) + limit); @@ -511,7 +508,8 @@ static void ext4_dx_csum_set(struct inode *inode, struct ext4_dir_entry_2 *diren return; } if (count > limit) { - EXT4_ERROR_INODE(inode, "dir seems corrupt? Run e2fsck -D."); + EXT4_ERROR_INODE(inode, "dir seems corrupt (%i > %i)? " + " Run e2fsck -D.", count, limit); return; } t = (struct dx_tail *)(((struct dx_entry *)c) + limit); -- 2.43.7