|
@@ -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)
|