|
@@ -180,26 +180,31 @@ xfs_sync_inode_valid(
|
|
|
struct xfs_perag *pag)
|
|
|
{
|
|
|
struct inode *inode = VFS_I(ip);
|
|
|
+ int error = EFSCORRUPTED;
|
|
|
|
|
|
/* nothing to sync during shutdown */
|
|
|
- if (XFS_FORCED_SHUTDOWN(ip->i_mount)) {
|
|
|
- read_unlock(&pag->pag_ici_lock);
|
|
|
- return EFSCORRUPTED;
|
|
|
- }
|
|
|
+ if (XFS_FORCED_SHUTDOWN(ip->i_mount))
|
|
|
+ goto out_unlock;
|
|
|
|
|
|
- /* If we can't get a reference on the inode, it must be in reclaim. */
|
|
|
- if (!igrab(inode)) {
|
|
|
- read_unlock(&pag->pag_ici_lock);
|
|
|
- return ENOENT;
|
|
|
- }
|
|
|
- read_unlock(&pag->pag_ici_lock);
|
|
|
+ /* avoid new or reclaimable inodes. Leave for reclaim code to flush */
|
|
|
+ error = ENOENT;
|
|
|
+ if (xfs_iflags_test(ip, XFS_INEW | XFS_IRECLAIMABLE | XFS_IRECLAIM))
|
|
|
+ goto out_unlock;
|
|
|
|
|
|
- if (is_bad_inode(inode) || xfs_iflags_test(ip, XFS_INEW)) {
|
|
|
+ /* If we can't grab the inode, it must on it's way to reclaim. */
|
|
|
+ if (!igrab(inode))
|
|
|
+ goto out_unlock;
|
|
|
+
|
|
|
+ if (is_bad_inode(inode)) {
|
|
|
IRELE(ip);
|
|
|
- return ENOENT;
|
|
|
+ goto out_unlock;
|
|
|
}
|
|
|
|
|
|
- return 0;
|
|
|
+ /* inode is valid */
|
|
|
+ error = 0;
|
|
|
+out_unlock:
|
|
|
+ read_unlock(&pag->pag_ici_lock);
|
|
|
+ return error;
|
|
|
}
|
|
|
|
|
|
STATIC int
|