USB: remove use of the bus rwsem, as it doesn't really protect anything.
The driver core stopped using the rwsem a long time ago, yet the USB core still grabbed the lock, thinking it protected something. This patch removes that useless use. Cc: Alan Stern <stern@rowland.harvard.edu> Cc: Oliver Neukum <oneukum@suse.de> Cc: David Brownell <david-b@pacbell.net> Cc: linux-usb-devel <linux-usb-devel@lists.sourceforge.net> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
b7bb125dc3
commit
341487a837
|
@ -246,7 +246,6 @@ static char *usb_dump_interface_descriptor(char *start, char *end,
|
|||
|
||||
if (start > end)
|
||||
return start;
|
||||
down_read(&usb_bus_type.subsys.rwsem);
|
||||
if (iface) {
|
||||
driver_name = (iface->dev.driver
|
||||
? iface->dev.driver->name
|
||||
|
@ -263,7 +262,6 @@ static char *usb_dump_interface_descriptor(char *start, char *end,
|
|||
desc->bInterfaceSubClass,
|
||||
desc->bInterfaceProtocol,
|
||||
driver_name);
|
||||
up_read(&usb_bus_type.subsys.rwsem);
|
||||
return start;
|
||||
}
|
||||
|
||||
|
|
|
@ -421,14 +421,11 @@ static int claimintf(struct dev_state *ps, unsigned int ifnum)
|
|||
if (test_bit(ifnum, &ps->ifclaimed))
|
||||
return 0;
|
||||
|
||||
/* lock against other changes to driver bindings */
|
||||
down_write(&usb_bus_type.subsys.rwsem);
|
||||
intf = usb_ifnum_to_if(dev, ifnum);
|
||||
if (!intf)
|
||||
err = -ENOENT;
|
||||
else
|
||||
err = usb_driver_claim_interface(&usbfs_driver, intf, ps);
|
||||
up_write(&usb_bus_type.subsys.rwsem);
|
||||
if (err == 0)
|
||||
set_bit(ifnum, &ps->ifclaimed);
|
||||
return err;
|
||||
|
@ -444,8 +441,6 @@ static int releaseintf(struct dev_state *ps, unsigned int ifnum)
|
|||
if (ifnum >= 8*sizeof(ps->ifclaimed))
|
||||
return err;
|
||||
dev = ps->dev;
|
||||
/* lock against other changes to driver bindings */
|
||||
down_write(&usb_bus_type.subsys.rwsem);
|
||||
intf = usb_ifnum_to_if(dev, ifnum);
|
||||
if (!intf)
|
||||
err = -ENOENT;
|
||||
|
@ -453,7 +448,6 @@ static int releaseintf(struct dev_state *ps, unsigned int ifnum)
|
|||
usb_driver_release_interface(&usbfs_driver, intf);
|
||||
err = 0;
|
||||
}
|
||||
up_write(&usb_bus_type.subsys.rwsem);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -813,7 +807,6 @@ static int proc_getdriver(struct dev_state *ps, void __user *arg)
|
|||
|
||||
if (copy_from_user(&gd, arg, sizeof(gd)))
|
||||
return -EFAULT;
|
||||
down_read(&usb_bus_type.subsys.rwsem);
|
||||
intf = usb_ifnum_to_if(ps->dev, gd.interface);
|
||||
if (!intf || !intf->dev.driver)
|
||||
ret = -ENODATA;
|
||||
|
@ -822,7 +815,6 @@ static int proc_getdriver(struct dev_state *ps, void __user *arg)
|
|||
sizeof(gd.driver));
|
||||
ret = (copy_to_user(arg, &gd, sizeof(gd)) ? -EFAULT : 0);
|
||||
}
|
||||
up_read(&usb_bus_type.subsys.rwsem);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1351,15 +1343,12 @@ static int proc_ioctl(struct dev_state *ps, struct usbdevfs_ioctl *ctl)
|
|||
|
||||
/* disconnect kernel driver from interface */
|
||||
case USBDEVFS_DISCONNECT:
|
||||
|
||||
down_write(&usb_bus_type.subsys.rwsem);
|
||||
if (intf->dev.driver) {
|
||||
driver = to_usb_driver(intf->dev.driver);
|
||||
dev_dbg (&intf->dev, "disconnect by usbfs\n");
|
||||
usb_driver_release_interface(driver, intf);
|
||||
} else
|
||||
retval = -ENODATA;
|
||||
up_write(&usb_bus_type.subsys.rwsem);
|
||||
break;
|
||||
|
||||
/* let kernel drivers try to (re)bind to the interface */
|
||||
|
@ -1371,7 +1360,6 @@ static int proc_ioctl(struct dev_state *ps, struct usbdevfs_ioctl *ctl)
|
|||
|
||||
/* talk directly to the interface's driver */
|
||||
default:
|
||||
down_read(&usb_bus_type.subsys.rwsem);
|
||||
if (intf->dev.driver)
|
||||
driver = to_usb_driver(intf->dev.driver);
|
||||
if (driver == NULL || driver->ioctl == NULL) {
|
||||
|
@ -1381,7 +1369,6 @@ static int proc_ioctl(struct dev_state *ps, struct usbdevfs_ioctl *ctl)
|
|||
if (retval == -ENOIOCTLCMD)
|
||||
retval = -ENOTTY;
|
||||
}
|
||||
up_read(&usb_bus_type.subsys.rwsem);
|
||||
}
|
||||
|
||||
/* cleanup and return */
|
||||
|
|
|
@ -287,9 +287,9 @@ static int usb_unbind_interface(struct device *dev)
|
|||
* way to bind to an interface is to return the private data from
|
||||
* the driver's probe() method.
|
||||
*
|
||||
* Callers must own the device lock and the driver model's usb_bus_type.subsys
|
||||
* writelock. So driver probe() entries don't need extra locking,
|
||||
* but other call contexts may need to explicitly claim those locks.
|
||||
* Callers must own the device lock, so driver probe() entries don't need
|
||||
* extra locking, but other call contexts may need to explicitly claim that
|
||||
* lock.
|
||||
*/
|
||||
int usb_driver_claim_interface(struct usb_driver *driver,
|
||||
struct usb_interface *iface, void* priv)
|
||||
|
@ -330,9 +330,9 @@ EXPORT_SYMBOL(usb_driver_claim_interface);
|
|||
* also causes the driver disconnect() method to be called.
|
||||
*
|
||||
* This call is synchronous, and may not be used in an interrupt context.
|
||||
* Callers must own the device lock and the driver model's usb_bus_type.subsys
|
||||
* writelock. So driver disconnect() entries don't need extra locking,
|
||||
* but other call contexts may need to explicitly claim those locks.
|
||||
* Callers must own the device lock, so driver disconnect() entries don't
|
||||
* need extra locking, but other call contexts may need to explicitly claim
|
||||
* that lock.
|
||||
*/
|
||||
void usb_driver_release_interface(struct usb_driver *driver,
|
||||
struct usb_interface *iface)
|
||||
|
|
|
@ -1349,7 +1349,7 @@ static void release_interface(struct device *dev)
|
|||
*
|
||||
* This call is synchronous. The calling context must be able to sleep,
|
||||
* must own the device lock, and must not hold the driver model's USB
|
||||
* bus rwsem; usb device driver probe() methods cannot use this routine.
|
||||
* bus mutex; usb device driver probe() methods cannot use this routine.
|
||||
*
|
||||
* Returns zero on success, or else the status code returned by the
|
||||
* underlying call that failed. On successful completion, each interface
|
||||
|
|
Loading…
Reference in New Issue