summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Whitehouse <swhiteho@redhat.com>2011-08-02 13:13:20 +0100
committerSteven Whitehouse <swhiteho@redhat.com>2011-10-21 12:39:21 +0100
commit1d4ec642d9f00d4c531b1a4ae0613091ec1f8e9b (patch)
tree71b7c5944b21d87750802e70dcd69698f17b3e7d
parent75549186edf1515062fe2fcbfbd92bd99659afba (diff)
downloadlinux-3.10-1d4ec642d9f00d4c531b1a4ae0613091ec1f8e9b.tar.gz
linux-3.10-1d4ec642d9f00d4c531b1a4ae0613091ec1f8e9b.tar.bz2
linux-3.10-1d4ec642d9f00d4c531b1a4ae0613091ec1f8e9b.zip
GFS2: Make atime checks more efficient
We do not need to start a transaction unless the atime check has proved positive. Also if we are going to flush the complete ail list anyway, we might as well skip the writeback for this specific inode's metadata, since that will be done as part of the ail writeback process in an order offering potentially more efficient I/O. Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
-rw-r--r--fs/gfs2/super.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c
index b7beadd9ba4..afb87615c01 100644
--- a/fs/gfs2/super.c
+++ b/fs/gfs2/super.c
@@ -768,30 +768,30 @@ static int gfs2_write_inode(struct inode *inode, struct writeback_control *wbc)
goto do_flush;
unlock_required = 1;
}
- ret = gfs2_trans_begin(sdp, RES_DINODE, 0);
- if (ret)
- goto do_unlock;
ret = gfs2_meta_inode_buffer(ip, &bh);
if (ret == 0) {
di = (struct gfs2_dinode *)bh->b_data;
atime.tv_sec = be64_to_cpu(di->di_atime);
atime.tv_nsec = be32_to_cpu(di->di_atime_nsec);
if (timespec_compare(&inode->i_atime, &atime) > 0) {
- gfs2_trans_add_bh(ip->i_gl, bh, 1);
- gfs2_dinode_out(ip, bh->b_data);
+ ret = gfs2_trans_begin(sdp, RES_DINODE, 0);
+ if (ret == 0) {
+ gfs2_trans_add_bh(ip->i_gl, bh, 1);
+ gfs2_dinode_out(ip, bh->b_data);
+ gfs2_trans_end(sdp);
+ }
}
brelse(bh);
}
- gfs2_trans_end(sdp);
-do_unlock:
if (unlock_required)
gfs2_glock_dq_uninit(&gh);
do_flush:
if (wbc->sync_mode == WB_SYNC_ALL)
gfs2_log_flush(GFS2_SB(inode), ip->i_gl);
- filemap_fdatawrite(metamapping);
if (bdi->dirty_exceeded)
gfs2_ail1_flush(sdp, wbc);
+ else
+ filemap_fdatawrite(metamapping);
if (!ret && (wbc->sync_mode == WB_SYNC_ALL))
ret = filemap_fdatawait(metamapping);
if (ret)