mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 13:11:40 +00:00
[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: Yingping Lu <yingping@sgi.com> Signed-off-by: Nathan Scott <nathans@sgi.com>
This commit is contained in:
parent
f1fdc848aa
commit
9fa8046f50
@ -1420,6 +1420,9 @@ xfs_itruncate_start(
|
||||
|
||||
mp = ip->i_mount;
|
||||
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
|
||||
* overlapping the region being removed. We have to use
|
||||
|
@ -615,6 +615,7 @@ xfs_setattr(
|
||||
code = xfs_igrow_start(ip, vap->va_size, credp);
|
||||
}
|
||||
xfs_iunlock(ip, XFS_ILOCK_EXCL);
|
||||
vn_iowait(vp); /* wait for the completion of any pending DIOs */
|
||||
if (!code)
|
||||
code = xfs_itruncate_data(ip, vap->va_size);
|
||||
if (code) {
|
||||
@ -4310,8 +4311,10 @@ xfs_free_file_space(
|
||||
ASSERT(attr_flags & ATTR_NOLOCK ? attr_flags & ATTR_DMI : 1);
|
||||
if (attr_flags & ATTR_NOLOCK)
|
||||
need_iolock = 0;
|
||||
if (need_iolock)
|
||||
if (need_iolock) {
|
||||
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),
|
||||
(__uint8_t)NBPP);
|
||||
|
Loading…
Reference in New Issue
Block a user