Re: [PATCH 2/3] fs: pass on FTRUNCATE_* flags to do_truncate

Jan Kara <[email protected]>
Newsgroups gmane.linux.ports.ppc64.devel,gmane.linux.ports.arm.kernel,gmane.linux.ports.mips,gmane.linux.ports.parisc,gmane.linux.ports.sparc,gmane.linux.file-systems,gmane.linux.kernel.api
Message-ID <xyngoavkugrr3iib3se7pkd4h72tu6iwhmr37ro63qnytlr7s7@g6mspo2kgwzp>
On Mon 23-03-26 08:01:45, Christoph Hellwig wrote:
> Pass the flags one level down to replace the somewhat confusing small
> argument, and clean up do_truncate as a result.
> 
> Signed-off-by: Christoph Hellwig <[email protected]>

Looks good. Feel free to add:

Reviewed-by: Jan Kara <[email protected]>

								Honza

> ---
>  fs/internal.h       |  2 +-
>  fs/open.c           | 22 ++++++++++------------
>  io_uring/truncate.c |  2 +-
>  3 files changed, 12 insertions(+), 14 deletions(-)
> 
> diff --git a/fs/internal.h b/fs/internal.h
> index 2663823e273a..52e4c354e7a4 100644
> --- a/fs/internal.h
> +++ b/fs/internal.h
> @@ -198,7 +198,7 @@ extern struct open_how build_open_how(int flags, umode_t mode);
>  extern int build_open_flags(const struct open_how *how, struct open_flags *op);
>  struct file *file_close_fd_locked(struct files_struct *files, unsigned fd);
>  
> -int do_ftruncate(struct file *file, loff_t length, int small);
> +int do_ftruncate(struct file *file, loff_t length, unsigned int flags);
>  int chmod_common(const struct path *path, umode_t mode);
>  int do_fchownat(int dfd, const char __user *filename, uid_t user, gid_t group,
>  		int flag);
> diff --git a/fs/open.c b/fs/open.c
> index 412d0d6fbaa7..181c1597e73c 100644
> --- a/fs/open.c
> +++ b/fs/open.c
> @@ -161,23 +161,21 @@ COMPAT_SYSCALL_DEFINE2(truncate, const char __user *, path, compat_off_t, length
>  }
>  #endif
>  
> -int do_ftruncate(struct file *file, loff_t length, int small)
> +int do_ftruncate(struct file *file, loff_t length, unsigned int flags)
>  {
> -	struct inode *inode;
> -	struct dentry *dentry;
> +	struct dentry *dentry = file->f_path.dentry;
> +	struct inode *inode = dentry->d_inode;
>  	int error;
>  
> -	/* explicitly opened as large or we are on 64-bit box */
> -	if (file->f_flags & O_LARGEFILE)
> -		small = 0;
> -
> -	dentry = file->f_path.dentry;
> -	inode = dentry->d_inode;
>  	if (!S_ISREG(inode->i_mode) || !(file->f_mode & FMODE_WRITE))
>  		return -EINVAL;
>  
> -	/* Cannot ftruncate over 2^31 bytes without large file support */
> -	if (small && length > MAX_NON_LFS)
> +	/*
> +	 * Cannot ftruncate over 2^31 bytes without large file support, either
> +	 * through opening with O_LARGEFILE or by using ftruncate64().
> +	 */
> +	if (length > MAX_NON_LFS &&
> +	    !(file->f_flags & O_LARGEFILE) && !(flags & FTRUNCATE_LFS))
>  		return -EINVAL;
>  
>  	/* Check IS_APPEND on real upper inode */
> @@ -205,7 +203,7 @@ int ksys_ftruncate(unsigned int fd, loff_t length, unsigned int flags)
>  	if (fd_empty(f))
>  		return -EBADF;
>  
> -	return do_ftruncate(fd_file(f), length, !(flags & FTRUNCATE_LFS));
> +	return do_ftruncate(fd_file(f), length, flags);
>  }
>  
>  SYSCALL_DEFINE2(ftruncate, unsigned int, fd, off_t, length)
> diff --git a/io_uring/truncate.c b/io_uring/truncate.c
> index 487baf23b44e..c88d8bd8d20e 100644
> --- a/io_uring/truncate.c
> +++ b/io_uring/truncate.c
> @@ -41,7 +41,7 @@ int io_ftruncate(struct io_kiocb *req, unsigned int issue_flags)
>  
>  	WARN_ON_ONCE(issue_flags & IO_URING_F_NONBLOCK);
>  
> -	ret = do_ftruncate(req->file, ft->len, 1);
> +	ret = do_ftruncate(req->file, ft->len, 0);
>  
>  	io_req_set_res(req, ret, 0);
>  	return IOU_COMPLETE;
> -- 
> 2.47.3
> 
-- 
Jan Kara <[email protected]>
SUSE Labs, CR
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.