[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] xl: Implement block-list command
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1273737110 -3600 # Node ID 922962ef94c820cae4682b0f53948321f8c73db6 # Parent 68d4e8b220fa024ea08dd15041beac6a3f276659 xl: Implement block-list command Signed-off-by: Eric Chanudet <eric.chanudet@xxxxxxxxxx> --- tools/libxl/libxl.c | 115 +++++++++++++++++++++++++++++----------------- tools/libxl/libxl.h | 13 +++++ tools/libxl/xl_cmdimpl.c | 45 ++++++++++++++++++ tools/libxl/xl_cmdimpl.h | 1 tools/libxl/xl_cmdtable.c | 5 ++ 5 files changed, 138 insertions(+), 41 deletions(-) diff -r 68d4e8b220fa -r 922962ef94c8 tools/libxl/libxl.c --- a/tools/libxl/libxl.c Thu May 13 08:50:54 2010 +0100 +++ b/tools/libxl/libxl.c Thu May 13 08:51:50 2010 +0100 @@ -1703,57 +1703,90 @@ libxl_device_disk *libxl_device_disk_lis 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"); - } - free(l); - } - l = libxl_xs_directory(ctx, XBT_NULL, be_path_tap, &numl); + 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"); + } + libxl_free(ctx, b); + } + 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"); - } - free(l); - } - *num = num_disks; - return disks; + 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"); + } + libxl_free(ctx, b); + } + 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 -r 68d4e8b220fa -r 922962ef94c8 tools/libxl/libxl.h --- a/tools/libxl/libxl.h Thu May 13 08:50:54 2010 +0100 +++ b/tools/libxl/libxl.h Thu May 13 08:51:50 2010 +0100 @@ -368,9 +368,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 -r 68d4e8b220fa -r 922962ef94c8 tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Thu May 13 08:50:54 2010 +0100 +++ b/tools/libxl/xl_cmdimpl.c Thu May 13 08:51:50 2010 +0100 @@ -3416,3 +3416,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 -r 68d4e8b220fa -r 922962ef94c8 tools/libxl/xl_cmdimpl.h --- a/tools/libxl/xl_cmdimpl.h Thu May 13 08:50:54 2010 +0100 +++ b/tools/libxl/xl_cmdimpl.h Thu May 13 08:51:50 2010 +0100 @@ -46,5 +46,6 @@ int main_networklist(int argc, char **ar 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 -r 68d4e8b220fa -r 922962ef94c8 tools/libxl/xl_cmdtable.c --- a/tools/libxl/xl_cmdtable.c Thu May 13 08:50:54 2010 +0100 +++ b/tools/libxl/xl_cmdtable.c Thu May 13 08:51:50 2010 +0100 @@ -209,6 +209,11 @@ struct cmd_spec cmd_table[] = { "Create a new virtual block device", "<Domain> <BackDev> <FrontDev> <Mode> [BackDomain]", }, + { "block-list", + &main_blocklist, + "List virtual block devices for a domain", + "<Domain(s)>", + }, }; int cmdtable_len = sizeof(cmd_table)/sizeof(struct cmd_spec); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |