static void parse_type_size(Visitor *v, const char *name, uint64_t *obj, Error **errp) { StringInputVisitor *siv = to_siv(v); Error *err = NULL; uint64_t val; parse_option_size(name, siv->string, &val, &err); if (err) { error_propagate(errp, err); return; } *obj = val; }
static void parse_type_size(Visitor *v, const char *name, uint64_t *obj, Error **errp) { StringInputVisitor *siv = to_siv(v); Error *err = NULL; uint64_t val; if (siv->string) { parse_option_size(name, siv->string, &val, &err); } else { error_setg(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null", "size"); return; } if (err) { error_propagate(errp, err); return; } *obj = val; }
static int vdi_create(int argc, char **argv) { char *vdiname = argv[optind++]; uint64_t size; uint32_t vid; uint64_t oid; int idx, max_idx, ret; struct sheepdog_inode *inode = NULL; char *buf = NULL; if (!argv[optind]) { fprintf(stderr, "please specify the size of vdi\n"); return EXIT_USAGE; } ret = parse_option_size(argv[optind], &size); if (ret < 0) return EXIT_USAGE; if (size > SD_MAX_VDI_SIZE) { fprintf(stderr, "too big image size, %s\n", argv[optind]); return EXIT_USAGE; } ret = do_vdi_create(vdiname, size, 0, &vid, 0); if (ret != EXIT_SUCCESS || !vdi_cmd_data.prealloc) goto out; inode = malloc(sizeof(*inode)); buf = zalloc(SD_DATA_OBJ_SIZE); if (!inode || !buf) { fprintf(stderr, "oom\n"); ret = EXIT_SYSFAIL; goto out; } ret = sd_read_object(vid_to_vdi_oid(vid), inode, sizeof(*inode), 0); if (ret != SD_RES_SUCCESS) { fprintf(stderr, "failed to read a newly created vdi object\n"); ret = EXIT_FAILURE; goto out; } max_idx = DIV_ROUND_UP(size, SD_DATA_OBJ_SIZE); for (idx = 0; idx < max_idx; idx++) { oid = vid_to_data_oid(vid, idx); ret = sd_write_object(oid, 0, buf, SD_DATA_OBJ_SIZE, 0, 0, inode->nr_copies, 1); if (ret != SD_RES_SUCCESS) { ret = EXIT_FAILURE; goto out; } inode->data_vdi_id[idx] = vid; ret = sd_write_object(vid_to_vdi_oid(vid), 0, &vid, sizeof(vid), SD_INODE_HEADER_SIZE + sizeof(vid) * idx, 0, inode->nr_copies, 0); if (ret) { ret = EXIT_FAILURE; goto out; } } ret = EXIT_SUCCESS; out: free(inode); free(buf); return ret; }