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>
This commit is contained in:
Родитель
75549186ed
Коммит
1d4ec642d9
|
@ -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)
|
||||
|
|
Загрузка…
Ссылка в новой задаче