On 05/10/2013 06:10 PM, Seiji Aguchi wrote: > Any comments? Apologies that no one has spoken up yet, but this is on my list of things to review. I got waylaid by debugging two nasty races today, or I would have had time to actually give comments; but come Monday, you should have some better feedback. > >> -----Original Message----- >> From: Seiji Aguchi >> Sent: Thursday, May 02, 2013 1:26 PM >> To: libvir-list@xxxxxxxxxx >> Cc: dle-develop@xxxxxxxxxxxxxxxxxxxxx; Tomoki Sekiyama (tomoki.sekiyama@xxxxxxx) >> Subject: [PATCH] Introduce startupPolicy for chardev to make guest OS bootable when hardware failure happens in log disk >> >> [Problem] >> Currently, guest OS's messages can be logged to a local disk of host OS >> by creating chadevs with options below. >> -chardev file,id=charserial0,path=<log file's path> -device isa-serial,chardev=chardevserial0,id=serial0 >> >> When a hardware failure happens in the disk, qemu-kvm can't create the chardevs. >> In this case, guest OS doesn't boot up. >> >> Actually, there are users who don't desire that guest OS goes down due to a hardware failure >> of a log disk only.Therefore, qemu should offer some way to boot guest OS up even if the log >> disk is broken. >> >> [Solution] >> This patch supports startupPolicy for chardev. >> >> The starupPolicy is introduced just in case where chardev is "file" >> because this patch aims for making guest OS boot up when a hardware failure happens. >> >> In other cases ,pty, dev, pipe and unix, it is not introduced >> because they don't access to hardware. >> >> The policy works as follows. >> - If the value is "optional", guestOS boots up by dropping the chardev. >> - If other values are specified, guestOS fails to boot up. (the default) >> >> Description about original startupPolicy attribute: >> http://libvirt.org/git/?p=libvirt.git;a=commitdiff;h=e5a84d74a2789a917bf394f15de9989ec48fded0 >> >> Signed-off-by: Seiji Aguchi <seiji.aguchi@xxxxxxx> >> --- >> docs/formatdomain.html.in | 9 ++++++++- >> docs/schemas/domaincommon.rng | 3 +++ >> src/conf/domain_conf.c | 8 ++++++++ >> src/conf/domain_conf.h | 1 + >> src/qemu/qemu_process.c | 25 ++++++++++++++++++++++++- >> tests/virt-aa-helper-test | 3 +++ >> 6 files changed, 47 insertions(+), 2 deletions(-) >> >> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in >> index f325c3c..1e1bf27 100644 >> --- a/docs/formatdomain.html.in >> +++ b/docs/formatdomain.html.in >> @@ -4044,13 +4044,20 @@ qemu-kvm -net nic,model=? /dev/null >> <p> >> A file is opened and all data sent to the character >> device is written to the file. >> + It is possible to define policy whether guestOS boots up >> + if the file is not accessible. This is done by a startupPolicy >> + attribute: >> + <ul> >> + <li>If the vaule is "optional", guestOS boots up by dropping the file.</li> >> + <li>If other values are specified, guestOS fails to boot up. (the default)</li> >> + </ul> >> </p> >> >> <pre> >> ... >> <devices> >> <serial type="file"> >> - <source path="/var/log/vm/vm-serial.log"/> >> + <source path="/var/log/vm/vm-serial.log" startupPolicy="optional"/> >> <target port="1"/> >> </serial> >> </devices> >> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng >> index 10596dc..6fc0a3c 100644 >> --- a/docs/schemas/domaincommon.rng >> +++ b/docs/schemas/domaincommon.rng >> @@ -2706,6 +2706,9 @@ >> </optional> >> <optional> >> <attribute name="path"/> >> + <optional> >> + <ref name='startupPolicy'/> >> + </optional> >> </optional> >> <optional> >> <attribute name="host"/> >> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c >> index a8b5dfd..6680f15 100644 >> --- a/src/conf/domain_conf.c >> +++ b/src/conf/domain_conf.c >> @@ -6467,6 +6467,7 @@ virDomainChrSourceDefParseXML(virDomainChrSourceDefPtr def, >> char *path = NULL; >> char *mode = NULL; >> char *protocol = NULL; >> + char *startupPolicy = NULL; >> int remaining = 0; >> >> while (cur != NULL) { >> @@ -6487,6 +6488,9 @@ virDomainChrSourceDefParseXML(virDomainChrSourceDefPtr def, >> !(flags & VIR_DOMAIN_XML_INACTIVE))) >> path = virXMLPropString(cur, "path"); >> >> + if (startupPolicy == NULL && >> + def->type == VIR_DOMAIN_CHR_TYPE_FILE) >> + startupPolicy = virXMLPropString(cur, "startupPolicy"); >> break; >> >> case VIR_DOMAIN_CHR_TYPE_UDP: >> @@ -6559,6 +6563,10 @@ virDomainChrSourceDefParseXML(virDomainChrSourceDefPtr def, >> >> def->data.file.path = path; >> path = NULL; >> + >> + def->data.file.startupPolicy = >> + virDomainStartupPolicyTypeFromString(startupPolicy); >> + startupPolicy = NULL; >> break; >> >> case VIR_DOMAIN_CHR_TYPE_STDIO: >> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h >> index 3a0f23a..e709951 100644 >> --- a/src/conf/domain_conf.h >> +++ b/src/conf/domain_conf.h >> @@ -1052,6 +1052,7 @@ struct _virDomainChrSourceDef { >> /* no <source> for null, vc, stdio */ >> struct { >> char *path; >> + int startupPolicy; /* enum virDomainStartupPolicy */ >> } file; /* pty, file, pipe, or device */ >> struct { >> char *host; >> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c >> index e75c8c9..6e2f78e 100644 >> --- a/src/qemu/qemu_process.c >> +++ b/src/qemu/qemu_process.c >> @@ -2442,7 +2442,30 @@ qemuProcessPrepareChardevDevice(virDomainDefPtr def ATTRIBUTE_UNUSED, >> virReportSystemError(errno, >> _("Unable to pre-create chardev file '%s'"), >> dev->source.data.file.path); >> - return -1; >> + if (dev->source.data.file.startupPolicy != >> + VIR_DOMAIN_STARTUP_POLICY_OPTIONAL) { >> + return -1; >> + } >> + VIR_FREE(dev->source.data.file.path); >> + /* >> + * Change a destination to /dev/null to boot guest OS up >> + * even if a log disk is broken. >> + */ >> + VIR_WARN("Switch the destination to /dev/null"); >> + dev->source.data.file.path = strdup("/dev/null"); >> + >> + if (!(dev->source.data.file.path)) { >> + virReportOOMError(); >> + return -1; >> + } >> + >> + if ((fd = open(dev->source.data.file.path, >> + O_CREAT | O_APPEND, S_IRUSR|S_IWUSR)) < 0) { >> + virReportSystemError(errno, >> + _("Unable to pre-create chardev file '%s'"), >> + dev->source.data.file.path); >> + return -1; >> + } >> } >> >> VIR_FORCE_CLOSE(fd); >> diff --git a/tests/virt-aa-helper-test b/tests/virt-aa-helper-test >> index af91c61..7172fd6 100755 >> --- a/tests/virt-aa-helper-test >> +++ b/tests/virt-aa-helper-test >> @@ -255,6 +255,9 @@ testme "0" "disk (empty cdrom)" "-r -u $valid_uuid" "$test_xml" >> sed -e "s,###UUID###,$uuid,g" -e "s,###DISK###,$disk1,g" -e "s,</devices>,<serial type='file'><source >> path='$tmpdir/serial.log'/><target port='0'/></serial></devices>,g" "$template_xml" > "$test_xml" >> testme "0" "serial" "-r -u $valid_uuid" "$test_xml" >> >> +sed -e "s,###UUID###,$uuid,g" -e "s,###DISK###,$disk1,g" -e "s,</devices>,<serial type='file'><source path='$tmpdir/serial.log' >> startupPolicy='optional'/><target port='0'/></serial></devices>,g" "$template_xml" > "$test_xml" >> +testme "0" "serial" "-r -u $valid_uuid" "$test_xml" >> + >> sed -e "s,###UUID###,$uuid,g" -e "s,###DISK###,$disk1,g" -e "s,</devices>,<serial type='pty'><target >> port='0'/></serial></devices>,g" "$template_xml" > "$test_xml" >> testme "0" "serial (pty)" "-r -u $valid_uuid" "$test_xml" >> >> -- >> 1.7.1 > > > -- > libvir-list mailing list > libvir-list@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/libvir-list > > -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
Attachment:
signature.asc
Description: OpenPGP digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list