[Ocfs2-devel] [PATCH] ocfs2: no need try to truncate file beyond i_size

Joseph Qi joseph.qi at linux.alibaba.com
Tue Apr 7 18:00:28 PDT 2020



On 2020/4/7 16:27, Changwei Ge wrote:
> Linux fallocate(2) with FALLOC_FL_PUNCH_HOLE mode set, its offset can
> exceed inode size. Ocfs2 now does't allow that offset beyond inode size.
> This restriction is not necessary and voilates fallocate(2) semantics.
> 
> If fallocate(2) offset is beyond inode size, just return success and do
> nothing further.
> 
> Otherwise, ocfs2 will crash the kernel.
> 
> ---
> kernel BUG at fs/ocfs2//alloc.c:7264!
>  ocfs2_truncate_inline+0x20f/0x360 [ocfs2]
>  ? ocfs2_read_blocks+0x2f3/0x5f0 [ocfs2]
>  ocfs2_remove_inode_range+0x23c/0xcb0 [ocfs2]
>  ? ocfs2_read_inode_block+0x10/0x20 [ocfs2]
>  ? ocfs2_allocate_extend_trans+0x1a0/0x1a0 [ocfs2]
>  __ocfs2_change_file_space+0x4a5/0x650 [ocfs2]
>  ocfs2_fallocate+0x83/0xa0 [ocfs2]
>  ? __audit_syscall_entry+0xb8/0x100
>  ? __sb_start_write+0x3b/0x70
>  vfs_fallocate+0x148/0x230
>  SyS_fallocate+0x48/0x80
>  do_syscall_64+0x79/0x170
> 
> Signed-off-by: Changwei Ge <chge at linux.alibaba.com>

Looks good.
Reviewed-by: Joseph Qi <joseph.qi at linux.alibaba.com>

> Cc: <stable at vger.kernel.org>
> ---
>  fs/ocfs2/alloc.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c
> index 88534eb0e7c..3d5b6b989db 100644
> --- a/fs/ocfs2/alloc.c
> +++ b/fs/ocfs2/alloc.c
> @@ -7403,6 +7403,10 @@ int ocfs2_truncate_inline(struct inode *inode, struct buffer_head *di_bh,
>  	struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data;
>  	struct ocfs2_inline_data *idata = &di->id2.i_data;
>  
> +	/* No need to punch hole beyond i_size. */
> +	if (start >= i_size_read(inode))
> +		return 0;
> +
>  	if (end > i_size_read(inode))
>  		end = i_size_read(inode);
>  
> 



More information about the Ocfs2-devel mailing list