ChangeSet 1.1673.8.44, 2004/03/30 08:53:38-08:00, david-b@pacbell.net

[PATCH] USB; minor usbfs locking updates

These are "obvious" locking fixes:  using the right lock
to protect interface claim/release (should be the driver
model bus lock, not BKL).


 drivers/usb/core/devices.c |    4 ++--
 drivers/usb/core/devio.c   |    9 +++++++--
 2 files changed, 9 insertions(+), 4 deletions(-)


diff -Nru a/drivers/usb/core/devices.c b/drivers/usb/core/devices.c
--- a/drivers/usb/core/devices.c	Wed Apr 14 14:36:30 2004
+++ b/drivers/usb/core/devices.c	Wed Apr 14 14:36:30 2004
@@ -238,7 +238,7 @@
 
 	if (start > end)
 		return start;
-	lock_kernel(); /* driver might be unloaded */
+	down_read(&usb_bus_type.subsys.rwsem);
 	start += sprintf(start, format_iface,
 			 desc->bInterfaceNumber,
 			 desc->bAlternateSetting,
@@ -248,7 +248,7 @@
 			 desc->bInterfaceSubClass,
 			 desc->bInterfaceProtocol,
 			 iface->driver ? iface->driver->name : "(none)");
-	unlock_kernel();
+	up_read(&usb_bus_type.subsys.rwsem);
 	return start;
 }
 
diff -Nru a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
--- a/drivers/usb/core/devio.c	Wed Apr 14 14:36:30 2004
+++ b/drivers/usb/core/devio.c	Wed Apr 14 14:36:30 2004
@@ -374,13 +374,15 @@
 		return 0;
 	iface = dev->actconfig->interface[intf];
 	err = -EBUSY;
-	lock_kernel();
+
+	/* lock against other changes to driver bindings */
+	down_write(&usb_bus_type.subsys.rwsem);
 	if (!usb_interface_claimed(iface)) {
 		usb_driver_claim_interface(&usbdevfs_driver, iface, ps);
 		set_bit(intf, &ps->ifclaimed);
 		err = 0;
 	}
-	unlock_kernel();
+	up_write(&usb_bus_type.subsys.rwsem);
 	return err;
 }
 
@@ -395,11 +397,14 @@
 	err = -EINVAL;
 	dev = ps->dev;
 	down(&dev->serialize);
+	/* lock against other changes to driver bindings */
+	down_write(&usb_bus_type.subsys.rwsem);
 	if (test_and_clear_bit(intf, &ps->ifclaimed)) {
 		iface = dev->actconfig->interface[intf];
 		usb_driver_release_interface(&usbdevfs_driver, iface);
 		err = 0;
 	}
+	up_write(&usb_bus_type.subsys.rwsem);
 	up(&dev->serialize);
 	return err;
 }
