Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 148841
b: refs/heads/master
c: 845b6d0
h: refs/heads/master
i:
  148839: b4868ae
v: v3
  • Loading branch information
Christoph Hellwig authored and Christoph Hellwig committed Jun 8, 2009
1 parent 5e6cd2d commit 39ff76c
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 18 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 5a34d5cd096310133f9208db294021208a96660d
refs/heads/master: 845b6d0cbbc2304e8a54ed4038272c55f85b2269
50 changes: 33 additions & 17 deletions trunk/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 39ff76c

Please sign in to comment.