xfs: avoid AGI/AGF deadlock scenario for inode chunk allocation
[firefly-linux-kernel-4.4.55.git] / fs / xfs / xfs_ialloc.c
index 5d7f105a1c82e932175ce61b3dfce66b2282966e..283a76d2c7980e128f9dfeae129bf6e77819f9cc 100644 (file)
@@ -363,6 +363,18 @@ xfs_ialloc_ag_alloc(
                args.minleft = args.mp->m_in_maxlevels - 1;
                if ((error = xfs_alloc_vextent(&args)))
                        return error;
+
+               /*
+                * This request might have dirtied the transaction if the AG can
+                * satisfy the request, but the exact block was not available.
+                * If the allocation did fail, subsequent requests will relax
+                * the exact agbno requirement and increase the alignment
+                * instead. It is critical that the total size of the request
+                * (len + alignment + slop) does not increase from this point
+                * on, so reset minalignslop to ensure it is not included in
+                * subsequent requests.
+                */
+               args.minalignslop = 0;
        } else
                args.fsbno = NULLFSBLOCK;