diff options
author | Christoph Hellwig <hch@infradead.org> | 2010-02-05 10:57:55 +0100 |
---|---|---|
committer | Alex Elder <aelder@sgi.com> | 2010-02-12 20:45:14 +0100 |
commit | 180040b89ee2aed88c0a0b1fcf7ada9a512b12e3 (patch) | |
tree | ddc3f6aead139aad5d5c5e0e786fb0b91090505a /fs/xfs | |
parent | xfs: only clear the suid bit once in xfs_write (diff) | |
download | linux-180040b89ee2aed88c0a0b1fcf7ada9a512b12e3.tar.xz linux-180040b89ee2aed88c0a0b1fcf7ada9a512b12e3.zip |
xfs: optimize log flushing in xfs_fsync
If we have a pinned inode it must have a log item attached to it.
Usually that log item will have ili_last_lsn already set, in which
case we only need to flush the log up to that LSN instead of doing a
full log force. This gives speedups of about 5% in some fsync heavy
workloads.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Alex Elder <aelder@sgi.com>
Diffstat (limited to 'fs/xfs')
-rw-r--r-- | fs/xfs/xfs_vnodeops.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 43241e289800..ddd2c5d1b854 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -629,8 +629,14 @@ xfs_fsync( */ xfs_iunlock(ip, XFS_ILOCK_SHARED); if (xfs_ipincount(ip)) { - error = _xfs_log_force(ip->i_mount, XFS_LOG_SYNC, - &log_flushed); + if (ip->i_itemp->ili_last_lsn) { + error = _xfs_log_force_lsn(ip->i_mount, + ip->i_itemp->ili_last_lsn, + XFS_LOG_SYNC, &log_flushed); + } else { + error = _xfs_log_force(ip->i_mount, + XFS_LOG_SYNC, &log_flushed); + } } } else { /* |