All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jens Axboe <axboe@kernel.dk>
To: Tony Solomonik <tony.solomonik@gmail.com>
Cc: krisman@suse.de, leitao@debian.org, io-uring@vger.kernel.org,
	asml.silence@gmail.com
Subject: Re: [PATCH v3 1/2] Add ftruncate_file that truncates a struct file*
Date: Tue, 23 Jan 2024 15:07:54 -0700	[thread overview]
Message-ID: <955c752a-7631-4f3e-a19b-e3bc8a5139f3@kernel.dk> (raw)
In-Reply-To: <20240123211952.32342-2-tony.solomonik@gmail.com>

On 1/23/24 2:19 PM, Tony Solomonik wrote:
> do_sys_ftruncate receives a file descriptor, fgets the struct file*, and
> finally actually truncates the file.

Just do struct file and get rid of '*', kernel style would otherwise
dictate it should be struct file * but there's no point in mentioning
this is a pointer. It's the only case that makes sense.

> ftruncate_file allows for truncating a file without fgets.

I'd rephrase that last sentence, as it reads as you could do this
without holding a file reference. That is obviously not true. You
could make it:

ftruncate_file allows for passing in a file directly, with the
caller already holding a reference to it.

> 
> Signed-off-by: Tony Solomonik <tony.solomonik@gmail.com>
> ---
>  fs/internal.h |  1 +
>  fs/open.c     | 51 ++++++++++++++++++++++++++++++---------------------
>  2 files changed, 31 insertions(+), 21 deletions(-)
> 
> diff --git a/fs/internal.h b/fs/internal.h
> index 58e43341aebf..78a641ebd16e 100644
> --- a/fs/internal.h
> +++ b/fs/internal.h
> @@ -182,6 +182,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);
>  extern struct file *__close_fd_get_file(unsigned int fd);
>  
> +long ftruncate_file(struct file *file, loff_t length, int small);
>  long do_sys_ftruncate(unsigned int fd, loff_t length, int small);
>  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,
> diff --git a/fs/open.c b/fs/open.c
> index 02dc608d40d8..0c505402e93d 100644
> --- a/fs/open.c
> +++ b/fs/open.c
> @@ -154,47 +154,56 @@ 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 ftruncate_file(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))
> +		return error;
>  
>  	error = -EINVAL;
>  	/* Cannot ftruncate over 2^31 bytes without large file support */
>  	if (small && length > MAX_NON_LFS)
> -		goto out_putf;
> +		return error;
>  
>  	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)))
> +		return error;
>  	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:
> +
> +  return error;

White space issue here with 'error'. And see below comments for error
assignment in general.

> +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 = ftruncate_file(f.file, length, small);
> +
>  	fdput(f);
>  out:
>  	return error;

No reason for the goto's here anymore, just do:

long do_sys_ftruncate(unsigned int fd, loff_t length, int small)
{
	struct fd f;
	int error;

	if (length < 0)
		return -EINVAL;
	error = -EBADF;
	f = fdget(fd);
	if (f.file)
		error = ftruncate_file(f.file, length, small);
	fdput(f);
	return error;
}

Same for the above helper, save error for when you actually need it
rather than do:

	error = -EFOO;
	if (some_error)
		return error;

That only really makes sense when you assign error through eg calling a
function, not when you know what error you are returning. Makes it
easier to read the code as well.

-- 
Jens Axboe


  reply	other threads:[~2024-01-23 22:07 UTC|newest]

Thread overview: 19+ 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 [this message]
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   ` [PATCH v2 1/2] Add __do_ftruncate that truncates a struct file* Gabriel Krisman Bertazi
2024-01-23 15:38   ` Jens Axboe
2024-01-23 15:40     ` Jens Axboe

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 \
    --in-reply-to=955c752a-7631-4f3e-a19b-e3bc8a5139f3@kernel.dk \
    --to=axboe@kernel.dk \
    --cc=asml.silence@gmail.com \
    --cc=io-uring@vger.kernel.org \
    --cc=krisman@suse.de \
    --cc=leitao@debian.org \
    --cc=tony.solomonik@gmail.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.