X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=ldiskfs%2Fkernel_patches%2Fpatches%2Fsles12%2Fext4-data-in-dirent.patch;fp=ldiskfs%2Fkernel_patches%2Fpatches%2Fsles12%2Fext4-data-in-dirent.patch;h=b9d50c2f3edcb4073c902d3427642109d8d4a15d;hb=ec7a166a498be607c3882ff11e98b625839e69d0;hp=8b3c01ed7797d2fd0fb4f8053d664405cca0716b;hpb=053785b6aea4f608236418a5fa30a99135f6ccf3;p=fs%2Flustre-release.git diff --git a/ldiskfs/kernel_patches/patches/sles12/ext4-data-in-dirent.patch b/ldiskfs/kernel_patches/patches/sles12/ext4-data-in-dirent.patch index 8b3c01e..b9d50c2 100644 --- a/ldiskfs/kernel_patches/patches/sles12/ext4-data-in-dirent.patch +++ b/ldiskfs/kernel_patches/patches/sles12/ext4-data-in-dirent.patch @@ -183,7 +183,7 @@ Index: linux-stage/fs/ext4/ext4.h extern int search_dir(struct buffer_head *bh, char *search_buf, int buf_size, -@@ -2834,6 +2885,28 @@ extern struct mutex ext4__aio_mutex[EXT4 +@@ -2834,6 +2885,36 @@ extern struct mutex ext4__aio_mutex[EXT4 extern int ext4_resize_begin(struct super_block *sb); extern void ext4_resize_end(struct super_block *sb); @@ -198,6 +198,14 @@ Index: linux-stage/fs/ext4/ext4.h + char *len = de->name + de->name_len + 1 /* NUL terminator */; + int dlen = 0; + __u8 extra_data_flags = (de->file_type & ~EXT4_FT_MASK) >> 4; ++ struct ext4_dir_entry_tail *t = (struct ext4_dir_entry_tail *)de; ++ ++ if (!t->det_reserved_zero1 && ++ le16_to_cpu(t->det_rec_len) == ++ sizeof(struct ext4_dir_entry_tail) && ++ !t->det_reserved_zero2 && ++ t->det_reserved_ft == EXT4_FT_DIR_CSUM) ++ return 0; + + while (extra_data_flags) { + if (extra_data_flags & 1) { @@ -226,6 +234,38 @@ Index: linux-stage/fs/ext4/namei.c static unsigned dx_node_limit(struct inode *dir); static struct dx_frame *dx_probe(const struct qstr *d_name, struct inode *dir, +@@ -379,22 +380,23 @@ static struct dx_countlimit *get_dx_coun + { + struct ext4_dir_entry *dp; + struct dx_root_info *root; +- int count_offset; ++ int count_offset, dot_rec_len, dotdot_rec_len; + + if (le16_to_cpu(dirent->rec_len) == EXT4_BLOCK_SIZE(inode->i_sb)) + count_offset = 8; +- else if (le16_to_cpu(dirent->rec_len) == 12) { +- dp = (struct ext4_dir_entry *)(((void *)dirent) + 12); ++ else { ++ dot_rec_len = le16_to_cpu(dirent->rec_len); ++ dp = (struct ext4_dir_entry *)(((void *)dirent) + dot_rec_len); + if (le16_to_cpu(dp->rec_len) != +- EXT4_BLOCK_SIZE(inode->i_sb) - 12) ++ EXT4_BLOCK_SIZE(inode->i_sb) - dot_rec_len) + return NULL; +- root = (struct dx_root_info *)(((void *)dp + 12)); ++ dotdot_rec_len = EXT4_DIR_REC_LEN((struct ext4_dir_entry_2 *)dp); ++ root = (struct dx_root_info *)(((void *)dp + dotdot_rec_len)); + if (root->reserved_zero || + root->info_length != sizeof(struct dx_root_info)) + return NULL; +- count_offset = 32; +- } else +- return NULL; ++ count_offset = 8 + dot_rec_len + dotdot_rec_len; ++ } + + if (offset) + *offset = count_offset; @@ -500,11 +501,12 @@ ext4_next_entry(struct ext4_dir_entry_2 */ struct dx_root_info *dx_get_dx_info(struct ext4_dir_entry_2 *de)