On 17.02.2015 12:52, Mikhail Feoktistov wrote: > 1. Delete all boot devices for VM instance > 2. Find the first HDD from XML and set it as bootable > > Now we support only one boot device and it should be HDD > --- > src/parallels/parallels_sdk.c | 95 +++++++++++++++++++++++++++++++++++++++-- > 1 files changed, 91 insertions(+), 4 deletions(-) > > diff --git a/src/parallels/parallels_sdk.c b/src/parallels/parallels_sdk.c > index 8660259..15822ab 100644 > --- a/src/parallels/parallels_sdk.c > +++ b/src/parallels/parallels_sdk.c > @@ -1987,6 +1987,69 @@ static int prlsdkClearDevices(PRL_HANDLE sdkdom) > return ret; > } > > +int static int. This function is used only within the parallels_sdk.c file. > +prlsdkRemoveBootDevices(PRL_HANDLE sdkdom) > +{ > + PRL_RESULT pret; > + PRL_UINT32 devCount; > + PRL_HANDLE dev = PRL_INVALID_HANDLE; > + PRL_DEVICE_TYPE devType; > + > + pret = PrlVmCfg_GetBootDevCount(sdkdom, &devCount); > + prlsdkCheckRetGoto(pret, error); > + > + for (int i = 0; i < devCount; i++) { We don't use c99 style of for loops. Moreover, i should be the same type as devCount. > + > + /* always get device by index 0, because device list resort after delete */ > + pret = PrlVmCfg_GetBootDev(sdkdom, 0, &dev); > + prlsdkCheckRetGoto(pret, error); > + > + pret = PrlBootDev_GetType(dev, &devType); > + prlsdkCheckRetGoto(pret, error); > + Trailing whitespace. > + pret = PrlBootDev_Remove(dev); > + prlsdkCheckRetGoto(pret, error); > + } > + > + return 0; > + > + error: > + return -1; > +} > + > +int Again. static int. > +prlsdkAddDeviceToBootList(PRL_HANDLE sdkdom, > + PRL_UINT32 devIndex, > + PRL_DEVICE_TYPE devType, > + PRL_UINT32 bootSequence) > +{ > + PRL_RESULT pret; > + PRL_HANDLE bootDev = PRL_INVALID_HANDLE; > + > + pret = PrlVmCfg_CreateBootDev(sdkdom, &bootDev); > + prlsdkCheckRetGoto(pret, error); > + > + pret = PrlBootDev_SetIndex(bootDev, devIndex); > + prlsdkCheckRetGoto(pret, error); > + > + pret = PrlBootDev_SetType(bootDev, devType); > + prlsdkCheckRetGoto(pret, error); > + > + pret = PrlBootDev_SetSequenceIndex(bootDev, bootSequence); > + prlsdkCheckRetGoto(pret, error); > + > + pret = PrlBootDev_SetInUse(bootDev, PRL_TRUE); > + prlsdkCheckRetGoto(pret, error); > + Trailing whitepsace. > + return 0; > + > + error: > + if (bootDev != PRL_INVALID_HANDLE) > + PrlBootDev_Remove(bootDev); > + > + return -1; > +} > + > static int prlsdkCheckGraphicsUnsupportedParams(virDomainDefPtr def) > { > virDomainGraphicsDefPtr gr; > @@ -2601,7 +2664,7 @@ static int prlsdkAddNet(PRL_HANDLE sdkdom, virDomainNetDefPtr net) > return ret; > } > > -static int prlsdkAddDisk(PRL_HANDLE sdkdom, virDomainDiskDefPtr disk) > +static int prlsdkAddDisk(PRL_HANDLE sdkdom, virDomainDiskDefPtr disk, bool bootDisk) > { > PRL_RESULT pret; > PRL_HANDLE sdkdisk = PRL_INVALID_HANDLE; > @@ -2610,14 +2673,18 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom, virDomainDiskDefPtr disk) > PRL_MASS_STORAGE_INTERFACE_TYPE sdkbus; > int idx; > virDomainDeviceDriveAddressPtr drive; > + PRL_UINT32 devIndex; > + PRL_DEVICE_TYPE devType; > > if (prlsdkCheckDiskUnsupportedParams(disk) < 0) > return -1; > > if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) > - pret = PrlVmCfg_CreateVmDev(sdkdom, PDE_HARD_DISK, &sdkdisk); > + devType = PDE_HARD_DISK; > else > - pret = PrlVmCfg_CreateVmDev(sdkdom, PDE_OPTICAL_DISK, &sdkdisk); > + devType = PDE_OPTICAL_DISK; > + > + pret = PrlVmCfg_CreateVmDev(sdkdom, devType, &sdkdisk); > prlsdkCheckRetGoto(pret, cleanup); > > pret = PrlVmDev_SetEnabled(sdkdisk, 1); > @@ -2713,6 +2780,14 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom, virDomainDiskDefPtr disk) > goto cleanup; > } > > + if (bootDisk == true) { > + pret = PrlVmDev_GetIndex(sdkdisk, &devIndex); > + prlsdkCheckRetGoto(pret, cleanup); > + > + if (prlsdkAddDeviceToBootList(sdkdom, devIndex, devType, 0) < 0) > + goto cleanup; > + } > + > return 0; > cleanup: > PrlHandle_Free(sdkdisk); > @@ -2796,6 +2871,9 @@ prlsdkDoApplyConfig(PRL_HANDLE sdkdom, > if (prlsdkClearDevices(sdkdom) < 0) > goto error; > > + if (prlsdkRemoveBootDevices(sdkdom) < 0) > + goto error; > + > if (prlsdkApplyGraphicsParams(sdkdom, def) < 0) > goto error; > > @@ -2812,8 +2890,17 @@ prlsdkDoApplyConfig(PRL_HANDLE sdkdom, > goto error; > } > > + bool needBoot = true; This has to go up in the beginning of the function, otherwise the compiler complains that variable initialization is jumped over (all the gotos above). > for (i = 0; i < def->ndisks; i++) { > - if (prlsdkAddDisk(sdkdom, def->disks[i]) < 0) > + bool bootDisk = false; > + > + if (needBoot == true && > + def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_DISK) { > + > + needBoot = false; > + bootDisk = true; > + } > + if (prlsdkAddDisk(sdkdom, def->disks[i], bootDisk) < 0) > goto error; > } > > I've fixed all the nits, ACKed and pushed all three patches. Congratulations on your first libvirt contribution! Michal -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list