aboutsummaryrefslogtreecommitdiffstats
path: root/fs/gfs2/bmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/gfs2/bmap.c')
-rw-r--r--fs/gfs2/bmap.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c
index e3a75a27cee7..1fda731c074b 100644
--- a/fs/gfs2/bmap.c
+++ b/fs/gfs2/bmap.c
@@ -136,8 +136,9 @@ int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page)
136 /* Get a free block, fill it with the stuffed data, 136 /* Get a free block, fill it with the stuffed data,
137 and write it out to disk */ 137 and write it out to disk */
138 138
139 unsigned int n = 1;
140 block = gfs2_alloc_block(ip, &n);
139 if (isdir) { 141 if (isdir) {
140 block = gfs2_alloc_block(ip);
141 gfs2_trans_add_unrevoke(GFS2_SB(&ip->i_inode), block, 1); 142 gfs2_trans_add_unrevoke(GFS2_SB(&ip->i_inode), block, 1);
142 error = gfs2_dir_get_new_buffer(ip, block, &bh); 143 error = gfs2_dir_get_new_buffer(ip, block, &bh);
143 if (error) 144 if (error)
@@ -146,8 +147,6 @@ int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page)
146 dibh, sizeof(struct gfs2_dinode)); 147 dibh, sizeof(struct gfs2_dinode));
147 brelse(bh); 148 brelse(bh);
148 } else { 149 } else {
149 block = gfs2_alloc_block(ip);
150
151 error = gfs2_unstuffer_page(ip, dibh, block, page); 150 error = gfs2_unstuffer_page(ip, dibh, block, page);
152 if (error) 151 if (error)
153 goto out_brelse; 152 goto out_brelse;
@@ -195,7 +194,7 @@ static int build_height(struct inode *inode, struct metapath *mp, unsigned heigh
195 int error; 194 int error;
196 __be64 *bp; 195 __be64 *bp;
197 u64 bn; 196 u64 bn;
198 unsigned n; 197 unsigned n, i = 0;
199 198
200 if (height <= ip->i_height) 199 if (height <= ip->i_height)
201 return 0; 200 return 0;
@@ -204,12 +203,16 @@ static int build_height(struct inode *inode, struct metapath *mp, unsigned heigh
204 if (error) 203 if (error)
205 return error; 204 return error;
206 205
207 for(n = 0; n < new_height; n++) { 206 do {
208 bn = gfs2_alloc_block(ip); 207 n = new_height - i;
209 gfs2_trans_add_unrevoke(GFS2_SB(inode), bn, 1); 208 bn = gfs2_alloc_block(ip, &n);
210 mp->mp_bh[n] = gfs2_meta_new(ip->i_gl, bn); 209 gfs2_trans_add_unrevoke(GFS2_SB(inode), bn, n);
211 gfs2_trans_add_bh(ip->i_gl, mp->mp_bh[n], 1); 210 do {
212 } 211 mp->mp_bh[i] = gfs2_meta_new(ip->i_gl, bn++);
212 gfs2_trans_add_bh(ip->i_gl, mp->mp_bh[i], 1);
213 i++;
214 } while(i < n);
215 } while(i < new_height);
213 216
214 n = 0; 217 n = 0;
215 bn = mp->mp_bh[0]->b_blocknr; 218 bn = mp->mp_bh[0]->b_blocknr;
@@ -358,6 +361,7 @@ static int lookup_block(struct gfs2_inode *ip, unsigned int height,
358{ 361{
359 int boundary; 362 int boundary;
360 __be64 *ptr = metapointer(&boundary, height, mp); 363 __be64 *ptr = metapointer(&boundary, height, mp);
364 unsigned int n = 1;
361 365
362 if (*ptr) { 366 if (*ptr) {
363 *block = be64_to_cpu(*ptr); 367 *block = be64_to_cpu(*ptr);
@@ -369,7 +373,7 @@ static int lookup_block(struct gfs2_inode *ip, unsigned int height,
369 if (!create) 373 if (!create)
370 return 0; 374 return 0;
371 375
372 *block = gfs2_alloc_block(ip); 376 *block = gfs2_alloc_block(ip, &n);
373 if (height != ip->i_height - 1 || gfs2_is_dir(ip)) 377 if (height != ip->i_height - 1 || gfs2_is_dir(ip))
374 gfs2_trans_add_unrevoke(GFS2_SB(&ip->i_inode), *block, 1); 378 gfs2_trans_add_unrevoke(GFS2_SB(&ip->i_inode), *block, 1);
375 379