diff options
Diffstat (limited to 'fs/ext3')
-rw-r--r-- | fs/ext3/namei.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/fs/ext3/namei.c b/fs/ext3/namei.c index d282ea870081..de13e919cd81 100644 --- a/fs/ext3/namei.c +++ b/fs/ext3/namei.c | |||
@@ -991,19 +991,21 @@ static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry, | |||
991 | de = (struct ext3_dir_entry_2 *) bh->b_data; | 991 | de = (struct ext3_dir_entry_2 *) bh->b_data; |
992 | top = (struct ext3_dir_entry_2 *) ((char *) de + sb->s_blocksize - | 992 | top = (struct ext3_dir_entry_2 *) ((char *) de + sb->s_blocksize - |
993 | EXT3_DIR_REC_LEN(0)); | 993 | EXT3_DIR_REC_LEN(0)); |
994 | for (; de < top; de = ext3_next_entry(de)) | 994 | for (; de < top; de = ext3_next_entry(de)) { |
995 | if (ext3_match (namelen, name, de)) { | 995 | int off = (block << EXT3_BLOCK_SIZE_BITS(sb)) |
996 | if (!ext3_check_dir_entry("ext3_find_entry", | 996 | + ((char *) de - bh->b_data); |
997 | dir, de, bh, | 997 | |
998 | (block<<EXT3_BLOCK_SIZE_BITS(sb)) | 998 | if (!ext3_check_dir_entry(__func__, dir, de, bh, off)) { |
999 | +((char *)de - bh->b_data))) { | 999 | brelse(bh); |
1000 | brelse (bh); | ||
1001 | *err = ERR_BAD_DX_DIR; | 1000 | *err = ERR_BAD_DX_DIR; |
1002 | goto errout; | 1001 | goto errout; |
1003 | } | 1002 | } |
1004 | *res_dir = de; | 1003 | |
1005 | dx_release (frames); | 1004 | if (ext3_match(namelen, name, de)) { |
1006 | return bh; | 1005 | *res_dir = de; |
1006 | dx_release(frames); | ||
1007 | return bh; | ||
1008 | } | ||
1007 | } | 1009 | } |
1008 | brelse (bh); | 1010 | brelse (bh); |
1009 | /* Check to see if we should continue to search */ | 1011 | /* Check to see if we should continue to search */ |