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;
+       }
+
        /* Extract socket from fd. */
        socket = sockfd_lookup(sockfd, &err);
-       if (!socket)
-               return -EINVAL;
+       if (!socket) {
+               ret = -EINVAL;
+               goto error;
+       }
 
        /* now need lock until setting vdev status as used */
 
@@ -362,7 +373,8 @@ static ssize_t attach_store(struct device *dev, struct 
device_attribute *attr,
                 * Will be retried from userspace
                 * if there's another free port.
                 */
-               return -EBUSY;
+               ret = -EBUSY;
+               goto error;
        }
 
        dev_info(dev, "pdev(%u) rhport(%u) sockfd(%d)\n",
@@ -386,6 +398,11 @@ static ssize_t attach_store(struct device *dev, struct 
device_attribute *attr,
        rh_port_connect(vdev, speed);
 
        return count;
+
+error:
+       module_put(THIS_MODULE);
+module_get_err:
+       return ret;
 }
 static DEVICE_ATTR_WO(attach);
 
-- 
2.14.1

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to