<div dir="ltr">Sorry for this stupid mistake. Thank you for reviewing.<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jul 9, 2018 at 11:20 PM, Michal Privoznik <span dir="ltr"><<a href="mailto:mprivozn@redhat.com" target="_blank">mprivozn@redhat.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On 07/04/2018 05:04 AM, Han Han wrote:<br>
> Adding usb bus address support to the optional address parameter of virsh<br>
> attach-disk. The address is used as bus:port. e.g.<br>
> usb:1:1<br>
> <br>
> Signed-off-by: Han Han <<a href="mailto:hhan@redhat.com">hhan@redhat.com</a>><br>
> ---<br>
>  tools/virsh-domain.c | 38 ++++++++++++++++++++++++++++++<wbr>+++++++-<br>
>  tools/virsh.pod      |  2 +-<br>
>  2 files changed, 38 insertions(+), 2 deletions(-)<br>
> <br>
> diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c<br>
> index e9b88f0013..5a445eff44 100644<br>
> --- a/tools/virsh-domain.c<br>
> +++ b/tools/virsh-domain.c<br>
> @@ -319,6 +319,7 @@ enum {<br>
>      DISK_ADDR_TYPE_SCSI,<br>
>      DISK_ADDR_TYPE_IDE,<br>
>      DISK_ADDR_TYPE_CCW,<br>
> +    DISK_ADDR_TYPE_USB,<br>
>  };<br>
>  <br>
>  struct PCIAddress {<br>
> @@ -346,6 +347,11 @@ struct CCWAddress {<br>
>      unsigned int devno;<br>
>  };<br>
>  <br>
> +struct USBAddress {<br>
> +    unsigned int bus;<br>
> +    unsigned int port;<br>
> +};<br>
> +<br>
>  struct DiskAddress {<br>
>      int type;<br>
>      union {<br>
> @@ -353,6 +359,7 @@ struct DiskAddress {<br>
>          struct SCSIAddress scsi;<br>
>          struct IDEAddress ide;<br>
>          struct CCWAddress ccw;<br>
> +        struct USBAddress usb;<br>
>      } addr;<br>
>  };<br>
>  <br>
> @@ -460,10 +467,32 @@ static int str2CCWAddress(const char *str, struct CCWAddress *ccwAddr)<br>
>      return 0;<br>
>  }<br>
>  <br>
> +static int str2USBAddress(const char *str, struct USBAddress *usbAddr)<br>
> +{<br>
> +    char *bus, *port;<br>
> +<br>
> +    if (!usbAddr)<br>
> +        return -1;<br>
> +    if (!str)<br>
> +        return -1;<br>
> +<br>
> +    bus = (char *)str;<br>
> +<br>
> +    if (virStrToLong_uip(bus, &port, 10, &usbAddr->bus) != 0)<br>
> +        return -1;<br>
> +<br>
> +    port++;<br>
> +    if (virStrToLong_uip(port, NULL, 10, &usbAddr->port) != 0)<br>
> +        return -1;<br>
> +<br>
> +    return 0;<br>
> +}<br>
> +<br>
>  /* pci address pci:0000.00.0x0a.0 (domain:bus:slot:function)<br>
>   * ide disk address: ide:00.00.0 (controller:bus:unit)<br>
>   * scsi disk address: scsi:00.00.0 (controller:bus:unit)<br>
>   * ccw disk address: ccw:0xfe.0.0000 (cssid:ssid:devno)<br>
> + * usb disk address: usb:00.00 (bus:port)<br>
>   */<br>
>  <br>
>  static int str2DiskAddress(const char *str, struct DiskAddress *diskAddr)<br>
> @@ -492,6 +521,9 @@ static int str2DiskAddress(const char *str, struct DiskAddress *diskAddr)<br>
>      } else if (STREQLEN(type, "ccw", addr - type)) {<br>
>          diskAddr->type = DISK_ADDR_TYPE_CCW;<br>
>          return str2CCWAddress(addr + 1, &diskAddr->addr.ccw);<br>
> +    } else if (STREQLEN(type, "usb", addr - type)) {<br>
> +        diskAddr->type = DISK_ADDR_TYPE_USB;<br>
> +        return str2USBAddress(addr + 1, &diskAddr->addr.usb);<br>
>      }<br>
>  <br>
>      return -1;<br>
> @@ -648,8 +680,12 @@ cmdAttachDisk(vshControl *ctl, const vshCmd *cmd)<br>
>                                    " bus='%u' unit='%llu' />\n",<br>
>                                    diskAddr.addr.scsi.controller, diskAddr.addr.scsi.bus,<br>
>                                    diskAddr.addr.scsi.unit);<br>
> +            } else if (diskAddr.type == DISK_ADDR_TYPE_USB) {<br>
> +                virBufferAsprintf(&buf,<br>
> +                                  "<address type='usb' bus='%u' port='%u' />\n",<br>
> +                                  diskAddr.addr.usb.bus, diskAddr.addr.usb.port);<br>
>              } else {<br>
> -                vshError(ctl, "%s", _("expecting a scsi:00.00.00 address."));<br>
> +                vshError(ctl, "%s", _("expecting a scsi:00.00.00 or usb:00.00 address."));<br>
>                  goto cleanup;<br>
>              }<br>
>          } else if (STRPREFIX((const char *)target, "hd")) {<br>
> diff --git a/tools/virsh.pod b/tools/virsh.pod<br>
> index dc100db9f3..2ca1b8f7a2 100644<br>
> --- a/tools/virsh.pod<br>
> +++ b/tools/virsh.pod<br>
> @@ -3060,7 +3060,7 @@ this disk may be attached (QEMU only).<br>
>  I<serial> is the serial of disk device. I<wwn> is the wwn of disk device.<br>
>  I<rawio> indicates the disk needs rawio capability.<br>
>  I<address> is the address of disk device in the form of pci:domain.bus.slot.function,<br>
> -scsi:controller.bus.unit, ide:controller.bus.unit or ccw:cssid.ssid.devno.<br>
> +scsi:controller.bus.unit, ide:controller.bus.unit, usb:bus:port or ccw:cssid.ssid.devno.<br>
<br>
</div></div>Actually, it's usb:bus.port ;-) And also I'm breaking this long line<br>
(which gets even longer after next patch).<br>
<br>
Fixed and ACKed.<br>
<span class="HOEnZb"><font color="#888888"><br>
Michal<br>
</font></span></blockquote></div><br><br clear="all"><br>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr">Best regards,</div><div dir="ltr">-----------------------------------<br></div><div dir="ltr">Han Han<br>Quality Engineer<br>Redhat.<br><br>Email: <a href="mailto:hhan@redhat.com" target="_blank">hhan@redhat.com</a><br>Phone: +861065339333<br></div></div></div></div></div></div>
</div>