[libvirt] [PATCH v2 05/15] vbox: Cleanup vboxAttachDrives implementation

Dawid Zamirski dzamirski at datto.com
Fri Nov 3 16:19:46 UTC 2017


On Fri, 2017-11-03 at 09:43 -0400, John Ferlan wrote:
> 
> On 10/24/2017 03:35 PM, Dawid Zamirski wrote:
> > This commit primes vboxAttachDrives for further changes so when
> > they
> > are made, the diff is less noisy:
> > 
> > * move variable declarations to the top of the function
> > * add disk variable to replace all the def->disks[i] instances
> > * add cleanup at the end of the loop body, so it's all in one place
> >   rather than scattered through the loop body. It's purposefully
> >   called 'cleanup' rather than 'skip' or 'continue' because future
> >   commit will treat errors as hard-failures.
> > ---
> >  src/vbox/vbox_common.c | 95 ++++++++++++++++++++++++------------
> > --------------
> >  1 file changed, 46 insertions(+), 49 deletions(-)
> > 
> > diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c
> > index fa8471e68..b949c4db7 100644
> > --- a/src/vbox/vbox_common.c
> > +++ b/src/vbox/vbox_common.c
> > @@ -959,8 +959,17 @@ static void
> >  vboxAttachDrives(virDomainDefPtr def, vboxDriverPtr data, IMachine
> > *machine)
> >  {
> >      size_t i;
> > +    int type, format;
> > +    const char *src = NULL;
> >      nsresult rc = 0;
> > +    virDomainDiskDefPtr disk = NULL;
> >      PRUnichar *storageCtlName = NULL;
> > +    IMedium *medium = NULL;
> > +    PRUnichar *mediumFileUtf16 = NULL, *mediumEmpty = NULL;
> > +    PRUint32 devicePort, deviceSlot, deviceType, accessMode;
> > +    vboxIID mediumUUID;
> > +
> > +    VBOX_IID_INITIALIZE(&mediumUUID);
> 
> The cleanup: label would clean this up on the first pass through the
> loop, so it needs to move outside the last }.
> 

The VBOX_IID_INITIALIZE macro is a simple struct initializer that is
equivalent of vboxIID mediumUUID = {NULL, true}; as a matter of fact,
src/vbox/vbox_tmpl.c uses VBOX_IID_INITIALIZER macro which is exactly
that, but that macro is not available to vbox_common.c This is likely
another remanent of VBOX <= 3 support that needs to be cleaned up - I
will do so in a separate patch as it will touch to many parts of the
driver and when you take a closer look we don't really need vboxIID
struct at all and can simply use PRUnichar directly for VBOX UUIDs.

> I can do this for you; however, I have a question - something I
> noticed
> while reviewing patch 7.  There's a call:
> 
> rc = gVBoxAPI.UIMedium.GetId(medium, &mediumUUID);
> 
> for which it wasn't clear whether the mediumUUID is overwritten. If
> it
> is, then although existing - it probably needs some cleanup and of
> course would change the flow a bit to doing that initializer each
> time
> through the loop.

Yes, it is overwritten but since the cleanup: label is at the end of
the loop body it will set mediumUIID to {NULL, true} which is the same
as calling VBOX_IID_INITIALIZE (see _vboxIIDUnalloc in
src/vbox/vbox_tmpl.c)

> 
> Moving it does have a ripple effect on subsequent patches, but it's
> manageable.
> 
> If moving it to the end is acceptable, then

As per above, I'd rather leave this patch "as is" as the (future)
driver cleanup patches for vboxIID will make this clearer.

> 
> Reviewed-by: John Ferlan <jferlan at redhat.com>
> 
> otherwise let me know and I'll let you repost as part of a v3
> 
> John
> 
> >  
> >      /* add a storage controller for the mediums to be attached */
> >      /* this needs to change when multiple controller are supported
> > for
> > @@ -1003,57 +1012,50 @@ vboxAttachDrives(virDomainDefPtr def,
> > vboxDriverPtr data, IMachine *machine)
> >      }
> >  
> >      for (i = 0; i < def->ndisks; i++) {
> > -        const char *src = virDomainDiskGetSource(def->disks[i]);
> > -        int type = virDomainDiskGetType(def->disks[i]);
> > -        int format = virDomainDiskGetFormat(def->disks[i]);
> > +        disk = def->disks[i];
> > +        src = virDomainDiskGetSource(disk);
> > +        type = virDomainDiskGetType(disk);
> > +        format = virDomainDiskGetFormat(disk);
> > +        deviceType = DeviceType_Null;
> > +        accessMode = AccessMode_ReadOnly;
> > +        devicePort = disk->info.addr.drive.unit;
> > +        deviceSlot = disk->info.addr.drive.bus;
> >  
> >          VIR_DEBUG("disk(%zu) type:       %d", i, type);
> > -        VIR_DEBUG("disk(%zu) device:     %d", i, def->disks[i]-
> > >device);
> > -        VIR_DEBUG("disk(%zu) bus:        %d", i, def->disks[i]-
> > >bus);
> > +        VIR_DEBUG("disk(%zu) device:     %d", i, disk->device);
> > +        VIR_DEBUG("disk(%zu) bus:        %d", i, disk->bus);
> >          VIR_DEBUG("disk(%zu) src:        %s", i, src);
> > -        VIR_DEBUG("disk(%zu) dst:        %s", i, def->disks[i]-
> > >dst);once vboxIID will (probably) be removed in separate patches
> > at some point in the future, I'd rather leave this patch "as is"
> > for now.
> > +        VIR_DEBUG("disk(%zu) dst:        %s", i, disk->dst);
> >          VIR_DEBUG("disk(%zu) driverName: %s", i,
> > -                  virDomainDiskGetDriver(def->disks[i]));
> > +                  virDomainDiskGetDriver(disk));
> >          VIR_DEBUG("disk(%zu) driverType: %s", i,
> >                    virStorageFileFormatTypeToString(format));
> > -        VIR_DEBUG("disk(%zu) cachemode:  %d", i, def->disks[i]-
> > >cachemode);
> > -        VIR_DEBUG("disk(%zu) readonly:   %s", i, (def->disks[i]-
> > >src->readonly
> > +        VIR_DEBUG("disk(%zu) cachemode:  %d", i, disk->cachemode);
> > +        VIR_DEBUG("disk(%zu) readonly:   %s", i, (disk->src-
> > >readonly
> >                                               ? "True" : "False"));
> > -        VIR_DEBUG("disk(%zu) shared:     %s", i, (def->disks[i]-
> > >src->shared
> > +        VIR_DEBUG("disk(%zu) shared:     %s", i, (disk->src-
> > >shared
> >                                               ? "True" : "False"));
> >  
> >          if (type == VIR_STORAGE_TYPE_FILE && src) {
> > -            IMedium *medium = NULL;
> > -            vboxIID mediumUUID;
> > -            PRUnichar *mediumFileUtf16 = NULL;
> > -            PRUint32 deviceType = DeviceType_Null;
> > -            PRUint32 accessMode = AccessMode_ReadOnly;
> > -            PRInt32 devicePort = def->disks[i]-
> > >info.addr.drive.unit;
> > -            PRInt32 deviceSlot = def->disks[i]-
> > >info.addr.drive.bus;
> > -
> > -            VBOX_IID_INITIALIZE(&mediumUUID);
> >              VBOX_UTF8_TO_UTF16(src, &mediumFileUtf16);
> >  
> > -            if (def->disks[i]->device ==
> > VIR_DOMAIN_DISK_DEVICE_DISK) {
> > +            if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) {
> >                  deviceType = DeviceType_HardDisk;
> >                  accessMode = AccessMode_ReadWrite;
> > -            } else if (def->disks[i]->device ==
> > VIR_DOMAIN_DISK_DEVICE_CDROM) {
> > +            } else if (disk->device ==
> > VIR_DOMAIN_DISK_DEVICE_CDROM) {
> >                  deviceType = DeviceType_DVD;
> >                  accessMode = AccessMode_ReadOnly;
> > -            } else if (def->disks[i]->device ==
> > VIR_DOMAIN_DISK_DEVICE_FLOPPY) {
> > +            } else if (disk->device ==
> > VIR_DOMAIN_DISK_DEVICE_FLOPPY) {
> >                  deviceType = DeviceType_Floppy;
> >                  accessMode = AccessMode_ReadWrite;
> >              } else {
> > -                VBOX_UTF16_FREE(mediumFileUtf16);
> > -                continue;
> > +                goto cleanup;
> >              }
> >  
> >              gVBoxAPI.UIVirtualBox.FindHardDisk(data->vboxObj,
> > mediumFileUtf16,
> >                                                 deviceType,
> > accessMode, &medium);
> >  
> >              if (!medium) {
> > -                PRUnichar *mediumEmpty = NULL;
> > -
> >                  VBOX_UTF8_TO_UTF16("", &mediumEmpty);
> >  
> >                  rc = gVBoxAPI.UIVirtualBox.OpenMedium(data-
> > >vboxObj,
> > @@ -1066,45 +1068,41 @@ vboxAttachDrives(virDomainDefPtr def,
> > vboxDriverPtr data, IMachine *machine)
> >              if (!medium) {
> >                  virReportError(VIR_ERR_INTERNAL_ERROR,
> >                                 _("Failed to attach the following
> > disk/dvd/floppy "
> > -                                 "to the machine: %s, rc=%08x"),
> > -                               src, (unsigned)rc);
> > -                VBOX_UTF16_FREE(mediumFileUtf16);
> > -                continue;
> > +                                 "to the machine: %s, rc=%08x"),
> > src, rc);
> > +                goto cleanup;
> >              }
> >  
> >              rc = gVBoxAPI.UIMedium.GetId(medium, &mediumUUID);
> >              if (NS_FAILED(rc)) {
> >                  virReportError(VIR_ERR_INTERNAL_ERROR,
> > -                               _("can't get the uuid of the file
> > to be attached "
> > +                               _("Can't get the UUID of the file
> > to be attached "
> >                                   "as harddisk/dvd/floppy: %s,
> > rc=%08x"),
> > -                               src, (unsigned)rc);
> > -                VBOX_MEDIUM_RELEASE(medium);
> > -                VBOX_UTF16_FREE(mediumFileUtf16);
> > -                continue;
> > +                               src, rc);
> > +                goto cleanup;
> >              }
> >  
> > -            if (def->disks[i]->device ==
> > VIR_DOMAIN_DISK_DEVICE_DISK) {
> > -                if (def->disks[i]->src->readonly) {
> > +            if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) {
> > +                if (disk->src->readonly) {
> >                      gVBoxAPI.UIMedium.SetType(medium,
> > MediumType_Immutable);
> > -                    VIR_DEBUG("setting harddisk to immutable");
> > -                } else if (!def->disks[i]->src->readonly) {
> > +                    VIR_DEBUG("Setting harddisk to immutable");
> > +                } else if (!disk->src->readonly) {
> >                      gVBoxAPI.UIMedium.SetType(medium,
> > MediumType_Normal);
> > -                    VIR_DEBUG("setting harddisk type to normal");
> > +                    VIR_DEBUG("Setting harddisk type to normal");
> >                  }
> >              }
> >  
> > -            if (def->disks[i]->bus == VIR_DOMAIN_DISK_BUS_IDE) {
> > +            if (disk->bus == VIR_DOMAIN_DISK_BUS_IDE) {
> >                  VBOX_UTF8_TO_UTF16("IDE Controller",
> > &storageCtlName);
> >                  devicePort = def->disks[i]->info.addr.drive.bus;
> >                  deviceSlot = def->disks[i]->info.addr.drive.unit;
> > -            } else if (def->disks[i]->bus ==
> > VIR_DOMAIN_DISK_BUS_SATA) {
> > +            } else if (disk->bus == VIR_DOMAIN_DISK_BUS_SATA) {
> >                  VBOX_UTF8_TO_UTF16("SATA Controller",
> > &storageCtlName);
> > -            } else if (def->disks[i]->bus ==
> > VIR_DOMAIN_DISK_BUS_SCSI) {
> > +            } else if (disk->bus == VIR_DOMAIN_DISK_BUS_SCSI) {
> >                  VBOX_UTF8_TO_UTF16("SCSI Controller",
> > &storageCtlName);
> > -            } else if (def->disks[i]->bus ==
> > VIR_DOMAIN_DISK_BUS_FDC) {
> > +            } else if (disk->bus == VIR_DOMAIN_DISK_BUS_FDC) {
> >                  VBOX_UTF8_TO_UTF16("Floppy Controller",
> > &storageCtlName);
> >                  devicePort = 0;
> > -                deviceSlot = def->disks[i]->info.addr.drive.unit;
> > +                deviceSlot = disk->info.addr.drive.unit;
> >              }
> >  
> >              /* attach the harddisk/dvd/Floppy to the storage
> > controller */
> > @@ -1117,13 +1115,12 @@ vboxAttachDrives(virDomainDefPtr def,
> > vboxDriverPtr data, IMachine *machine)
> >  
> >              if (NS_FAILED(rc)) {
> >                  virReportError(VIR_ERR_INTERNAL_ERROR,
> > -                               _("could not attach the file as "
> > -                                 "harddisk/dvd/floppy: %s,
> > rc=%08x"),
> > -                               src, (unsigned)rc);
> > +                               _("Could not attach the file as "
> > +                                 "harddisk/dvd/floppy: %s,
> > rc=%08x"), src, rc);
> >              } else {
> >                  DEBUGIID("Attached HDD/DVD/Floppy with UUID",
> > &mediumUUID);
> >              }
> > -
> > + cleanup:
> >              VBOX_MEDIUM_RELEASE(medium);
> >              vboxIIDUnalloc(&mediumUUID);
> >              VBOX_UTF16_FREE(mediumFileUtf16);
> > 
> 
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list




More information about the libvir-list mailing list