From 0a9a2250b6d46080c190f19ea4cc9b8d6f032500 Mon Sep 17 00:00:00 2001 From: "Darrick J. Wong" Date: Mon, 12 Nov 2012 23:51:02 -0500 Subject: [PATCH] --- yaml --- r: 344863 b: refs/heads/master c: c6af8803cd4f56aa62a47448c55030d4905b6783 h: refs/heads/master i: 344861: 035c24d170c4ee76b263441b6e28820eabcf8423 344859: bbd965d2c4e38f7a86bee502015625010d781185 344855: 6b1d0a49819db1df1ff2128aca3e9ff1a486bfdb 344847: 58178d0398911c0ab116f625cc03192cb6962e85 344831: d7440094f6ccf2c4efcd83a966d200840ce01cb3 v: v3 --- [refs] | 2 +- trunk/fs/ext4/namei.c | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 10798e8bc15a..d04bf3feef9a 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: dffe9d8da715bed4d395883add90a2d150d85729 +refs/heads/master: c6af8803cd4f56aa62a47448c55030d4905b6783 diff --git a/trunk/fs/ext4/namei.c b/trunk/fs/ext4/namei.c index 580af3dfc0eb..88e9a2c7e328 100644 --- a/trunk/fs/ext4/namei.c +++ b/trunk/fs/ext4/namei.c @@ -1146,6 +1146,21 @@ static inline int search_dirblock(struct buffer_head *bh, return 0; } +static int is_dx_internal_node(struct inode *dir, ext4_lblk_t block, + struct ext4_dir_entry *de) +{ + struct super_block *sb = dir->i_sb; + + if (!is_dx(dir)) + return 0; + if (block == 0) + return 1; + if (de->inode == 0 && + ext4_rec_len_from_disk(de->rec_len, sb->s_blocksize) == + sb->s_blocksize) + return 1; + return 0; +} /* * ext4_find_entry() @@ -1246,6 +1261,8 @@ static struct buffer_head * ext4_find_entry (struct inode *dir, goto next; } if (!buffer_verified(bh) && + !is_dx_internal_node(dir, block, + (struct ext4_dir_entry *)bh->b_data) && !ext4_dirent_csum_verify(dir, (struct ext4_dir_entry *)bh->b_data)) { EXT4_ERROR_INODE(dir, "checksumming directory "