diff options
Diffstat (limited to 'fs/gfs2/bmap.c')
-rw-r--r-- | fs/gfs2/bmap.c | 21 |
1 files changed, 11 insertions, 10 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, | |||
121 | int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page) | 121 | int 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 | ||
173 | out_brelse: | 172 | out_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 | } |