Looking at xfs_iflush(). If an IO fails, it is supposed to unlock the inode by calling xfs_iflush_abort(), which will also remove it from the AIL. This can also happen on reclaim of a dirty inode, and if so we'll still reclaim the inode because reclaim assumes xfs_iflush() cleans up properly. Which, apparently, it doesn't. Fix xfs_iflush() buf get failure to remove intent log item. Discovered-by: Dave Chinner <dchinner at redhat.com> diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 96f606d..85414a6 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -3374,8 +3374,9 @@ xfs_iflush( error = xfs_imap_to_bp(mp, NULL, &ip->i_imap, &dip, &bp, XBF_TRYLOCK, 0); if (error || !bp) { - xfs_ifunlock(ip); - return error; + if (!bp) + error = -EIO; + goto abort_out; } /* -- _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs