<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">2014-02-17 16:31 GMT+08:00 Cedric Bosdonnat <span dir="ltr"><<a href="mailto:cbosdonnat@suse.com" target="_blank">cbosdonnat@suse.com</a>></span>:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello ChunYan,<br>
<br>
Good to see your patchset into smaller pieces. This patch looks almost<br>
OK for me, but there are problems you'll need to look into.<br>
<div><div class="h5"><br>
On Mon, 2014-02-17 at 14:32 +0800, Chunyan Liu wrote:<br>
> Add driver info to used_by, to avoid conflict among different drivers if there<br>
> are more than one drivers existing and using the hostdev.<br>
><br>
> Signed-off-by: Chunyan Liu <<a href="mailto:cyliu@suse.com">cyliu@suse.com</a>><br>
> ---<br>
>  src/lxc/lxc_hostdev.c   |   11 +++++++----<br>
>  src/qemu/qemu_conf.h    |    2 ++<br>
>  src/qemu/qemu_driver.c  |    8 ++++----<br>
>  src/qemu/qemu_hostdev.c |   41 +++++++++++++++++++++++++----------------<br>
>  src/util/virpci.c       |   30 +++++++++++++++++++++++-------<br>
>  src/util/virpci.h       |    9 ++++++---<br>
>  src/util/virscsi.c      |   30 ++++++++++++++++++++++--------<br>
>  src/util/virscsi.h      |    7 +++++--<br>
>  src/util/virusb.c       |   29 ++++++++++++++++++++++-------<br>
>  src/util/virusb.h       |    8 ++++++--<br>
>  tests/virscsitest.c     |    6 +++---<br>
>  11 files changed, 125 insertions(+), 56 deletions(-)<br>
><br>
> diff --git a/src/lxc/lxc_hostdev.c b/src/lxc/lxc_hostdev.c<br>
> index 3b371fc..77ce965 100644<br>
> --- a/src/lxc/lxc_hostdev.c<br>
> +++ b/src/lxc/lxc_hostdev.c<br>
> @@ -60,7 +60,7 @@ virLXCUpdateActiveUsbHostdevs(virLXCDriverPtr driver,<br>
>              continue;<br>
>          }<br>
><br>
> -        virUSBDeviceSetUsedBy(usb, def->name);<br>
> +        virUSBDeviceSetUsedBy(usb, "QEMU", def->name);<br>
<br>
</div></div>You meant LXC_DRIVER_NAME rather than "QEMU" here, right?<br>
<div class=""><br>
>          virObjectLock(driver->activeUsbHostdevs);<br>
>          if (virUSBDeviceListAdd(driver->activeUsbHostdevs, usb) < 0) {<br>
> @@ -90,7 +90,9 @@ virLXCPrepareHostdevUSBDevices(virLXCDriverPtr driver,<br>
>      for (i = 0; i < count; i++) {<br>
>          virUSBDevicePtr usb = virUSBDeviceListGet(list, i);<br>
>          if ((tmp = virUSBDeviceListFind(driver->activeUsbHostdevs, usb))) {<br>
> -            const char *other_name = virUSBDeviceGetUsedBy(tmp);<br>
> +            const char *other_name = NULL;<br>
> +            const char *other_drvname = NULL;<br>
> +            virUSBDeviceGetUsedBy(tmp, &other_drvname, &other_name);<br>
><br>
>              if (other_name)<br>
>                  virReportError(VIR_ERR_OPERATION_INVALID,<br>
> @@ -103,7 +105,7 @@ virLXCPrepareHostdevUSBDevices(virLXCDriverPtr driver,<br>
>              goto error;<br>
>          }<br>
><br>
> -        virUSBDeviceSetUsedBy(usb, name);<br>
> +        virUSBDeviceSetUsedBy(usb, "QEMU", name);<br>
<br>
</div>Same here, I guess that should be LXC_DRIVER_NAME, no?<br>
<div class=""><br>
>          VIR_DEBUG("Adding %03d.%03d dom=%s to activeUsbHostdevs",<br>
>                    virUSBDeviceGetBus(usb), virUSBDeviceGetDevno(usb), name);<br>
>          /*<br>
> @@ -352,6 +354,7 @@ virLXCDomainReAttachHostUsbDevices(virLXCDriverPtr driver,<br>
>          virDomainHostdevDefPtr hostdev = hostdevs[i];<br>
>          virUSBDevicePtr usb, tmp;<br>
>          const char *used_by = NULL;<br>
> +        const char *used_by_drvname = NULL;<br>
><br>
>          if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)<br>
>              continue;<br>
> @@ -389,7 +392,7 @@ virLXCDomainReAttachHostUsbDevices(virLXCDriverPtr driver,<br>
>              continue;<br>
>          }<br>
><br>
> -        used_by = virUSBDeviceGetUsedBy(tmp);<br>
> +        virUSBDeviceGetUsedBy(tmp, &used_by_drvname, &used_by);<br>
<br>
</div>Where is used_by_drvname used? If that really isn't used, then replacing<br>
it by NULL would be fine.<br>
<div><div class="h5"><br>
>          if (STREQ_NULLABLE(used_by, name)) {<br>
>              VIR_DEBUG("Removing %03d.%03d dom=%s from activeUsbHostdevs",<br>
>                        hostdev->source.subsys.u.usb.bus,<br>
> diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h<br>
> index 1f44a76..158cc1a 100644<br>
> --- a/src/qemu/qemu_conf.h<br>
> +++ b/src/qemu/qemu_conf.h<br>
> @@ -53,6 +53,8 @@<br>
>  #  error "Port me"<br>
>  # endif<br>
><br>
> +# define QEMU_DRIVER_NAME "QEMU"<br>
> +<br>
>  typedef struct _virQEMUDriver virQEMUDriver;<br>
>  typedef virQEMUDriver *virQEMUDriverPtr;<br>
><br>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c<br>
> index 59e018d..1fe8992 100644<br>
> --- a/src/qemu/qemu_driver.c<br>
> +++ b/src/qemu/qemu_driver.c<br>
> @@ -97,8 +97,6 @@<br>
><br>
>  #define VIR_FROM_THIS VIR_FROM_QEMU<br>
><br>
> -#define QEMU_DRIVER_NAME "QEMU"<br>
> -<br>
>  #define QEMU_NB_MEM_PARAM  3<br>
><br>
>  #define QEMU_NB_BLOCK_IO_TUNE_PARAM  6<br>
> @@ -11325,7 +11323,9 @@ qemuNodeDeviceReAttach(virNodeDevicePtr dev)<br>
>      virObjectLock(driver->inactivePciHostdevs);<br>
>      other = virPCIDeviceListFind(driver->activePciHostdevs, pci);<br>
>      if (other) {<br>
> -        const char *other_name = virPCIDeviceGetUsedBy(other);<br>
> +        const char *other_name = NULL;<br>
> +        const char *other_drvname = NULL;<br>
> +        virPCIDeviceGetUsedBy(other, &other_drvname, &other_name);<br>
<br>
</div></div>Is other_drvname used any here? Seems not from the patch, so using </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"> NULLwould surely be preferable.</blockquote>
<div> <br>Not used in this patch since tmp_drvname check is always 'success' within the qemu<br> code. It will be used when switching to using common library. I'll change it.<br><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

<div><div class="h5"><br>
>          if (other_name)<br>
>              virReportError(VIR_ERR_OPERATION_INVALID,<br>
> @@ -16684,7 +16684,7 @@ static virDriver qemuDriver = {<br>
><br>
><br>
>  static virStateDriver qemuStateDriver = {<br>
> -    .name = "QEMU",<br>
> +    .name = QEMU_DRIVER_NAME,<br>
>      .stateInitialize = qemuStateInitialize,<br>
>      .stateAutoStart = qemuStateAutoStart,<br>
>      .stateCleanup = qemuStateCleanup,<br>
> diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c<br>
> index 1b16386..01c24f9 100644<br>
> --- a/src/qemu/qemu_hostdev.c<br>
> +++ b/src/qemu/qemu_hostdev.c<br>
> @@ -177,7 +177,7 @@ qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver,<br>
>                  goto cleanup;<br>
><br>
>          }<br>
> -        virPCIDeviceSetUsedBy(dev, def->name);<br>
> +        virPCIDeviceSetUsedBy(dev, QEMU_DRIVER_NAME, def->name);<br>
><br>
>          /* Setup the original states for the PCI device */<br>
>          virPCIDeviceSetUnbindFromStub(dev, hostdev->origstates.states.pci.unbind_from_stub);<br>
> @@ -230,7 +230,7 @@ qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver,<br>
>              continue;<br>
>          }<br>
><br>
> -        virUSBDeviceSetUsedBy(usb, def->name);<br>
> +        virUSBDeviceSetUsedBy(usb, QEMU_DRIVER_NAME, def->name);<br>
><br>
>          if (virUSBDeviceListAdd(driver->activeUsbHostdevs, usb) < 0) {<br>
>              virUSBDeviceFree(usb);<br>
> @@ -274,13 +274,13 @@ qemuUpdateActiveScsiHostdevs(virQEMUDriverPtr driver,<br>
>              goto cleanup;<br>
><br>
>          if ((tmp = virSCSIDeviceListFind(driver->activeScsiHostdevs, scsi))) {<br>
> -            if (virSCSIDeviceSetUsedBy(tmp, def->name) < 0) {<br>
> +            if (virSCSIDeviceSetUsedBy(tmp, QEMU_DRIVER_NAME, def->name) < 0) {<br>
>                  virSCSIDeviceFree(scsi);<br>
>                  goto cleanup;<br>
>              }<br>
>              virSCSIDeviceFree(scsi);<br>
>          } else {<br>
> -            if (virSCSIDeviceSetUsedBy(scsi, def->name) < 0 ||<br>
> +            if (virSCSIDeviceSetUsedBy(scsi, QEMU_DRIVER_NAME, def->name) < 0 ||<br>
>                  virSCSIDeviceListAdd(driver->activeScsiHostdevs, scsi) < 0) {<br>
>                  virSCSIDeviceFree(scsi);<br>
>                  goto cleanup;<br>
> @@ -693,7 +693,9 @@ qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver,<br>
>           * the dev is in list driver->activePciHostdevs.<br>
>           */<br>
>          if ((other = virPCIDeviceListFind(driver->activePciHostdevs, dev))) {<br>
> -            const char *other_name = virPCIDeviceGetUsedBy(other);<br>
> +            const char *other_name = NULL;<br>
> +            const char *other_drvname = NULL;<br>
> +            virPCIDeviceGetUsedBy(other, &other_drvname, &other_name);<br>
<br>
</div></div>Again, other_drvname seems to be unused.<br>
<div class=""><br>
>              if (other_name)<br>
>                  virReportError(VIR_ERR_OPERATION_INVALID,<br>
> @@ -766,7 +768,7 @@ qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver,<br>
>          activeDev = virPCIDeviceListFind(driver->activePciHostdevs, dev);<br>
><br>
>          if (activeDev)<br>
> -            virPCIDeviceSetUsedBy(activeDev, name);<br>
> +            virPCIDeviceSetUsedBy(activeDev, QEMU_DRIVER_NAME, name);<br>
>      }<br>
><br>
>      /* Loop 8: Now set the original states for hostdev def */<br>
> @@ -857,7 +859,9 @@ qemuPrepareHostdevUSBDevices(virQEMUDriverPtr driver,<br>
>      for (i = 0; i < count; i++) {<br>
>          virUSBDevicePtr usb = virUSBDeviceListGet(list, i);<br>
>          if ((tmp = virUSBDeviceListFind(driver->activeUsbHostdevs, usb))) {<br>
> -            const char *other_name = virUSBDeviceGetUsedBy(tmp);<br>
> +            const char *other_name = NULL;<br>
> +            const char *other_drvname = NULL;<br>
> +            virUSBDeviceGetUsedBy(tmp, &other_drvname, &other_name);<br>
<br>
</div>Here too.<br>
<div><div class="h5"><br>
>              if (other_name)<br>
>                  virReportError(VIR_ERR_OPERATION_INVALID,<br>
> @@ -870,7 +874,7 @@ qemuPrepareHostdevUSBDevices(virQEMUDriverPtr driver,<br>
>              goto error;<br>
>          }<br>
><br>
> -        virUSBDeviceSetUsedBy(usb, name);<br>
> +        virUSBDeviceSetUsedBy(usb, QEMU_DRIVER_NAME, name);<br>
>          VIR_DEBUG("Adding %03d.%03d dom=%s to activeUsbHostdevs",<br>
>                    virUSBDeviceGetBus(usb), virUSBDeviceGetDevno(usb), name);<br>
>          /*<br>
> @@ -1140,10 +1144,10 @@ qemuPrepareHostdevSCSIDevices(virQEMUDriverPtr driver,<br>
>                  goto error;<br>
>              }<br>
><br>
> -            if (virSCSIDeviceSetUsedBy(tmp, name) < 0)<br>
> +            if (virSCSIDeviceSetUsedBy(tmp, QEMU_DRIVER_NAME, name) < 0)<br>
>                  goto error;<br>
>          } else {<br>
> -            if (virSCSIDeviceSetUsedBy(scsi, name) < 0)<br>
> +            if (virSCSIDeviceSetUsedBy(scsi, QEMU_DRIVER_NAME, name) < 0)<br>
>                  goto error;<br>
><br>
>              VIR_DEBUG("Adding %s to activeScsiHostdevs", virSCSIDeviceGetName(scsi));<br>
> @@ -1275,10 +1279,14 @@ qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver,<br>
>           * been used by this domain.<br>
>           */<br>
>          activeDev = virPCIDeviceListFind(driver->activePciHostdevs, dev);<br>
> -        if (activeDev &&<br>
> -            STRNEQ_NULLABLE(name, virPCIDeviceGetUsedBy(activeDev))) {<br>
> -            virPCIDeviceListDel(pcidevs, dev);<br>
> -            continue;<br>
> +        if (activeDev) {<br>
> +                const char *tmp_name = NULL;<br>
> +                const char *tmp_drvname = NULL;<br>
> +                virPCIDeviceGetUsedBy(activeDev, &tmp_drvname, &tmp_name);<br>
<br>
</div></div>Is tmp_drvname actually used?<br></blockquote><div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div class=""><br>
> +                if (STRNEQ_NULLABLE(name, tmp_name)) {<br>
> +                    virPCIDeviceListDel(pcidevs, dev);<br>
> +                    continue;<br>
> +                }<br>
>          }<br>
><br>
>          virPCIDeviceListDel(driver->activePciHostdevs, dev);<br>
> @@ -1333,6 +1341,7 @@ qemuDomainReAttachHostUsbDevices(virQEMUDriverPtr driver,<br>
>          virDomainHostdevDefPtr hostdev = hostdevs[i];<br>
>          virUSBDevicePtr usb, tmp;<br>
>          const char *used_by = NULL;<br>
> +        const char *used_by_drvname = NULL;<br>
><br>
>          if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)<br>
>              continue;<br>
> @@ -1370,7 +1379,7 @@ qemuDomainReAttachHostUsbDevices(virQEMUDriverPtr driver,<br>
>              continue;<br>
>          }<br>
><br>
> -        used_by = virUSBDeviceGetUsedBy(tmp);<br>
> +        virUSBDeviceGetUsedBy(tmp, &used_by_drvname, &used_by);<br>
<br>
</div>Same here, used_by_drvname isn't used.<br>
<div class=""><br>
>          if (STREQ_NULLABLE(used_by, name)) {<br>
>              VIR_DEBUG("Removing %03d.%03d dom=%s from activeUsbHostdevs",<br>
>                        hostdev->source.subsys.u.usb.bus,<br>
> @@ -1445,7 +1454,7 @@ qemuDomainReAttachHostScsiDevices(virQEMUDriverPtr driver,<br>
>                     hostdev->source.subsys.u.scsi.unit,<br>
>                     name);<br>
><br>
> -        virSCSIDeviceListDel(driver->activeScsiHostdevs, tmp, name);<br>
> +        virSCSIDeviceListDel(driver->activeScsiHostdevs, tmp, QEMU_DRIVER_NAME, name);<br>
>          virSCSIDeviceFree(scsi);<br>
>      }<br>
>      virObjectUnlock(driver->activeScsiHostdevs);<br>
> diff --git a/src/util/virpci.c b/src/util/virpci.c<br>
> index 00d1064..4ea2bcf 100644<br>
> --- a/src/util/virpci.c<br>
> +++ b/src/util/virpci.c<br>
> @@ -59,7 +59,10 @@ struct _virPCIDevice {<br>
>      char          name[PCI_ADDR_LEN]; /* domain:bus:slot.function */<br>
>      char          id[PCI_ID_LEN];     /* product vendor */<br>
>      char          *path;<br>
> -    const char    *used_by;           /* The domain which uses the device */<br>
> +<br>
> +    /* The driver:domain which uses the device */<br>
> +    char          *used_by_drvname;<br>
> +    char          *used_by_domname;<br>
<br>
</div>Why changing from const char* to char*?<br></blockquote><div><br>used_by_domname is better to be char *, we can never be sure when someone uses <br>this this API with a string that they free sooner than we expect. Much safer to <br>
strdup the parameter. And used_by_drvname is just a parallel.<br>Will check and correct the memory leak.<br></div><div> .</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

<div class=""><br>
>      unsigned int  pcie_cap_pos;<br>
>      unsigned int  pci_pm_cap_pos;<br>
> @@ -1635,6 +1638,8 @@ virPCIDeviceFree(virPCIDevicePtr dev)<br>
>      VIR_DEBUG("%s %s: freeing", dev->id, dev->name);<br>
>      VIR_FREE(dev->path);<br>
>      VIR_FREE(dev->stubDriver);<br>
> +    VIR_FREE(dev->used_by_drvname);<br>
> +    VIR_FREE(dev->used_by_domname);<br>
>      VIR_FREE(dev);<br>
>  }<br>
><br>
> @@ -1704,16 +1709,27 @@ virPCIDeviceSetReprobe(virPCIDevicePtr dev, bool reprobe)<br>
>      dev->reprobe = reprobe;<br>
>  }<br>
><br>
> -void<br>
> -virPCIDeviceSetUsedBy(virPCIDevicePtr dev, const char *name)<br>
> +int<br>
> +virPCIDeviceSetUsedBy(virPCIDevicePtr dev,<br>
> +                      const char *drv_name,<br>
> +                      const char *dom_name)<br>
>  {<br>
> -    dev->used_by = name;<br>
> +    if (VIR_STRDUP(dev->used_by_drvname, drv_name) < 0)<br>
> +        return -1;<br>
> +    if (VIR_STRDUP(dev->used_by_domname, dom_name) < 0)<br>
> +        return -1;<br>
> +<br>
<br>
</div>You will leak memory here if there was already a value set, You need to<br>
free dev->used_by_drvname and dev->used_by_domname before VIR_STRDUP'ing<br>
to them.<br>
<br>
However, it would be much more convenient to keep const char*.<br>
<div><div class="h5"><br>
> +    return 0;<br>
>  }<br>
><br>
> -const char *<br>
> -virPCIDeviceGetUsedBy(virPCIDevicePtr dev)<br>
> +void<br>
> +virPCIDeviceGetUsedBy(virPCIDevicePtr dev,<br>
> +                      const char **drv_name,<br>
> +                      const char **dom_name)<br>
>  {<br>
> -    return dev->used_by;<br>
> +    *drv_name = dev->used_by_drvname;<br>
> +    *dom_name = dev->used_by_domname;<br>
>  }<br>
><br>
>  void virPCIDeviceReattachInit(virPCIDevicePtr pci)<br>
> diff --git a/src/util/virpci.h b/src/util/virpci.h<br>
> index ac6dae1..20ffe54 100644<br>
> --- a/src/util/virpci.h<br>
> +++ b/src/util/virpci.h<br>
> @@ -66,9 +66,12 @@ int virPCIDeviceSetStubDriver(virPCIDevicePtr dev,<br>
>                                const char *driver)<br>
>      ATTRIBUTE_NONNULL(2);<br>
>  const char *virPCIDeviceGetStubDriver(virPCIDevicePtr dev);<br>
> -void virPCIDeviceSetUsedBy(virPCIDevice *dev,<br>
> -                           const char *used_by);<br>
> -const char *virPCIDeviceGetUsedBy(virPCIDevice *dev);<br>
> +int virPCIDeviceSetUsedBy(virPCIDevice *dev,<br>
> +                          const char *drv_name,<br>
> +                          const char *dom_name);<br>
> +void virPCIDeviceGetUsedBy(virPCIDevice *dev,<br>
> +                           const char **drv_name,<br>
> +                           const char **dom_name);<br>
>  unsigned int virPCIDeviceGetUnbindFromStub(virPCIDevicePtr dev);<br>
>  void  virPCIDeviceSetUnbindFromStub(virPCIDevice *dev,<br>
>                                      bool unbind);<br>
> diff --git a/src/util/virscsi.c b/src/util/virscsi.c<br>
> index acc3815..5e28328 100644<br>
> --- a/src/util/virscsi.c<br>
> +++ b/src/util/virscsi.c<br>
> @@ -47,6 +47,11 @@<br>
><br>
>  /* For virReportOOMError()  and virReportSystemError() */<br>
>  #define VIR_FROM_THIS VIR_FROM_NONE<br>
> +struct _virUsedByInfo {<br>
> +    char *drvname; /* which driver */<br>
> +    char *domname; /* which domain */<br>
> +};<br>
> +typedef struct _virUsedByInfo *virUsedByInfoPtr;<br>
><br>
>  struct _virSCSIDevice {<br>
>      unsigned int adapter;<br>
> @@ -57,7 +62,7 @@ struct _virSCSIDevice {<br>
>      char *name; /* adapter:bus:target:unit */<br>
>      char *id;   /* model:vendor */<br>
>      char *sg_path; /* e.g. /dev/sg2 */<br>
> -    char **used_by; /* name of the domains using this dev */<br>
> +    virUsedByInfoPtr *used_by; /* driver:domain(s) using this dev */<br>
>      size_t n_used_by; /* how many domains are using this dev */<br>
><br>
>      bool readonly;<br>
> @@ -274,19 +279,26 @@ virSCSIDeviceFree(virSCSIDevicePtr dev)<br>
>      VIR_FREE(dev->id);<br>
>      VIR_FREE(dev->name);<br>
>      VIR_FREE(dev->sg_path);<br>
> -    for (i = 0; i < dev->n_used_by; i++)<br>
> +    for (i = 0; i < dev->n_used_by; i++) {<br>
> +        VIR_FREE(dev->used_by[i]->drvname);<br>
> +        VIR_FREE(dev->used_by[i]->domname);<br>
>          VIR_FREE(dev->used_by[i]);<br>
> +    }<br>
>      VIR_FREE(dev->used_by);<br>
>      VIR_FREE(dev);<br>
>  }<br>
><br>
>  int<br>
>  virSCSIDeviceSetUsedBy(virSCSIDevicePtr dev,<br>
> -                       const char *name)<br>
> +                       const char *drvname,<br>
> +                       const char *domname)<br>
>  {<br>
> -    char *copy = NULL;<br>
> -<br>
> -    if (VIR_STRDUP(copy, name) < 0)<br>
> +    virUsedByInfoPtr copy;<br>
> +    if (VIR_ALLOC(copy) < 0)<br>
> +        return -1;<br>
> +    if (VIR_STRDUP(copy->drvname, drvname) < 0)<br>
> +        return -1;<br>
> +    if (VIR_STRDUP(copy->domname, domname) < 0)<br>
>          return -1;<br>
><br>
>      return VIR_APPEND_ELEMENT(dev->used_by, dev->n_used_by, copy);<br>
> @@ -427,13 +439,15 @@ virSCSIDeviceListSteal(virSCSIDeviceListPtr list,<br>
>  void<br>
>  virSCSIDeviceListDel(virSCSIDeviceListPtr list,<br>
>                       virSCSIDevicePtr dev,<br>
> -                     const char *name)<br>
> +                     const char *drvname,<br>
> +                     const char *domname)<br>
>  {<br>
>      virSCSIDevicePtr tmp = NULL;<br>
>      size_t i;<br>
><br>
>      for (i = 0; i < dev->n_used_by; i++) {<br>
> -        if (STREQ_NULLABLE(dev->used_by[i], name)) {<br>
> +        if (STREQ_NULLABLE(dev->used_by[i]->drvname, drvname) &&<br>
> +            STREQ_NULLABLE(dev->used_by[i]->domname, domname)) {<br>
>              if (dev->n_used_by > 1) {<br>
>                  VIR_DELETE_ELEMENT(dev->used_by, i, dev->n_used_by);<br>
<br>
</div></div>I'ld say that doesn't free everything. You'll need to VIR_FREE the<br>
dev->drvname and dev->domname before.<br>
<div><div class="h5"><br>
>              } else {<br>
> diff --git a/src/util/virscsi.h b/src/util/virscsi.h<br>
> index 1b685eb..c67837f 100644<br>
> --- a/src/util/virscsi.h<br>
> +++ b/src/util/virscsi.h<br>
> @@ -53,7 +53,9 @@ virSCSIDevicePtr virSCSIDeviceNew(const char *sysfs_prefix,<br>
>                                    bool shareable);<br>
><br>
>  void virSCSIDeviceFree(virSCSIDevicePtr dev);<br>
> -int virSCSIDeviceSetUsedBy(virSCSIDevicePtr dev, const char *name);<br>
> +int virSCSIDeviceSetUsedBy(virSCSIDevicePtr dev,<br>
> +                           const char *drvname,<br>
> +                           const char *domname);<br>
>  bool virSCSIDeviceIsAvailable(virSCSIDevicePtr dev);<br>
>  const char *virSCSIDeviceGetName(virSCSIDevicePtr dev);<br>
>  unsigned int virSCSIDeviceGetAdapter(virSCSIDevicePtr dev);<br>
> @@ -87,7 +89,8 @@ virSCSIDevicePtr virSCSIDeviceListSteal(virSCSIDeviceListPtr list,<br>
>                                          virSCSIDevicePtr dev);<br>
>  void virSCSIDeviceListDel(virSCSIDeviceListPtr list,<br>
>                            virSCSIDevicePtr dev,<br>
> -                          const char *name);<br>
> +                          const char *drvname,<br>
> +                          const char *domname);<br>
>  virSCSIDevicePtr virSCSIDeviceListFind(virSCSIDeviceListPtr list,<br>
>                                         virSCSIDevicePtr dev);<br>
><br>
> diff --git a/src/util/virusb.c b/src/util/virusb.c<br>
> index bb5980d..4e22973 100644<br>
> --- a/src/util/virusb.c<br>
> +++ b/src/util/virusb.c<br>
> @@ -55,7 +55,10 @@ struct _virUSBDevice {<br>
>      char          name[USB_ADDR_LEN]; /* domain:bus:slot.function */<br>
>      char          id[USB_ID_LEN];     /* product vendor */<br>
>      char          *path;<br>
> -    const char    *used_by;           /* name of the domain using this dev */<br>
> +<br>
> +    /* driver:domain using this dev */<br>
> +    char          *used_by_drvname;<br>
> +    char          *used_by_domname;<br>
>  };<br>
<br>
</div></div>Again, why changing from const char* to char*? It will mostly lead to<br>
memory handling troubles.<br>
<div class=""><br>
>  struct _virUSBDeviceList {<br>
> @@ -375,19 +378,31 @@ virUSBDeviceFree(virUSBDevicePtr dev)<br>
>          return;<br>
>      VIR_DEBUG("%s %s: freeing", dev->id, dev->name);<br>
>      VIR_FREE(dev->path);<br>
> +    VIR_FREE(dev->used_by_drvname);<br>
> +    VIR_FREE(dev->used_by_domname);<br>
>      VIR_FREE(dev);<br>
>  }<br>
><br>
> -<br>
> -void virUSBDeviceSetUsedBy(virUSBDevicePtr dev,<br>
> -                           const char *name)<br>
> +int<br>
> +virUSBDeviceSetUsedBy(virUSBDevicePtr dev,<br>
> +                      const char *drv_name,<br>
> +                      const char *dom_name)<br>
>  {<br>
> -    dev->used_by = name;<br>
> +    if (VIR_STRDUP(dev->used_by_drvname, drv_name) < 0)<br>
> +        return -1;<br>
> +    if (VIR_STRDUP(dev->used_by_domname, dom_name) < 0)<br>
> +        return -1;<br>
<br>
</div>What if there was already values set? There would be a memory leak:<br>
either use const char* or VIR_FREE before the VIR_STRDUP.<br>
<div><div class="h5"><br>
> +<br>
> +    return 0;<br>
>  }<br>
><br>
> -const char * virUSBDeviceGetUsedBy(virUSBDevicePtr dev)<br>
> +void<br>
> +virUSBDeviceGetUsedBy(virUSBDevicePtr dev,<br>
> +                      const char **drv_name,<br>
> +                      const char **dom_name)<br>
>  {<br>
> -    return dev->used_by;<br>
> +    *drv_name = dev->used_by_drvname;<br>
> +    *dom_name = dev->used_by_domname;<br>
>  }<br>
><br>
>  const char *virUSBDeviceGetName(virUSBDevicePtr dev)<br>
> diff --git a/src/util/virusb.h b/src/util/virusb.h<br>
> index e0a7c4c..f98ea21 100644<br>
> --- a/src/util/virusb.h<br>
> +++ b/src/util/virusb.h<br>
> @@ -60,8 +60,12 @@ int virUSBDeviceFind(unsigned int vendor,<br>
>                       virUSBDevicePtr *usb);<br>
><br>
>  void virUSBDeviceFree(virUSBDevicePtr dev);<br>
> -void virUSBDeviceSetUsedBy(virUSBDevicePtr dev, const char *name);<br>
> -const char *virUSBDeviceGetUsedBy(virUSBDevicePtr dev);<br>
> +int virUSBDeviceSetUsedBy(virUSBDevicePtr dev,<br>
> +                          const char *drv_name,<br>
> +                          const char *dom_name);<br>
> +void virUSBDeviceGetUsedBy(virUSBDevicePtr dev,<br>
> +                           const char **drv_name,<br>
> +                           const char **dom_name);<br>
>  const char *virUSBDeviceGetName(virUSBDevicePtr dev);<br>
><br>
>  unsigned int virUSBDeviceGetBus(virUSBDevicePtr dev);<br>
> diff --git a/tests/virscsitest.c b/tests/virscsitest.c<br>
> index d4b3e4a..586c41b 100644<br>
> --- a/tests/virscsitest.c<br>
> +++ b/tests/virscsitest.c<br>
> @@ -91,13 +91,13 @@ test2(const void *data ATTRIBUTE_UNUSED)<br>
>      if (!virSCSIDeviceIsAvailable(dev))<br>
>          goto cleanup;<br>
><br>
> -    if (virSCSIDeviceSetUsedBy(dev, "fc18") < 0)<br>
> +    if (virSCSIDeviceSetUsedBy(dev, "QEMU", "fc18") < 0)<br>
>          goto cleanup;<br>
><br>
>      if (virSCSIDeviceIsAvailable(dev))<br>
>          goto cleanup;<br>
><br>
> -    if (virSCSIDeviceSetUsedBy(dev, "fc20") < 0)<br>
> +    if (virSCSIDeviceSetUsedBy(dev, "QEMU", "fc20") < 0)<br>
>          goto cleanup;<br>
><br>
>      if (virSCSIDeviceIsAvailable(dev))<br>
> @@ -117,7 +117,7 @@ test2(const void *data ATTRIBUTE_UNUSED)<br>
>      if (!virSCSIDeviceListFind(list, dev))<br>
>          goto cleanup;<br>
><br>
> -    virSCSIDeviceListDel(list, dev, "fc20");<br>
> +    virSCSIDeviceListDel(list, dev, "QEMU", "fc20");<br>
><br>
>      if (!virSCSIDeviceListFind(list, dev))<br>
>          goto cleanup;<br>
<br>
</div></div>May be some tests with the "LXC" value couldn't harm.<br>
<br>
--<br>
Cedric<br>
<br>
</blockquote></div><br></div></div>