| From 3b4683c294095b5f777c03307ef8c60f47320e12 Mon Sep 17 00:00:00 2001 |
| From: Brian Foster <bfoster@redhat.com> |
| Date: Tue, 11 Apr 2017 10:50:05 -0700 |
| Subject: xfs: drop iolock from reclaim context to appease lockdep |
| |
| From: Brian Foster <bfoster@redhat.com> |
| |
| commit 3b4683c294095b5f777c03307ef8c60f47320e12 upstream. |
| |
| Lockdep complains about use of the iolock in inode reclaim context |
| because it doesn't understand that reclaim has the last reference to |
| the inode, and thus an iolock->reclaim->iolock deadlock is not |
| possible. |
| |
| The iolock is technically not necessary in xfs_inactive() and was |
| only added to appease an assert in xfs_free_eofblocks(), which can |
| be called from other non-reclaim contexts. Therefore, just kill the |
| assert and drop the use of the iolock from reclaim context to quiet |
| lockdep. |
| |
| Signed-off-by: Brian Foster <bfoster@redhat.com> |
| Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> |
| Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/xfs/xfs_bmap_util.c | 8 +++----- |
| fs/xfs/xfs_inode.c | 9 +++++---- |
| 2 files changed, 8 insertions(+), 9 deletions(-) |
| |
| --- a/fs/xfs/xfs_bmap_util.c |
| +++ b/fs/xfs/xfs_bmap_util.c |
| @@ -911,9 +911,9 @@ xfs_can_free_eofblocks(struct xfs_inode |
| } |
| |
| /* |
| - * This is called by xfs_inactive to free any blocks beyond eof |
| - * when the link count isn't zero and by xfs_dm_punch_hole() when |
| - * punching a hole to EOF. |
| + * This is called to free any blocks beyond eof. The caller must hold |
| + * IOLOCK_EXCL unless we are in the inode reclaim path and have the only |
| + * reference to the inode. |
| */ |
| int |
| xfs_free_eofblocks( |
| @@ -928,8 +928,6 @@ xfs_free_eofblocks( |
| struct xfs_bmbt_irec imap; |
| struct xfs_mount *mp = ip->i_mount; |
| |
| - ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); |
| - |
| /* |
| * Figure out if there are any blocks beyond the end |
| * of the file. If not, then there is nothing to do. |
| --- a/fs/xfs/xfs_inode.c |
| +++ b/fs/xfs/xfs_inode.c |
| @@ -1915,12 +1915,13 @@ xfs_inactive( |
| * force is true because we are evicting an inode from the |
| * cache. Post-eof blocks must be freed, lest we end up with |
| * broken free space accounting. |
| + * |
| + * Note: don't bother with iolock here since lockdep complains |
| + * about acquiring it in reclaim context. We have the only |
| + * reference to the inode at this point anyways. |
| */ |
| - if (xfs_can_free_eofblocks(ip, true)) { |
| - xfs_ilock(ip, XFS_IOLOCK_EXCL); |
| + if (xfs_can_free_eofblocks(ip, true)) |
| xfs_free_eofblocks(ip); |
| - xfs_iunlock(ip, XFS_IOLOCK_EXCL); |
| - } |
| |
| return; |
| } |