On Nov 30, 2017, at 8:17 AM, Artem Blagodarenko <artem.blagodarenko@xxxxxxxxx> wrote: > > From: Yang Sheng <yang.sheng@xxxxxxxxx> > > Removes static definition of dx_root struct. so that "." and ".." dirent > can have extra data. This patch does not change any functionality but is > required for ext4_data_in_dirent patch. > > Signed-off-by: Yang Sheng <yang.sheng@xxxxxxxxx> > Signed-off-by: Artem Blagodarenko <artem.blagodarenko@xxxxxxxxx> > --- > fs/ext4/namei.c | 130 +++++++++++++++++++++++++++++++------------------------- > 1 file changed, 71 insertions(+), 59 deletions(-) > > diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c > index c1cf020d1889..7c649cf2b630 100644 > --- a/fs/ext4/namei.c > +++ b/fs/ext4/namei.c > @@ -193,23 +193,13 @@ struct dx_entry > * dirent the two low bits of the hash version will be zero. Therefore, the > * hash version mod 4 should never be 0. Sincerely, the paranoia department. > */ > - > -struct dx_root > +struct dx_root_info > { > - struct fake_dirent dot; > - char dot_name[4]; > - struct fake_dirent dotdot; > - char dotdot_name[4]; > - struct dx_root_info > - { > - __le32 reserved_zero; > - u8 hash_version; > - u8 info_length; /* 8 */ > - u8 indirect_levels; > - u8 unused_flags; > - } > - info; > - struct dx_entry entries[0]; > + __le32 reserved_zero; > + u8 hash_version; > + u8 info_length; /* 8 */ > + u8 indirect_levels; > + u8 unused_flags; > }; > > struct dx_node > @@ -521,6 +511,17 @@ static inline void dx_set_block(struct dx_entry *entry, ext4_lblk_t value) > entry->block = cpu_to_le32(value); > } > > +struct dx_root_info *dx_get_dx_info(struct ext4_dir_entry_2 *de) > +{ > + /* get dotdot first */ > + de = (struct ext4_dir_entry_2 *)((char *)de + EXT4_DIR_NAME_LEN(1)); > + > + /* dx root info is after dotdot entry */ > + de = (struct ext4_dir_entry_2 *)((char *)de + EXT4_DIR_NAME_LEN(2)); > + > + return (struct dx_root_info *)de; > +} > + > static inline unsigned dx_get_hash(struct dx_entry *entry) > { > return le32_to_cpu(entry->hash); > @@ -744,17 +745,17 @@ dx_probe(struct ext4_filename *fname, struct inode *dir, > if (IS_ERR(frame->bh)) > return (struct dx_frame *) frame->bh; > > - root = (struct dx_root *) frame->bh->b_data; > - if (root->info.hash_version != DX_HASH_TEA && > - root->info.hash_version != DX_HASH_HALF_MD4 && > - root->info.hash_version != DX_HASH_LEGACY) { > - ext4_warning_inode(dir, "Unrecognised inode hash code %u", > - root->info.hash_version); > + info = dx_get_dx_info((struct ext4_dir_entry_2 *)frame->bh->b_data); > + if (info->hash_version != DX_HASH_TEA && > + info->hash_version != DX_HASH_HALF_MD4 && > + info->hash_version != DX_HASH_LEGACY) { > + ext4_warning(dir->i_sb, "inode #%lu: unrecognised hash code %u", > + dir->i_ino, info->hash_version); This is probably a conflict from the older version of the dx_root patch with newer error messages. The new ext4_warning_inode() message should be kept, and just the "root->info." usage replaced by "info->". > @@ -762,18 +763,18 @@ dx_probe(struct ext4_filename *fname, struct inode *dir, > > - if (root->info.unused_flags & 1) { > - ext4_warning_inode(dir, "Unimplemented hash flags: %#06x", > - root->info.unused_flags); > + if (info->unused_flags & 1) { > + ext4_warning_inode(dir, > + "inode #%lu: Unimplemented hash flags: %#06x", > + dir->i_ino, info->unused_flags); Similarly, the ext4_warning_inode() message already prints "inode #%lu: " at the start, so the old message should be kept and just replace "root->info.". > if (indirect >= ext4_dir_htree_level(dir->i_sb)) { > ext4_warning(dir->i_sb, > - "Directory (ino: %lu) htree depth %#06x exceed" > - "supported value", dir->i_ino, > - ext4_dir_htree_level(dir->i_sb)); > + "inode #%lu unimplemented hash depth %#06x", > + dir->i_ino, ext4_dir_htree_level(dir->i_sb)); This should also be using ext4_warning_inode() and drop the "inode #%lu" at the start, leaving "directory htree depth %u exceeds supported value %u", and also print ext4_dir_htree_level(dir->i_sb) at the end. It isn't clear why the depth was printed in hex previously, that doesn't make sense. > @@ -781,14 +782,17 @@ dx_probe(struct ext4_filename *fname, struct inode *dir, > > if (dx_get_limit(entries) != dx_root_limit(dir, It would make sense to move "dx_root_limit(dir," to the next line, aligned after 'if (', so that it is not wrapping so close to the end. > - root->info.info_length)) { > - ext4_warning_inode(dir, "dx entry: limit %u != root limit %u", > - dx_get_limit(entries), > - dx_root_limit(dir, root->info.info_length)); > + (struct ext4_dir_entry_2 *) frame->bh->b_data, > + info->info_length)) { > + ext4_warning(dir->i_sb, "dx entry: limit != root limit " > + "inode #%lu: dx entry: limit %u != root limit %u", > + dir->i_ino, dx_get_limit(entries), > + dx_root_limit(dir, (struct ext4_dir_entry_2 *) > + frame->bh->b_data, > + info->info_length)); Use the old message with ext4_warning_inode(), which doesn't have the duplicate "dx entry:" part, and doesn't need the "inode #%lu: " anymore. Cheers, Andreas
Attachment:
signature.asc
Description: Message signed with OpenPGP