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 <hhan@xxxxxxxxxx> > --- > 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@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list