aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/gfs2/bmap.c45
1 files changed, 26 insertions, 19 deletions
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
269 return ((__be64 *)(bh->b_data + head_size)) + mp->mp_list[height]; 269 return ((__be64 *)(bh->b_data + head_size)) + mp->mp_list[height];
270} 270}
271 271
272static void gfs2_metapath_ra(struct gfs2_glock *gl,
273 const struct buffer_head *bh, const __be64 *pos)
274{
275 struct buffer_head *rabh;
276 const __be64 *endp = (const __be64 *)(bh->b_data + bh->b_size);
277 const __be64 *t;
278
279 for (t = pos; t < endp; t++) {
280 if (!*t)
281 continue;
282
283 rabh = gfs2_getbuf(gl, be64_to_cpu(*t), CREATE);
284 if (trylock_buffer(rabh)) {
285 if (!buffer_uptodate(rabh)) {
286 rabh->b_end_io = end_buffer_read_sync;
287 submit_bh(READA | REQ_META, rabh);
288 continue;
289 }
290 unlock_buffer(rabh);
291 }
292 brelse(rabh);
293 }
294}
295
272/** 296/**
273 * lookup_metapath - Walk the metadata tree to a specific point 297 * lookup_metapath - Walk the metadata tree to a specific point
274 * @ip: The inode 298 * @ip: The inode
@@ -843,7 +867,7 @@ static int recursive_scan(struct gfs2_inode *ip, struct buffer_head *dibh,
843{ 867{
844 struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); 868 struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
845 struct buffer_head *bh = NULL; 869 struct buffer_head *bh = NULL;
846 __be64 *top, *bottom, *t2; 870 __be64 *top, *bottom;
847 u64 bn; 871 u64 bn;
848 int error; 872 int error;
849 int mh_size = sizeof(struct gfs2_meta_header); 873 int mh_size = sizeof(struct gfs2_meta_header);
@@ -872,26 +896,9 @@ static int recursive_scan(struct gfs2_inode *ip, struct buffer_head *dibh,
872 goto out; 896 goto out;
873 897
874 if (height < ip->i_height - 1) { 898 if (height < ip->i_height - 1) {
875 struct buffer_head *rabh;
876 899
877 for (t2 = top; t2 < bottom; t2++, first = 0) { 900 gfs2_metapath_ra(ip->i_gl, bh, top);
878 if (!*t2)
879 continue;
880 901
881 bn = be64_to_cpu(*t2);
882 rabh = gfs2_getbuf(ip->i_gl, bn, CREATE);
883 if (trylock_buffer(rabh)) {
884 if (buffer_uptodate(rabh)) {
885 unlock_buffer(rabh);
886 brelse(rabh);
887 continue;
888 }
889 rabh->b_end_io = end_buffer_read_sync;
890 submit_bh(READA | REQ_META, rabh);
891 continue;
892 }
893 brelse(rabh);
894 }
895 for (; top < bottom; top++, first = 0) { 902 for (; top < bottom; top++, first = 0) {
896 if (!*top) 903 if (!*top)
897 continue; 904 continue;