diff options
Diffstat (limited to 'fs/gfs2/bmap.c')
-rw-r--r-- | fs/gfs2/bmap.c | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c index cd805a66880d..93fa427bb5f5 100644 --- a/fs/gfs2/bmap.c +++ b/fs/gfs2/bmap.c | |||
@@ -93,9 +93,10 @@ static int gfs2_unstuffer_page(struct gfs2_inode *ip, struct buffer_head *dibh, | |||
93 | map_bh(bh, inode->i_sb, block); | 93 | map_bh(bh, inode->i_sb, block); |
94 | 94 | ||
95 | set_buffer_uptodate(bh); | 95 | set_buffer_uptodate(bh); |
96 | if (!gfs2_is_jdata(ip)) | ||
97 | mark_buffer_dirty(bh); | ||
96 | if (sdp->sd_args.ar_data == GFS2_DATA_ORDERED || gfs2_is_jdata(ip)) | 98 | if (sdp->sd_args.ar_data == GFS2_DATA_ORDERED || gfs2_is_jdata(ip)) |
97 | gfs2_trans_add_bh(ip->i_gl, bh, 0); | 99 | gfs2_trans_add_bh(ip->i_gl, bh, 0); |
98 | mark_buffer_dirty(bh); | ||
99 | 100 | ||
100 | if (release) { | 101 | if (release) { |
101 | unlock_page(page); | 102 | unlock_page(page); |
@@ -1085,6 +1086,33 @@ static int do_shrink(struct gfs2_inode *ip, u64 size) | |||
1085 | return error; | 1086 | return error; |
1086 | } | 1087 | } |
1087 | 1088 | ||
1089 | static int do_touch(struct gfs2_inode *ip, u64 size) | ||
1090 | { | ||
1091 | struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); | ||
1092 | struct buffer_head *dibh; | ||
1093 | int error; | ||
1094 | |||
1095 | error = gfs2_trans_begin(sdp, RES_DINODE, 0); | ||
1096 | if (error) | ||
1097 | return error; | ||
1098 | |||
1099 | down_write(&ip->i_rw_mutex); | ||
1100 | |||
1101 | error = gfs2_meta_inode_buffer(ip, &dibh); | ||
1102 | if (error) | ||
1103 | goto do_touch_out; | ||
1104 | |||
1105 | ip->i_inode.i_mtime = ip->i_inode.i_ctime = CURRENT_TIME; | ||
1106 | gfs2_trans_add_bh(ip->i_gl, dibh, 1); | ||
1107 | gfs2_dinode_out(ip, dibh->b_data); | ||
1108 | brelse(dibh); | ||
1109 | |||
1110 | do_touch_out: | ||
1111 | up_write(&ip->i_rw_mutex); | ||
1112 | gfs2_trans_end(sdp); | ||
1113 | return error; | ||
1114 | } | ||
1115 | |||
1088 | /** | 1116 | /** |
1089 | * gfs2_truncatei - make a file a given size | 1117 | * gfs2_truncatei - make a file a given size |
1090 | * @ip: the inode | 1118 | * @ip: the inode |
@@ -1105,8 +1133,11 @@ int gfs2_truncatei(struct gfs2_inode *ip, u64 size) | |||
1105 | 1133 | ||
1106 | if (size > ip->i_di.di_size) | 1134 | if (size > ip->i_di.di_size) |
1107 | error = do_grow(ip, size); | 1135 | error = do_grow(ip, size); |
1108 | else | 1136 | else if (size < ip->i_di.di_size) |
1109 | error = do_shrink(ip, size); | 1137 | error = do_shrink(ip, size); |
1138 | else | ||
1139 | /* update time stamps */ | ||
1140 | error = do_touch(ip, size); | ||
1110 | 1141 | ||
1111 | return error; | 1142 | return error; |
1112 | } | 1143 | } |