On Mon, Apr 02, 2018 at 02:52:31PM -0600, Shuah Khan wrote:
> vhci_hcd module can be removed even when devices are attached. Fix to
> prevent module removal when devices are still attached.
> 
> Signed-off-by: Shuah Khan <shua...@osg.samsung.com>
> ---
>  drivers/usb/usbip/vhci_sysfs.c | 25 +++++++++++++++++++++----
>  1 file changed, 21 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/usb/usbip/vhci_sysfs.c b/drivers/usb/usbip/vhci_sysfs.c
> index 48808388ec33..6a54b9aa92be 100644
> --- a/drivers/usb/usbip/vhci_sysfs.c
> +++ b/drivers/usb/usbip/vhci_sysfs.c
> @@ -9,6 +9,7 @@
>  #include <linux/net.h>
>  #include <linux/platform_device.h>
>  #include <linux/slab.h>
> +#include <linux/module.h>
>  
>  #include "usbip_common.h"
>  #include "vhci.h"
> @@ -252,6 +253,8 @@ static ssize_t detach_store(struct device *dev, struct 
> device_attribute *attr,
>       if (ret < 0)
>               return -EINVAL;
>  
> +     module_put(THIS_MODULE);
> +
>       usbip_dbg_vhci_sysfs("Leave\n");
>  
>       return count;
> @@ -302,7 +305,7 @@ static ssize_t attach_store(struct device *dev, struct 
> device_attribute *attr,
>       struct vhci_hcd *vhci_hcd;
>       struct vhci_device *vdev;
>       struct vhci *vhci;
> -     int err;
> +     int err, ret;
>       unsigned long flags;
>  
>       /*
> @@ -339,10 +342,18 @@ static ssize_t attach_store(struct device *dev, struct 
> device_attribute *attr,
>       else
>               vdev = &vhci->vhci_hcd_hs->vdev[rhport];
>  
> +     /* get module ref to avoid being removed with active attached devs */
> +     if (!try_module_get(THIS_MODULE)) {
> +             ret = -EAGAIN;
> +             goto module_get_err;
> +     }

That's really not a good idea, trying to grab your own module reference
is considered racy and we stopped adding that code pattern to the kernel
a long time ago.

What's wrong if you remove the vhci module if devices are attached?  You
can do that today for any other USB host driver, this shouldn't be
"special".

Also, kernel modules are never automatically removed by the system, so
someone has to do this by hand, so they knew what they were doing :)

thanks,

greg k-h

Reply via email to