|
@@ -2918,36 +2918,30 @@ xfs_finish_reclaim(
|
|
|
}
|
|
|
|
|
|
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;
|
|
|
- int done = 0;
|
|
|
|
|
|
- while (!done) {
|
|
|
- purged = 0;
|
|
|
- XFS_MOUNT_ILOCK(mp);
|
|
|
- list_for_each_entry_safe(ip, n, &mp->m_del_inodes, i_reclaim) {
|
|
|
- if (noblock) {
|
|
|
- if (xfs_ilock_nowait(ip, XFS_ILOCK_EXCL) == 0)
|
|
|
- continue;
|
|
|
- if (xfs_ipincount(ip) ||
|
|
|
- !xfs_iflock_nowait(ip)) {
|
|
|
- xfs_iunlock(ip, XFS_ILOCK_EXCL);
|
|
|
- continue;
|
|
|
- }
|
|
|
+restart:
|
|
|
+ XFS_MOUNT_ILOCK(mp);
|
|
|
+ list_for_each_entry_safe(ip, n, &mp->m_del_inodes, i_reclaim) {
|
|
|
+ if (noblock) {
|
|
|
+ if (xfs_ilock_nowait(ip, XFS_ILOCK_EXCL) == 0)
|
|
|
+ continue;
|
|
|
+ if (xfs_ipincount(ip) ||
|
|
|
+ !xfs_iflock_nowait(ip)) {
|
|
|
+ xfs_iunlock(ip, XFS_ILOCK_EXCL);
|
|
|
+ continue;
|
|
|
}
|
|
|
- XFS_MOUNT_IUNLOCK(mp);
|
|
|
- if (xfs_finish_reclaim(ip, noblock,
|
|
|
- XFS_IFLUSH_DELWRI_ELSE_ASYNC))
|
|
|
- delay(1);
|
|
|
- purged = 1;
|
|
|
- break;
|
|
|
}
|
|
|
-
|
|
|
- done = !purged;
|
|
|
+ XFS_MOUNT_IUNLOCK(mp);
|
|
|
+ if (xfs_finish_reclaim(ip, noblock, mode))
|
|
|
+ delay(1);
|
|
|
+ goto restart;
|
|
|
}
|
|
|
-
|
|
|
XFS_MOUNT_IUNLOCK(mp);
|
|
|
return 0;
|
|
|
}
|