mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-09-09 09:14:57 +00:00
virsh: Implement domblkerror command
This command lists all disk devices with errors
This commit is contained in:
parent
e17e3ed6aa
commit
e08d2a9ad8
@ -16036,6 +16036,83 @@ cleanup:
|
|||||||
return ret;
|
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
|
* "qemu-monitor-command" command
|
||||||
*/
|
*/
|
||||||
@ -16236,6 +16313,7 @@ static const vshCmdDef domManagementCmds[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const vshCmdDef domMonitoringCmds[] = {
|
static const vshCmdDef domMonitoringCmds[] = {
|
||||||
|
{"domblkerror", cmdDomBlkError, opts_domblkerror, info_domblkerror, 0},
|
||||||
{"domblkinfo", cmdDomblkinfo, opts_domblkinfo, info_domblkinfo, 0},
|
{"domblkinfo", cmdDomblkinfo, opts_domblkinfo, info_domblkinfo, 0},
|
||||||
{"domblklist", cmdDomblklist, opts_domblklist, info_domblklist, 0},
|
{"domblklist", cmdDomblklist, opts_domblklist, info_domblklist, 0},
|
||||||
{"domblkstat", cmdDomblkstat, opts_domblkstat, info_domblkstat, 0},
|
{"domblkstat", cmdDomblkstat, opts_domblkstat, info_domblkstat, 0},
|
||||||
|
@ -507,6 +507,13 @@ on hypervisor.
|
|||||||
|
|
||||||
Get memory stats for a running domain.
|
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>
|
=item B<domblkinfo> I<domain> I<block-device>
|
||||||
|
|
||||||
Get block device size info for a domain. A I<block-device> corresponds
|
Get block device size info for a domain. A I<block-device> corresponds
|
||||||
|
Loading…
Reference in New Issue
Block a user