Skip to content

Commit

Permalink
xfs: ensure log flush at the end of a synchronous fallocate call
Browse files Browse the repository at this point in the history
Since we've started treating fallocate more like a file write, we
should flush the log to disk if the user has asked for synchronous
writes either by setting it via fcntl flags, or inode flags, or with
the sync mount option.  We've already got a helper for this, so use
it.

[The original patch by Darrick was massaged by Dave to fit this patchset]

Signed-off-by: Darrick J. Wong <[email protected]>
Signed-off-by: Dave Chinner <[email protected]>
Reviewed-by: Darrick J. Wong <[email protected]>
  • Loading branch information
Dave Chinner authored and Darrick J. Wong committed Feb 1, 2022
1 parent b39a046 commit cea267c
Showing 1 changed file with 16 additions and 16 deletions.
32 changes: 16 additions & 16 deletions fs/xfs/xfs_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -861,6 +861,21 @@ xfs_break_layouts(
return error;
}

/* Does this file, inode, or mount want synchronous writes? */
static inline bool xfs_file_sync_writes(struct file *filp)
{
struct xfs_inode *ip = XFS_I(file_inode(filp));

if (xfs_has_wsync(ip->i_mount))
return true;
if (filp->f_flags & (__O_SYNC | O_DSYNC))
return true;
if (IS_SYNC(file_inode(filp)))
return true;

return false;
}

#define XFS_FALLOC_FL_SUPPORTED \
(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | \
FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | \
Expand Down Expand Up @@ -1048,7 +1063,7 @@ xfs_file_fallocate(
goto out_unlock;
}

if (file->f_flags & O_DSYNC)
if (xfs_file_sync_writes(file))
error = xfs_log_force_inode(ip);

out_unlock:
Expand Down Expand Up @@ -1081,21 +1096,6 @@ xfs_file_fadvise(
return ret;
}

/* Does this file, inode, or mount want synchronous writes? */
static inline bool xfs_file_sync_writes(struct file *filp)
{
struct xfs_inode *ip = XFS_I(file_inode(filp));

if (xfs_has_wsync(ip->i_mount))
return true;
if (filp->f_flags & (__O_SYNC | O_DSYNC))
return true;
if (IS_SYNC(file_inode(filp)))
return true;

return false;
}

STATIC loff_t
xfs_file_remap_range(
struct file *file_in,
Expand Down

0 comments on commit cea267c

Please sign in to comment.