Lines Matching full:handle
160 * Begin functions to handle an inode's extent information
162 void ext2fs_extent_free(ext2_extent_handle_t handle)
166 if (!handle)
169 if (handle->path) {
170 for (i=1; i <= handle->max_depth; i++) {
171 if (handle->path[i].buf)
172 ext2fs_free_mem(&handle->path[i].buf);
174 ext2fs_free_mem(&handle->path);
176 ext2fs_free_mem(&handle);
189 struct ext2_extent_handle *handle;
200 retval = ext2fs_get_mem(sizeof(struct ext2_extent_handle), &handle);
203 memset(handle, 0, sizeof(struct ext2_extent_handle));
205 handle->ino = ino;
206 handle->fs = fs;
209 handle->inode = inode;
211 handle->inode = &handle->inodebuf;
212 retval = ext2fs_read_inode(fs, ino, handle->inode);
217 eh = (struct ext3_extent_header *) &handle->inode->i_block[0];
220 if (handle->inode->i_block[i])
226 i = (sizeof(handle->inode->i_block) - sizeof(*eh)) /
229 handle->inode->i_flags |= EXT4_EXTENTS_FL;
232 if (!(handle->inode->i_flags & EXT4_EXTENTS_FL)) {
237 retval = ext2fs_extent_header_verify(eh, sizeof(handle->inode->i_block));
241 handle->max_depth = ext2fs_le16_to_cpu(eh->eh_depth);
242 handle->type = ext2fs_le16_to_cpu(eh->eh_magic);
244 retval = ext2fs_get_mem(((handle->max_depth+1) *
246 &handle->path);
247 memset(handle->path, 0,
248 (handle->max_depth+1) * sizeof(struct extent_path));
249 handle->path[0].buf = (char *) handle->inode->i_block;
251 handle->path[0].left = handle->path[0].entries =
253 handle->path[0].max_entries = ext2fs_le16_to_cpu(eh->eh_max);
254 handle->path[0].curr = 0;
255 handle->path[0].end_blk =
256 (EXT2_I_SIZE(handle->inode) + fs->blocksize - 1) >>
258 handle->path[0].visit_num = 1;
259 handle->level = 0;
260 handle->magic = EXT2_ET_MAGIC_EXTENT_HANDLE;
262 *ret_handle = handle;
266 ext2fs_extent_free(handle);
274 errcode_t ext2fs_extent_get(ext2_extent_handle_t handle,
286 EXT2_CHECK_MAGIC(handle, EXT2_ET_MAGIC_EXTENT_HANDLE);
288 if (!handle->path)
294 path = handle->path + handle->level;
297 if (handle->level < handle->max_depth) {
304 else if (handle->level > 0)
312 else if (handle->level > 0)
328 if (handle->level < handle->max_depth) {
335 else if (handle->level > 0)
343 else if (handle->level > 0)
358 if ((handle->level < handle->max_depth) &&
374 handle->level = 0;
375 path = handle->path + handle->level;
403 if (handle->level < handle->max_depth)
414 if (handle->level <= 0)
416 handle->level--;
425 if (!path->curr ||(handle->level >= handle->max_depth))
431 retval = ext2fs_get_mem(handle->fs->blocksize,
438 if ((handle->fs->flags & EXT2_FLAG_IMAGE_FILE) &&
439 (handle->fs->io != handle->fs->image_io))
440 memset(newpath->buf, 0, handle->fs->blocksize);
442 retval = io_channel_read_blk64(handle->fs->io,
447 handle->level++;
451 retval = ext2fs_extent_header_verify(eh, handle->fs->blocksize);
453 handle->level--;
477 if (handle->level < handle->max_depth)
482 handle->level, handle->max_depth,
498 if (handle->level == handle->max_depth) {
527 (handle->level != handle->max_depth))
531 ((handle->level != handle->max_depth) ||
538 static errcode_t update_path(ext2_extent_handle_t handle)
544 if (handle->level == 0) {
545 retval = ext2fs_write_inode(handle->fs, handle->ino,
546 handle->inode);
548 ix = handle->path[handle->level - 1].curr;
552 retval = io_channel_write_blk64(handle->fs->io,
553 blk, 1, handle->path[handle->level].buf);
559 errcode_t ext2fs_extent_save_path(ext2_extent_handle_t handle,
567 retval = ext2fs_extent_get(handle, EXT2_EXTENT_CURRENT, &extent);
571 retval = ext2fs_extent_get_info(handle, &info);
603 * If "blk" has no mapping (hole) then handle is left at last
606 errcode_t ext2fs_extent_goto2(ext2_extent_handle_t handle,
612 retval = ext2fs_extent_get(handle, EXT2_EXTENT_ROOT, &extent);
619 if (leaf_level > handle->max_depth) {
622 leaf_level, handle->max_depth);
628 printf("goto extent ino %u, level %d, %llu\n", handle->ino,
636 if (handle->max_depth - handle->level == leaf_level) {
642 retval = ext2fs_extent_get(handle,
647 retval = ext2fs_extent_get(handle,
657 retval = ext2fs_extent_get(handle, EXT2_EXTENT_NEXT_SIB,
672 retval = ext2fs_extent_get(handle, EXT2_EXTENT_PREV_SIB,
682 retval = ext2fs_extent_get(handle, EXT2_EXTENT_DOWN,
693 errcode_t ext2fs_extent_goto(ext2_extent_handle_t handle,
696 return ext2fs_extent_goto2(handle, 0, blk);
708 errcode_t ext2fs_extent_fix_parents(ext2_extent_handle_t handle)
717 EXT2_CHECK_MAGIC(handle, EXT2_ET_MAGIC_EXTENT_HANDLE);
719 if (!(handle->fs->flags & EXT2_FLAG_RW))
722 if (!handle->path)
725 path = handle->path + handle->level;
729 retval = ext2fs_extent_get(handle, EXT2_EXTENT_CURRENT, &extent);
736 if ((retval = ext2fs_extent_get_info(handle, &info)))
741 while (handle->level > 0 &&
743 retval = ext2fs_extent_get(handle, EXT2_EXTENT_UP, &extent);
748 path = handle->path + handle->level;
751 retval = ext2fs_extent_replace(handle, 0, &extent);
754 update_path(handle);
757 /* put handle back to where we started */
758 retval = ext2fs_extent_goto2(handle, orig_height, start);
763 errcode_t ext2fs_extent_replace(ext2_extent_handle_t handle,
771 EXT2_CHECK_MAGIC(handle, EXT2_ET_MAGIC_EXTENT_HANDLE);
773 if (!(handle->fs->flags & EXT2_FLAG_RW))
776 if (!handle->path)
779 path = handle->path + handle->level;
784 printf("extent replace: %u ", handle->ino);
788 if (handle->level == handle->max_depth) {
812 update_path(handle);
819 * handle will be left pointing at original record.
821 errcode_t ext2fs_extent_node_split(ext2_extent_handle_t handle)
838 EXT2_CHECK_MAGIC(handle, EXT2_ET_MAGIC_EXTENT_HANDLE);
840 if (!(handle->fs->flags & EXT2_FLAG_RW))
843 if (!handle->path)
847 printf("splitting node at level %d\n", handle->level);
849 retval = ext2fs_extent_get(handle, EXT2_EXTENT_CURRENT, &extent);
853 retval = ext2fs_extent_get_info(handle, &info);
862 if (handle->level &&
863 (handle->path[handle->level - 1].entries >=
864 handle->path[handle->level - 1].max_entries)) {
868 handle->level - 1);
871 retval = ext2fs_extent_get(handle, EXT2_EXTENT_UP, &extent);
876 retval = ext2fs_extent_node_split(handle);
880 /* get handle back to our original split position */
881 retval = ext2fs_extent_goto2(handle, orig_height, orig_lblk);
887 path = handle->path + handle->level;
895 if (handle->level == 0) {
898 retval = ext2fs_get_mem(((handle->max_depth+2) *
904 ((handle->max_depth+2) * sizeof(struct extent_path)));
912 handle->level);
924 block_buf = malloc(handle->fs->blocksize);
931 dgrp_t group = ext2fs_group_of_ino(handle->fs, handle->ino);
932 __u8 log_flex = handle->fs->super->s_log_groups_per_flex;
936 goal_blk = ext2fs_group_first_block2(handle->fs, group);
938 retval = ext2fs_alloc_block2(handle->fs, goal_blk, block_buf,
953 neweh->eh_max = ext2fs_cpu_to_le16((handle->fs->blocksize -
966 retval = io_channel_write_blk64(handle->fs->io, new_node_pblk, 1,
975 if (handle->level == 0) {
977 sizeof(struct extent_path) * (handle->max_depth+1));
978 handle->path = newpath;
980 path = handle->path;
983 handle->max_depth++;
984 eh->eh_depth = ext2fs_cpu_to_le16(handle->max_depth);
992 retval = update_path(handle);
998 retval = ext2fs_extent_get(handle, EXT2_EXTENT_FIRST_SIB, &extent);
1004 extent.e_len = handle->path[0].end_blk - extent.e_lblk;
1005 retval = ext2fs_extent_replace(handle, 0, &extent);
1011 retval = ext2fs_extent_get(handle, EXT2_EXTENT_UP, &extent);
1015 retval = ext2fs_extent_replace(handle, 0, &extent);
1023 retval = ext2fs_extent_insert(handle, EXT2_EXTENT_INSERT_AFTER, &extent);
1028 /* get handle back to our original position */
1029 retval = ext2fs_extent_goto2(handle, orig_height, orig_lblk);
1034 handle->inode->i_blocks += (handle->fs->blocksize *
1035 EXT2FS_CLUSTER_RATIO(handle->fs)) / 512;
1036 retval = ext2fs_write_inode(handle->fs, handle->ino,
1037 handle->inode);
1049 errcode_t ext2fs_extent_insert(ext2_extent_handle_t handle, int flags,
1057 EXT2_CHECK_MAGIC(handle, EXT2_ET_MAGIC_EXTENT_HANDLE);
1059 if (!(handle->fs->flags & EXT2_FLAG_RW))
1062 if (!handle->path)
1066 printf("extent insert: %u ", handle->ino);
1070 path = handle->path + handle->level;
1078 handle->level);
1080 retval = ext2fs_extent_node_split(handle);
1083 path = handle->path + handle->level;
1108 retval = ext2fs_extent_replace(handle, 0, extent);
1112 retval = update_path(handle);
1119 ext2fs_extent_delete(handle, 0);
1145 errcode_t ext2fs_extent_set_bmap(ext2_extent_handle_t handle,
1163 EXT2_CHECK_MAGIC(handle, EXT2_ET_MAGIC_EXTENT_HANDLE);
1167 handle->ino, logical, physical, flags);
1170 if (!(handle->fs->flags & EXT2_FLAG_RW))
1173 if (!handle->path)
1176 path = handle->path + handle->level;
1194 if ((handle->max_depth == 0) && (path->entries == 0)) {
1195 retval = ext2fs_extent_insert(handle, 0, &newextent);
1200 if ((retval = ext2fs_extent_get(handle, EXT2_EXTENT_CURRENT,
1206 if ((retval = ext2fs_extent_get_info(handle, &info)))
1212 retval = ext2fs_extent_goto(handle, logical);
1234 retval = ext2fs_extent_get(handle, EXT2_EXTENT_CURRENT, &extent);
1239 retval = ext2fs_extent_get(handle, EXT2_EXTENT_NEXT_LEAF, &next_extent);
1251 retval = ext2fs_extent_goto(handle, logical);
1254 retval = ext2fs_extent_get(handle, EXT2_EXTENT_PREV_LEAF, &prev_extent);
1266 retval = ext2fs_extent_goto(handle, logical);
1288 retval = ext2fs_extent_replace(handle, 0, &extent);
1296 retval = ext2fs_extent_replace(handle, 0, &extent);
1302 retval = ext2fs_extent_get(handle,
1310 retval = ext2fs_extent_replace(handle, 0, &next_extent);
1312 retval = ext2fs_extent_insert(handle, 0, &newextent);
1314 retval = ext2fs_extent_insert(handle,
1318 retval = ext2fs_extent_fix_parents(handle);
1326 retval = ext2fs_extent_replace(handle, 0, &newextent);
1328 retval = ext2fs_extent_delete(handle, 0);
1331 ec = ext2fs_extent_fix_parents(handle);
1348 retval = ext2fs_extent_get(handle,
1355 retval = ext2fs_extent_replace(handle, 0,
1359 retval = ext2fs_extent_fix_parents(handle);
1363 retval = ext2fs_extent_insert(handle,
1368 retval = ext2fs_extent_get(handle,
1375 retval = ext2fs_extent_replace(handle, 0, &extent);
1390 retval = ext2fs_extent_get(handle,
1395 retval = ext2fs_extent_replace(handle, 0,
1398 retval = ext2fs_extent_insert(handle,
1402 retval = ext2fs_extent_get(handle,
1411 retval = ext2fs_extent_replace(handle, 0, &extent);
1414 retval = ext2fs_extent_fix_parents(handle);
1429 retval = ext2fs_extent_replace(handle, 0, &extent);
1435 retval = ext2fs_extent_insert(handle,
1444 retval = ext2fs_extent_insert(handle,
1451 /* get handle back to its position */
1452 if (orig_height > handle->max_depth)
1453 orig_height = handle->max_depth; /* In case we shortened the tree */
1454 ext2fs_extent_goto2(handle, orig_height, orig_lblk);
1458 errcode_t ext2fs_extent_delete(ext2_extent_handle_t handle, int flags)
1465 EXT2_CHECK_MAGIC(handle, EXT2_ET_MAGIC_EXTENT_HANDLE);
1467 if (!(handle->fs->flags & EXT2_FLAG_RW))
1470 if (!handle->path)
1477 retval = ext2fs_extent_get(handle, EXT2_EXTENT_CURRENT,
1480 printf("extent delete %u ", handle->ino);
1486 path = handle->path + handle->level;
1505 if (path->entries == 0 && handle->level) {
1509 retval = ext2fs_extent_get(handle, EXT2_EXTENT_UP,
1514 retval = ext2fs_extent_delete(handle, flags);
1515 handle->inode->i_blocks -=
1516 (handle->fs->blocksize *
1517 EXT2FS_CLUSTER_RATIO(handle->fs)) / 512;
1518 retval = ext2fs_write_inode(handle->fs, handle->ino,
1519 handle->inode);
1520 ext2fs_block_alloc_stats2(handle->fs,
1526 if ((path->entries == 0) && (handle->level == 0))
1527 eh->eh_depth = handle->max_depth = 0;
1528 retval = update_path(handle);
1533 errcode_t ext2fs_extent_get_info(ext2_extent_handle_t handle,
1538 EXT2_CHECK_MAGIC(handle, EXT2_ET_MAGIC_EXTENT_HANDLE);
1542 path = handle->path + handle->level;
1555 info->curr_level = handle->level;
1556 info->max_depth = handle->max_depth;