]> git.karo-electronics.de Git - linux-beck.git/commitdiff
GFS2: Make atime checks more efficient
authorSteven Whitehouse <swhiteho@redhat.com>
Tue, 2 Aug 2011 12:13:20 +0000 (13:13 +0100)
committerSteven Whitehouse <swhiteho@redhat.com>
Fri, 21 Oct 2011 11:39:21 +0000 (12:39 +0100)
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>
fs/gfs2/super.c

index b7beadd9ba4cfe5810c1747a566307878eca8204..afb87615c014be7570131c1e35bceca2b9bea93d 100644 (file)
@@ -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)