[libvirt] [PATCH] bhyve: bhyveload: respect boot dev and boot order
Daniel P. Berrange
berrange at redhat.com
Tue Dec 22 15:12:35 UTC 2015
On Sun, Dec 13, 2015 at 06:41:21AM +0300, Roman Bogorodskiy wrote:
> Make bhyveload respect boot order as specified by os.boot section of the
> domain XML or by "boot order" for specific devices. As bhyve does not
> support a real boot order specification right now, it's just about
> choosing a single device to boot from.
So if bhyve only lets you specify a single device to boot from,
then we should report an error to the user if they provide more
than one <boot> element in the XML.
> +static virDomainDiskDefPtr
> +virBhyveGetBootDisk(virConnectPtr conn, virDomainDefPtr def)
> +{
> + size_t i;
> + virDomainDiskDefPtr match = NULL;
> + int best_index = INT_MAX;
> + int boot_cdrom = 0, boot_disk = 0;
> +
> + if (def->ndisks == 0)
> + return NULL;
> +
> + for (i = 0; i < def->os.nBootDevs; i++) {
> + switch (def->os.bootDevs[i]) {
> + case VIR_DOMAIN_BOOT_CDROM:
> + boot_cdrom = i;
> + break;
> + case VIR_DOMAIN_BOOT_DISK:
> + boot_disk = i;
> + break;
> + }
> + }
IOW instead of this, we should just do
int boot_dev = -1;
if (def->ndisks > 1) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("Only one boot device is supported");
return NULL;
}
switch (def->os.bootDevs[0]) {
case VIR_DOMAIN_BOOT_DISK:
boot_dev = VIR_DOMAIN_DISK_DEVICE_DISK;
break;
case VIR_DOMAIN_BOOT_CDROM:
boot_dev = VIR_DOMAIN_DISK_DEVICE_CDROM;
break;
default:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Cannot boot from device %s"),
virDOmainBootDeviceTypeToString(def->os.bootDevs[0]));
return NULL;
}
Now look for the first disk where disk->device == boot_dev
and use that to boot from.
Note however that '<boot ...>' only takes effect if you have
*not* got any boot index values specified on devices. ie
they are considered mutually exclusive.
http://libvirt.org/formatdomain.html#elementsOSBIOS
"The boot element and per-device boot elements are mutually exclusive."
So now in this loop:
> + for (i = 0; i < def->ndisks; i++) {
> + int bootIndex;
> + if (!virBhyveUsableDisk(conn, def->disks[i]))
> + continue;
> +
> + bootIndex = def->disks[i]->info.bootIndex;
> + if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_CDROM)
> + bootIndex += boot_cdrom;
> + else if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_DISK)
> + bootIndex += boot_disk;
> +
> + if (bootIndex < best_index) {
> + best_index = bootIndex;
> + match = def->disks[i];
> + }
> + }
If 'boot_dev != -1' then you should report an error if
you see any 'bootIndex != -1'.
If 'boot_dev == -1', then you should have exactly one
device with a bootIndex != -1. If you see multiple
devices with a boot index set, you should again report
an VIR_ERR_CONFIG_UNSUPPORTED to inform the user that
their config cannot be honoured.
> +
> + return match;
> +}
> +
> virCommandPtr
> virBhyveProcessBuildLoadCmd(virConnectPtr conn, virDomainDefPtr def,
> const char *devmap_file, char **devicesmap_out)
> @@ -535,10 +577,11 @@ virBhyveProcessBuildLoadCmd(virConnectPtr conn, virDomainDefPtr def,
> }
>
> if (def->os.bootloader == NULL) {
> - disk = def->disks[0];
> + disk = virBhyveGetBootDisk(conn, def);
>
> - if (!virBhyveUsableDisk(conn, disk))
> - return NULL;
> + if (disk == NULL)
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> + _("no bootable disks found"));
Push that error message into virBhyveGetBootDisk as there are multiple
different errors to report now.
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list