xfs: log timestamp updates
Timestamps on regular files are the last metadata that XFS does not update transactionally. Now that we use the delaylog mode exclusively and made the log scode scale extremly well there is no need to bypass that code for timestamp updates. Logging all updates allows to drop a lot of code, and will allow for further performance improvements later on. Note that this patch drops optimized handling of fdatasync - it will be added back in a separate commit. Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Mark Tinguely <tinguely@sgi.com> Signed-off-by: Ben Myers <bpm@sgi.com>
This commit is contained in:

committed by
Ben Myers

parent
281627df3e
commit
8a9c9980f2
@@ -336,32 +336,6 @@ xfs_sync_fsdata(
|
||||
return error;
|
||||
}
|
||||
|
||||
int
|
||||
xfs_log_dirty_inode(
|
||||
struct xfs_inode *ip,
|
||||
struct xfs_perag *pag,
|
||||
int flags)
|
||||
{
|
||||
struct xfs_mount *mp = ip->i_mount;
|
||||
struct xfs_trans *tp;
|
||||
int error;
|
||||
|
||||
if (!ip->i_update_core)
|
||||
return 0;
|
||||
|
||||
tp = xfs_trans_alloc(mp, XFS_TRANS_FSYNC_TS);
|
||||
error = xfs_trans_reserve(tp, 0, XFS_FSYNC_TS_LOG_RES(mp), 0, 0, 0);
|
||||
if (error) {
|
||||
xfs_trans_cancel(tp, 0);
|
||||
return error;
|
||||
}
|
||||
|
||||
xfs_ilock(ip, XFS_ILOCK_EXCL);
|
||||
xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
|
||||
xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
|
||||
return xfs_trans_commit(tp, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* When remounting a filesystem read-only or freezing the filesystem, we have
|
||||
* two phases to execute. This first phase is syncing the data before we
|
||||
@@ -385,16 +359,6 @@ xfs_quiesce_data(
|
||||
{
|
||||
int error, error2 = 0;
|
||||
|
||||
/*
|
||||
* Log all pending size and timestamp updates. The vfs writeback
|
||||
* code is supposed to do this, but due to its overagressive
|
||||
* livelock detection it will skip inodes where appending writes
|
||||
* were written out in the first non-blocking sync phase if their
|
||||
* completion took long enough that it happened after taking the
|
||||
* timestamp for the cut-off in the blocking phase.
|
||||
*/
|
||||
xfs_inode_ag_iterator(mp, xfs_log_dirty_inode, 0);
|
||||
|
||||
/* force out the log */
|
||||
xfs_log_force(mp, XFS_LOG_SYNC);
|
||||
|
||||
|
Reference in New Issue
Block a user