summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarrick J. Wong <djwong@kernel.org>2022-01-28 14:35:12 -0800
committerDarrick J. Wong <djwong@kernel.org>2022-01-30 09:36:28 -0800
commited133bb8ccba2d833688c4d808b6549186b53bd1 (patch)
treece1b29a406952c223d5b35a292014031df444a90
parent5ebf6bc9acf4f46d10d19e18e1d4d4bb6c6d560c (diff)
xfs: use vfs helper to update file attributes after fallocate
In XFS, we always update the inode change and modification time when any preallocation 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. Signed-off-by: Darrick J. Wong <djwong@kernel.org>
-rw-r--r--fs/xfs/xfs_file.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index d81a28cada35..99f245978762 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -1058,12 +1058,26 @@ xfs_file_fallocate(
}
}
+ /* Update [cm]time and drop file privileges like a regular write. */
+ error = file_modified(file);
+ if (error)
+ goto out_unlock;
+
+ /*
+ * If we need to change the PREALLOC flag or flush the log, do so.
+ * We already updated the timestamps and cleared the suid flags, so we
+ * don't need to do that again. This must be committed before the size
+ * change so that we don't trim post-EOF preallocations.
+ */
if (file->f_flags & O_DSYNC)
flags |= XFS_PREALLOC_SYNC;
+ if (flags) {
+ flags |= XFS_PREALLOC_INVISIBLE;
- error = xfs_update_prealloc_flags(ip, flags);
- if (error)
- goto out_unlock;
+ error = xfs_update_prealloc_flags(ip, flags);
+ if (error)
+ goto out_unlock;
+ }
/* Change file size if needed */
if (new_size) {