Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 82878897 authored by Dave Chinner's avatar Dave Chinner Committed by Dave Chinner
Browse files

xfs: preallocation transactions do not need to be synchronous



Preallocation and hole punch transactions are currently synchronous
and this is causing performance problems in some cases. The
transactions don't need to be synchronous as we don't need to
guarantee the preallocation is persistent on disk until a
fdatasync, fsync, sync operation occurs. If the file is opened
O_SYNC or O_DATASYNC, only then should the transaction be issued
synchronously.

Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarAlex Elder <aelder@sgi.com>
parent 0c9ba973
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -896,6 +896,7 @@ xfs_file_fallocate(
	xfs_flock64_t	bf;
	xfs_inode_t	*ip = XFS_I(inode);
	int		cmd = XFS_IOC_RESVSP;
	int		attr_flags = XFS_ATTR_NOLOCK;

	if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE))
		return -EOPNOTSUPP;
@@ -918,7 +919,10 @@ xfs_file_fallocate(
			goto out_unlock;
	}

	error = -xfs_change_file_space(ip, cmd, &bf, 0, XFS_ATTR_NOLOCK);
	if (file->f_flags & O_DSYNC)
		attr_flags |= XFS_ATTR_SYNC;

	error = -xfs_change_file_space(ip, cmd, &bf, 0, attr_flags);
	if (error)
		goto out_unlock;

+4 −0
Original line number Diff line number Diff line
@@ -624,6 +624,10 @@ xfs_ioc_space(

	if (filp->f_flags & (O_NDELAY|O_NONBLOCK))
		attr_flags |= XFS_ATTR_NONBLOCK;

	if (filp->f_flags & O_DSYNC)
		attr_flags |= XFS_ATTR_SYNC;

	if (ioflags & IO_INVIS)
		attr_flags |= XFS_ATTR_DMI;

+2 −1
Original line number Diff line number Diff line
@@ -2831,6 +2831,7 @@ xfs_change_file_space(
		ip->i_d.di_flags &= ~XFS_DIFLAG_PREALLOC;

	xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
	if (attr_flags & XFS_ATTR_SYNC)
		xfs_trans_set_sync(tp);

	error = xfs_trans_commit(tp, 0);
+1 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ int xfs_setattr(struct xfs_inode *ip, struct iattr *vap, int flags);
#define	XFS_ATTR_NONBLOCK	0x02	/* return EAGAIN if operation would block */
#define XFS_ATTR_NOLOCK		0x04	/* Don't grab any conflicting locks */
#define XFS_ATTR_NOACL		0x08	/* Don't call xfs_acl_chmod */
#define XFS_ATTR_SYNC		0x10	/* synchronous operation required */

int xfs_readlink(struct xfs_inode *ip, char *link);
int xfs_release(struct xfs_inode *ip);