[RAMEN9610-21969][9610] usb: gadget: add lock to avoid panic in composite_suspend
authorKisang Lee <kisang80.lee@samsung.com>
Wed, 3 Feb 2021 05:13:12 +0000 (14:13 +0900)
committerCosmin Tanislav <demonsingur@gmail.com>
Mon, 22 Apr 2024 17:23:40 +0000 (20:23 +0300)
Change-Id: Ic38e507a0a7c94778826b73f471b61065bff9b51
Signed-off-by: Kisang Lee <kisang80.lee@samsung.com>
drivers/usb/gadget/composite.c

index 5c3be2f439703afa7c80d24fff3cafd8a3a05764..4adf33f12beb8346d91dd7599db187a232b6a260 100644 (file)
@@ -2343,12 +2343,26 @@ fail:
 
 void __nocfi composite_suspend(struct usb_gadget *gadget)
 {
-       struct usb_composite_dev        *cdev = get_gadget_data(gadget);
+       struct usb_composite_dev        *cdev = NULL;
        struct usb_function             *f;
+       unsigned long                   flags;
 
        /* REVISIT:  should we have config level
         * suspend/resume callbacks?
         */
+
+       if (gadget == NULL) {
+               pr_info("%s: gadget is NULL\n", __func__);
+               return;
+       }
+
+       cdev = get_gadget_data(gadget);
+       if (!cdev) {
+               pr_info("%s: cdev is NULL\n", __func__);
+               return;
+       }
+
+       spin_lock_irqsave(&cdev->lock, flags);
        DBG(cdev, "suspend\n");
        if (cdev->config) {
                list_for_each_entry(f, &cdev->config->functions, list) {
@@ -2359,6 +2373,8 @@ void __nocfi composite_suspend(struct usb_gadget *gadget)
        if (cdev->driver->suspend)
                cdev->driver->suspend(cdev);
 
+       spin_unlock_irqrestore(&cdev->lock, flags);
+
        cdev->suspended = 1;
 
        usb_gadget_set_selfpowered(gadget);