mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-03-29 14:02:17 +07:00
[XFS] Remove xfs_iflush_all and clean up xfs_finish_reclaim_all()
xfs_iflush_all() walks the m_inodes list to find inodes that need reclaiming. We already have such a list - the m_del_inodes list. Replace xfs_iflush_all() with a call to xfs_finish_reclaim_all() and clean up xfs_finish_reclaim_all() to handle the different flush modes now needed. Originally based on a patch from Christoph Hellwig. Version 3 o rediff against new linux-2.6/xfs_sync.c code Version 2 o revert xfs_syncsub() inode reclaim behaviour back to original code o xfs_quiesce_fs() should use XFS_IFLUSH_DELWRI_ELSE_ASYNC, not XFS_IFLUSH_ASYNC, to prevent change of behaviour. SGI-PV: 988139 SGI-Modid: xfs-linux-melb:xfs-kern:32284a Signed-off-by: David Chinner <david@fromorbit.com> Signed-off-by: Lachlan McIlroy <lachlan@sgi.com> Signed-off-by: Christoph Hellwig <hch@infradead.org>
This commit is contained in:
parent
a167b17e89
commit
75c68f411b
@ -504,7 +504,7 @@ xfs_syncsub(
|
|||||||
|
|
||||||
if (flags & (SYNC_ATTR|SYNC_DELWRI)) {
|
if (flags & (SYNC_ATTR|SYNC_DELWRI)) {
|
||||||
if (flags & SYNC_BDFLUSH)
|
if (flags & SYNC_BDFLUSH)
|
||||||
xfs_finish_reclaim_all(mp, 1);
|
xfs_finish_reclaim_all(mp, 1, XFS_IFLUSH_DELWRI_ELSE_ASYNC);
|
||||||
else
|
else
|
||||||
error = xfs_sync_inodes(mp, flags, bypassed);
|
error = xfs_sync_inodes(mp, flags, bypassed);
|
||||||
}
|
}
|
||||||
|
@ -3499,41 +3499,6 @@ xfs_iflush_int(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Flush all inactive inodes in mp.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
xfs_iflush_all(
|
|
||||||
xfs_mount_t *mp)
|
|
||||||
{
|
|
||||||
xfs_inode_t *ip;
|
|
||||||
|
|
||||||
again:
|
|
||||||
XFS_MOUNT_ILOCK(mp);
|
|
||||||
ip = mp->m_inodes;
|
|
||||||
if (ip == NULL)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
do {
|
|
||||||
/* Make sure we skip markers inserted by sync */
|
|
||||||
if (ip->i_mount == NULL) {
|
|
||||||
ip = ip->i_mnext;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!VFS_I(ip)) {
|
|
||||||
XFS_MOUNT_IUNLOCK(mp);
|
|
||||||
xfs_finish_reclaim(ip, 0, XFS_IFLUSH_ASYNC);
|
|
||||||
goto again;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASSERT(vn_count(VFS_I(ip)) == 0);
|
|
||||||
|
|
||||||
ip = ip->i_mnext;
|
|
||||||
} while (ip != mp->m_inodes);
|
|
||||||
out:
|
|
||||||
XFS_MOUNT_IUNLOCK(mp);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef XFS_ILOCK_TRACE
|
#ifdef XFS_ILOCK_TRACE
|
||||||
ktrace_t *xfs_ilock_trace_buf;
|
ktrace_t *xfs_ilock_trace_buf;
|
||||||
|
@ -503,7 +503,7 @@ uint xfs_ilock_map_shared(xfs_inode_t *);
|
|||||||
void xfs_iunlock_map_shared(xfs_inode_t *, uint);
|
void xfs_iunlock_map_shared(xfs_inode_t *, uint);
|
||||||
void xfs_ireclaim(xfs_inode_t *);
|
void xfs_ireclaim(xfs_inode_t *);
|
||||||
int xfs_finish_reclaim(xfs_inode_t *, int, int);
|
int xfs_finish_reclaim(xfs_inode_t *, int, int);
|
||||||
int xfs_finish_reclaim_all(struct xfs_mount *, int);
|
int xfs_finish_reclaim_all(struct xfs_mount *, int, int);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* xfs_inode.c prototypes.
|
* xfs_inode.c prototypes.
|
||||||
@ -530,7 +530,6 @@ void xfs_iext_realloc(xfs_inode_t *, int, int);
|
|||||||
void xfs_ipin(xfs_inode_t *);
|
void xfs_ipin(xfs_inode_t *);
|
||||||
void xfs_iunpin(xfs_inode_t *);
|
void xfs_iunpin(xfs_inode_t *);
|
||||||
int xfs_iflush(xfs_inode_t *, uint);
|
int xfs_iflush(xfs_inode_t *, uint);
|
||||||
void xfs_iflush_all(struct xfs_mount *);
|
|
||||||
void xfs_ichgtime(xfs_inode_t *, int);
|
void xfs_ichgtime(xfs_inode_t *, int);
|
||||||
xfs_fsize_t xfs_file_last_byte(xfs_inode_t *);
|
xfs_fsize_t xfs_file_last_byte(xfs_inode_t *);
|
||||||
void xfs_lock_inodes(xfs_inode_t **, int, uint);
|
void xfs_lock_inodes(xfs_inode_t **, int, uint);
|
||||||
|
@ -1241,7 +1241,7 @@ xfs_unmountfs(
|
|||||||
* need to force the log first.
|
* need to force the log first.
|
||||||
*/
|
*/
|
||||||
xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE | XFS_LOG_SYNC);
|
xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE | XFS_LOG_SYNC);
|
||||||
xfs_iflush_all(mp);
|
xfs_finish_reclaim_all(mp, 0, XFS_IFLUSH_ASYNC);
|
||||||
|
|
||||||
XFS_QM_DQPURGEALL(mp, XFS_QMOPT_QUOTALL | XFS_QMOPT_UMOUNTING);
|
XFS_QM_DQPURGEALL(mp, XFS_QMOPT_QUOTALL | XFS_QMOPT_UMOUNTING);
|
||||||
|
|
||||||
|
@ -66,7 +66,7 @@ xfs_quiesce_fs(
|
|||||||
int count = 0, pincount;
|
int count = 0, pincount;
|
||||||
|
|
||||||
xfs_flush_buftarg(mp->m_ddev_targp, 0);
|
xfs_flush_buftarg(mp->m_ddev_targp, 0);
|
||||||
xfs_finish_reclaim_all(mp, 0);
|
xfs_finish_reclaim_all(mp, 0, XFS_IFLUSH_DELWRI_ELSE_ASYNC);
|
||||||
|
|
||||||
/* This loop must run at least twice.
|
/* This loop must run at least twice.
|
||||||
* The first instance of the loop will flush
|
* The first instance of the loop will flush
|
||||||
|
@ -2918,36 +2918,30 @@ xfs_finish_reclaim(
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
xfs_finish_reclaim_all(xfs_mount_t *mp, int noblock)
|
xfs_finish_reclaim_all(
|
||||||
|
xfs_mount_t *mp,
|
||||||
|
int noblock,
|
||||||
|
int mode)
|
||||||
{
|
{
|
||||||
int purged;
|
|
||||||
xfs_inode_t *ip, *n;
|
xfs_inode_t *ip, *n;
|
||||||
int done = 0;
|
|
||||||
|
|
||||||
while (!done) {
|
restart:
|
||||||
purged = 0;
|
XFS_MOUNT_ILOCK(mp);
|
||||||
XFS_MOUNT_ILOCK(mp);
|
list_for_each_entry_safe(ip, n, &mp->m_del_inodes, i_reclaim) {
|
||||||
list_for_each_entry_safe(ip, n, &mp->m_del_inodes, i_reclaim) {
|
if (noblock) {
|
||||||
if (noblock) {
|
if (xfs_ilock_nowait(ip, XFS_ILOCK_EXCL) == 0)
|
||||||
if (xfs_ilock_nowait(ip, XFS_ILOCK_EXCL) == 0)
|
continue;
|
||||||
continue;
|
if (xfs_ipincount(ip) ||
|
||||||
if (xfs_ipincount(ip) ||
|
!xfs_iflock_nowait(ip)) {
|
||||||
!xfs_iflock_nowait(ip)) {
|
xfs_iunlock(ip, XFS_ILOCK_EXCL);
|
||||||
xfs_iunlock(ip, XFS_ILOCK_EXCL);
|
continue;
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
XFS_MOUNT_IUNLOCK(mp);
|
|
||||||
if (xfs_finish_reclaim(ip, noblock,
|
|
||||||
XFS_IFLUSH_DELWRI_ELSE_ASYNC))
|
|
||||||
delay(1);
|
|
||||||
purged = 1;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
XFS_MOUNT_IUNLOCK(mp);
|
||||||
done = !purged;
|
if (xfs_finish_reclaim(ip, noblock, mode))
|
||||||
|
delay(1);
|
||||||
|
goto restart;
|
||||||
}
|
}
|
||||||
|
|
||||||
XFS_MOUNT_IUNLOCK(mp);
|
XFS_MOUNT_IUNLOCK(mp);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user