]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
virsh: Implement domblkerror command
authorJiri Denemark <jdenemar@redhat.com>
Wed, 18 Jan 2012 16:46:00 +0000 (17:46 +0100)
committerJiri Denemark <jdenemar@redhat.com>
Wed, 1 Feb 2012 09:56:45 +0000 (10:56 +0100)
This command lists all disk devices with errors

tools/virsh.c
tools/virsh.pod

index 3a5974662c3d7a587e3cb6db787f675940addc95..23962bfbaf9913afc3c5087da0af5a7f616c5cf6 100644 (file)
@@ -16036,6 +16036,83 @@ cleanup:
     return ret;
 }
 
+/*
+ * "domblkerror" command
+ */
+static const char *
+vshDomainIOErrorToString(int error)
+{
+    switch ((virDomainDiskErrorCode) error) {
+    case VIR_DOMAIN_DISK_ERROR_NONE:
+        return _("no error");
+    case VIR_DOMAIN_DISK_ERROR_UNSPEC:
+        return _("unspecified error");
+    case VIR_DOMAIN_DISK_ERROR_NO_SPACE:
+        return _("no space");
+    case VIR_DOMAIN_DISK_ERROR_LAST:
+        ;
+    }
+
+    return _("unknown error");
+}
+
+static const vshCmdInfo info_domblkerror[] = {
+    {"help", N_("Show errors on block devices")},
+    {"desc", N_("Show block device errors")},
+    {NULL, NULL}
+};
+
+static const vshCmdOptDef opts_domblkerror[] = {
+    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id, or uuid")},
+    {NULL, 0, 0, NULL}
+};
+
+static bool
+cmdDomBlkError(vshControl *ctl, const vshCmd *cmd)
+{
+    virDomainPtr dom;
+    virDomainDiskErrorPtr disks = NULL;
+    unsigned int ndisks;
+    int i;
+    int count;
+    bool ret = false;
+
+    if (!vshConnectionUsability(ctl, ctl->conn))
+        return false;
+
+    if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
+        return false;
+
+    if ((count = virDomainGetDiskErrors(dom, NULL, 0, 0)) < 0)
+        goto cleanup;
+    ndisks = count;
+
+    if (ndisks) {
+        if (VIR_ALLOC_N(disks, ndisks) < 0)
+            goto cleanup;
+
+        if ((count = virDomainGetDiskErrors(dom, disks, ndisks, 0)) == -1)
+            goto cleanup;
+    }
+
+    if (count == 0) {
+        vshPrint(ctl, _("No errors found\n"));
+    } else {
+        for (i = 0; i < count; i++) {
+            vshPrint(ctl, "%s: %s\n",
+                     disks[i].disk,
+                     vshDomainIOErrorToString(disks[i].error));
+        }
+    }
+
+    ret = true;
+
+cleanup:
+    VIR_FREE(disks);
+    virDomainFree(dom);
+    return ret;
+}
+
 /*
  * "qemu-monitor-command" command
  */
@@ -16236,6 +16313,7 @@ static const vshCmdDef domManagementCmds[] = {
 };
 
 static const vshCmdDef domMonitoringCmds[] = {
+    {"domblkerror", cmdDomBlkError, opts_domblkerror, info_domblkerror, 0},
     {"domblkinfo", cmdDomblkinfo, opts_domblkinfo, info_domblkinfo, 0},
     {"domblklist", cmdDomblklist, opts_domblklist, info_domblklist, 0},
     {"domblkstat", cmdDomblkstat, opts_domblkstat, info_domblkstat, 0},
index 4bc25bf366b656229f24dcd68febdf0e52bee9bc..e9598acf411862b0a9e6016f4916ba27d211d59a 100644 (file)
@@ -507,6 +507,13 @@ on hypervisor.
 
 Get memory stats for a running domain.
 
+=item B<domblkerror> I<domain-id>
+
+Show errors on block devices.  This command usually comes handy when
+B<domstate> command says that a domain was paused due to I/O error.
+The B<domblkerror> command lists all block devices in error state and
+the error seen on each of them.
+
 =item B<domblkinfo> I<domain> I<block-device>
 
 Get block device size info for a domain.  A I<block-device> corresponds