Commit 845b6d0c authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Christoph Hellwig

xfs: split inode flushing from xfs_sync_inodes_ag

In many cases we only want to sync inode metadata. Split out the inode
flushing into a separate helper to prepare factoring the inode sync code.

Based on a patch from Dave Chinner, but redone to keep the current behaviour
exactly and leave changes to the flushing logic to another patch.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarEric Sandeen <sandeen@sandeen.net>
parent 5a34d5cd
...@@ -77,6 +77,35 @@ xfs_sync_inode_data( ...@@ -77,6 +77,35 @@ xfs_sync_inode_data(
return error; return error;
} }
STATIC int
xfs_sync_inode_attr(
struct xfs_inode *ip,
int flags)
{
int error = 0;
xfs_ilock(ip, XFS_ILOCK_SHARED);
if (xfs_inode_clean(ip))
goto out_unlock;
if (!xfs_iflock_nowait(ip)) {
if (!(flags & SYNC_WAIT))
goto out_unlock;
xfs_iflock(ip);
}
if (xfs_inode_clean(ip)) {
xfs_ifunlock(ip);
goto out_unlock;
}
error = xfs_iflush(ip, (flags & SYNC_WAIT) ?
XFS_IFLUSH_SYNC : XFS_IFLUSH_DELWRI);
out_unlock:
xfs_iunlock(ip, XFS_ILOCK_SHARED);
return error;
}
/* /*
* Sync all the inodes in the given AG according to the * Sync all the inodes in the given AG according to the
* direction given by the flags. * direction given by the flags.
...@@ -96,7 +125,6 @@ xfs_sync_inodes_ag( ...@@ -96,7 +125,6 @@ xfs_sync_inodes_ag(
do { do {
struct inode *inode; struct inode *inode;
xfs_inode_t *ip = NULL; xfs_inode_t *ip = NULL;
int lock_flags = XFS_ILOCK_SHARED;
/* /*
* use a gang lookup to find the next inode in the tree * use a gang lookup to find the next inode in the tree
...@@ -155,22 +183,10 @@ xfs_sync_inodes_ag( ...@@ -155,22 +183,10 @@ xfs_sync_inodes_ag(
if (flags & SYNC_DELWRI) if (flags & SYNC_DELWRI)
error = xfs_sync_inode_data(ip, flags); error = xfs_sync_inode_data(ip, flags);
xfs_ilock(ip, XFS_ILOCK_SHARED); if (flags & SYNC_ATTR)
if ((flags & SYNC_ATTR) && !xfs_inode_clean(ip)) { error = xfs_sync_inode_attr(ip, flags);
if (flags & SYNC_WAIT) {
xfs_iflock(ip); IRELE(ip);
if (!xfs_inode_clean(ip))
error = xfs_iflush(ip, XFS_IFLUSH_SYNC);
else
xfs_ifunlock(ip);
} else if (xfs_iflock_nowait(ip)) {
if (!xfs_inode_clean(ip))
error = xfs_iflush(ip, XFS_IFLUSH_DELWRI);
else
xfs_ifunlock(ip);
}
}
xfs_iput(ip, lock_flags);
if (error) if (error)
last_error = error; last_error = error;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment