|
@@ -1211,6 +1211,9 @@ xfs_inode_free_eofblocks(
|
|
|
{
|
|
|
int ret;
|
|
|
struct xfs_eofblocks *eofb = args;
|
|
|
+ bool need_iolock = true;
|
|
|
+
|
|
|
+ ASSERT(!eofb || (eofb && eofb->eof_scan_owner != 0));
|
|
|
|
|
|
if (!xfs_can_free_eofblocks(ip, false)) {
|
|
|
/* inode could be preallocated or append-only */
|
|
@@ -1235,9 +1238,17 @@ xfs_inode_free_eofblocks(
|
|
|
if (eofb->eof_flags & XFS_EOF_FLAGS_MINFILESIZE &&
|
|
|
XFS_ISIZE(ip) < eofb->eof_min_file_size)
|
|
|
return 0;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * A scan owner implies we already hold the iolock. Skip it in
|
|
|
+ * xfs_free_eofblocks() to avoid deadlock. This also eliminates
|
|
|
+ * the possibility of EAGAIN being returned.
|
|
|
+ */
|
|
|
+ if (eofb->eof_scan_owner == ip->i_ino)
|
|
|
+ need_iolock = false;
|
|
|
}
|
|
|
|
|
|
- ret = xfs_free_eofblocks(ip->i_mount, ip, true);
|
|
|
+ ret = xfs_free_eofblocks(ip->i_mount, ip, need_iolock);
|
|
|
|
|
|
/* don't revisit the inode if we're not waiting */
|
|
|
if (ret == -EAGAIN && !(flags & SYNC_WAIT))
|