From a29f8ad5b5d074cb0909bf8c99a73616fbffc45b Mon Sep 17 00:00:00 2001 From: Steven Whitehouse Date: Wed, 21 Sep 2011 11:05:16 +0100 Subject: [PATCH] --- yaml --- r: 270012 b: refs/heads/master c: b99b98dc2673a123a73068f16720232d7be7e669 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/fs/gfs2/bmap.c | 45 +++++++++++++++++++++++++------------------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/[refs] b/[refs] index 5e1f52feb482..9d620d8ac51b 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 9ae32429fe036fcfce036ec57b28fc59f3911976 +refs/heads/master: b99b98dc2673a123a73068f16720232d7be7e669 diff --git a/trunk/fs/gfs2/bmap.c b/trunk/fs/gfs2/bmap.c index 97b61955850a..41d494d79709 100644 --- a/trunk/fs/gfs2/bmap.c +++ b/trunk/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;