aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_iget.c
diff options
context:
space:
mode:
authorDavid Chinner <dgc@sgi.com>2007-11-23 00:29:18 -0500
committerLachlan McIlroy <lachlan@redback.melbourne.sgi.com>2008-02-07 02:16:07 -0500
commit5d51eff4538bdfeb9b7a2ec030ee3b0980b067d2 (patch)
tree27606a34eab830ccc9a066f14f598af0c0c9027c /fs/xfs/xfs_iget.c
parente4143a1cf5973e3443c0650fc4c35292d3b7baa8 (diff)
[XFS] Fix inode allocation latency
The log force added in xfs_iget_core() has been a performance issue since it was introduced for tight loops that allocate then unlink a single file. under heavy writeback, this can introduce unnecessary latency due tothe log I/o getting stuck behind bulk data writes. Fix this latency problem by avoinding the need for the log force by moving the place we mark linux inode dirty to the transaction commit rather than on transaction completion. This also closes a potential hole in the sync code where a linux inode is not dirty between the time it is modified and the time the log buffer has been written to disk. SGI-PV: 972753 SGI-Modid: xfs-linux-melb:xfs-kern:30007a Signed-off-by: David Chinner <dgc@sgi.com> Signed-off-by: Christoph Hellwig <hch@infradead.org> Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
Diffstat (limited to 'fs/xfs/xfs_iget.c')
-rw-r--r--fs/xfs/xfs_iget.c18
1 files changed, 0 insertions, 18 deletions
diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c
index eecc33d3751f..f01b07687faf 100644
--- a/fs/xfs/xfs_iget.c
+++ b/fs/xfs/xfs_iget.c
@@ -140,27 +140,9 @@ again:
140 return ENOENT; 140 return ENOENT;
141 } 141 }
142 142
143 /*
144 * There may be transactions sitting in the
145 * incore log buffers or being flushed to disk
146 * at this time. We can't clear the
147 * XFS_IRECLAIMABLE flag until these
148 * transactions have hit the disk, otherwise we
149 * will void the guarantee the flag provides
150 * xfs_iunpin()
151 */
152 if (xfs_ipincount(ip)) {
153 read_unlock(&pag->pag_ici_lock);
154 xfs_log_force(mp, 0,
155 XFS_LOG_FORCE|XFS_LOG_SYNC);
156 XFS_STATS_INC(xs_ig_frecycle);
157 goto again;
158 }
159
160 xfs_itrace_exit_tag(ip, "xfs_iget.alloc"); 143 xfs_itrace_exit_tag(ip, "xfs_iget.alloc");
161 144
162 XFS_STATS_INC(xs_ig_found); 145 XFS_STATS_INC(xs_ig_found);
163
164 xfs_iflags_clear(ip, XFS_IRECLAIMABLE); 146 xfs_iflags_clear(ip, XFS_IRECLAIMABLE);
165 read_unlock(&pag->pag_ici_lock); 147 read_unlock(&pag->pag_ici_lock);
166 148