$ collie vdi resize -h vdi resize - resize a image Usage: collie vdi resize <vdiname> <new size> [-a address] [-p port] [-h] Command parameters: -a, --address specify the daemon address (default: localhost) -p, --port specify the daemon port -h, --help display this help and exit Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp> --- collie/collie.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 51 insertions(+), 0 deletions(-) diff --git a/collie/collie.c b/collie/collie.c index 64f0748..0b307a5 100644 --- a/collie/collie.c +++ b/collie/collie.c @@ -1147,6 +1147,55 @@ out: return ret; } +static int vdi_resize(int argc, char **argv) +{ + char *vdiname = argv[optind++]; + uint64_t new_size; + uint32_t vid; + int ret; + char buf[SD_INODE_HEADER_SIZE]; + struct sheepdog_inode *inode = (struct sheepdog_inode *)buf; + + if (!argv[optind]) { + fprintf(stderr, "please specify a new size of vdi\n"); + return EXIT_USAGE; + } + ret = parse_option_size(argv[optind], &new_size); + if (ret < 0) + return EXIT_USAGE; + if (new_size > SD_MAX_VDI_SIZE) { + fprintf(stderr, "too big image size, %s\n", argv[optind]); + return EXIT_USAGE; + } + + ret = find_vdi_name(vdiname, 0, "", &vid, 0); + if (ret < 0) { + fprintf(stderr, "failed to open vdi %s\n", vdiname); + return EXIT_FAILURE; + } + + ret = sd_read_object(vid_to_vdi_oid(vid), inode, SD_INODE_HEADER_SIZE, 0); + if (ret != SD_RES_SUCCESS) { + fprintf(stderr, "failed to read an inode header\n"); + return EXIT_FAILURE; + } + + if (new_size < inode->vdi_size) { + fprintf(stderr, "shrinking is not implemented\n"); + return EXIT_USAGE; + } + inode->vdi_size = new_size; + + ret = sd_write_object(vid_to_vdi_oid(vid), inode, SD_INODE_HEADER_SIZE, 0, + 0, inode->nr_copies, 0); + if (ret != SD_RES_SUCCESS) { + fprintf(stderr, "failed to update an inode header\n"); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} + static int vdi_delete(int argc, char **argv) { char *data = argv[optind]; @@ -1454,6 +1503,8 @@ static struct subcommand vdi_cmd[] = { SUBCMD_FLAG_NEED_NODELIST|SUBCMD_FLAG_NEED_THIRD_ARG, vdi_setattr}, {"getattr", "<vdiname> <key>", "aph", "get a vdi attribute", SUBCMD_FLAG_NEED_NODELIST|SUBCMD_FLAG_NEED_THIRD_ARG, vdi_getattr}, + {"resize", "<vdiname> <new size>", "aph", "resize a image", + SUBCMD_FLAG_NEED_NODELIST|SUBCMD_FLAG_NEED_THIRD_ARG, vdi_resize}, {NULL,}, }; -- 1.7.2.5 |