Skip to content

Commit

Permalink
xfs: split inode flushing from xfs_sync_inodes_ag
Browse files Browse the repository at this point in the history
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: Christoph Hellwig <[email protected]>
Reviewed-by: Eric Sandeen <[email protected]>
  • Loading branch information
Christoph Hellwig authored and Christoph Hellwig committed Jun 8, 2009
1 parent 5a34d5c commit 845b6d0
Showing 1 changed file with 33 additions and 17 deletions.
50 changes: 33 additions & 17 deletions fs/xfs/linux-2.6/xfs_sync.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,35 @@ xfs_sync_inode_data(
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
* direction given by the flags.
Expand All @@ -96,7 +125,6 @@ xfs_sync_inodes_ag(
do {
struct inode *inode;
xfs_inode_t *ip = NULL;
int lock_flags = XFS_ILOCK_SHARED;

/*
* use a gang lookup to find the next inode in the tree
Expand Down Expand Up @@ -155,22 +183,10 @@ xfs_sync_inodes_ag(
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);
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 (flags & SYNC_ATTR)
error = xfs_sync_inode_attr(ip, flags);

IRELE(ip);

if (error)
last_error = error;
Expand Down

0 comments on commit 845b6d0

Please sign in to comment.