Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9fa8046f authored by Yingping Lu's avatar Yingping Lu Committed by Nathan Scott
Browse files

[XFS] Fixing the error caused by the conflict between DIO Write's


conversion and concurrent truncate operations. Use vn_iowait to wait for
the completion of any pending DIOs. Since the truncate requires exclusive
IOLOCK, so this blocks any further DIO operations since DIO write also
needs exclusive IOBLOCK. This serves as a barrier and prevent any
potential starvation.

SGI-PV: 947420
SGI-Modid: xfs-linux-melb:xfs-kern:208088a

Signed-off-by: default avatarYingping Lu <yingping@sgi.com>
Signed-off-by: default avatarNathan Scott <nathans@sgi.com>
parent f1fdc848
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -1420,6 +1420,9 @@ xfs_itruncate_start(


	mp = ip->i_mount;
	mp = ip->i_mount;
	vp = XFS_ITOV(ip);
	vp = XFS_ITOV(ip);

	vn_iowait(vp);  /* wait for the completion of any pending DIOs */
	
	/*
	/*
	 * Call VOP_TOSS_PAGES() or VOP_FLUSHINVAL_PAGES() to get rid of pages and buffers
	 * Call VOP_TOSS_PAGES() or VOP_FLUSHINVAL_PAGES() to get rid of pages and buffers
	 * overlapping the region being removed.  We have to use
	 * overlapping the region being removed.  We have to use
+4 −1
Original line number Original line Diff line number Diff line
@@ -615,6 +615,7 @@ xfs_setattr(
			code = xfs_igrow_start(ip, vap->va_size, credp);
			code = xfs_igrow_start(ip, vap->va_size, credp);
		}
		}
		xfs_iunlock(ip, XFS_ILOCK_EXCL);
		xfs_iunlock(ip, XFS_ILOCK_EXCL);
		vn_iowait(vp); /* wait for the completion of any pending DIOs */
		if (!code)
		if (!code)
			code = xfs_itruncate_data(ip, vap->va_size);
			code = xfs_itruncate_data(ip, vap->va_size);
		if (code) {
		if (code) {
@@ -4310,8 +4311,10 @@ xfs_free_file_space(
	ASSERT(attr_flags & ATTR_NOLOCK ? attr_flags & ATTR_DMI : 1);
	ASSERT(attr_flags & ATTR_NOLOCK ? attr_flags & ATTR_DMI : 1);
	if (attr_flags & ATTR_NOLOCK)
	if (attr_flags & ATTR_NOLOCK)
		need_iolock = 0;
		need_iolock = 0;
	if (need_iolock)
	if (need_iolock) {
		xfs_ilock(ip, XFS_IOLOCK_EXCL);
		xfs_ilock(ip, XFS_IOLOCK_EXCL);
		vn_iowait(vp);	/* wait for the completion of any pending DIOs */
	}


	rounding = MAX((__uint8_t)(1 << mp->m_sb.sb_blocklog),
	rounding = MAX((__uint8_t)(1 << mp->m_sb.sb_blocklog),
			(__uint8_t)NBPP);
			(__uint8_t)NBPP);