public inbox for [email protected]
 help / color / mirror / Atom feed
From: Gabriel Krisman Bertazi <[email protected]>
To: Tony Solomonik <[email protected]>
Cc: [email protected],  [email protected],  [email protected],
	[email protected]
Subject: Re: [PATCH v2 1/2] Add __do_ftruncate that truncates a struct file*
Date: Tue, 23 Jan 2024 11:53:24 -0300	[thread overview]
Message-ID: <[email protected]> (raw)
In-Reply-To: <[email protected]> (Tony Solomonik's message of "Tue, 23 Jan 2024 13:33:32 +0200")

Tony Solomonik <[email protected]> writes:

> do_sys_ftruncate receives a file descriptor, fgets the struct file*, and
> finally actually truncates the file.

This need to be Cc'ed to the VFS maintainers and appropriated lists.
Also, you need a signed-off-by line and cover letter.

Take a look at:

https://www.kernel.org/doc/html/v6.7/process/submitting-patches.html

>
> __do_ftruncate allows for truncating a file without fgets.
> ---
>  fs/open.c                | 52 ++++++++++++++++++++++++----------------
>  include/linux/syscalls.h |  2 ++
>  2 files changed, 33 insertions(+), 21 deletions(-)
>
> diff --git a/fs/open.c b/fs/open.c
> index 02dc608d40d8..b32ac430666c 100644
> --- a/fs/open.c
> +++ b/fs/open.c
> @@ -154,47 +154,57 @@ COMPAT_SYSCALL_DEFINE2(truncate, const char __user *, path, compat_off_t, length
>  }
>  #endif
>  
> -long do_sys_ftruncate(unsigned int fd, loff_t length, int small)
> +long __do_ftruncate(struct file *file, loff_t length, int small)
>  {
>  	struct inode *inode;
>  	struct dentry *dentry;
> -	struct fd f;
>  	int error;
>  
> -	error = -EINVAL;
> -	if (length < 0)
> -		goto out;
> -	error = -EBADF;
> -	f = fdget(fd);
> -	if (!f.file)
> -		goto out;
> -
>  	/* explicitly opened as large or we are on 64-bit box */
> -	if (f.file->f_flags & O_LARGEFILE)
> +	if (file->f_flags & O_LARGEFILE)
>  		small = 0;
>  
> -	dentry = f.file->f_path.dentry;
> +	dentry = file->f_path.dentry;
>  	inode = dentry->d_inode;
>  	error = -EINVAL;
> -	if (!S_ISREG(inode->i_mode) || !(f.file->f_mode & FMODE_WRITE))
> -		goto out_putf;
> +	if (!S_ISREG(inode->i_mode) || !(file->f_mode & FMODE_WRITE))
> +		goto out;

Just return directly here. No point in jumping to 'out' just to return
immediately.

>  
>  	error = -EINVAL;
>  	/* Cannot ftruncate over 2^31 bytes without large file support */
>  	if (small && length > MAX_NON_LFS)
> -		goto out_putf;
> +		goto out;

likewise for the others..

>  
>  	error = -EPERM;
>  	/* Check IS_APPEND on real upper inode */
> -	if (IS_APPEND(file_inode(f.file)))
> -		goto out_putf;
> +	if (IS_APPEND(file_inode(file)))
> +		goto out;
>  	sb_start_write(inode->i_sb);
> -	error = security_file_truncate(f.file);
> +	error = security_file_truncate(file);
>  	if (!error)
> -		error = do_truncate(file_mnt_idmap(f.file), dentry, length,
> -				    ATTR_MTIME | ATTR_CTIME, f.file);
> +		error = do_truncate(file_mnt_idmap(file), dentry, length,
> +				    ATTR_MTIME | ATTR_CTIME, file);
>  	sb_end_write(inode->i_sb);
> -out_putf:
> +
> +out:
> +  return error;
> +}
> +
> +long do_sys_ftruncate(unsigned int fd, loff_t length, int small)
> +{
> +	struct fd f;
> +	int error;
> +
> +	error = -EINVAL;
> +	if (length < 0)
> +		goto out;
> +	error = -EBADF;
> +	f = fdget(fd);
> +	if (!f.file)
> +		goto out;
> +
> +	error = __do_ftruncate(f.file, length, small);
> +
>  	fdput(f);
>  out:
>  	return error;

Same here.

> diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
> index fd9d12de7e92..e8c56986e751 100644
> --- a/include/linux/syscalls.h
> +++ b/include/linux/syscalls.h
> @@ -1229,6 +1229,8 @@ static inline long ksys_lchown(const char __user *filename, uid_t user,
>  			     AT_SYMLINK_NOFOLLOW);
>  }
>  
> +extern long __do_ftruncate(struct file *file, loff_t length, int small);
> +
>  extern long do_sys_ftruncate(unsigned int fd, loff_t length, int small);
>  
>  static inline long ksys_ftruncate(unsigned int fd, loff_t length)

-- 
Gabriel Krisman Bertazi

  parent reply	other threads:[~2024-01-23 14:53 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CAD62OrGa9pS6-Qgg_UD4r4d+kCSPQihq0VvtVombrbAAOroG=w@mail.gmail.com>
2024-01-23 11:33 ` [PATCH v2 1/2] Add __do_ftruncate that truncates a struct file* Tony Solomonik
2024-01-23 11:33   ` [PATCH v2 2/2] io_uring: add support for ftruncate Tony Solomonik
2024-01-23 15:01     ` Gabriel Krisman Bertazi
2024-01-23 15:36       ` Jens Axboe
2024-01-23 15:46     ` Jens Axboe
2024-01-23 15:50     ` Jens Axboe
2024-01-23 21:19     ` [PATCH v3 0/2] Add ftruncate to io_uring Tony Solomonik
2024-01-23 21:19       ` [PATCH v3 1/2] Add ftruncate_file that truncates a struct file* Tony Solomonik
2024-01-23 22:07         ` Jens Axboe
2024-01-23 21:19       ` [PATCH v3 2/2] io_uring: add support for ftruncate Tony Solomonik
2024-01-23 22:11         ` Jens Axboe
2024-01-23 22:33     ` [PATCH v4 0/2] " Tony Solomonik
2024-01-23 22:33       ` [PATCH v4 1/2] Add ftruncate_file that truncates a struct file Tony Solomonik
2024-01-23 22:33       ` [PATCH v4 2/2] io_uring: add support for ftruncate Tony Solomonik
2024-01-23 23:24       ` [PATCH v4 0/2] " Jens Axboe
     [not found]         ` <CAD62OrEC62Ojh+uvMWMb7X=fNZerUVYfUWFmRHQ-49OvTJ1u4Q@mail.gmail.com>
2024-01-23 23:40           ` Jens Axboe
2024-01-23 14:53   ` Gabriel Krisman Bertazi [this message]
2024-01-23 15:38   ` [PATCH v2 1/2] Add __do_ftruncate that truncates a struct file* Jens Axboe
2024-01-23 15:40     ` Jens Axboe
     [not found] <[email protected]>
2024-01-23 11:32 ` Tony Solomonik

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    [email protected] \
    [email protected] \
    [email protected] \
    [email protected] \
    [email protected] \
    [email protected] \
    [email protected] \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox