[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