diff options
Diffstat (limited to 'fs/gfs2/ops_address.c')
-rw-r--r-- | fs/gfs2/ops_address.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/fs/gfs2/ops_address.c b/fs/gfs2/ops_address.c index 811f4ada2a01..4fb743f4e4a4 100644 --- a/fs/gfs2/ops_address.c +++ b/fs/gfs2/ops_address.c | |||
@@ -460,7 +460,8 @@ static int gfs2_commit_write(struct file *file, struct page *page, | |||
460 | struct gfs2_sbd *sdp = GFS2_SB(inode); | 460 | struct gfs2_sbd *sdp = GFS2_SB(inode); |
461 | int error = -EOPNOTSUPP; | 461 | int error = -EOPNOTSUPP; |
462 | struct buffer_head *dibh; | 462 | struct buffer_head *dibh; |
463 | struct gfs2_alloc *al = &ip->i_alloc;; | 463 | struct gfs2_alloc *al = &ip->i_alloc; |
464 | struct gfs2_dinode *di; | ||
464 | 465 | ||
465 | if (gfs2_assert_withdraw(sdp, gfs2_glock_is_locked_by_me(ip->i_gl))) | 466 | if (gfs2_assert_withdraw(sdp, gfs2_glock_is_locked_by_me(ip->i_gl))) |
466 | goto fail_nounlock; | 467 | goto fail_nounlock; |
@@ -470,6 +471,7 @@ static int gfs2_commit_write(struct file *file, struct page *page, | |||
470 | goto fail_endtrans; | 471 | goto fail_endtrans; |
471 | 472 | ||
472 | gfs2_trans_add_bh(ip->i_gl, dibh, 1); | 473 | gfs2_trans_add_bh(ip->i_gl, dibh, 1); |
474 | di = (struct gfs2_dinode *)dibh->b_data; | ||
473 | 475 | ||
474 | if (gfs2_is_stuffed(ip)) { | 476 | if (gfs2_is_stuffed(ip)) { |
475 | u64 file_size; | 477 | u64 file_size; |
@@ -495,10 +497,16 @@ static int gfs2_commit_write(struct file *file, struct page *page, | |||
495 | goto fail; | 497 | goto fail; |
496 | } | 498 | } |
497 | 499 | ||
498 | if (ip->i_di.di_size < inode->i_size) | 500 | if (ip->i_di.di_size < inode->i_size) { |
499 | ip->i_di.di_size = inode->i_size; | 501 | ip->i_di.di_size = inode->i_size; |
502 | di->di_size = cpu_to_be64(inode->i_size); | ||
503 | } | ||
504 | |||
505 | di->di_mode = cpu_to_be32(inode->i_mode); | ||
506 | di->di_atime = cpu_to_be64(inode->i_atime.tv_sec); | ||
507 | di->di_mtime = cpu_to_be64(inode->i_mtime.tv_sec); | ||
508 | di->di_ctime = cpu_to_be64(inode->i_ctime.tv_sec); | ||
500 | 509 | ||
501 | gfs2_dinode_out(&ip->i_di, dibh->b_data); | ||
502 | brelse(dibh); | 510 | brelse(dibh); |
503 | gfs2_trans_end(sdp); | 511 | gfs2_trans_end(sdp); |
504 | if (al->al_requested) { | 512 | if (al->al_requested) { |