diff options
| author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-12 12:14:51 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-12 12:14:51 -0400 |
| commit | f26e51f67ae6a75ffc57b96cf5fe096f75e778cb (patch) | |
| tree | 1e848187885426430cc93bffaadc539312ce636d /fs/gfs2/bmap.c | |
| parent | 1462222b76a09a24b240563a51d5f9fbea8bd3e1 (diff) | |
| parent | c36258b5925e6cf6bf72904635100593573bfcff (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-2.6-nmw
* git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-2.6-nmw: (51 commits)
[DLM] block dlm_recv in recovery transition
[DLM] don't overwrite castparam if it's NULL
[GFS2] Get superblock a different way
[GFS2] Don't try to remove buffers that don't exist
[GFS2] Alternate gfs2_iget to avoid looking up inodes being freed
[GFS2] Data corruption fix
[GFS2] Clean up journaled data writing
[GFS2] GFS2: chmod hung - fix race in thread creation
[DLM] Make dlm_sendd cond_resched more
[GFS2] Move inode deletion out of blocking_cb
[GFS2] flocks from same process trip kernel BUG at fs/gfs2/glock.c:1118!
[GFS2] Clean up gfs2_trans_add_revoke()
[GFS2] Use slab operations for all gfs2_bufdata allocations
[GFS2] Replace revoke structure with bufdata structure
[GFS2] Fix ordering of dirty/journal for ordered buffer unstuffing
[GFS2] Clean up ordered write code
[GFS2] Move pin/unpin into lops.c, clean up locking
[GFS2] Don't mark jdata dirty in gfs2_unstuffer_page()
[GFS2] Introduce gfs2_remove_from_ail
[GFS2] Correct lock ordering in unlink
...
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 | } |
