aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorValentina Manea <valentina.manea.m@gmail.com>2014-03-08 07:53:34 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-03-09 01:48:43 -0500
commit6080cd0e9239469524d2aa07250ad4b9f383960d (patch)
tree0682e223b8d1345188251e6dd6b05fc1fb4f63c6
parenta46034ca57ed6bdbb574a46ca3453061946b62f9 (diff)
staging: usbip: claim ports used by shared devices
A device should not be able to be used concurrently both by the server and the client. Claiming the port used by the shared device ensures no interface drivers bind to it and that it is not usable from the server. Signed-off-by: Valentina Manea <valentina.manea.m@gmail.com> Acked-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/staging/usbip/stub_dev.c22
-rw-r--r--drivers/usb/core/hub.c2
-rw-r--r--drivers/usb/core/usb.h4
-rw-r--r--include/linux/usb.h7
4 files changed, 31 insertions, 4 deletions
diff --git a/drivers/staging/usbip/stub_dev.c b/drivers/staging/usbip/stub_dev.c
index ee899f01c008..952743c752d7 100644
--- a/drivers/staging/usbip/stub_dev.c
+++ b/drivers/staging/usbip/stub_dev.c
@@ -339,6 +339,7 @@ static int stub_probe(struct usb_device *udev)
339 const char *udev_busid = dev_name(&udev->dev); 339 const char *udev_busid = dev_name(&udev->dev);
340 int err = 0; 340 int err = 0;
341 struct bus_id_priv *busid_priv; 341 struct bus_id_priv *busid_priv;
342 int rc;
342 343
343 dev_dbg(&udev->dev, "Enter\n"); 344 dev_dbg(&udev->dev, "Enter\n");
344 345
@@ -388,6 +389,18 @@ static int stub_probe(struct usb_device *udev)
388 busid_priv->sdev = sdev; 389 busid_priv->sdev = sdev;
389 busid_priv->udev = udev; 390 busid_priv->udev = udev;
390 391
392 /*
393 * Claim this hub port.
394 * It doesn't matter what value we pass as owner
395 * (struct dev_state) as long as it is unique.
396 */
397 rc = usb_hub_claim_port(udev->parent, udev->portnum,
398 (struct dev_state *) udev);
399 if (rc) {
400 dev_dbg(&udev->dev, "unable to claim port\n");
401 return rc;
402 }
403
391 err = stub_add_files(&udev->dev); 404 err = stub_add_files(&udev->dev);
392 if (err) { 405 if (err) {
393 dev_err(&udev->dev, "stub_add_files for %s\n", udev_busid); 406 dev_err(&udev->dev, "stub_add_files for %s\n", udev_busid);
@@ -424,6 +437,7 @@ static void stub_disconnect(struct usb_device *udev)
424 struct stub_device *sdev; 437 struct stub_device *sdev;
425 const char *udev_busid = dev_name(&udev->dev); 438 const char *udev_busid = dev_name(&udev->dev);
426 struct bus_id_priv *busid_priv; 439 struct bus_id_priv *busid_priv;
440 int rc;
427 441
428 dev_dbg(&udev->dev, "Enter\n"); 442 dev_dbg(&udev->dev, "Enter\n");
429 443
@@ -448,6 +462,14 @@ static void stub_disconnect(struct usb_device *udev)
448 */ 462 */
449 stub_remove_files(&udev->dev); 463 stub_remove_files(&udev->dev);
450 464
465 /* release port */
466 rc = usb_hub_release_port(udev->parent, udev->portnum,
467 (struct dev_state *) udev);
468 if (rc) {
469 dev_dbg(&udev->dev, "unable to release port\n");
470 return;
471 }
472
451 /* If usb reset is called from event handler */ 473 /* If usb reset is called from event handler */
452 if (busid_priv->sdev->ud.eh == current) 474 if (busid_priv->sdev->ud.eh == current)
453 return; 475 return;
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 64ea21971be2..e4849333c8de 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -1819,6 +1819,7 @@ int usb_hub_claim_port(struct usb_device *hdev, unsigned port1,
1819 *powner = owner; 1819 *powner = owner;
1820 return rc; 1820 return rc;
1821} 1821}
1822EXPORT_SYMBOL_GPL(usb_hub_claim_port);
1822 1823
1823int usb_hub_release_port(struct usb_device *hdev, unsigned port1, 1824int usb_hub_release_port(struct usb_device *hdev, unsigned port1,
1824 struct dev_state *owner) 1825 struct dev_state *owner)
@@ -1834,6 +1835,7 @@ int usb_hub_release_port(struct usb_device *hdev, unsigned port1,
1834 *powner = NULL; 1835 *powner = NULL;
1835 return rc; 1836 return rc;
1836} 1837}
1838EXPORT_SYMBOL_GPL(usb_hub_release_port);
1837 1839
1838void usb_hub_release_all_ports(struct usb_device *hdev, struct dev_state *owner) 1840void usb_hub_release_all_ports(struct usb_device *hdev, struct dev_state *owner)
1839{ 1841{
diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h
index 823857767a16..222bbd2618f1 100644
--- a/drivers/usb/core/usb.h
+++ b/drivers/usb/core/usb.h
@@ -57,10 +57,6 @@ extern int usb_match_device(struct usb_device *dev,
57extern void usb_forced_unbind_intf(struct usb_interface *intf); 57extern void usb_forced_unbind_intf(struct usb_interface *intf);
58extern void usb_rebind_intf(struct usb_interface *intf); 58extern void usb_rebind_intf(struct usb_interface *intf);
59 59
60extern int usb_hub_claim_port(struct usb_device *hdev, unsigned port,
61 struct dev_state *owner);
62extern int usb_hub_release_port(struct usb_device *hdev, unsigned port,
63 struct dev_state *owner);
64extern void usb_hub_release_all_ports(struct usb_device *hdev, 60extern void usb_hub_release_all_ports(struct usb_device *hdev,
65 struct dev_state *owner); 61 struct dev_state *owner);
66extern bool usb_device_is_owned(struct usb_device *udev); 62extern bool usb_device_is_owned(struct usb_device *udev);
diff --git a/include/linux/usb.h b/include/linux/usb.h
index 22de4affe9c8..140a6a3e7d56 100644
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -366,6 +366,8 @@ struct usb_bus {
366#endif 366#endif
367}; 367};
368 368
369struct dev_state;
370
369/* ----------------------------------------------------------------------- */ 371/* ----------------------------------------------------------------------- */
370 372
371struct usb_tt; 373struct usb_tt;
@@ -749,6 +751,11 @@ extern struct usb_host_interface *usb_find_alt_setting(
749 unsigned int iface_num, 751 unsigned int iface_num,
750 unsigned int alt_num); 752 unsigned int alt_num);
751 753
754/* port claiming functions */
755int usb_hub_claim_port(struct usb_device *hdev, unsigned port1,
756 struct dev_state *owner);
757int usb_hub_release_port(struct usb_device *hdev, unsigned port1,
758 struct dev_state *owner);
752 759
753/** 760/**
754 * usb_make_path - returns stable device path in the usb tree 761 * usb_make_path - returns stable device path in the usb tree