diff options
| -rw-r--r-- | fs/gfs2/bmap.c | 45 |
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 | ||
| 272 | static 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; |
