Home | History | Annotate | Download | only in ext2fs

Lines Matching refs:extent

2  * extent.c --- routines to implement extents support
99 printf("extent: block=%u-%u len=%u start=%u start_hi=%u\n",
108 static void dbg_print_extent(char *desc, struct ext2fs_extent *extent)
112 printf("extent: lblk %llu--%llu, len %u, pblk %llu, flags: ",
113 extent->e_lblk, extent->e_lblk + extent->e_len - 1,
114 extent->e_len, extent->e_pblk);
115 if (extent->e_flags & EXT2_EXTENT_FLAGS_LEAF)
117 if (extent->e_flags & EXT2_EXTENT_FLAGS_UNINIT)
119 if (extent->e_flags & EXT2_EXTENT_FLAGS_SECOND_VISIT)
121 if (!extent->e_flags)
163 * Verify the extent header as being sane
181 /* Allow two extent-sized items at the end of the block, for
192 * Begin functions to handle an inode's extent information
303 * extent tree and then returning the current extent
306 int flags, struct ext2fs_extent *extent)
530 extent->e_flags = 0;
538 extent->e_pblk = ext2fs_le32_to_cpu(ex->ee_start) +
540 extent->e_lblk = ext2fs_le32_to_cpu(ex->ee_block);
541 extent->e_len = ext2fs_le16_to_cpu(ex->ee_len);
542 extent->e_flags |= EXT2_EXTENT_FLAGS_LEAF;
543 if (extent->e_len > EXT_INIT_MAX_LEN) {
544 extent->e_len -= EXT_INIT_MAX_LEN;
545 extent->e_flags |= EXT2_EXTENT_FLAGS_UNINIT;
548 extent->e_pblk = ext2fs_le32_to_cpu(ix->ei_leaf) +
550 extent->e_lblk = ext2fs_le32_to_cpu(ix->ei_block);
557 extent->e_len = end_blk - extent->e_lblk;
560 extent->e_flags |= EXT2_EXTENT_FLAGS_SECOND_VISIT;
612 struct ext2fs_extent extent;
616 retval = ext2fs_extent_get(handle, EXT2_EXTENT_CURRENT, &extent);
631 save_path->lblk = extent.e_lblk;
653 * extent before blk.
658 struct ext2fs_extent extent;
661 retval = ext2fs_extent_get(handle, EXT2_EXTENT_ROOT, &extent);
677 printf("goto extent ino %u, level %d, %llu\n", handle->ino,
682 dbg_print_extent("root", &extent);
686 /* block is in this &extent */
687 if ((blk >= extent.e_lblk) &&
688 (blk < extent.e_lblk + extent.e_len))
690 if (blk < extent.e_lblk) {
693 &extent);
698 &extent);
707 &extent);
714 dbg_print_extent("next", &extent);
716 if (blk == extent.e_lblk)
718 if (blk > extent.e_lblk)
722 &extent);
727 dbg_print_extent("prev", &extent);
732 &extent);
737 dbg_print_extent("down", &extent);
759 * extents, the position of the extent handle after the call will be the second
760 * extent if nothing happened, or the first extent if something did. A caller
770 struct ext2fs_extent extent;
785 retval = ext2fs_extent_get(handle, EXT2_EXTENT_CURRENT, &extent);
790 start = extent.e_lblk;
799 retval = ext2fs_extent_get(handle, EXT2_EXTENT_UP, &extent);
802 if (extent.e_lblk == start)
805 extent.e_len += (extent.e_lblk - start);
806 extent.e_lblk = start;
807 retval = ext2fs_extent_replace(handle, 0, &extent);
821 struct ext2fs_extent *extent)
840 printf("extent replace: %u ", handle->ino);
841 dbg_print_extent(0, extent);
847 ex->ee_block = ext2fs_cpu_to_le32(extent->e_lblk);
848 ex->ee_start = ext2fs_cpu_to_le32(extent->e_pblk & 0xFFFFFFFF);
849 ex->ee_start_hi = ext2fs_cpu_to_le16(extent->e_pblk >> 32);
850 if (extent->e_flags & EXT2_EXTENT_FLAGS_UNINIT) {
851 if (extent->e_len > EXT_UNINIT_MAX_LEN)
853 ex->ee_len = ext2fs_cpu_to_le16(extent->e_len +
856 if (extent->e_len > EXT_INIT_MAX_LEN)
858 ex->ee_len = ext2fs_cpu_to_le16(extent->e_len);
863 ix->ei_leaf = ext2fs_cpu_to_le32(extent->e_pblk & 0xFFFFFFFF);
864 ix->ei_leaf_hi = ext2fs_cpu_to_le16(extent->e_pblk >> 32);
865 ix->ei_block = ext2fs_cpu_to_le32(extent->e_lblk);
905 struct ext2fs_extent extent;
925 retval = ext2fs_extent_get(handle, EXT2_EXTENT_CURRENT, &extent);
935 orig_lblk = extent.e_lblk;
937 /* Try to put the index block before the first extent */
966 retval = ext2fs_extent_get(handle, EXT2_EXTENT_UP, &extent);
988 * then we're stuck with a tree of half-full extent blocks. This of
993 /* extent header of the current node we'll split */
1102 retval = ext2fs_extent_get(handle, EXT2_EXTENT_FIRST_SIB, &extent);
1106 extent.e_lblk = new_node_start;
1107 extent.e_pblk = new_node_pblk;
1108 extent.e_len = handle->path[0].end_blk - extent.e_lblk;
1109 retval = ext2fs_extent_replace(handle, 0, &extent);
1115 retval = ext2fs_extent_get(handle, EXT2_EXTENT_UP, &extent);
1117 new_node_length = new_node_start - extent.e_lblk;
1118 extent.e_len -= new_node_length;
1119 retval = ext2fs_extent_replace(handle, 0, &extent);
1123 /* now set up the new extent and insert it */
1124 extent.e_lblk = new_node_start;
1125 extent.e_pblk = new_node_pblk;
1126 extent.e_len = new_node_length;
1127 retval = ext2fs_extent_insert(handle, EXT2_EXTENT_INSERT_AFTER, &extent);
1158 struct ext2fs_extent *extent)
1174 printf("extent insert: %u ", handle->ino);
1175 dbg_print_extent(0, extent);
1218 retval = ext2fs_extent_replace(handle, 0, extent);
1234 * Sets the physical block for a logical file block in the extent tree.
1238 * Mapping an unmapped block adds a single-block extent.
1240 * Unmapping first or last block modifies extent in-place
1243 * Mapping any unmapped block requires adding a (single-block) extent
1247 * of an extent requires splitting the extent.
1248 * - Remapping case requires new single-block extent.
1250 * Remapping first or last block adds an extent.
1252 * We really need extent adding to be smart about merging.
1269 struct ext2fs_extent extent, next_extent, prev_extent;
1293 /* if (re)mapping, set up new extent to insert */
1303 /* special case if the extent tree is completely empty */
1309 /* save our original location in the extent tree */
1311 &extent))) {
1314 memset(&extent, 0, sizeof(extent));
1319 orig_lblk = extent.e_lblk;
1339 * This may be the extent *before* the requested logical,
1344 retval = ext2fs_extent_get(handle, EXT2_EXTENT_CURRENT, &extent);
1347 if (extent.e_flags & EXT2_EXTENT_FLAGS_UNINIT)
1382 (extent.e_pblk + (logical - extent.e_lblk) == physical)) {
1393 if ((logical == extent.e_lblk + extent.e_len) &&
1394 (physical == extent.e_pblk + extent.e_len) &&
1396 ((int) extent.e_len < max_len-1)) {
1397 extent.e_len++;
1398 retval = ext2fs_extent_replace(handle, 0, &extent);
1399 } else if ((logical == extent.e_lblk - 1) &&
1400 (physical == extent.e_pblk - 1) &&
1402 ((int) extent.e_len < max_len - 1)) {
1403 extent.e_len++;
1404 extent.e_lblk--;
1405 extent.e_pblk--;
1406 retval = ext2fs_extent_replace(handle, 0, &extent);
1421 } else if (logical < extent.e_lblk)
1431 } else if ((logical == extent.e_lblk) && (extent.e_len == 1)) {
1433 printf("(re/un)mapping only block in extent\n");
1448 } else if (logical == extent.e_lblk + extent.e_len - 1) {
1450 printf("(re/un)mapping last block in extent\n");
1478 * Now pointing at inserted extent; move back to prev.
1488 &extent);
1492 extent.e_len--;
1493 retval = ext2fs_extent_replace(handle, 0, &extent);
1496 } else if (logical == extent.e_lblk) {
1498 printf("(re/un)mapping first block in extent\n");
1525 &extent);
1529 extent.e_pblk++;
1530 extent.e_lblk++;
1531 extent.e_len--;
1532 retval = ext2fs_extent_replace(handle, 0, &extent);
1545 printf("(re/un)mapping in middle of extent\n");
1547 /* need to split this extent; later */
1548 save_lblk = extent.e_lblk;
1549 save_length = extent.e_len;
1550 save_extent = extent;
1552 /* shorten pre-split extent */
1553 extent.e_len = (logical - extent.e_lblk);
1554 retval = ext2fs_extent_replace(handle, 0, &extent);
1557 /* insert our new extent, if any */
1559 /* insert new extent after current */
1570 /* add post-split extent */
1571 extent.e_pblk += extent.e_len + 1;
1572 extent.e_lblk += extent.e_len + 1;
1573 extent.e_len = save_length - extent.e_len - 1;
1575 EXT2_EXTENT_INSERT_AFTER, &extent);
1616 struct ext2fs_extent extent;
1619 &extent);
1621 printf("extent delete %u ", handle->ino);
1622 dbg_print_extent(0, &extent);
1648 struct ext2fs_extent extent;
1651 &extent);
1662 extent.e_pblk, -1);