diff options
author | Alan Stern <stern@rowland.harvard.edu> | 2008-06-24 14:47:04 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2008-07-21 15:16:40 -0700 |
commit | cd9f03759d3eb588e185b04e1854c778b050833e (patch) | |
tree | c4d3ad70cec5c77569c05d6e657b253b2b6253c9 /drivers/usb/core/usb.h | |
parent | 78d9a487ee961c356e1a934d9a92eca38ffb3a70 (diff) | |
download | kernel_samsung_smdk4412-cd9f03759d3eb588e185b04e1854c778b050833e.zip kernel_samsung_smdk4412-cd9f03759d3eb588e185b04e1854c778b050833e.tar.gz kernel_samsung_smdk4412-cd9f03759d3eb588e185b04e1854c778b050833e.tar.bz2 |
usbfs: send disconnect signals when device is unregistered
USB device files are accessible in two ways: as files in usbfs and as
character device nodes. The two paths are supposed to behave
identically, but they don't. When the underlying USB device is
unplugged, disconnect signals are sent to processes with open usbfs
files (if they requested these signals) but not to processes with open
device node files.
This patch (as1104) fixes the bug by moving the disconnect-signalling
code into a common subroutine which is called from both paths.
Putting this subroutine in devio.c removes the only out-of-file
reference to struct dev_state, and so the structure's declaration can
be moved from usb.h into devio.c.
Finally, the new subroutine performs one extra action: It kills all
the outstanding async URBs. (I'd kill the outstanding synchronous
URBs too, if there was any way to do it.) In the past this hasn't
mattered much, because devices were unregistered from usbfs only
when they were disconnected. But now the unregistration can also
occur whenever devices are unbound from the usb_generic driver. At
any rate, killing URBs when a device is unregistered from usbfs seems
like a good thing to do.
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/core/usb.h')
-rw-r--r-- | drivers/usb/core/usb.h | 17 |
1 files changed, 1 insertions, 16 deletions
diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h index d3eb0a2..d9a6e16 100644 --- a/drivers/usb/core/usb.h +++ b/drivers/usb/core/usb.h @@ -142,26 +142,11 @@ extern struct usb_driver usbfs_driver; extern const struct file_operations usbfs_devices_fops; extern const struct file_operations usbdev_file_operations; extern void usbfs_conn_disc_event(void); +extern void usb_fs_classdev_common_remove(struct usb_device *udev); extern int usb_devio_init(void); extern void usb_devio_cleanup(void); -struct dev_state { - struct list_head list; /* state list */ - struct usb_device *dev; - struct file *file; - spinlock_t lock; /* protects the async urb lists */ - struct list_head async_pending; - struct list_head async_completed; - wait_queue_head_t wait; /* wake up if a request completed */ - unsigned int discsignr; - struct pid *disc_pid; - uid_t disc_uid, disc_euid; - void __user *disccontext; - unsigned long ifclaimed; - u32 secid; -}; - /* internal notify stuff */ extern void usb_notify_add_device(struct usb_device *udev); extern void usb_notify_remove_device(struct usb_device *udev); |