[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 5 of 6] xl: block-list command
This patch adds block-list command to xl. Usage: xl block-list <Domain(s)> diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -1703,57 +1703,90 @@ int libxl_device_vkb_hard_shutdown(struc libxl_device_disk *libxl_device_disk_list(struct libxl_ctx *ctx, uint32_t domid, int *num) { char *be_path_tap, *be_path_vbd; - libxl_device_disk *disks = NULL; - char **l = NULL; + libxl_device_disk *dend, *disks, *ret = NULL; + char **b, **l = NULL; unsigned int numl; - int num_disks = 0, i; char *type; be_path_vbd = libxl_sprintf(ctx, "%s/backend/vbd/%d", libxl_xs_get_dompath(ctx, 0), domid); be_path_tap = libxl_sprintf(ctx, "%s/backend/tap/%d", libxl_xs_get_dompath(ctx, 0), domid); - l = libxl_xs_directory(ctx, XBT_NULL, be_path_vbd, &numl); + b = l = libxl_xs_directory(ctx, XBT_NULL, be_path_vbd, &numl); if (l) { - num_disks += numl; - disks = realloc(disks, sizeof(libxl_device_disk) * num_disks); - for (i = 0; i < numl; i++) { - disks[i].backend_domid = 0; - disks[i].domid = domid; - disks[i].physpath = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/%s/params", be_path_vbd, l[i])); - libxl_string_to_phystype(ctx, libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/%s/type", be_path_vbd, l[i])), &(disks[i].phystype)); - disks[i].virtpath = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/%s/dev", be_path_vbd, l[i])); - disks[i].unpluggable = atoi(libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/%s/removable", be_path_vbd, l[i]))); - if (!strcmp(libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/%s/mode", be_path_vbd, l[i])), "w")) - disks[i].readwrite = 1; + ret = realloc(ret, sizeof(libxl_device_disk) * numl); + disks = ret; + *num = numl; + dend = ret + *num; + for (; disks < dend; ++disks, ++l) { + disks->backend_domid = 0; + disks->domid = domid; + disks->physpath = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/%s/params", be_path_vbd, *l)); + libxl_string_to_phystype(ctx, libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/%s/type", be_path_vbd, *l)), &(disks->phystype)); + disks->virtpath = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/%s/dev", be_path_vbd, *l)); + disks->unpluggable = atoi(libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/%s/removable", be_path_vbd, *l))); + if (!strcmp(libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/%s/mode", be_path_vbd, *l)), "w")) + disks->readwrite = 1; else - disks[i].readwrite = 0; - type = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/device-type", libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/%s/frontend", be_path_vbd, l[i])))); - disks[i].is_cdrom = !strcmp(type, "cdrom"); + disks->readwrite = 0; + type = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/device-type", libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/%s/frontend", be_path_vbd, *l)))); + disks->is_cdrom = !strcmp(type, "cdrom"); } - free(l); + libxl_free(ctx, b); } - l = libxl_xs_directory(ctx, XBT_NULL, be_path_tap, &numl); + b = l = libxl_xs_directory(ctx, XBT_NULL, be_path_tap, &numl); if (l) { - num_disks += numl; - disks = realloc(disks, sizeof(libxl_device_disk) * num_disks); - for (i = 0; i < numl; i++) { - disks[i].backend_domid = 0; - disks[i].domid = domid; - disks[i].physpath = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/%s/params", be_path_tap, l[i])); - libxl_string_to_phystype(ctx, libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/%s/type", be_path_tap, l[i])), &(disks[i].phystype)); - disks[i].virtpath = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/%s/dev", be_path_tap, l[i])); - disks[i].unpluggable = atoi(libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/%s/removable", be_path_tap, l[i]))); - if (!strcmp(libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/%s/mode", be_path_tap, l[i])), "w")) - disks[i].readwrite = 1; + ret = realloc(ret, sizeof(libxl_device_disk) * (*num + numl)); + disks = ret + *num; + *num += numl; + for (dend = ret + *num; disks < dend; ++disks, ++l) { + disks->backend_domid = 0; + disks->domid = domid; + disks->physpath = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/%s/params", be_path_tap, *l)); + libxl_string_to_phystype(ctx, libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/%s/type", be_path_tap, *l)), &(disks->phystype)); + disks->virtpath = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/%s/dev", be_path_tap, *l)); + disks->unpluggable = atoi(libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/%s/removable", be_path_tap, *l))); + if (!strcmp(libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/%s/mode", be_path_tap, *l)), "w")) + disks->readwrite = 1; else - disks[i].readwrite = 0; - type = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/device-type", libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/%s/frontend", be_path_vbd, l[i])))); - disks[i].is_cdrom = !strcmp(type, "cdrom"); + disks->readwrite = 0; + type = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/device-type", libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/%s/frontend", be_path_tap, *l)))); + disks->is_cdrom = !strcmp(type, "cdrom"); } - free(l); + libxl_free(ctx, b); } - *num = num_disks; - return disks; + return ret; +} + +int libxl_device_disk_getinfo(struct libxl_ctx *ctx, uint32_t domid, + libxl_device_disk *disk, libxl_diskinfo *diskinfo) +{ + char *dompath, *diskpath; + char *val; + + dompath = libxl_xs_get_dompath(ctx, domid); + diskinfo->devid = device_disk_dev_number(disk->virtpath); + + /* tap devices entries in xenstore are written as vbd devices. */ + diskpath = libxl_sprintf(ctx, "%s/device/vbd/%d", dompath, diskinfo->devid); + diskinfo->backend = libxl_xs_read(ctx, XBT_NULL, + libxl_sprintf(ctx, "%s/backend", diskpath)); + if (!diskinfo->backend) { + return ERROR_FAIL; + } + val = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/backend-id", diskpath)); + diskinfo->backend_id = val ? strtoul(val, NULL, 10) : -1; + val = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/state", diskpath)); + diskinfo->state = val ? strtoul(val, NULL, 10) : -1; + val = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/event-channel", diskpath)); + diskinfo->evtch = val ? strtoul(val, NULL, 10) : -1; + val = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/ring-ref", diskpath)); + diskinfo->rref = val ? strtoul(val, NULL, 10) : -1; + diskinfo->frontend = libxl_xs_read(ctx, XBT_NULL, + libxl_sprintf(ctx, "%s/frontend", diskinfo->backend)); + val = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/frontend-id", diskinfo->backend)); + diskinfo->frontend_id = val ? strtoul(val, NULL, 10) : -1; + + return 0; } int libxl_cdrom_insert(struct libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk) diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -367,9 +367,22 @@ int libxl_detach_device_model(struct lib libxl_device_model_starting *starting); /* DM is detached even if error is returned */ +typedef struct { + char *backend; + uint32_t backend_id; + char *frontend; + uint32_t frontend_id; + int devid; + int state; + int evtch; + int rref; +} libxl_diskinfo; + int libxl_device_disk_add(struct libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk); int libxl_device_disk_del(struct libxl_ctx *ctx, libxl_device_disk *disk, int wait); libxl_device_disk *libxl_device_disk_list(struct libxl_ctx *ctx, uint32_t domid, int *num); +int libxl_device_disk_getinfo(struct libxl_ctx *ctx, uint32_t domid, + libxl_device_disk *disk, libxl_diskinfo *diskinfo); int libxl_cdrom_insert(struct libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk); typedef struct { diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -3303,3 +3303,48 @@ int main_blockattach(int argc, char **ar } exit(0); } + +int main_blocklist(int argc, char **argv) +{ + int opt; + int nb; + libxl_device_disk *disks; + libxl_diskinfo diskinfo; + + if (argc < 2) { + help("block-list"); + exit(0); + } + while ((opt = getopt(argc, argv, "h")) != -1) { + switch (opt) { + case 'h': + help("block-list"); + exit(0); + default: + fprintf(stderr, "option `%c' not supported.\n", opt); + break; + } + } + + printf("%-5s %-3s %-6s %-5s %-6s %-8s %-30s\n", + "Vdev", "BE", "handle", "state", "evt-ch", "ring-ref", "BE-path"); + for (++argv, --argc; argc > 0; --argc, ++argv) { + if (domain_qualifier_to_domid(*argv, &domid, 0) < 0) { + fprintf(stderr, "%s is an invalid domain identifier\n", *argv); + continue; + } + disks = libxl_device_disk_list(&ctx, domid, &nb); + if (!disks) { + continue; + } + for (; nb > 0; --nb, ++disks) { + if (!libxl_device_disk_getinfo(&ctx, domid, disks, &diskinfo)) { + /* Vdev BE hdl st evch rref BE-path*/ + printf("%-5d %-3d %-6d %-5d %-6d %-8d %-30s\n", + diskinfo.devid, diskinfo.backend_id, diskinfo.frontend_id, + diskinfo.state, diskinfo.evtch, diskinfo.rref, diskinfo.backend); + } + } + } + exit(0); +} diff --git a/tools/libxl/xl_cmdimpl.h b/tools/libxl/xl_cmdimpl.h --- a/tools/libxl/xl_cmdimpl.h +++ b/tools/libxl/xl_cmdimpl.h @@ -43,5 +43,6 @@ int main_networkattach(int argc, char ** int main_networklist(int argc, char **argv); int main_networkdetach(int argc, char **argv); int main_blockattach(int argc, char **argv); +int main_blocklist(int argc, char **argv); void help(char *command); diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c --- a/tools/libxl/xl_cmdtable.c +++ b/tools/libxl/xl_cmdtable.c @@ -188,6 +188,10 @@ struct cmd_spec cmd_table[] = { &main_blockattach, "Create a new virtual block device" }, + { "block-list", + &main_blocklist, + "List virtual block devices for a domain" + }, }; int cmdtable_len = sizeof(cmd_table)/sizeof(struct cmd_spec); _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |