Lines Matching +full:5 +full:mp

178  * @mp: The metapath to return the result in
200 * | |0 1 2 3 4 5 9|
208 * | 5|
209 * | 4 4 4 4 4 5 5 1|
210 * |0 5 6 7 8 9 0 1 2|
217 * | 1 1 1 1 1 5|
219 * |0 3 4 5 6 7 2|
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()
319 metapath_dibh(struct metapath *mp) in metapath_dibh() argument
321 return mp->mp_bh[0]; in metapath_dibh()
324 static int __fillup_metapath(struct gfs2_inode *ip, struct metapath *mp, in __fillup_metapath() argument
328 __be64 *ptr = metapointer(x, mp); in __fillup_metapath()
334 ret = gfs2_meta_buffer(ip, GFS2_METATYPE_IN, dblock, &mp->mp_bh[x + 1]); in __fillup_metapath()
338 mp->mp_aheight = x + 1; in __fillup_metapath()
345 * @mp: The metapath
348 * hooked onto mp->mp_bh[0] and that the metapath has been initialised
354 * added to the mp->mp_bh[] list.
359 static int lookup_metapath(struct gfs2_inode *ip, struct metapath *mp) in lookup_metapath() argument
361 return __fillup_metapath(ip, mp, 0, ip->i_height - 1); in lookup_metapath()
367 * @mp: The metapath
375 static int fillup_metapath(struct gfs2_inode *ip, struct metapath *mp, int h) in fillup_metapath() argument
383 if (mp->mp_bh[x]) in fillup_metapath()
387 ret = __fillup_metapath(ip, mp, x, h); in fillup_metapath()
390 return mp->mp_aheight - x - 1; in fillup_metapath()
393 static sector_t metapath_to_block(struct gfs2_sbd *sdp, struct metapath *mp) in metapath_to_block() argument
398 for (hgt = mp->mp_fheight - 1; hgt >= 0; hgt--) { in metapath_to_block()
399 if (hgt < mp->mp_aheight) in metapath_to_block()
400 block += mp->mp_list[hgt] * factor; in metapath_to_block()
406 static void release_metapath(struct metapath *mp) in release_metapath() argument
411 if (mp->mp_bh[i] == NULL) in release_metapath()
413 brelse(mp->mp_bh[i]); in release_metapath()
414 mp->mp_bh[i] = NULL; in release_metapath()
449 * @mp: Metapath to indirect block
452 * When returning WALK_FOLLOW, the walker must update @mp to point at the right
455 typedef enum walker_status (*gfs2_metadata_walker)(struct metapath *mp,
461 * @mp: Starting point of walk
469 static int gfs2_walk_metadata(struct inode *inode, struct metapath *mp, in gfs2_walk_metadata() argument
480 * before the position indicated by @mp. Adjust @max_len accordingly in gfs2_walk_metadata()
483 for (hgt = mp->mp_fheight - 1; hgt >= mp->mp_aheight; hgt--) { in gfs2_walk_metadata()
484 max_len += mp->mp_list[hgt] * factor; in gfs2_walk_metadata()
485 mp->mp_list[hgt] = 0; in gfs2_walk_metadata()
490 u16 start = mp->mp_list[hgt]; in gfs2_walk_metadata()
500 status = walker(mp, ptrs); in gfs2_walk_metadata()
505 BUG_ON(mp->mp_aheight == mp->mp_fheight); in gfs2_walk_metadata()
506 ptrs = mp->mp_list[hgt] - start; in gfs2_walk_metadata()
520 brelse(mp->mp_bh[hgt]); in gfs2_walk_metadata()
521 mp->mp_bh[hgt] = NULL; in gfs2_walk_metadata()
522 mp->mp_list[hgt] = 0; in gfs2_walk_metadata()
529 (mp->mp_list[hgt])++; in gfs2_walk_metadata()
531 if (mp->mp_list[hgt] >= sdp->sd_inptrs) in gfs2_walk_metadata()
534 if (mp->mp_list[hgt] >= sdp->sd_diptrs) in gfs2_walk_metadata()
540 ret = fillup_metapath(ip, mp, ip->i_height - 1); in gfs2_walk_metadata()
546 mp->mp_aheight = hgt + 1; in gfs2_walk_metadata()
551 static enum walker_status gfs2_hole_walker(struct metapath *mp, in gfs2_hole_walker() argument
557 hgt = mp->mp_aheight - 1; in gfs2_hole_walker()
558 start = metapointer(hgt, mp); in gfs2_hole_walker()
563 mp->mp_list[hgt] += ptr - start; in gfs2_hole_walker()
564 if (mp->mp_aheight == mp->mp_fheight) in gfs2_hole_walker()
577 * @mp: The metapath at lblock
580 * This function modifies @mp.
585 struct metapath *mp, struct iomap *iomap) in gfs2_hole_size() argument
591 clone_metapath(&clone, mp); in gfs2_hole_size()
608 static inline void gfs2_indirect_init(struct metapath *mp, in gfs2_indirect_init() argument
612 __be64 *ptr = (__be64 *)(mp->mp_bh[i - 1]->b_data + in gfs2_indirect_init()
616 BUG_ON(mp->mp_bh[i] != NULL); in gfs2_indirect_init()
617 mp->mp_bh[i] = gfs2_meta_new(gl, bn); in gfs2_indirect_init()
618 gfs2_trans_add_meta(gl, mp->mp_bh[i]); in gfs2_indirect_init()
619 gfs2_metatype_set(mp->mp_bh[i], GFS2_METATYPE_IN, GFS2_FORMAT_IN); in gfs2_indirect_init()
620 gfs2_buffer_clear_tail(mp->mp_bh[i], sizeof(struct gfs2_meta_header)); in gfs2_indirect_init()
636 * @mp: The metapath, with proper height information calculated
662 struct metapath *mp) in __gfs2_iomap_alloc() argument
666 struct buffer_head *dibh = metapath_dibh(mp); in __gfs2_iomap_alloc()
670 const unsigned end_of_metadata = mp->mp_fheight - 1; in __gfs2_iomap_alloc()
676 BUG_ON(mp->mp_aheight < 1); in __gfs2_iomap_alloc()
684 if (mp->mp_fheight == mp->mp_aheight) { in __gfs2_iomap_alloc()
689 if (mp->mp_fheight == ip->i_height) { in __gfs2_iomap_alloc()
691 iblks = mp->mp_fheight - mp->mp_aheight; in __gfs2_iomap_alloc()
696 iblks = mp->mp_fheight - ip->i_height; in __gfs2_iomap_alloc()
697 branch_start = metapath_branch_start(mp); in __gfs2_iomap_alloc()
698 iblks += (mp->mp_fheight - branch_start); in __gfs2_iomap_alloc()
705 i = mp->mp_aheight; in __gfs2_iomap_alloc()
722 for (; i - 1 < mp->mp_fheight - ip->i_height && n > 0; in __gfs2_iomap_alloc()
724 gfs2_indirect_init(mp, ip->i_gl, i, 0, bn++); in __gfs2_iomap_alloc()
725 if (i - 1 == mp->mp_fheight - ip->i_height) { in __gfs2_iomap_alloc()
727 gfs2_buffer_copy_tail(mp->mp_bh[i], in __gfs2_iomap_alloc()
733 ptr = (__be64 *)(mp->mp_bh[i]->b_data + in __gfs2_iomap_alloc()
737 for(i = branch_start; i < mp->mp_fheight; i++) { in __gfs2_iomap_alloc()
738 if (mp->mp_bh[i] == NULL) in __gfs2_iomap_alloc()
740 brelse(mp->mp_bh[i]); in __gfs2_iomap_alloc()
741 mp->mp_bh[i] = NULL; in __gfs2_iomap_alloc()
749 if (i > 1 && i < mp->mp_fheight) in __gfs2_iomap_alloc()
750 gfs2_trans_add_meta(ip->i_gl, mp->mp_bh[i-1]); in __gfs2_iomap_alloc()
751 for (; i < mp->mp_fheight && n > 0; i++, n--) in __gfs2_iomap_alloc()
752 gfs2_indirect_init(mp, ip->i_gl, i, in __gfs2_iomap_alloc()
753 mp->mp_list[i-1], bn++); in __gfs2_iomap_alloc()
754 if (i == mp->mp_fheight) in __gfs2_iomap_alloc()
761 BUG_ON(mp->mp_bh[end_of_metadata] == NULL); in __gfs2_iomap_alloc()
762 gfs2_trans_add_meta(ip->i_gl, mp->mp_bh[end_of_metadata]); in __gfs2_iomap_alloc()
764 ptr = metapointer(end_of_metadata, mp); in __gfs2_iomap_alloc()
775 ip->i_height = mp->mp_fheight; in __gfs2_iomap_alloc()
788 * @mp: The metapath
791 * Compute the maximum size of the next allocation at @mp.
795 static u64 gfs2_alloc_size(struct inode *inode, struct metapath *mp, u64 size) in gfs2_alloc_size() argument
809 if (gfs2_is_stuffed(ip) || mp->mp_fheight != mp->mp_aheight) { in gfs2_alloc_size()
810 unsigned int maxsize = mp->mp_fheight > 1 ? in gfs2_alloc_size()
812 maxsize -= mp->mp_list[mp->mp_fheight - 1]; in gfs2_alloc_size()
818 first = metapointer(ip->i_height - 1, mp); in gfs2_alloc_size()
819 end = metaend(ip->i_height - 1, mp); in gfs2_alloc_size()
836 * @mp: The metapath
842 struct metapath *mp) in __gfs2_iomap_get() argument
864 mp->mp_bh[0] = dibh; in __gfs2_iomap_get()
903 find_metapath(sdp, lblock, mp, height); in __gfs2_iomap_get()
907 ret = lookup_metapath(ip, mp); in __gfs2_iomap_get()
911 if (mp->mp_aheight != ip->i_height) in __gfs2_iomap_get()
914 ptr = metapointer(ip->i_height - 1, mp); in __gfs2_iomap_get()
918 bh = mp->mp_bh[ip->i_height - 1]; in __gfs2_iomap_get()
939 ret = gfs2_hole_size(inode, lblock, len, mp, iomap); in __gfs2_iomap_get()
948 len = gfs2_alloc_size(inode, mp, len); in __gfs2_iomap_get()
954 ret = gfs2_hole_size(inode, lblock, len, mp, iomap); in __gfs2_iomap_get()
1017 struct metapath *mp) in gfs2_iomap_begin_write() argument
1062 release_metapath(mp); in gfs2_iomap_begin_write()
1064 iomap->length, flags, iomap, mp); in gfs2_iomap_begin_write()
1070 ret = __gfs2_iomap_alloc(inode, iomap, mp); in gfs2_iomap_begin_write()
1102 struct metapath mp = { .mp_aheight = 1, }; in gfs2_iomap_begin() local
1109 ret = __gfs2_iomap_get(inode, pos, length, flags, iomap, &mp); in gfs2_iomap_begin()
1133 ret = gfs2_iomap_begin_write(inode, pos, length, flags, iomap, &mp); in gfs2_iomap_begin()
1139 iomap->private = metapath_dibh(&mp); in gfs2_iomap_begin()
1144 release_metapath(&mp); in gfs2_iomap_begin()
1428 struct metapath mp = { .mp_aheight = 1, }; in gfs2_iomap_get() local
1431 ret = __gfs2_iomap_get(inode, pos, length, 0, iomap, &mp); in gfs2_iomap_get()
1432 release_metapath(&mp); in gfs2_iomap_get()
1439 struct metapath mp = { .mp_aheight = 1, }; in gfs2_iomap_alloc() local
1442 ret = __gfs2_iomap_get(inode, pos, length, IOMAP_WRITE, iomap, &mp); in gfs2_iomap_alloc()
1444 ret = __gfs2_iomap_alloc(inode, iomap, &mp); in gfs2_iomap_alloc()
1445 release_metapath(&mp); in gfs2_iomap_alloc()
1623 static bool mp_eq_to_hgt(struct metapath *mp, __u16 *list, unsigned int h) in mp_eq_to_hgt() argument
1625 if (memcmp(mp->mp_list, list, h * sizeof(mp->mp_list[0]))) in mp_eq_to_hgt()
1633 * @mp: starting metapath
1642 static bool find_nonnull_ptr(struct gfs2_sbd *sdp, struct metapath *mp, in find_nonnull_ptr() argument
1646 struct buffer_head *bh = mp->mp_bh[h]; in find_nonnull_ptr()
1649 first = metaptr1(h, mp); in find_nonnull_ptr()
1650 ptr = first + mp->mp_list[h]; in find_nonnull_ptr()
1652 if (end_list && mp_eq_to_hgt(mp, end_list, h)) { in find_nonnull_ptr()
1659 mp->mp_list[h] = ptr - first; in find_nonnull_ptr()
1662 mp->mp_list[h] = 0; in find_nonnull_ptr()
1678 metapointer_range(struct metapath *mp, int height, in metapointer_range() argument
1683 struct buffer_head *bh = mp->mp_bh[height]; in metapointer_range()
1686 first = metaptr1(height, mp); in metapointer_range()
1688 if (mp_eq_to_hgt(mp, start_list, height)) { in metapointer_range()
1693 if (end_list && mp_eq_to_hgt(mp, end_list, height)) { in metapointer_range()
1700 struct metapath *mp, int height, in walk_done() argument
1707 if (!mp_eq_to_hgt(mp, end_list, height)) in walk_done()
1712 return mp->mp_list[height] >= end; in walk_done()
1735 struct metapath mp = {}; in punch_hole() local
1787 find_metapath(sdp, lend, &mp, ip->i_height); in punch_hole()
1789 memcpy(end_list, mp.mp_list, sizeof(mp.mp_list)); in punch_hole()
1798 find_metapath(sdp, lblock, &mp, ip->i_height); in punch_hole()
1799 memcpy(start_list, mp.mp_list, sizeof(start_list)); in punch_hole()
1811 mp.mp_bh[0] = dibh; in punch_hole()
1812 ret = lookup_metapath(ip, &mp); in punch_hole()
1817 for (mp_h = 0; mp_h < mp.mp_aheight - 1; mp_h++) { in punch_hole()
1818 metapointer_range(&mp, mp_h, start_list, start_aligned, in punch_hole()
1823 if (mp.mp_aheight == ip->i_height) in punch_hole()
1844 bh = mp.mp_bh[mp_h]; in punch_hole()
1868 metapointer_range(&mp, mp_h, start_list, start_aligned, in punch_hole()
1871 ret = sweep_bh_for_rgrps(ip, &rd_gh, mp.mp_bh[mp_h], in punch_hole()
1891 brelse(mp.mp_bh[mp_h]); in punch_hole()
1892 mp.mp_bh[mp_h] = NULL; in punch_hole()
1899 memcpy(mp.mp_list, start_list, sizeof(start_list)); in punch_hole()
1904 mp.mp_list[mp_h] = 0; in punch_hole()
1906 mp.mp_list[mp_h]++; in punch_hole()
1907 if (walk_done(sdp, &mp, mp_h, end_list, end_aligned)) in punch_hole()
1912 if (find_nonnull_ptr(sdp, &mp, mp_h, end_list, end_aligned)) { in punch_hole()
1923 ret = fillup_metapath(ip, &mp, mp_h); in punch_hole()
1928 if (mp.mp_aheight > 1 && strip_h == ip->i_height - 1) { in punch_hole()
1929 unsigned int height = mp.mp_aheight - 1; in punch_hole()
1932 if (mp.mp_aheight - 1 == strip_h) in punch_hole()
1935 for (; height >= mp.mp_aheight - ret; height--) { in punch_hole()
1936 metapointer_range(&mp, height, in punch_hole()
1945 if (mp.mp_aheight - 1 == strip_h) { in punch_hole()
1949 if (mp.mp_aheight < ip->i_height) /* We have a partial height */ in punch_hole()
1950 mp_h = mp.mp_aheight - 1; in punch_hole()
1955 if (find_nonnull_ptr(sdp, &mp, mp_h, end_list, end_aligned)) in punch_hole()
1991 release_metapath(&mp); in punch_hole()