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 | } |
