[XFS] Don't wait for pending I/Os when purging blocks beyond eof.
authorLachlan McIlroy <lachlan@sgi.com>
Tue, 18 Dec 2007 05:17:41 +0000 (16:17 +1100)
committerLachlan McIlroy <lachlan@redback.melbourne.sgi.com>
Tue, 18 Dec 2007 06:16:17 +0000 (17:16 +1100)
On last close of a file we purge blocks beyond eof. The same code is used
when we truncate the file size down. In this case we need to wait for any
pending I/Os for dirty pages beyond the new eof. For the last close case
we are not changing the file size and therefore do not need to wait for
any I/Os to complete. This fixes a performance bottleneck where writes
into the page cache and cache flushes can become mutually exclusive.

SGI-PV: 964002
SGI-Modid: xfs-linux-melb:xfs-kern:30220a

Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
Signed-off-by: Peter Leckie <pleckie@sgi.com>
fs/xfs/xfs_inode.c

index abf509a88915e95aae00dcebec502170b1280b38..344948082819d94b82c72c5967d14e83e140cc36 100644 (file)
@@ -1459,8 +1459,10 @@ xfs_itruncate_start(
        mp = ip->i_mount;
        vp = XFS_ITOV(ip);
 
-       vn_iowait(ip);  /* wait for the completion of any pending DIOs */
-       
+       /* wait for the completion of any pending DIOs */
+       if (new_size < ip->i_size)
+               vn_iowait(ip);
+
        /*
         * Call toss_pages or flushinval_pages to get rid of pages
         * overlapping the region being removed.  We have to use