Re: [PATCH] usbip: vhc_hcd: prevent module being removed while device are attached
From: Greg KH
Date: Tue Apr 03 2018 - 02:56:26 EST
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 <shuahkh@xxxxxxxxxxxxxxx>
> ---
> 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