aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/gfs2/bmap.c21
-rw-r--r--fs/gfs2/inode.c4
-rw-r--r--fs/gfs2/ops_address.c14
3 files changed, 25 insertions, 14 deletions
diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c
index 92eef825167d..cc57f2ecd219 100644
--- a/fs/gfs2/bmap.c
+++ b/fs/gfs2/bmap.c
@@ -121,6 +121,7 @@ static int gfs2_unstuffer_page(struct gfs2_inode *ip, struct buffer_head *dibh,
121int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page) 121int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page)
122{ 122{
123 struct buffer_head *bh, *dibh; 123 struct buffer_head *bh, *dibh;
124 struct gfs2_dinode *di;
124 u64 block = 0; 125 u64 block = 0;
125 int isdir = gfs2_is_dir(ip); 126 int isdir = gfs2_is_dir(ip);
126 int error; 127 int error;
@@ -141,8 +142,7 @@ int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page)
141 error = gfs2_dir_get_new_buffer(ip, block, &bh); 142 error = gfs2_dir_get_new_buffer(ip, block, &bh);
142 if (error) 143 if (error)
143 goto out_brelse; 144 goto out_brelse;
144 gfs2_buffer_copy_tail(bh, 145 gfs2_buffer_copy_tail(bh, sizeof(struct gfs2_meta_header),
145 sizeof(struct gfs2_meta_header),
146 dibh, sizeof(struct gfs2_dinode)); 146 dibh, sizeof(struct gfs2_dinode));
147 brelse(bh); 147 brelse(bh);
148 } else { 148 } else {
@@ -157,18 +157,17 @@ int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page)
157 /* Set up the pointer to the new block */ 157 /* Set up the pointer to the new block */
158 158
159 gfs2_trans_add_bh(ip->i_gl, dibh, 1); 159 gfs2_trans_add_bh(ip->i_gl, dibh, 1);
160 160 di = (struct gfs2_dinode *)dibh->b_data;
161 gfs2_buffer_clear_tail(dibh, sizeof(struct gfs2_dinode)); 161 gfs2_buffer_clear_tail(dibh, sizeof(struct gfs2_dinode));
162 162
163 if (ip->i_di.di_size) { 163 if (ip->i_di.di_size) {
164 *(u64 *)(dibh->b_data + sizeof(struct gfs2_dinode)) = 164 *(__be64 *)(di + 1) = cpu_to_be64(block);
165 cpu_to_be64(block);
166 ip->i_di.di_blocks++; 165 ip->i_di.di_blocks++;
166 di->di_blocks = cpu_to_be64(ip->i_di.di_blocks);
167 } 167 }
168 168
169 ip->i_di.di_height = 1; 169 ip->i_di.di_height = 1;
170 170 di->di_height = cpu_to_be16(1);
171 gfs2_dinode_out(&ip->i_di, dibh->b_data);
172 171
173out_brelse: 172out_brelse:
174 brelse(dibh); 173 brelse(dibh);
@@ -229,6 +228,7 @@ static int build_height(struct inode *inode, unsigned height)
229 unsigned new_height = height - ip->i_di.di_height; 228 unsigned new_height = height - ip->i_di.di_height;
230 struct buffer_head *dibh; 229 struct buffer_head *dibh;
231 struct buffer_head *blocks[GFS2_MAX_META_HEIGHT]; 230 struct buffer_head *blocks[GFS2_MAX_META_HEIGHT];
231 struct gfs2_dinode *di;
232 int error; 232 int error;
233 u64 *bp; 233 u64 *bp;
234 u64 bn; 234 u64 bn;
@@ -267,12 +267,13 @@ static int build_height(struct inode *inode, unsigned height)
267 dibh, sizeof(struct gfs2_dinode)); 267 dibh, sizeof(struct gfs2_dinode));
268 brelse(blocks[n]); 268 brelse(blocks[n]);
269 gfs2_trans_add_bh(ip->i_gl, dibh, 1); 269 gfs2_trans_add_bh(ip->i_gl, dibh, 1);
270 di = (struct gfs2_dinode *)dibh->b_data;
270 gfs2_buffer_clear_tail(dibh, sizeof(struct gfs2_dinode)); 271 gfs2_buffer_clear_tail(dibh, sizeof(struct gfs2_dinode));
271 bp = (u64 *)(dibh->b_data + sizeof(struct gfs2_dinode)); 272 *(__be64 *)(di + 1) = cpu_to_be64(bn);
272 *bp = cpu_to_be64(bn);
273 ip->i_di.di_height += new_height; 273 ip->i_di.di_height += new_height;
274 ip->i_di.di_blocks += new_height; 274 ip->i_di.di_blocks += new_height;
275 gfs2_dinode_out(&ip->i_di, dibh->b_data); 275 di->di_height = cpu_to_be16(ip->i_di.di_height);
276 di->di_blocks = cpu_to_be64(ip->i_di.di_blocks);
276 brelse(dibh); 277 brelse(dibh);
277 return error; 278 return error;
278} 279}
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
index 57a4c8b68587..660dc81849a6 100644
--- a/fs/gfs2/inode.c
+++ b/fs/gfs2/inode.c
@@ -1166,6 +1166,7 @@ int gfs2_glock_nq_atime(struct gfs2_holder *gh)
1166 curtime = get_seconds(); 1166 curtime = get_seconds();
1167 if (curtime - ip->i_di.di_atime >= quantum) { 1167 if (curtime - ip->i_di.di_atime >= quantum) {
1168 struct buffer_head *dibh; 1168 struct buffer_head *dibh;
1169 struct gfs2_dinode *di;
1169 1170
1170 error = gfs2_trans_begin(sdp, RES_DINODE, 0); 1171 error = gfs2_trans_begin(sdp, RES_DINODE, 0);
1171 if (error == -EROFS) 1172 if (error == -EROFS)
@@ -1180,7 +1181,8 @@ int gfs2_glock_nq_atime(struct gfs2_holder *gh)
1180 ip->i_di.di_atime = curtime; 1181 ip->i_di.di_atime = curtime;
1181 1182
1182 gfs2_trans_add_bh(ip->i_gl, dibh, 1); 1183 gfs2_trans_add_bh(ip->i_gl, dibh, 1);
1183 gfs2_dinode_out(&ip->i_di, dibh->b_data); 1184 di = (struct gfs2_dinode *)dibh->b_data;
1185 di->di_atime = cpu_to_be64(ip->i_di.di_atime);
1184 brelse(dibh); 1186 brelse(dibh);
1185 1187
1186 gfs2_trans_end(sdp); 1188 gfs2_trans_end(sdp);
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) {