HID: elo: update the reference count of the usb device structure
authorSalah Triki <salah.triki@gmail.com>
Thu, 29 Jul 2021 00:45:12 +0000 (01:45 +0100)
committerJiri Kosina <jkosina@suse.cz>
Fri, 20 Aug 2021 12:22:28 +0000 (14:22 +0200)
Use usb_get_dev() to increment the reference count of the usb device
structure in order to avoid releasing the structure while it is still in
use. And use usb_put_dev() to decrement the reference count and thus,
when it will be equal to 0 the structure will be released.

Signed-off-by: Salah Triki <salah.triki@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/hid-elo.c

index 0d22713a38742b23465f0dbe216d2107c25edc52..383dfda8c12fcede9f98bce23a21f55dfab22118 100644 (file)
@@ -228,13 +228,15 @@ static int elo_probe(struct hid_device *hdev, const struct hid_device_id *id)
 {
        struct elo_priv *priv;
        int ret;
+       struct usb_device *udev;
 
        priv = kzalloc(sizeof(*priv), GFP_KERNEL);
        if (!priv)
                return -ENOMEM;
 
        INIT_DELAYED_WORK(&priv->work, elo_work);
-       priv->usbdev = interface_to_usbdev(to_usb_interface(hdev->dev.parent));
+       udev = interface_to_usbdev(to_usb_interface(hdev->dev.parent));
+       priv->usbdev = usb_get_dev(udev);
 
        hid_set_drvdata(hdev, priv);
 
@@ -265,6 +267,8 @@ static void elo_remove(struct hid_device *hdev)
 {
        struct elo_priv *priv = hid_get_drvdata(hdev);
 
+       usb_put_dev(priv->usbdev);
+
        hid_hw_stop(hdev);
        cancel_delayed_work_sync(&priv->work);
        kfree(priv);