Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 89501
b: refs/heads/master
c: 11707ea
h: refs/heads/master
i:
  89499: 5dd0b20
v: v3
  • Loading branch information
Steven Whitehouse committed Mar 31, 2008
1 parent a2ba480 commit 381235b
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 22 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 29d38cd16358dcaef4a6c50866ecee28025b481a
refs/heads/master: 11707ea05e85290d10c482b87e195c198f5eb3cf
57 changes: 36 additions & 21 deletions trunk/fs/gfs2/bmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -384,6 +384,35 @@ static int lookup_block(struct gfs2_inode *ip, struct buffer_head *bh,
return 0;
}

static int lookup_metapath(struct inode *inode, struct metapath *mp,
int create, int *new, u64 *dblock,
struct buffer_head **dibh, struct buffer_head **bh)
{
struct gfs2_inode *ip = GFS2_I(inode);
unsigned int end_of_metadata = ip->i_height - 1;
unsigned int x;
int ret = gfs2_meta_inode_buffer(ip, bh);
if (ret)
return ret;

*dibh = *bh;
get_bh(*dibh);

for (x = 0; x < end_of_metadata; x++) {
lookup_block(ip, *bh, x, mp, create, new, dblock);
brelse(*bh);
*bh = NULL;
if (!dblock)
return 0;

ret = gfs2_meta_indirect_buffer(ip, x+1, *dblock, *new, bh);
if (ret)
return ret;
}

return lookup_block(ip, *bh, end_of_metadata, mp, create, new, dblock);
}

static inline void bmap_lock(struct inode *inode, int create)
{
struct gfs2_inode *ip = GFS2_I(inode);
Expand Down Expand Up @@ -419,10 +448,8 @@ int gfs2_block_map(struct inode *inode, sector_t lblock,
{
struct gfs2_inode *ip = GFS2_I(inode);
struct gfs2_sbd *sdp = GFS2_SB(inode);
struct buffer_head *bh;
unsigned int bsize = sdp->sd_sb.sb_bsize;
unsigned int end_of_metadata;
unsigned int x;
struct buffer_head *bh = NULL;
int error = 0;
int new = 0;
u64 dblock = 0;
Expand Down Expand Up @@ -459,25 +486,11 @@ int gfs2_block_map(struct inode *inode, sector_t lblock,
}

find_metapath(ip, lblock, &mp);
end_of_metadata = ip->i_height - 1;
error = gfs2_meta_inode_buffer(ip, &bh);
if (error)
error = lookup_metapath(inode, &mp, create, &new, &dblock, &dibh, &bh);
if (error < 0)
goto out_fail;
dibh = bh;
get_bh(dibh);

for (x = 0; x < end_of_metadata; x++) {
lookup_block(ip, bh, x, &mp, create, &new, &dblock);
brelse(bh);
if (!dblock)
goto out_ok;
boundary = error;

error = gfs2_meta_indirect_buffer(ip, x+1, dblock, new, &bh);
if (error)
goto out_fail;
}

boundary = lookup_block(ip, bh, end_of_metadata, &mp, create, &new, &dblock);
if (dblock) {
map_bh(bh_map, inode->i_sb, dblock);
if (boundary)
Expand All @@ -489,6 +502,7 @@ int gfs2_block_map(struct inode *inode, sector_t lblock,
goto out_brelse;
}
while(--maxlen && !buffer_boundary(bh_map)) {
unsigned int end_of_metadata = ip->i_height - 1;
u64 eblock;

mp.mp_list[end_of_metadata]++;
Expand All @@ -501,7 +515,8 @@ int gfs2_block_map(struct inode *inode, sector_t lblock,
}
}
out_brelse:
brelse(bh);
if (bh)
brelse(bh);
out_ok:
error = 0;
out_fail:
Expand Down

0 comments on commit 381235b

Please sign in to comment.