Commit 7b5ad0c5 authored by Felix Blyakher's avatar Felix Blyakher Committed by Nathan Scott

[XFS] Restored xfs_iflush_all, which is still used to finish reclaims.

SGI Modid: xfs-linux:xfs-kern:174868a
Signed-off-by: default avatarNathan Scott <nathans@sgi.com>
parent 102a6929
...@@ -3580,6 +3580,108 @@ xfs_iflush_int( ...@@ -3580,6 +3580,108 @@ xfs_iflush_int(
} }
/*
* Flush all inactive inodes in mp. Return true if no user references
* were found, false otherwise.
*/
int
xfs_iflush_all(
xfs_mount_t *mp,
int flag)
{
int busy;
int done;
int purged;
xfs_inode_t *ip;
vmap_t vmap;
vnode_t *vp;
busy = done = 0;
while (!done) {
purged = 0;
XFS_MOUNT_ILOCK(mp);
ip = mp->m_inodes;
if (ip == NULL) {
break;
}
do {
/* Make sure we skip markers inserted by sync */
if (ip->i_mount == NULL) {
ip = ip->i_mnext;
continue;
}
/*
* It's up to our caller to purge the root
* and quota vnodes later.
*/
vp = XFS_ITOV_NULL(ip);
if (!vp) {
XFS_MOUNT_IUNLOCK(mp);
xfs_finish_reclaim(ip, 0, XFS_IFLUSH_ASYNC);
purged = 1;
break;
}
if (vn_count(vp) != 0) {
if (vn_count(vp) == 1 &&
(ip == mp->m_rootip ||
(mp->m_quotainfo &&
(ip->i_ino == mp->m_sb.sb_uquotino ||
ip->i_ino == mp->m_sb.sb_gquotino)))) {
ip = ip->i_mnext;
continue;
}
if (!(flag & XFS_FLUSH_ALL)) {
busy = 1;
done = 1;
break;
}
/*
* Ignore busy inodes but continue flushing
* others.
*/
ip = ip->i_mnext;
continue;
}
/*
* Sample vp mapping while holding mp locked on MP
* systems, so we don't purge a reclaimed or
* nonexistent vnode. We break from the loop
* since we know that we modify
* it by pulling ourselves from it in xfs_reclaim()
* called via vn_purge() below. Set ip to the next
* entry in the list anyway so we'll know below
* whether we reached the end or not.
*/
VMAP(vp, vmap);
XFS_MOUNT_IUNLOCK(mp);
vn_purge(vp, &vmap);
purged = 1;
break;
} while (ip != mp->m_inodes);
/*
* We need to distinguish between when we exit the loop
* after a purge and when we simply hit the end of the
* list. We can't use the (ip == mp->m_inodes) test,
* because when we purge an inode at the start of the list
* the next inode on the list becomes mp->m_inodes. That
* would cause such a test to bail out early. The purged
* variable tells us how we got out of the loop.
*/
if (!purged) {
done = 1;
}
}
XFS_MOUNT_IUNLOCK(mp);
return !busy;
}
/* /*
* xfs_iaccess: check accessibility of inode for mode. * xfs_iaccess: check accessibility of inode for mode.
*/ */
......
...@@ -527,6 +527,7 @@ void xfs_ipin(xfs_inode_t *); ...@@ -527,6 +527,7 @@ void xfs_ipin(xfs_inode_t *);
void xfs_iunpin(xfs_inode_t *); void xfs_iunpin(xfs_inode_t *);
int xfs_iextents_copy(xfs_inode_t *, xfs_bmbt_rec_t *, int); int xfs_iextents_copy(xfs_inode_t *, xfs_bmbt_rec_t *, int);
int xfs_iflush(xfs_inode_t *, uint); int xfs_iflush(xfs_inode_t *, uint);
int xfs_iflush_all(struct xfs_mount *, int);
int xfs_iaccess(xfs_inode_t *, mode_t, cred_t *); int xfs_iaccess(xfs_inode_t *, mode_t, cred_t *);
uint xfs_iroundup(uint); uint xfs_iroundup(uint);
void xfs_ichgtime(xfs_inode_t *, int); void xfs_ichgtime(xfs_inode_t *, int);
......
...@@ -1074,6 +1074,8 @@ xfs_unmountfs(xfs_mount_t *mp, struct cred *cr) ...@@ -1074,6 +1074,8 @@ xfs_unmountfs(xfs_mount_t *mp, struct cred *cr)
int64_t fsid; int64_t fsid;
#endif #endif
xfs_iflush_all(mp, XFS_FLUSH_ALL);
XFS_QM_DQPURGEALL(mp, XFS_QM_DQPURGEALL(mp,
XFS_QMOPT_UQUOTA | XFS_QMOPT_GQUOTA | XFS_QMOPT_UMOUNTING); XFS_QMOPT_UQUOTA | XFS_QMOPT_GQUOTA | XFS_QMOPT_UMOUNTING);
......
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