usbip: prevent bind loops on devices attached to vhci_hcd
usbip host binds to devices attached to vhci_hcd on the same server when user does attach over localhost or specifies the server as the remote. usbip attach -r localhost -b busid or usbip attach -r servername (or server IP) Unbind followed by bind works, however device is left in a bad state with accesses via the attached busid result in errors and system hangs during shutdown. Fix it to check and bail out if the device is already attached to vhci_hcd. Cc: stable@vger.kernel.org Signed-off-by: Shuah Khan <shuahkh@osg.samsung.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
f0b4198f07
commit
ef54cf0c60
|
@ -144,6 +144,7 @@ static int bind_device(char *busid)
|
||||||
int rc;
|
int rc;
|
||||||
struct udev *udev;
|
struct udev *udev;
|
||||||
struct udev_device *dev;
|
struct udev_device *dev;
|
||||||
|
const char *devpath;
|
||||||
|
|
||||||
/* Check whether the device with this bus ID exists. */
|
/* Check whether the device with this bus ID exists. */
|
||||||
udev = udev_new();
|
udev = udev_new();
|
||||||
|
@ -152,8 +153,16 @@ static int bind_device(char *busid)
|
||||||
err("device with the specified bus ID does not exist");
|
err("device with the specified bus ID does not exist");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
devpath = udev_device_get_devpath(dev);
|
||||||
udev_unref(udev);
|
udev_unref(udev);
|
||||||
|
|
||||||
|
/* If the device is already attached to vhci_hcd - bail out */
|
||||||
|
if (strstr(devpath, USBIP_VHCI_DRV_NAME)) {
|
||||||
|
err("bind loop detected: device: %s is attached to %s\n",
|
||||||
|
devpath, USBIP_VHCI_DRV_NAME);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
rc = unbind_other(busid);
|
rc = unbind_other(busid);
|
||||||
if (rc == UNBIND_ST_FAILED) {
|
if (rc == UNBIND_ST_FAILED) {
|
||||||
err("could not unbind driver from device on busid %s", busid);
|
err("could not unbind driver from device on busid %s", busid);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user