From b99b98dc2673a123a73068f16720232d7be7e669 Mon Sep 17 00:00:00 2001 From: Steven Whitehouse Date: Wed, 21 Sep 2011 11:05:16 +0100 Subject: GFS2: Move readahead of metadata during deallocation into its own function Move the recently added readahead of the indirect pointer tree during deallocation into its own function in order that we can use it elsewhere in the future. Also this fixes the resetting of the "first" variable in the original patch. Signed-off-by: Steven Whitehouse --- fs/gfs2/bmap.c | 45 ++++++++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 19 deletions(-) (limited to 'fs/gfs2') diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c index 97b61955850a..41d494d79709 100644 --- a/fs/gfs2/bmap.c +++ b/fs/gfs2/bmap.c @@ -269,6 +269,30 @@ static inline __be64 *metapointer(unsigned int height, const struct metapath *mp return ((__be64 *)(bh->b_data + head_size)) + mp->mp_list[height]; } +static void gfs2_metapath_ra(struct gfs2_glock *gl, + const struct buffer_head *bh, const __be64 *pos) +{ + struct buffer_head *rabh; + const __be64 *endp = (const __be64 *)(bh->b_data + bh->b_size); + const __be64 *t; + + for (t = pos; t < endp; t++) { + if (!*t) + continue; + + rabh = gfs2_getbuf(gl, be64_to_cpu(*t), CREATE); + if (trylock_buffer(rabh)) { + if (!buffer_uptodate(rabh)) { + rabh->b_end_io = end_buffer_read_sync; + submit_bh(READA | REQ_META, rabh); + continue; + } + unlock_buffer(rabh); + } + brelse(rabh); + } +} + /** * lookup_metapath - Walk the metadata tree to a specific point * @ip: The inode @@ -843,7 +867,7 @@ static int recursive_scan(struct gfs2_inode *ip, struct buffer_head *dibh, { struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); struct buffer_head *bh = NULL; - __be64 *top, *bottom, *t2; + __be64 *top, *bottom; u64 bn; int error; int mh_size = sizeof(struct gfs2_meta_header); @@ -872,26 +896,9 @@ static int recursive_scan(struct gfs2_inode *ip, struct buffer_head *dibh, goto out; if (height < ip->i_height - 1) { - struct buffer_head *rabh; - for (t2 = top; t2 < bottom; t2++, first = 0) { - if (!*t2) - continue; + gfs2_metapath_ra(ip->i_gl, bh, top); - bn = be64_to_cpu(*t2); - rabh = gfs2_getbuf(ip->i_gl, bn, CREATE); - if (trylock_buffer(rabh)) { - if (buffer_uptodate(rabh)) { - unlock_buffer(rabh); - brelse(rabh); - continue; - } - rabh->b_end_io = end_buffer_read_sync; - submit_bh(READA | REQ_META, rabh); - continue; - } - brelse(rabh); - } for (; top < bottom; top++, first = 0) { if (!*top) continue; -- cgit v1.2.1