diff options
Diffstat (limited to 'fs/ext4/extents.c')
| -rw-r--r-- | fs/ext4/extents.c | 23 | 
1 files changed, 23 insertions, 0 deletions
| diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 0057fe3f248d..72a361d5ef74 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -869,6 +869,12 @@ ext4_find_extent(struct inode *inode, ext4_lblk_t block,  	eh = ext_inode_hdr(inode);  	depth = ext_depth(inode); +	if (depth < 0 || depth > EXT4_MAX_EXTENT_DEPTH) { +		EXT4_ERROR_INODE(inode, "inode has invalid extent depth: %d", +				 depth); +		ret = -EFSCORRUPTED; +		goto err; +	}  	if (path) {  		ext4_ext_drop_refs(path); @@ -4820,6 +4826,13 @@ static long ext4_zero_range(struct file *file, loff_t offset,  		 * released from page cache.  		 */  		down_write(&EXT4_I(inode)->i_mmap_sem); + +		ret = ext4_break_layouts(inode); +		if (ret) { +			up_write(&EXT4_I(inode)->i_mmap_sem); +			goto out_mutex; +		} +  		ret = ext4_update_disksize_before_punch(inode, offset, len);  		if (ret) {  			up_write(&EXT4_I(inode)->i_mmap_sem); @@ -5493,6 +5506,11 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len)  	 * page cache.  	 */  	down_write(&EXT4_I(inode)->i_mmap_sem); + +	ret = ext4_break_layouts(inode); +	if (ret) +		goto out_mmap; +  	/*  	 * Need to round down offset to be aligned with page size boundary  	 * for page size > block size. @@ -5641,6 +5659,11 @@ int ext4_insert_range(struct inode *inode, loff_t offset, loff_t len)  	 * page cache.  	 */  	down_write(&EXT4_I(inode)->i_mmap_sem); + +	ret = ext4_break_layouts(inode); +	if (ret) +		goto out_mmap; +  	/*  	 * Need to round down to align start offset to page size boundary  	 * for page size > block size. |