--- fs/xfs/xfs_vnodeops.c_1.726 2007-12-12 17:14:59.000000000 +1100 +++ fs/xfs/xfs_vnodeops.c 2007-12-12 17:15:42.000000000 +1100 @@ -3762,20 +3762,29 @@ xfs_finish_reclaim( goto reclaim; } xfs_iflock(ip); /* synchronize with xfs_iflush_done */ + xfs_ifunlock(ip); } ASSERT(ip->i_update_core == 0); ASSERT(ip->i_itemp == NULL || ip->i_itemp->ili_format.ilf_fields == 0); xfs_iunlock(ip, XFS_ILOCK_EXCL); - } else if (locked) { + } else { /* * We are not interested in doing an iflush if we're * in the process of shutting down the filesystem forcibly. * So, just reclaim the inode. - */ - xfs_ifunlock(ip); - xfs_iunlock(ip, XFS_ILOCK_EXCL); + * + * If the flush lock is not already held then temporarily + * acquire it to synchronize with xfs_iflush_done. + */ + if (locked) { + xfs_ifunlock(ip); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + } else { + xfs_iflock(ip); + xfs_ifunlock(ip); + } } reclaim: