|
@@ -1025,7 +1025,6 @@ xfs_log_inode(
|
|
|
*/
|
|
|
xfs_trans_ijoin(tp, ip);
|
|
|
xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
|
|
|
- xfs_trans_set_sync(tp);
|
|
|
error = xfs_trans_commit(tp, 0);
|
|
|
xfs_ilock_demote(ip, XFS_ILOCK_EXCL);
|
|
|
|
|
@@ -1048,20 +1047,11 @@ xfs_fs_write_inode(
|
|
|
|
|
|
if (wbc->sync_mode == WB_SYNC_ALL) {
|
|
|
/*
|
|
|
- * Make sure the inode has hit stable storage. By using the
|
|
|
- * log and the fsync transactions we reduce the IOs we have
|
|
|
- * to do here from two (log and inode) to just the log.
|
|
|
- *
|
|
|
- * Note: We still need to do a delwri write of the inode after
|
|
|
- * this to flush it to the backing buffer so that bulkstat
|
|
|
- * works properly if this is the first time the inode has been
|
|
|
- * written. Because we hold the ilock atomically over the
|
|
|
- * transaction commit and the inode flush we are guaranteed
|
|
|
- * that the inode is not pinned when it returns. If the flush
|
|
|
- * lock is already held, then the inode has already been
|
|
|
- * flushed once and we don't need to flush it again. Hence
|
|
|
- * the code will only flush the inode if it isn't already
|
|
|
- * being flushed.
|
|
|
+ * Make sure the inode has made it it into the log. Instead
|
|
|
+ * of forcing it all the way to stable storage using a
|
|
|
+ * synchronous transaction we let the log force inside the
|
|
|
+ * ->sync_fs call do that for thus, which reduces the number
|
|
|
+ * of synchronous log foces dramatically.
|
|
|
*/
|
|
|
xfs_ioend_wait(ip);
|
|
|
xfs_ilock(ip, XFS_ILOCK_SHARED);
|
|
@@ -1075,27 +1065,29 @@ xfs_fs_write_inode(
|
|
|
* We make this non-blocking if the inode is contended, return
|
|
|
* EAGAIN to indicate to the caller that they did not succeed.
|
|
|
* This prevents the flush path from blocking on inodes inside
|
|
|
- * another operation right now, they get caught later by xfs_sync.
|
|
|
+ * another operation right now, they get caught later by
|
|
|
+ * xfs_sync.
|
|
|
*/
|
|
|
if (!xfs_ilock_nowait(ip, XFS_ILOCK_SHARED))
|
|
|
goto out;
|
|
|
- }
|
|
|
|
|
|
- if (xfs_ipincount(ip) || !xfs_iflock_nowait(ip))
|
|
|
- goto out_unlock;
|
|
|
+ if (xfs_ipincount(ip) || !xfs_iflock_nowait(ip))
|
|
|
+ goto out_unlock;
|
|
|
|
|
|
- /*
|
|
|
- * Now we have the flush lock and the inode is not pinned, we can check
|
|
|
- * if the inode is really clean as we know that there are no pending
|
|
|
- * transaction completions, it is not waiting on the delayed write
|
|
|
- * queue and there is no IO in progress.
|
|
|
- */
|
|
|
- if (xfs_inode_clean(ip)) {
|
|
|
- xfs_ifunlock(ip);
|
|
|
- error = 0;
|
|
|
- goto out_unlock;
|
|
|
+ /*
|
|
|
+ * Now we have the flush lock and the inode is not pinned, we
|
|
|
+ * can check if the inode is really clean as we know that
|
|
|
+ * there are no pending transaction completions, it is not
|
|
|
+ * waiting on the delayed write queue and there is no IO in
|
|
|
+ * progress.
|
|
|
+ */
|
|
|
+ if (xfs_inode_clean(ip)) {
|
|
|
+ xfs_ifunlock(ip);
|
|
|
+ error = 0;
|
|
|
+ goto out_unlock;
|
|
|
+ }
|
|
|
+ error = xfs_iflush(ip, 0);
|
|
|
}
|
|
|
- error = xfs_iflush(ip, 0);
|
|
|
|
|
|
out_unlock:
|
|
|
xfs_iunlock(ip, XFS_ILOCK_SHARED);
|