mirror of
https://github.com/qemu/qemu.git
synced 2024-11-23 19:03:38 +08:00
usb-host: fix host close
The whole usb_host_close() function is skipped in case the device is not in attached state. This is wrong though, only then usb_device_detach() must be skipped, all other cleanup (especially device reset and closing the file handle) still needs to be done. There are code paths where usb_host_close() is called with the device in detached state already. This fixes usb-host devices not being released and returned to the host after removing them with device_del. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
db80358a20
commit
39fba3ada9
@ -1349,7 +1349,7 @@ static int usb_host_close(USBHostDevice *dev)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (dev->fd == -1 || !dev->dev.attached) {
|
if (dev->fd == -1) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1367,7 +1367,9 @@ static int usb_host_close(USBHostDevice *dev)
|
|||||||
}
|
}
|
||||||
async_complete(dev);
|
async_complete(dev);
|
||||||
dev->closing = 0;
|
dev->closing = 0;
|
||||||
usb_device_detach(&dev->dev);
|
if (dev->dev.attached) {
|
||||||
|
usb_device_detach(&dev->dev);
|
||||||
|
}
|
||||||
ioctl(dev->fd, USBDEVFS_RESET);
|
ioctl(dev->fd, USBDEVFS_RESET);
|
||||||
close(dev->fd);
|
close(dev->fd);
|
||||||
dev->fd = -1;
|
dev->fd = -1;
|
||||||
|
Loading…
Reference in New Issue
Block a user