diff options
| author | Alan Stern <[email protected]> | 2023-01-31 20:49:04 +0000 |
|---|---|---|
| committer | Greg Kroah-Hartman <[email protected]> | 2023-01-31 20:54:35 +0000 |
| commit | 45bf39f8df7f05efb83b302c65ae3b9bc92b7065 (patch) | |
| tree | 18ae9c594efe73bf020c4b80ddca0dacea382426 /drivers/usb/core/sysfs.c | |
| parent | usb: early: xhci-dbc: Use memcpy_and_pad() (diff) | |
| download | kernel-45bf39f8df7f05efb83b302c65ae3b9bc92b7065.tar.gz kernel-45bf39f8df7f05efb83b302c65ae3b9bc92b7065.zip | |
USB: core: Don't hold device lock while reading the "descriptors" sysfs file
Ever since commit 83e83ecb79a8 ("usb: core: get config and string
descriptors for unauthorized devices") was merged in 2013, there has
been no mechanism for reallocating the rawdescriptors buffers in
struct usb_device after the initial enumeration. Before that commit,
the buffers would be deallocated when a device was deauthorized and
reallocated when it was authorized and enumerated.
This means that the locking in the read_descriptors() routine is not
needed, since the buffers it reads will never be reallocated while the
routine is running. This locking can interfere with user programs
trying to read a hub's descriptors via sysfs while new child devices
of the hub are being initialized, since the hub is locked during this
procedure.
Since the locking in read_descriptors() hasn't been needed for over
nine years, we can remove it.
Reported-and-tested-by: Troels Liebe Bentsen <[email protected]>
Signed-off-by: Alan Stern <[email protected]>
CC: [email protected]
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Greg Kroah-Hartman <[email protected]>
Diffstat (limited to 'drivers/usb/core/sysfs.c')
| -rw-r--r-- | drivers/usb/core/sysfs.c | 5 |
1 files changed, 0 insertions, 5 deletions
diff --git a/drivers/usb/core/sysfs.c b/drivers/usb/core/sysfs.c index 8217032dfb85..b63f78e48c74 100644 --- a/drivers/usb/core/sysfs.c +++ b/drivers/usb/core/sysfs.c @@ -869,11 +869,7 @@ read_descriptors(struct file *filp, struct kobject *kobj, size_t srclen, n; int cfgno; void *src; - int retval; - retval = usb_lock_device_interruptible(udev); - if (retval < 0) - return -EINTR; /* The binary attribute begins with the device descriptor. * Following that are the raw descriptor entries for all the * configurations (config plus subsidiary descriptors). @@ -898,7 +894,6 @@ read_descriptors(struct file *filp, struct kobject *kobj, off -= srclen; } } - usb_unlock_device(udev); return count - nleft; } |
