diff mbox series

[2/5] xfs: fallocate() should call file_modified()

Message ID 20220131064350.739863-3-david@fromorbit.com (mailing list archive)
State Superseded, archived
Headers show
Series xfs: fallocate() vs xfs_update_prealloc_flags() | expand

Commit Message

Dave Chinner Jan. 31, 2022, 6:43 a.m. UTC
From: Dave Chinner <dchinner@redhat.com>

In XFS, we always update the inode change and modification time when
any fallocate() operation succeeds.  Furthermore, as various
fallocate modes can change the file contents (extending EOF,
punching holes, zeroing things, shifting extents), we should drop
file privileges like suid just like we do for a regular write().
There's already a VFS helper that figures all this out for us, so
use that.

The net effect of this is that we no longer drop suid/sgid if the
caller is root, but we also now drop file capabilities.

We also move the xfs_update_prealloc_flags() function so that it now
is only called by the scope that needs to set the the prealloc flag.

Based on a patch from Darrick Wong.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
---
 fs/xfs/xfs_file.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

Comments

Darrick J. Wong Jan. 31, 2022, 5:27 p.m. UTC | #1
On Mon, Jan 31, 2022 at 05:43:47PM +1100, Dave Chinner wrote:
> From: Dave Chinner <dchinner@redhat.com>
> 
> In XFS, we always update the inode change and modification time when
> any fallocate() operation succeeds.  Furthermore, as various
> fallocate modes can change the file contents (extending EOF,
> punching holes, zeroing things, shifting extents), we should drop
> file privileges like suid just like we do for a regular write().
> There's already a VFS helper that figures all this out for us, so
> use that.
> 
> The net effect of this is that we no longer drop suid/sgid if the
> caller is root, but we also now drop file capabilities.
> 
> We also move the xfs_update_prealloc_flags() function so that it now
> is only called by the scope that needs to set the the prealloc flag.
> 
> Based on a patch from Darrick Wong.
> 
> Signed-off-by: Dave Chinner <dchinner@redhat.com>

I think you can get rid of @flags entirely, right?

With that fixed, I think this looks good.
Reviewed-by: Darrick J. Wong <djwong@kernel.org>

--D

> ---
>  fs/xfs/xfs_file.c | 13 +++++++++----
>  1 file changed, 9 insertions(+), 4 deletions(-)
> 
> diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
> index 6eda41710a5a..223996822d84 100644
> --- a/fs/xfs/xfs_file.c
> +++ b/fs/xfs/xfs_file.c
> @@ -953,6 +953,10 @@ xfs_file_fallocate(
>  			goto out_unlock;
>  	}
>  
> +	error = file_modified(file);
> +	if (error)
> +		goto out_unlock;
> +
>  	if (mode & FALLOC_FL_PUNCH_HOLE) {
>  		error = xfs_free_file_space(ip, offset, len);
>  		if (error)
> @@ -1053,11 +1057,12 @@ xfs_file_fallocate(
>  			if (error)
>  				goto out_unlock;
>  		}
> -	}
>  
> -	error = xfs_update_prealloc_flags(ip, flags);
> -	if (error)
> -		goto out_unlock;
> +		error = xfs_update_prealloc_flags(ip, XFS_PREALLOC_SET);
> +		if (error)
> +			goto out_unlock;
> +
> +	}
>  
>  	/* Change file size if needed */
>  	if (new_size) {
> -- 
> 2.33.0
>
diff mbox series

Patch

diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index 6eda41710a5a..223996822d84 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -953,6 +953,10 @@  xfs_file_fallocate(
 			goto out_unlock;
 	}
 
+	error = file_modified(file);
+	if (error)
+		goto out_unlock;
+
 	if (mode & FALLOC_FL_PUNCH_HOLE) {
 		error = xfs_free_file_space(ip, offset, len);
 		if (error)
@@ -1053,11 +1057,12 @@  xfs_file_fallocate(
 			if (error)
 				goto out_unlock;
 		}
-	}
 
-	error = xfs_update_prealloc_flags(ip, flags);
-	if (error)
-		goto out_unlock;
+		error = xfs_update_prealloc_flags(ip, XFS_PREALLOC_SET);
+		if (error)
+			goto out_unlock;
+
+	}
 
 	/* Change file size if needed */
 	if (new_size) {