]> err.no Git - linux-2.6/commitdiff
[XFS] Fixing the error caused by the conflict between DIO Write's
authorYingping Lu <yingping@sgi.com>
Wed, 22 Mar 2006 01:44:35 +0000 (12:44 +1100)
committerNathan Scott <nathans@sgi.com>
Wed, 22 Mar 2006 01:44:35 +0000 (12:44 +1100)
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>
fs/xfs/xfs_inode.c
fs/xfs/xfs_vnodeops.c

index 2424a4777949cfcab05bf6084724d96dadf38f74..8d2b36879f060fb5940af3232d3db15a00bdced1 100644 (file)
@@ -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
index 8b5a44fe28654a10ee02ae8e942e0adb443b97e6..697bf22a84f39733c7b931ba7bf30e62cace6626 100644 (file)
@@ -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);