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
|