diff options
| -rw-r--r-- | fs/ext3/dir.c | 15 | ||||
| -rw-r--r-- | include/linux/ext3_fs.h | 9 | 
2 files changed, 17 insertions, 7 deletions
| diff --git a/fs/ext3/dir.c b/fs/ext3/dir.c index e2e72c367cf6..34f0a072b935 100644 --- a/fs/ext3/dir.c +++ b/fs/ext3/dir.c @@ -69,25 +69,26 @@ int ext3_check_dir_entry (const char * function, struct inode * dir,  	const char * error_msg = NULL;  	const int rlen = ext3_rec_len_from_disk(de->rec_len); -	if (rlen < EXT3_DIR_REC_LEN(1)) +	if (unlikely(rlen < EXT3_DIR_REC_LEN(1)))  		error_msg = "rec_len is smaller than minimal"; -	else if (rlen % 4 != 0) +	else if (unlikely(rlen % 4 != 0))  		error_msg = "rec_len % 4 != 0"; -	else if (rlen < EXT3_DIR_REC_LEN(de->name_len)) +	else if (unlikely(rlen < EXT3_DIR_REC_LEN(de->name_len)))  		error_msg = "rec_len is too small for name_len"; -	else if (((char *) de - bh->b_data) + rlen > dir->i_sb->s_blocksize) +	else if (unlikely((((char *) de - bh->b_data) + rlen > dir->i_sb->s_blocksize)))  		error_msg = "directory entry across blocks"; -	else if (le32_to_cpu(de->inode) > -			le32_to_cpu(EXT3_SB(dir->i_sb)->s_es->s_inodes_count)) +	else if (unlikely(le32_to_cpu(de->inode) > +			le32_to_cpu(EXT3_SB(dir->i_sb)->s_es->s_inodes_count)))  		error_msg = "inode out of bounds"; -	if (error_msg != NULL) +	if (unlikely(error_msg != NULL))  		ext3_error (dir->i_sb, function,  			"bad entry in directory #%lu: %s - "  			"offset=%lu, inode=%lu, rec_len=%d, name_len=%d",  			dir->i_ino, error_msg, offset,  			(unsigned long) le32_to_cpu(de->inode),  			rlen, de->name_len); +  	return error_msg == NULL ? 1 : 0;  } diff --git a/include/linux/ext3_fs.h b/include/linux/ext3_fs.h index a443965946bb..65990ef612f5 100644 --- a/include/linux/ext3_fs.h +++ b/include/linux/ext3_fs.h @@ -724,21 +724,30 @@ struct ext3_dir_entry_2 {  					 ~EXT3_DIR_ROUND)  #define EXT3_MAX_REC_LEN		((1<<16)-1) +/* + * Tests against MAX_REC_LEN etc were put in place for 64k block + * sizes; if that is not possible on this arch, we can skip + * those tests and speed things up. + */  static inline unsigned ext3_rec_len_from_disk(__le16 dlen)  {  	unsigned len = le16_to_cpu(dlen); +#if (PAGE_CACHE_SIZE >= 65536)  	if (len == EXT3_MAX_REC_LEN)  		return 1 << 16; +#endif  	return len;  }  static inline __le16 ext3_rec_len_to_disk(unsigned len)  { +#if (PAGE_CACHE_SIZE >= 65536)  	if (len == (1 << 16))  		return cpu_to_le16(EXT3_MAX_REC_LEN);  	else if (len > (1 << 16))  		BUG(); +#endif  	return cpu_to_le16(len);  } | 
