diff options
author | Bob Peterson <rpeterso@redhat.com> | 2007-12-12 02:16:09 +0100 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2008-01-25 09:14:13 +0100 |
commit | b0d5fd307463405fe1f57494fbb37f810715ed6d (patch) | |
tree | 2a627d7362a6db7eea4c388b0e0f0ceed8362fb5 /fs/gfs2/bmap.c | |
parent | [GFS2] Reorganize function gfs2_glmutex_lock (diff) | |
download | linux-b0d5fd307463405fe1f57494fbb37f810715ed6d.tar.xz linux-b0d5fd307463405fe1f57494fbb37f810715ed6d.zip |
[GFS2] Only fetch the dinode once in block_map
Function gfs2_block_map was often looking up the disk inode twice.
This optimizes it so that only does it once.
Signed-off-by: Bob Peterson <rpeterso@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to '')
-rw-r--r-- | fs/gfs2/bmap.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c index 49486029edc2..224114166529 100644 --- a/fs/gfs2/bmap.c +++ b/fs/gfs2/bmap.c @@ -469,6 +469,7 @@ int gfs2_block_map(struct inode *inode, sector_t lblock, unsigned int maxlen = bh_map->b_size >> inode->i_blkbits; struct metapath mp; u64 size; + struct buffer_head *dibh = NULL; BUG_ON(maxlen == 0); @@ -499,6 +500,8 @@ int gfs2_block_map(struct inode *inode, sector_t lblock, error = gfs2_meta_inode_buffer(ip, &bh); if (error) 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); @@ -517,13 +520,8 @@ int gfs2_block_map(struct inode *inode, sector_t lblock, if (boundary) set_buffer_boundary(bh_map); if (new) { - struct buffer_head *dibh; - error = gfs2_meta_inode_buffer(ip, &dibh); - if (!error) { - gfs2_trans_add_bh(ip->i_gl, dibh, 1); - gfs2_dinode_out(ip, dibh->b_data); - brelse(dibh); - } + gfs2_trans_add_bh(ip->i_gl, dibh, 1); + gfs2_dinode_out(ip, dibh->b_data); set_buffer_new(bh_map); goto out_brelse; } @@ -544,6 +542,8 @@ out_brelse: out_ok: error = 0; out_fail: + if (dibh) + brelse(dibh); bmap_unlock(inode, create); return error; } |