Re: [PATCH] USB: fix char-device disconnect handling

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,

Any reason this was not accepted for 2.6.28.1?
Is there something wrong?

Thanks,
Alon

On 1/13/09, Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> wrote:
> This patch (as1198) fixes a conceptual bug: Somewhere along the line
>  we managed to confuse USB class devices with USB char devices.  As a
>  result, the code to send a disconnect signal to userspace would not be
>  built if both CONFIG_USB_DEVICE_CLASS and CONFIG_USB_DEVICEFS were
>  disabled.
>
>  The usb_fs_classdev_common_remove() routine has been renamed to
>  usbdev_remove() and it is now called whenever any USB device is
>  removed, not just when a class device is unregistered.  The notifier
>  registration and unregistration calls are no longer conditionally
>  compiled.  And since the common removal code will always be called as
>  part of the char device interface, there's no need to call it again as
>  part of the usbfs interface; thus the invocation of
>  usb_fs_classdev_common_remove() has been taken out of
>  usbfs_remove_device().
>
>  Signed-off-by: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx>
>  Reported-by: Alon Bar-Lev <alon.barlev@xxxxxxxxx>
>  Tested-by: Alon Bar-Lev <alon.barlev@xxxxxxxxx>
>
>  ---
>
>  This bugfix should also be queued for 2.6.28.stable.
>
>
>  Index: usb-2.6/drivers/usb/core/devio.c
>  ===================================================================
>  --- usb-2.6.orig/drivers/usb/core/devio.c
>  +++ usb-2.6/drivers/usb/core/devio.c
>  @@ -1700,7 +1700,7 @@ const struct file_operations usbdev_file
>         .release =      usbdev_release,
>   };
>
>  -void usb_fs_classdev_common_remove(struct usb_device *udev)
>  +static void usbdev_remove(struct usb_device *udev)
>   {
>         struct dev_state *ps;
>         struct siginfo sinfo;
>  @@ -1742,10 +1742,15 @@ static void usb_classdev_remove(struct u
>   {
>         if (dev->usb_classdev)
>                 device_unregister(dev->usb_classdev);
>  -       usb_fs_classdev_common_remove(dev);
>   }
>
>  -static int usb_classdev_notify(struct notifier_block *self,
>  +#else
>  +#define usb_classdev_add(dev)          0
>  +#define usb_classdev_remove(dev)       do {} while (0)
>  +
>  +#endif
>  +
>  +static int usbdev_notify(struct notifier_block *self,
>                                unsigned long action, void *dev)
>   {
>         switch (action) {
>  @@ -1755,15 +1760,15 @@ static int usb_classdev_notify(struct no
>                 break;
>         case USB_DEVICE_REMOVE:
>                 usb_classdev_remove(dev);
>  +               usbdev_remove(dev);
>                 break;
>         }
>         return NOTIFY_OK;
>   }
>
>   static struct notifier_block usbdev_nb = {
>  -       .notifier_call =        usb_classdev_notify,
>  +       .notifier_call =        usbdev_notify,
>   };
>  -#endif
>
>   static struct cdev usb_device_cdev;
>
>  @@ -1798,9 +1803,8 @@ int __init usb_devio_init(void)
>          * to /sys/dev
>          */
>         usb_classdev_class->dev_kobj = NULL;
>  -
>  -       usb_register_notify(&usbdev_nb);
>   #endif
>  +       usb_register_notify(&usbdev_nb);
>   out:
>         return retval;
>
>  @@ -1811,8 +1815,8 @@ error_cdev:
>
>   void usb_devio_cleanup(void)
>   {
>  -#ifdef CONFIG_USB_DEVICE_CLASS
>         usb_unregister_notify(&usbdev_nb);
>  +#ifdef CONFIG_USB_DEVICE_CLASS
>         class_destroy(usb_classdev_class);
>   #endif
>         cdev_del(&usb_device_cdev);
>  Index: usb-2.6/drivers/usb/core/inode.c
>  ===================================================================
>  --- usb-2.6.orig/drivers/usb/core/inode.c
>  +++ usb-2.6/drivers/usb/core/inode.c
>  @@ -717,7 +717,6 @@ static void usbfs_remove_device(struct u
>                 fs_remove_file (dev->usbfs_dentry);
>                 dev->usbfs_dentry = NULL;
>         }
>  -       usb_fs_classdev_common_remove(dev);
>   }
>
>   static int usbfs_notify(struct notifier_block *self, unsigned long action, void *dev)
>  Index: usb-2.6/drivers/usb/core/usb.h
>  ===================================================================
>  --- usb-2.6.orig/drivers/usb/core/usb.h
>  +++ usb-2.6/drivers/usb/core/usb.h
>  @@ -151,7 +151,6 @@ 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);
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux