On 07/04/2018 05:04 AM, Han Han wrote:
> Adding usb bus address support to the optional address parameter of virsh
> attach-disk. The address is used as bus:port. e.g.
> usb:1:1
> 
> Signed-off-by: Han Han <h...@redhat.com>
> ---
>  tools/virsh-domain.c | 38 +++++++++++++++++++++++++++++++++++++-
>  tools/virsh.pod      |  2 +-
>  2 files changed, 38 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
> index e9b88f0013..5a445eff44 100644
> --- a/tools/virsh-domain.c
> +++ b/tools/virsh-domain.c
> @@ -319,6 +319,7 @@ enum {
>      DISK_ADDR_TYPE_SCSI,
>      DISK_ADDR_TYPE_IDE,
>      DISK_ADDR_TYPE_CCW,
> +    DISK_ADDR_TYPE_USB,
>  };
>  
>  struct PCIAddress {
> @@ -346,6 +347,11 @@ struct CCWAddress {
>      unsigned int devno;
>  };
>  
> +struct USBAddress {
> +    unsigned int bus;
> +    unsigned int port;
> +};
> +
>  struct DiskAddress {
>      int type;
>      union {
> @@ -353,6 +359,7 @@ struct DiskAddress {
>          struct SCSIAddress scsi;
>          struct IDEAddress ide;
>          struct CCWAddress ccw;
> +        struct USBAddress usb;
>      } addr;
>  };
>  
> @@ -460,10 +467,32 @@ static int str2CCWAddress(const char *str, struct 
> CCWAddress *ccwAddr)
>      return 0;
>  }
>  
> +static int str2USBAddress(const char *str, struct USBAddress *usbAddr)
> +{
> +    char *bus, *port;
> +
> +    if (!usbAddr)
> +        return -1;
> +    if (!str)
> +        return -1;
> +
> +    bus = (char *)str;
> +
> +    if (virStrToLong_uip(bus, &port, 10, &usbAddr->bus) != 0)
> +        return -1;
> +
> +    port++;
> +    if (virStrToLong_uip(port, NULL, 10, &usbAddr->port) != 0)
> +        return -1;
> +
> +    return 0;
> +}
> +
>  /* pci address pci:0000.00.0x0a.0 (domain:bus:slot:function)
>   * ide disk address: ide:00.00.0 (controller:bus:unit)
>   * scsi disk address: scsi:00.00.0 (controller:bus:unit)
>   * ccw disk address: ccw:0xfe.0.0000 (cssid:ssid:devno)
> + * usb disk address: usb:00.00 (bus:port)
>   */
>  
>  static int str2DiskAddress(const char *str, struct DiskAddress *diskAddr)
> @@ -492,6 +521,9 @@ static int str2DiskAddress(const char *str, struct 
> DiskAddress *diskAddr)
>      } else if (STREQLEN(type, "ccw", addr - type)) {
>          diskAddr->type = DISK_ADDR_TYPE_CCW;
>          return str2CCWAddress(addr + 1, &diskAddr->addr.ccw);
> +    } else if (STREQLEN(type, "usb", addr - type)) {
> +        diskAddr->type = DISK_ADDR_TYPE_USB;
> +        return str2USBAddress(addr + 1, &diskAddr->addr.usb);
>      }
>  
>      return -1;
> @@ -648,8 +680,12 @@ cmdAttachDisk(vshControl *ctl, const vshCmd *cmd)
>                                    " bus='%u' unit='%llu' />\n",
>                                    diskAddr.addr.scsi.controller, 
> diskAddr.addr.scsi.bus,
>                                    diskAddr.addr.scsi.unit);
> +            } else if (diskAddr.type == DISK_ADDR_TYPE_USB) {
> +                virBufferAsprintf(&buf,
> +                                  "<address type='usb' bus='%u' port='%u' 
> />\n",
> +                                  diskAddr.addr.usb.bus, 
> diskAddr.addr.usb.port);
>              } else {
> -                vshError(ctl, "%s", _("expecting a scsi:00.00.00 address."));
> +                vshError(ctl, "%s", _("expecting a scsi:00.00.00 or 
> usb:00.00 address."));
>                  goto cleanup;
>              }
>          } else if (STRPREFIX((const char *)target, "hd")) {
> diff --git a/tools/virsh.pod b/tools/virsh.pod
> index dc100db9f3..2ca1b8f7a2 100644
> --- a/tools/virsh.pod
> +++ b/tools/virsh.pod
> @@ -3060,7 +3060,7 @@ this disk may be attached (QEMU only).
>  I<serial> is the serial of disk device. I<wwn> is the wwn of disk device.
>  I<rawio> indicates the disk needs rawio capability.
>  I<address> is the address of disk device in the form of 
> pci:domain.bus.slot.function,
> -scsi:controller.bus.unit, ide:controller.bus.unit or ccw:cssid.ssid.devno.
> +scsi:controller.bus.unit, ide:controller.bus.unit, usb:bus:port or 
> ccw:cssid.ssid.devno.

Actually, it's usb:bus.port ;-) And also I'm breaking this long line
(which gets even longer after next patch).

Fixed and ACKed.

Michal

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to