[PATCH 1/6] [XFS] Split inode data writeback from inode sync.

Dave Chinner david at fromorbit.com
Sun Mar 15 06:46:38 CDT 2009


In many cases we only want to sync inode data. Start
spliting the inode sync into data sync and inode sync
by factoring out the inode data flush.

Signed-off-by: Dave Chinner <david at fromorbit.com>
---
 fs/xfs/linux-2.6/xfs_sync.c |   54 +++++++++++++++++++++++++++----------------
 1 files changed, 34 insertions(+), 20 deletions(-)

diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c
index f7ba766..fd024e2 100644
--- a/fs/xfs/linux-2.6/xfs_sync.c
+++ b/fs/xfs/linux-2.6/xfs_sync.c
@@ -47,6 +47,37 @@
 #include <linux/kthread.h>
 #include <linux/freezer.h>
 
+static int
+xfs_sync_inode_data(
+	struct xfs_inode	*ip,
+	int			flags)
+{
+	struct inode	*inode = VFS_I(ip);
+	int		error = 0;
+
+	if (VN_DIRTY(inode)) {
+		int	locked = 0;
+		if (flags & SYNC_TRYLOCK) {
+			if (xfs_ilock_nowait(ip, XFS_IOLOCK_SHARED))
+				locked = 1;
+		} else {
+			xfs_ilock(ip, XFS_IOLOCK_SHARED);
+			locked = 1;
+		}
+		if (locked) {
+			error = xfs_flush_pages(ip, 0, -1,
+					(flags & SYNC_WAIT) ? 0 : XFS_B_ASYNC,
+					FI_NONE);
+			xfs_iunlock(ip, XFS_IOLOCK_SHARED);
+		}
+	}
+
+	if (flags & SYNC_IOWAIT)
+		xfs_ioend_wait(ip);
+
+	return error;
+}
+
 /*
  * Sync all the inodes in the given AG according to the
  * direction given by the flags.
@@ -122,27 +153,10 @@ xfs_sync_inodes_ag(
 		 * If we have to flush data or wait for I/O completion
 		 * we need to hold the iolock.
 		 */
-		if (flags & SYNC_DELWRI) {
-			if (VN_DIRTY(inode)) {
-				if (flags & SYNC_TRYLOCK) {
-					if (xfs_ilock_nowait(ip, XFS_IOLOCK_SHARED))
-						lock_flags |= XFS_IOLOCK_SHARED;
-				} else {
-					xfs_ilock(ip, XFS_IOLOCK_SHARED);
-					lock_flags |= XFS_IOLOCK_SHARED;
-				}
-				if (lock_flags & XFS_IOLOCK_SHARED) {
-					error = xfs_flush_pages(ip, 0, -1,
-							(flags & SYNC_WAIT) ? 0
-								: XFS_B_ASYNC,
-							FI_NONE);
-				}
-			}
-			if (VN_CACHED(inode) && (flags & SYNC_IOWAIT))
-				xfs_ioend_wait(ip);
-		}
-		xfs_ilock(ip, XFS_ILOCK_SHARED);
+		if (flags & SYNC_DELWRI)
+			error = xfs_sync_inode_data(ip, flags);
 
+		xfs_ilock(ip, XFS_ILOCK_SHARED);
 		if ((flags & SYNC_ATTR) && !xfs_inode_clean(ip)) {
 			if (flags & SYNC_WAIT) {
 				xfs_iflock(ip);
-- 
1.6.2




More information about the xfs mailing list