Lines Matching full:mp
178 * @mp: The metapath to return the result in
234 struct metapath *mp, unsigned int height) in find_metapath() argument
238 mp->mp_fheight = height; in find_metapath()
240 mp->mp_list[i] = do_div(block, sdp->sd_inptrs); in find_metapath()
243 static inline unsigned int metapath_branch_start(const struct metapath *mp) in metapath_branch_start() argument
245 if (mp->mp_list[0] == 0) in metapath_branch_start()
253 * @mp: The metapath
255 static inline __be64 *metaptr1(unsigned int height, const struct metapath *mp) in metaptr1() argument
257 struct buffer_head *bh = mp->mp_bh[height]; in metaptr1()
266 * @mp: The metapath
273 static inline __be64 *metapointer(unsigned int height, const struct metapath *mp) in metapointer() argument
275 __be64 *p = metaptr1(height, mp); in metapointer()
276 return p + mp->mp_list[height]; in metapointer()
279 static inline const __be64 *metaend(unsigned int height, const struct metapath *mp) in metaend() argument
281 const struct buffer_head *bh = mp->mp_bh[height]; in metaend()
285 static void clone_metapath(struct metapath *clone, struct metapath *mp) in clone_metapath() argument
289 *clone = *mp; in clone_metapath()
290 for (hgt = 0; hgt < mp->mp_aheight; hgt++) in clone_metapath()
320 metapath_dibh(struct metapath *mp) in metapath_dibh() argument
322 return mp->mp_bh[0]; in metapath_dibh()
325 static int __fillup_metapath(struct gfs2_inode *ip, struct metapath *mp, in __fillup_metapath() argument
329 __be64 *ptr = metapointer(x, mp); in __fillup_metapath()
335 ret = gfs2_meta_buffer(ip, GFS2_METATYPE_IN, dblock, &mp->mp_bh[x + 1]); in __fillup_metapath()
339 mp->mp_aheight = x + 1; in __fillup_metapath()
346 * @mp: The metapath
349 * hooked onto mp->mp_bh[0] and that the metapath has been initialised
355 * added to the mp->mp_bh[] list.
360 static int lookup_metapath(struct gfs2_inode *ip, struct metapath *mp) in lookup_metapath() argument
362 return __fillup_metapath(ip, mp, 0, ip->i_height - 1); in lookup_metapath()
368 * @mp: The metapath
376 static int fillup_metapath(struct gfs2_inode *ip, struct metapath *mp, int h) in fillup_metapath() argument
384 if (mp->mp_bh[x]) in fillup_metapath()
388 ret = __fillup_metapath(ip, mp, x, h); in fillup_metapath()
391 return mp->mp_aheight - x - 1; in fillup_metapath()
394 static sector_t metapath_to_block(struct gfs2_sbd *sdp, struct metapath *mp) in metapath_to_block() argument
399 for (hgt = mp->mp_fheight - 1; hgt >= 0; hgt--) { in metapath_to_block()
400 if (hgt < mp->mp_aheight) in metapath_to_block()
401 block += mp->mp_list[hgt] * factor; in metapath_to_block()
407 static void release_metapath(struct metapath *mp) in release_metapath() argument
412 if (mp->mp_bh[i] == NULL) in release_metapath()
414 brelse(mp->mp_bh[i]); in release_metapath()
415 mp->mp_bh[i] = NULL; in release_metapath()
450 * @mp: Metapath to indirect block
453 * When returning WALK_FOLLOW, the walker must update @mp to point at the right
456 typedef enum walker_status (*gfs2_metadata_walker)(struct metapath *mp,
462 * @mp: Starting point of walk
470 static int gfs2_walk_metadata(struct inode *inode, struct metapath *mp, in gfs2_walk_metadata() argument
481 * before the position indicated by @mp. Adjust @max_len accordingly in gfs2_walk_metadata()
484 for (hgt = mp->mp_fheight - 1; hgt >= mp->mp_aheight; hgt--) { in gfs2_walk_metadata()
485 max_len += mp->mp_list[hgt] * factor; in gfs2_walk_metadata()
486 mp->mp_list[hgt] = 0; in gfs2_walk_metadata()
491 u16 start = mp->mp_list[hgt]; in gfs2_walk_metadata()
501 status = walker(mp, ptrs); in gfs2_walk_metadata()
506 BUG_ON(mp->mp_aheight == mp->mp_fheight); in gfs2_walk_metadata()
507 ptrs = mp->mp_list[hgt] - start; in gfs2_walk_metadata()
521 brelse(mp->mp_bh[hgt]); in gfs2_walk_metadata()
522 mp->mp_bh[hgt] = NULL; in gfs2_walk_metadata()
523 mp->mp_list[hgt] = 0; in gfs2_walk_metadata()
530 (mp->mp_list[hgt])++; in gfs2_walk_metadata()
532 if (mp->mp_list[hgt] >= sdp->sd_inptrs) in gfs2_walk_metadata()
535 if (mp->mp_list[hgt] >= sdp->sd_diptrs) in gfs2_walk_metadata()
541 ret = fillup_metapath(ip, mp, ip->i_height - 1); in gfs2_walk_metadata()
547 mp->mp_aheight = hgt + 1; in gfs2_walk_metadata()
552 static enum walker_status gfs2_hole_walker(struct metapath *mp, in gfs2_hole_walker() argument
558 hgt = mp->mp_aheight - 1; in gfs2_hole_walker()
559 start = metapointer(hgt, mp); in gfs2_hole_walker()
564 mp->mp_list[hgt] += ptr - start; in gfs2_hole_walker()
565 if (mp->mp_aheight == mp->mp_fheight) in gfs2_hole_walker()
578 * @mp: The metapath at lblock
581 * This function modifies @mp.
586 struct metapath *mp, struct iomap *iomap) in gfs2_hole_size() argument
592 clone_metapath(&clone, mp); in gfs2_hole_size()
609 static inline void gfs2_indirect_init(struct metapath *mp, in gfs2_indirect_init() argument
613 __be64 *ptr = (__be64 *)(mp->mp_bh[i - 1]->b_data + in gfs2_indirect_init()
617 BUG_ON(mp->mp_bh[i] != NULL); in gfs2_indirect_init()
618 mp->mp_bh[i] = gfs2_meta_new(gl, bn); in gfs2_indirect_init()
619 gfs2_trans_add_meta(gl, mp->mp_bh[i]); in gfs2_indirect_init()
620 gfs2_metatype_set(mp->mp_bh[i], GFS2_METATYPE_IN, GFS2_FORMAT_IN); in gfs2_indirect_init()
621 gfs2_buffer_clear_tail(mp->mp_bh[i], sizeof(struct gfs2_meta_header)); in gfs2_indirect_init()
637 * @mp: The metapath, with proper height information calculated
663 struct metapath *mp) in __gfs2_iomap_alloc() argument
667 struct buffer_head *dibh = metapath_dibh(mp); in __gfs2_iomap_alloc()
671 const unsigned end_of_metadata = mp->mp_fheight - 1; in __gfs2_iomap_alloc()
677 BUG_ON(mp->mp_aheight < 1); in __gfs2_iomap_alloc()
685 if (mp->mp_fheight == mp->mp_aheight) { in __gfs2_iomap_alloc()
690 if (mp->mp_fheight == ip->i_height) { in __gfs2_iomap_alloc()
692 iblks = mp->mp_fheight - mp->mp_aheight; in __gfs2_iomap_alloc()
697 iblks = mp->mp_fheight - ip->i_height; in __gfs2_iomap_alloc()
698 branch_start = metapath_branch_start(mp); in __gfs2_iomap_alloc()
699 iblks += (mp->mp_fheight - branch_start); in __gfs2_iomap_alloc()
706 i = mp->mp_aheight; in __gfs2_iomap_alloc()
723 for (; i - 1 < mp->mp_fheight - ip->i_height && n > 0; in __gfs2_iomap_alloc()
725 gfs2_indirect_init(mp, ip->i_gl, i, 0, bn++); in __gfs2_iomap_alloc()
726 if (i - 1 == mp->mp_fheight - ip->i_height) { in __gfs2_iomap_alloc()
728 gfs2_buffer_copy_tail(mp->mp_bh[i], in __gfs2_iomap_alloc()
734 ptr = (__be64 *)(mp->mp_bh[i]->b_data + in __gfs2_iomap_alloc()
738 for(i = branch_start; i < mp->mp_fheight; i++) { in __gfs2_iomap_alloc()
739 if (mp->mp_bh[i] == NULL) in __gfs2_iomap_alloc()
741 brelse(mp->mp_bh[i]); in __gfs2_iomap_alloc()
742 mp->mp_bh[i] = NULL; in __gfs2_iomap_alloc()
750 if (i > 1 && i < mp->mp_fheight) in __gfs2_iomap_alloc()
751 gfs2_trans_add_meta(ip->i_gl, mp->mp_bh[i-1]); in __gfs2_iomap_alloc()
752 for (; i < mp->mp_fheight && n > 0; i++, n--) in __gfs2_iomap_alloc()
753 gfs2_indirect_init(mp, ip->i_gl, i, in __gfs2_iomap_alloc()
754 mp->mp_list[i-1], bn++); in __gfs2_iomap_alloc()
755 if (i == mp->mp_fheight) in __gfs2_iomap_alloc()
762 BUG_ON(mp->mp_bh[end_of_metadata] == NULL); in __gfs2_iomap_alloc()
763 gfs2_trans_add_meta(ip->i_gl, mp->mp_bh[end_of_metadata]); in __gfs2_iomap_alloc()
765 ptr = metapointer(end_of_metadata, mp); in __gfs2_iomap_alloc()
776 ip->i_height = mp->mp_fheight; in __gfs2_iomap_alloc()
789 * @mp: The metapath
792 * Compute the maximum size of the next allocation at @mp.
796 static u64 gfs2_alloc_size(struct inode *inode, struct metapath *mp, u64 size) in gfs2_alloc_size() argument
810 if (gfs2_is_stuffed(ip) || mp->mp_fheight != mp->mp_aheight) { in gfs2_alloc_size()
811 unsigned int maxsize = mp->mp_fheight > 1 ? in gfs2_alloc_size()
813 maxsize -= mp->mp_list[mp->mp_fheight - 1]; in gfs2_alloc_size()
819 first = metapointer(ip->i_height - 1, mp); in gfs2_alloc_size()
820 end = metaend(ip->i_height - 1, mp); in gfs2_alloc_size()
837 * @mp: The metapath
843 struct metapath *mp) in __gfs2_iomap_get() argument
865 mp->mp_bh[0] = dibh; in __gfs2_iomap_get()
904 find_metapath(sdp, lblock, mp, height); in __gfs2_iomap_get()
908 ret = lookup_metapath(ip, mp); in __gfs2_iomap_get()
912 if (mp->mp_aheight != ip->i_height) in __gfs2_iomap_get()
915 ptr = metapointer(ip->i_height - 1, mp); in __gfs2_iomap_get()
919 bh = mp->mp_bh[ip->i_height - 1]; in __gfs2_iomap_get()
940 ret = gfs2_hole_size(inode, lblock, len, mp, iomap); in __gfs2_iomap_get()
949 len = gfs2_alloc_size(inode, mp, len); in __gfs2_iomap_get()
955 ret = gfs2_hole_size(inode, lblock, len, mp, iomap); in __gfs2_iomap_get()
1018 struct metapath *mp) in gfs2_iomap_begin_write() argument
1063 release_metapath(mp); in gfs2_iomap_begin_write()
1065 iomap->length, flags, iomap, mp); in gfs2_iomap_begin_write()
1071 ret = __gfs2_iomap_alloc(inode, iomap, mp); in gfs2_iomap_begin_write()
1103 struct metapath mp = { .mp_aheight = 1, }; in gfs2_iomap_begin() local
1110 ret = __gfs2_iomap_get(inode, pos, length, flags, iomap, &mp); in gfs2_iomap_begin()
1134 ret = gfs2_iomap_begin_write(inode, pos, length, flags, iomap, &mp); in gfs2_iomap_begin()
1140 iomap->private = metapath_dibh(&mp); in gfs2_iomap_begin()
1145 release_metapath(&mp); in gfs2_iomap_begin()
1444 struct metapath mp = { .mp_aheight = 1, }; in gfs2_iomap_get() local
1447 ret = __gfs2_iomap_get(inode, pos, length, 0, iomap, &mp); in gfs2_iomap_get()
1448 release_metapath(&mp); in gfs2_iomap_get()
1455 struct metapath mp = { .mp_aheight = 1, }; in gfs2_iomap_alloc() local
1458 ret = __gfs2_iomap_get(inode, pos, length, IOMAP_WRITE, iomap, &mp); in gfs2_iomap_alloc()
1460 ret = __gfs2_iomap_alloc(inode, iomap, &mp); in gfs2_iomap_alloc()
1461 release_metapath(&mp); in gfs2_iomap_alloc()
1639 static bool mp_eq_to_hgt(struct metapath *mp, __u16 *list, unsigned int h) in mp_eq_to_hgt() argument
1641 if (memcmp(mp->mp_list, list, h * sizeof(mp->mp_list[0]))) in mp_eq_to_hgt()
1649 * @mp: starting metapath
1658 static bool find_nonnull_ptr(struct gfs2_sbd *sdp, struct metapath *mp, in find_nonnull_ptr() argument
1662 struct buffer_head *bh = mp->mp_bh[h]; in find_nonnull_ptr()
1665 first = metaptr1(h, mp); in find_nonnull_ptr()
1666 ptr = first + mp->mp_list[h]; in find_nonnull_ptr()
1668 if (end_list && mp_eq_to_hgt(mp, end_list, h)) { in find_nonnull_ptr()
1675 mp->mp_list[h] = ptr - first; in find_nonnull_ptr()
1678 mp->mp_list[h] = 0; in find_nonnull_ptr()
1694 metapointer_range(struct metapath *mp, int height, in metapointer_range() argument
1699 struct buffer_head *bh = mp->mp_bh[height]; in metapointer_range()
1702 first = metaptr1(height, mp); in metapointer_range()
1704 if (mp_eq_to_hgt(mp, start_list, height)) { in metapointer_range()
1709 if (end_list && mp_eq_to_hgt(mp, end_list, height)) { in metapointer_range()
1716 struct metapath *mp, int height, in walk_done() argument
1723 if (!mp_eq_to_hgt(mp, end_list, height)) in walk_done()
1728 return mp->mp_list[height] >= end; in walk_done()
1751 struct metapath mp = {}; in punch_hole() local
1803 find_metapath(sdp, lend, &mp, ip->i_height); in punch_hole()
1805 memcpy(end_list, mp.mp_list, sizeof(mp.mp_list)); in punch_hole()
1814 find_metapath(sdp, lblock, &mp, ip->i_height); in punch_hole()
1815 memcpy(start_list, mp.mp_list, sizeof(start_list)); in punch_hole()
1827 mp.mp_bh[0] = dibh; in punch_hole()
1828 ret = lookup_metapath(ip, &mp); in punch_hole()
1833 for (mp_h = 0; mp_h < mp.mp_aheight - 1; mp_h++) { in punch_hole()
1834 metapointer_range(&mp, mp_h, start_list, start_aligned, in punch_hole()
1839 if (mp.mp_aheight == ip->i_height) in punch_hole()
1860 bh = mp.mp_bh[mp_h]; in punch_hole()
1884 metapointer_range(&mp, mp_h, start_list, start_aligned, in punch_hole()
1887 ret = sweep_bh_for_rgrps(ip, &rd_gh, mp.mp_bh[mp_h], in punch_hole()
1907 brelse(mp.mp_bh[mp_h]); in punch_hole()
1908 mp.mp_bh[mp_h] = NULL; in punch_hole()
1915 memcpy(mp.mp_list, start_list, sizeof(start_list)); in punch_hole()
1920 mp.mp_list[mp_h] = 0; in punch_hole()
1922 mp.mp_list[mp_h]++; in punch_hole()
1923 if (walk_done(sdp, &mp, mp_h, end_list, end_aligned)) in punch_hole()
1928 if (find_nonnull_ptr(sdp, &mp, mp_h, end_list, end_aligned)) { in punch_hole()
1939 ret = fillup_metapath(ip, &mp, mp_h); in punch_hole()
1944 if (mp.mp_aheight > 1 && strip_h == ip->i_height - 1) { in punch_hole()
1945 unsigned int height = mp.mp_aheight - 1; in punch_hole()
1948 if (mp.mp_aheight - 1 == strip_h) in punch_hole()
1951 for (; height >= mp.mp_aheight - ret; height--) { in punch_hole()
1952 metapointer_range(&mp, height, in punch_hole()
1961 if (mp.mp_aheight - 1 == strip_h) { in punch_hole()
1965 if (mp.mp_aheight < ip->i_height) /* We have a partial height */ in punch_hole()
1966 mp_h = mp.mp_aheight - 1; in punch_hole()
1971 if (find_nonnull_ptr(sdp, &mp, mp_h, end_list, end_aligned)) in punch_hole()
2007 release_metapath(&mp); in punch_hole()