[PATCH] xfs: don't call into blockgc scan with freeze protection

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



fstest xfs/167 produced a lockdep splat that complained about a
nested transaction acquiring freeze protection during an eofblocks
scan. Drop freeze protection around the block reclaim scan in the
transaction allocation code to avoid this problem.

Signed-off-by: Brian Foster <bfoster@xxxxxxxxxx>
---
 fs/xfs/xfs_trans.c | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)

diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c
index 44f72c09c203..c32c62d3b77a 100644
--- a/fs/xfs/xfs_trans.c
+++ b/fs/xfs/xfs_trans.c
@@ -261,6 +261,7 @@ xfs_trans_alloc(
 {
 	struct xfs_trans	*tp;
 	int			error;
+	bool			retried = false;
 
 	/*
 	 * Allocate the handle before we do our freeze accounting and setting up
@@ -288,19 +289,27 @@ xfs_trans_alloc(
 	INIT_LIST_HEAD(&tp->t_dfops);
 	tp->t_firstblock = NULLFSBLOCK;
 
+retry:
 	error = xfs_trans_reserve(tp, resp, blocks, rtextents);
-	if (error == -ENOSPC) {
+	if (error == -ENOSPC && !retried) {
 		/*
 		 * We weren't able to reserve enough space for the transaction.
 		 * Flush the other speculative space allocations to free space.
 		 * Do not perform a synchronous scan because callers can hold
 		 * other locks.
 		 */
+		retried = true;
+		if (!(flags & XFS_TRANS_NO_WRITECOUNT))
+			sb_end_intwrite(mp->m_super);
 		error = xfs_blockgc_free_space(mp, NULL);
-		if (!error)
-			error = xfs_trans_reserve(tp, resp, blocks, rtextents);
-	}
-	if (error) {
+		if (error) {
+			kmem_cache_free(xfs_trans_zone, tp);
+			return error;
+		}
+		if (!(flags & XFS_TRANS_NO_WRITECOUNT))
+			sb_start_intwrite(mp->m_super);
+		goto retry;
+	} else if (error) {
 		xfs_trans_cancel(tp);
 		return error;
 	}
-- 
2.26.2




[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux