void do_print_all(int argc, char **argv) { const char *usage = "[--leaf-only|--reverse|--reverse-leaf]"; struct ext2fs_extent extent; errcode_t retval; errcode_t end_err = EXT2_ET_EXTENT_NO_NEXT; int op = EXT2_EXTENT_NEXT; int first_op = EXT2_EXTENT_ROOT; if (common_extent_args_process(argc, argv, 1, 2, "print_all", usage, 0)) return; if (argc == 2) { if (!strcmp(argv[1], "--leaf-only")) op = EXT2_EXTENT_NEXT_LEAF; else if (!strcmp(argv[1], "--reverse")) { op = EXT2_EXTENT_PREV; first_op = EXT2_EXTENT_LAST_LEAF; end_err = EXT2_ET_EXTENT_NO_PREV; } else if (!strcmp(argv[1], "--reverse-leaf")) { op = EXT2_EXTENT_PREV_LEAF; first_op = EXT2_EXTENT_LAST_LEAF; end_err = EXT2_ET_EXTENT_NO_PREV; } else { fprintf(stderr, "Usage: %s %s\n", argv[0], usage); return; } } retval = ext2fs_extent_get(current_handle, first_op, &extent); if (retval) { com_err(argv[0], retval, 0); return; } dbg_print_extent(0, &extent); while (1) { retval = ext2fs_extent_get(current_handle, op, &extent); if (retval == end_err) break; if (retval) { com_err(argv[0], retval, 0); return; } dbg_print_extent(0, &extent); } }
void do_info(int argc, char **argv) { struct ext2fs_extent extent; struct ext2_extent_info info; errcode_t retval; if (common_extent_args_process(argc, argv, 1, 1, "info", "", 0)) return; retval = ext2fs_extent_get_info(current_handle, &info); if (retval) { com_err(argv[0], retval, 0); return; } retval = ext2fs_extent_get(current_handle, EXT2_EXTENT_CURRENT, &extent); if (retval) { com_err(argv[0], retval, 0); return; } dbg_print_extent(0, &extent); printf("Current handle location: %d/%d (max: %d, bytes %d), level %d/%d\n", info.curr_entry, info.num_entries, info.max_entries, info.bytes_avail, info.curr_level, info.max_depth); printf("\tmax lblk: %llu, max pblk: %llu\n", info.max_lblk, info.max_pblk); printf("\tmax_len: %u, max_uninit_len: %u\n", info.max_len, info.max_uninit_len); }
void do_set_bmap(int argc, char **argv) { const char *usage = "[--uninit] <lblk> <pblk>"; struct ext2fs_extent extent; errcode_t retval; blk_t logical; blk_t physical; char *cmd = argv[0]; int flags = 0; int err; if (common_extent_args_process(argc, argv, 3, 5, "set_bmap", usage, CHECK_FS_RW | CHECK_FS_BITMAPS)) return; if (argc > 2 && !strcmp(argv[1], "--uninit")) { argc--; argv++; flags |= EXT2_EXTENT_SET_BMAP_UNINIT; } if (argc != 3) { fprintf(stderr, "Usage: %s %s\n", cmd, usage); return; } logical = parse_ulong(argv[1], cmd, "logical block", &err); if (err) return; physical = parse_ulong(argv[2], cmd, "physical block", &err); if (err) return; retval = ext2fs_extent_set_bmap(current_handle, logical, (blk64_t) physical, flags); if (retval) { com_err(cmd, retval, 0); return; } retval = ext2fs_extent_get(current_handle, EXT2_EXTENT_CURRENT, &extent); if (retval) return; dbg_print_extent(0, &extent); }
errcode_t ext2fs_extent_replace(ext2_extent_handle_t handle, int flags EXT2FS_ATTR((unused)), struct ext2fs_extent *extent) { struct extent_path *path; struct ext3_extent_idx *ix; struct ext3_extent *ex; EXT2_CHECK_MAGIC(handle, EXT2_ET_MAGIC_EXTENT_HANDLE); if (!(handle->fs->flags & EXT2_FLAG_RW)) return EXT2_ET_RO_FILSYS; if (!handle->path) return EXT2_ET_NO_CURRENT_NODE; path = handle->path + handle->level; if (!path->curr) return EXT2_ET_NO_CURRENT_NODE; #ifdef DEBUG printf("extent replace: %u ", handle->ino); dbg_print_extent(0, extent); #endif if (handle->level == handle->max_depth) { ex = path->curr; ex->ee_block = ext2fs_cpu_to_le32(extent->e_lblk); ex->ee_start = ext2fs_cpu_to_le32(extent->e_pblk & 0xFFFFFFFF); ex->ee_start_hi = ext2fs_cpu_to_le16(extent->e_pblk >> 32); if (extent->e_flags & EXT2_EXTENT_FLAGS_UNINIT) { if (extent->e_len > EXT_UNINIT_MAX_LEN) return EXT2_ET_EXTENT_INVALID_LENGTH; ex->ee_len = ext2fs_cpu_to_le16(extent->e_len + EXT_INIT_MAX_LEN); } else { if (extent->e_len > EXT_INIT_MAX_LEN) return EXT2_ET_EXTENT_INVALID_LENGTH; ex->ee_len = ext2fs_cpu_to_le16(extent->e_len); } } else {
void do_delete_node(int argc, char *argv[]) { struct ext2fs_extent extent; errcode_t retval; if (common_extent_args_process(argc, argv, 1, 1, "delete_node", "", CHECK_FS_RW | CHECK_FS_BITMAPS)) return; retval = ext2fs_extent_delete(current_handle, 0); if (retval) { com_err(argv[0], retval, 0); return; } retval = ext2fs_extent_get(current_handle, EXT2_EXTENT_CURRENT, &extent); if (retval) return; dbg_print_extent(0, &extent); }
static void generic_goto_node(const char *my_name, int argc, char **argv, int op) { struct ext2fs_extent extent; errcode_t retval; if (my_name && common_args_process(argc, argv, 1, 1, my_name, "", 0)) return; if (!current_handle) { com_err(argv[0], 0, "Extent handle not open"); return; } retval = ext2fs_extent_get(current_handle, op, &extent); if (retval) { com_err(argv[0], retval, 0); return; } dbg_print_extent(0, &extent); }
/* * Go to the node at leaf_level which contains logical block blk. * * leaf_level is height from the leaf node level, i.e. * leaf_level 0 is at leaf node, leaf_level 1 is 1 above etc. * * If "blk" has no mapping (hole) then handle is left at last * extent before blk. */ static errcode_t extent_goto(ext2_extent_handle_t handle, int leaf_level, blk64_t blk) { struct ext2fs_extent extent; errcode_t retval; retval = ext2fs_extent_get(handle, EXT2_EXTENT_ROOT, &extent); if (retval) { if (retval == EXT2_ET_EXTENT_NO_NEXT) retval = EXT2_ET_EXTENT_NOT_FOUND; return retval; } if (leaf_level > handle->max_depth) { #ifdef DEBUG printf("leaf level %d greater than tree depth %d\n", leaf_level, handle->max_depth); #endif return EXT2_ET_OP_NOT_SUPPORTED; } dbg_print_extent("root", &extent); while (1) { if (handle->max_depth - handle->level == leaf_level) { /* block is in this &extent */ if ((blk >= extent.e_lblk) && (blk < extent.e_lblk + extent.e_len)) return 0; if (blk < extent.e_lblk) { retval = ext2fs_extent_get(handle, EXT2_EXTENT_PREV_SIB, &extent); return EXT2_ET_EXTENT_NOT_FOUND; } retval = ext2fs_extent_get(handle, EXT2_EXTENT_NEXT_SIB, &extent); if (retval == EXT2_ET_EXTENT_NO_NEXT) return EXT2_ET_EXTENT_NOT_FOUND; if (retval) return retval; continue; } retval = ext2fs_extent_get(handle, EXT2_EXTENT_NEXT_SIB, &extent); if (retval == EXT2_ET_EXTENT_NO_NEXT) goto go_down; if (retval) return retval; dbg_print_extent("next", &extent); if (blk == extent.e_lblk) goto go_down; if (blk > extent.e_lblk) continue; retval = ext2fs_extent_get(handle, EXT2_EXTENT_PREV_SIB, &extent); if (retval) return retval; dbg_print_extent("prev", &extent); go_down: retval = ext2fs_extent_get(handle, EXT2_EXTENT_DOWN, &extent); if (retval) return retval; dbg_print_extent("down", &extent); } }