Home | History | Annotate | Download | only in ext2fs

Lines Matching refs:handle

127 static void dump_path(const char *tag, struct ext2_extent_handle *handle,
131 printf("%s: level=%d\n", tag, handle->level);
136 tag, (ppp - handle->path), ppp->buf, ppp->entries,
148 } while (ppp >= handle->path);
159 #define dump_path(tag, handle, path) do { } while (0)
192 * Begin functions to handle an inode's extent information
194 void ext2fs_extent_free(ext2_extent_handle_t handle)
198 if (!handle)
201 if (handle->path) {
202 for (i = 1; i < handle->max_paths; i++) {
203 if (handle->path[i].buf)
204 ext2fs_free_mem(&handle->path[i].buf);
206 ext2fs_free_mem(&handle->path);
208 ext2fs_free_mem(&handle);
221 struct ext2_extent_handle *handle;
232 retval = ext2fs_get_mem(sizeof(struct ext2_extent_handle), &handle);
235 memset(handle, 0, sizeof(struct ext2_extent_handle));
237 handle->ino = ino;
238 handle->fs = fs;
241 handle->inode = inode;
243 handle->inode = &handle->inodebuf;
244 retval = ext2fs_read_inode(fs, ino, handle->inode);
249 eh = (struct ext3_extent_header *) &handle->inode->i_block[0];
252 if (handle->inode->i_block[i])
258 i = (sizeof(handle->inode->i_block) - sizeof(*eh)) /
261 handle->inode->i_flags |= EXT4_EXTENTS_FL;
264 if (!(handle->inode->i_flags & EXT4_EXTENTS_FL)) {
269 retval = ext2fs_extent_header_verify(eh, sizeof(handle->inode->i_block));
273 handle->max_depth = ext2fs_le16_to_cpu(eh->eh_depth);
274 handle->type = ext2fs_le16_to_cpu(eh->eh_magic);
276 handle->max_paths = handle->max_depth + 1;
277 retval = ext2fs_get_memzero(handle->max_paths *
279 &handle->path);
280 handle->path[0].buf = (char *) handle->inode->i_block;
282 handle->path[0].left = handle->path[0].entries =
284 handle->path[0].max_entries = ext2fs_le16_to_cpu(eh->eh_max);
285 handle->path[0].curr = 0;
286 handle->path[0].end_blk =
287 (EXT2_I_SIZE(handle->inode) + fs->blocksize - 1) >>
289 handle->path[0].visit_num = 1;
290 handle->level = 0;
291 handle->magic = EXT2_ET_MAGIC_EXTENT_HANDLE;
293 *ret_handle = handle;
297 ext2fs_extent_free(handle);
305 errcode_t ext2fs_extent_get(ext2_extent_handle_t handle,
318 EXT2_CHECK_MAGIC(handle, EXT2_ET_MAGIC_EXTENT_HANDLE);
320 if (!handle->path)
326 path = handle->path + handle->level;
329 if (handle->level < handle->max_depth) {
336 else if (handle->level > 0)
344 else if (handle->level > 0)
360 if (handle->level < handle->max_depth) {
367 else if (handle->level > 0)
375 else if (handle->level > 0)
390 if ((handle->level < handle->max_depth) &&
406 handle->level = 0;
407 path = handle->path + handle->level;
435 if (handle->level < handle->max_depth)
446 if (handle->level <= 0)
448 handle->level--;
457 if (!path->curr ||(handle->level >= handle->max_depth))
463 retval = ext2fs_get_mem(handle->fs->blocksize,
470 if ((handle->fs->flags & EXT2_FLAG_IMAGE_FILE) &&
471 (handle->fs->io != handle->fs->image_io))
472 memset(newpath->buf, 0, handle->fs->blocksize);
474 retval = io_channel_read_blk64(handle->fs->io,
479 handle->level++;
483 retval = ext2fs_extent_header_verify(eh, handle->fs->blocksize);
485 handle->level--;
489 if (!(handle->fs->flags & EXT2_FLAG_IGNORE_CSUM_ERRORS) &&
490 !ext2fs_extent_block_csum_verify(handle->fs, handle->ino,
514 if (handle->level < handle->max_depth)
519 handle->level, handle->max_depth,
535 if (handle->level == handle->max_depth) {
564 (handle->level != handle->max_depth))
568 ((handle->level != handle->max_depth) ||
578 static errcode_t update_path(ext2_extent_handle_t handle)
585 if (handle->level == 0) {
586 retval = ext2fs_write_inode(handle->fs, handle->ino,
587 handle->inode);
589 ix = handle->path[handle->level - 1].curr;
595 handle->path[handle->level].buf;
596 retval = ext2fs_extent_block_csum_set(handle->fs, handle->ino,
601 retval = io_channel_write_blk64(handle->fs->io,
602 blk, 1, handle->path[handle->level].buf);
608 errcode_t ext2fs_extent_save_path(ext2_extent_handle_t handle,
616 retval = ext2fs_extent_get(handle, EXT2_EXTENT_CURRENT, &extent);
620 retval = ext2fs_extent_get_info(handle, &info);
652 * If "blk" has no mapping (hole) then handle is left at last
655 handle,
661 retval = ext2fs_extent_get(handle, EXT2_EXTENT_ROOT, &extent);
668 if (leaf_level > handle->max_depth) {
671 leaf_level, handle->max_depth);
677 printf("goto extent ino %u, level %d, %llu\n", handle->ino,
685 if (handle->max_depth - handle->level == leaf_level) {
691 retval = ext2fs_extent_get(handle,
696 retval = ext2fs_extent_get(handle,
706 retval = ext2fs_extent_get(handle, EXT2_EXTENT_NEXT_SIB,
721 retval = ext2fs_extent_get(handle, EXT2_EXTENT_PREV_SIB,
731 retval = ext2fs_extent_get(handle, EXT2_EXTENT_DOWN,
742 errcode_t ext2fs_extent_goto(ext2_extent_handle_t handle,
745 return ext2fs_extent_goto2(handle, 0, blk);
759 * extents, the position of the extent handle after the call will be the second
764 errcode_t ext2fs_extent_fix_parents(ext2_extent_handle_t handle)
773 EXT2_CHECK_MAGIC(handle, EXT2_ET_MAGIC_EXTENT_HANDLE);
775 if (!(handle->fs->flags & EXT2_FLAG_RW))
778 if (!handle->path)
781 path = handle->path + handle->level;
785 retval = ext2fs_extent_get(handle, EXT2_EXTENT_CURRENT, &extent);
792 if ((retval = ext2fs_extent_get_info(handle, &info)))
797 while (handle->level > 0 &&
799 retval = ext2fs_extent_get(handle, EXT2_EXTENT_UP, &extent);
804 path = handle->path + handle->level;
807 retval = ext2fs_extent_replace(handle, 0, &extent);
810 update_path(handle);
813 /* put handle back to where we started */
814 retval = ext2fs_extent_goto2(handle, orig_height, start);
819 errcode_t ext2fs_extent_replace(ext2_extent_handle_t handle,
827 EXT2_CHECK_MAGIC(handle, EXT2_ET_MAGIC_EXTENT_HANDLE);
829 if (!(handle->fs->flags & EXT2_FLAG_RW))
832 if (!handle->path)
835 path = handle->path + handle->level;
840 printf("extent replace: %u ", handle->ino);
844 if (handle->level == handle->max_depth) {
868 update_path(handle);
872 static int splitting_at_eof(struct ext2_extent_handle *handle,
876 dump_path(__func__, handle, path);
878 if (handle->level == 0)
885 } while (ppp >= handle->path);
893 * handle will be left pointing at original record.
895 static errcode_t extent_node_split(ext2_extent_handle_t handle,
914 EXT2_CHECK_MAGIC(handle, EXT2_ET_MAGIC_EXTENT_HANDLE);
916 if (!(handle->fs->flags & EXT2_FLAG_RW))
919 if (!handle->path)
923 printf("splitting node at level %d\n", handle->level);
925 retval = ext2fs_extent_get(handle, EXT2_EXTENT_CURRENT, &extent);
929 retval = ext2fs_extent_get_info(handle, &info);
938 path = handle->path + handle->level;
940 if (handle->level == handle->max_depth) {
953 goal_blk -= EXT2FS_CLUSTER_RATIO(handle->fs);
954 goal_blk &= ~EXT2FS_CLUSTER_MASK(handle->fs);
957 if (handle->level &&
958 (handle->path[handle->level - 1].entries >=
959 handle->path[handle->level - 1].max_entries)) {
963 handle->level - 1);
966 retval = ext2fs_extent_get(handle, EXT2_EXTENT_UP, &extent);
970 retval = extent_node_split(handle, expand_allowed);
974 /* get handle back to our original split position */
975 retval = ext2fs_extent_goto2(handle, orig_height, orig_lblk);
981 path = handle->path + handle->level;
991 no_balance = expand_allowed ? splitting_at_eof(handle, path) : 0;
997 if (handle->level == 0) {
1000 retval = ext2fs_get_memzero((handle->max_paths + 1) *
1015 handle->level);
1027 block_buf = malloc(handle->fs->blocksize);
1034 goal_blk = ext2fs_find_inode_goal(handle->fs, handle->ino,
1035 handle->inode, 0);
1036 retval = ext2fs_alloc_block2(handle->fs, goal_blk, block_buf,
1051 neweh->eh_max = ext2fs_cpu_to_le16((handle->fs->blocksize -
1064 retval = ext2fs_extent_block_csum_set(handle->fs, handle->ino, neweh);
1069 retval = io_channel_write_blk64(handle->fs->io, new_node_pblk, 1,
1078 if (handle->level == 0) {
1080 sizeof(struct extent_path) * handle->max_paths);
1081 handle->path = newpath;
1083 path = handle->path;
1086 handle->max_depth++;
1087 handle->max_paths++;
1088 eh->eh_depth = ext2fs_cpu_to_le16(handle->max_depth);
1096 retval = update_path(handle);
1102 retval = ext2fs_extent_get(handle, EXT2_EXTENT_FIRST_SIB, &extent);
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);
1119 retval = ext2fs_extent_replace(handle, 0, &extent);
1127 retval = ext2fs_extent_insert(handle, EXT2_EXTENT_INSERT_AFTER, &extent);
1132 /* get handle back to our original position */
1133 retval = ext2fs_extent_goto2(handle, orig_height, orig_lblk);
1138 ext2fs_iblk_add_blocks(handle->fs, handle->inode, 1);
1139 retval = ext2fs_write_inode(handle->fs, handle->ino,
1140 handle->inode);
1152 errcode_t ext2fs_extent_node_split(ext2_extent_handle_t handle)
1154 return extent_node_split(handle, 0);
1157 errcode_t ext2fs_extent_insert(ext2_extent_handle_t handle, int flags,
1165 EXT2_CHECK_MAGIC(handle, EXT2_ET_MAGIC_EXTENT_HANDLE);
1167 if (!(handle->fs->flags & EXT2_FLAG_RW))
1170 if (!handle->path)
1174 printf("extent insert: %u ", handle->ino);
1178 path = handle->path + handle->level;
1186 handle->level);
1188 retval = extent_node_split(handle, 1);
1191 path = handle->path + handle->level;
1218 retval = ext2fs_extent_replace(handle, 0, extent);
1222 retval = update_path(handle);
1229 ext2fs_extent_delete(handle, 0);
1255 errcode_t ext2fs_extent_set_bmap(ext2_extent_handle_t handle,
1273 EXT2_CHECK_MAGIC(handle, EXT2_ET_MAGIC_EXTENT_HANDLE);
1277 handle->ino, logical, physical, flags);
1280 if (!(handle
1283 if (!handle->path)
1286 path = handle->path + handle->level;
1304 if ((handle->max_depth == 0) && (path->entries == 0)) {
1305 retval = ext2fs_extent_insert(handle, 0, &newextent);
1310 if ((retval = ext2fs_extent_get(handle, EXT2_EXTENT_CURRENT,
1316 if ((retval = ext2fs_extent_get_info(handle, &info)))
1322 retval = ext2fs_extent_goto(handle, logical);
1344 retval = ext2fs_extent_get(handle, EXT2_EXTENT_CURRENT, &extent);
1349 retval = ext2fs_extent_get(handle, EXT2_EXTENT_NEXT_LEAF, &next_extent);
1361 retval = ext2fs_extent_goto(handle, logical);
1364 retval = ext2fs_extent_get(handle, EXT2_EXTENT_PREV_LEAF, &prev_extent);
1376 retval = ext2fs_extent_goto(handle, logical);
1398 retval = ext2fs_extent_replace(handle, 0, &extent);
1406 retval = ext2fs_extent_replace(handle, 0, &extent);
1412 retval = ext2fs_extent_get(handle,
1420 retval = ext2fs_extent_replace(handle, 0, &next_extent);
1422 retval = ext2fs_extent_insert(handle, 0, &newextent);
1424 retval = ext2fs_extent_insert(handle,
1428 retval = ext2fs_extent_fix_parents(handle);
1436 retval = ext2fs_extent_replace(handle, 0, &newextent);
1438 retval = ext2fs_extent_delete(handle, 0);
1441 ec = ext2fs_extent_fix_parents(handle);
1458 retval = ext2fs_extent_get(handle,
1465 retval = ext2fs_extent_replace(handle, 0,
1470 retval = ext2fs_extent_insert(handle,
1474 retval = ext2fs_extent_fix_parents(handle);
1483 retval = ext2fs_extent_goto(handle, logical);
1486 retval = ext2fs_extent_get(handle,
1493 retval = ext2fs_extent_replace(handle, 0, &extent);
1508 retval = ext2fs_extent_get(handle,
1513 retval = ext2fs_extent_replace(handle, 0,
1516 retval = ext2fs_extent_insert(handle,
1520 retval = ext2fs_extent_fix_parents(handle);
1523 retval = ext2fs_extent_get(handle,
1532 retval = ext2fs_extent_replace(handle, 0, &extent);
1535 retval = ext2fs_extent_fix_parents(handle);
1554 retval = ext2fs_extent_replace(handle, 0, &extent);
1560 retval = ext2fs_extent_insert(handle,
1563 r2 = ext2fs_extent_goto(handle, save_lblk);
1565 (void)ext2fs_extent_replace(handle, 0,
1574 retval = ext2fs_extent_insert(handle,
1578 r2 = ext2fs_extent_goto(handle,
1581 (void)ext2fs_extent_delete(handle, 0);
1583 r2 = ext2fs_extent_goto(handle, save_lblk);
1585 (void)ext2fs_extent_replace(handle, 0,
1592 /* get handle back to its position */
1593 if (orig_height > handle->max_depth)
1594 orig_height = handle->max_depth; /* In case we shortened the tree */
1595 ext2fs_extent_goto2(handle, orig_height, orig_lblk);
1599 errcode_t ext2fs_extent_delete(ext2_extent_handle_t handle, int flags)
1606 EXT2_CHECK_MAGIC(handle, EXT2_ET_MAGIC_EXTENT_HANDLE);
1608 if (!(handle->fs->flags & EXT2_FLAG_RW))
1611 if (!handle->path)
1618 retval = ext2fs_extent_get(handle, EXT2_EXTENT_CURRENT,
1621 printf("extent delete %u ", handle->ino);
1627 path = handle->path + handle->level;
1646 if (path->entries == 0 && handle->level) {
1650 retval = ext2fs_extent_get(handle, EXT2_EXTENT_UP,
1655 retval = ext2fs_extent_delete(handle, flags);
1656 handle->inode->i_blocks -=
1657 (handle->fs->blocksize *
1658 EXT2FS_CLUSTER_RATIO(handle->fs)) / 512;
1659 retval = ext2fs_write_inode(handle->fs, handle->ino,
1660 handle->inode);
1661 ext2fs_block_alloc_stats2(handle->fs,
1667 if ((path->entries == 0) && (handle->level == 0)) {
1669 handle->max_depth = 0;
1671 retval = update_path(handle);
1676 errcode_t ext2fs_extent_get_info(ext2_extent_handle_t handle,
1681 EXT2_CHECK_MAGIC(handle, EXT2_ET_MAGIC_EXTENT_HANDLE);
1685 path = handle->path + handle->level;
1698 info->curr_level = handle->level;
1699 info->max_depth = handle->max_depth;
1720 size_t ext2fs_max_extent_depth(ext2_extent_handle_t handle)
1725 size_t extents_per_block = (handle->fs->blocksize -
1731 if (last_blocksize && last_blocksize == handle->fs->blocksize)
1736 last_blocksize = handle->fs->blocksize;