hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/usb/gadget/legacy/inode.c
....@@ -229,6 +229,7 @@
229229 */
230230
231231 static const char *CHIP;
232
+static DEFINE_MUTEX(sb_mutex); /* Serialize superblock operations */
232233
233234 /*----------------------------------------------------------------------*/
234235
....@@ -2012,13 +2013,20 @@
20122013 {
20132014 struct inode *inode;
20142015 struct dev_data *dev;
2016
+ int rc;
20152017
2016
- if (the_device)
2017
- return -ESRCH;
2018
+ mutex_lock(&sb_mutex);
2019
+
2020
+ if (the_device) {
2021
+ rc = -ESRCH;
2022
+ goto Done;
2023
+ }
20182024
20192025 CHIP = usb_get_gadget_udc_name();
2020
- if (!CHIP)
2021
- return -ENODEV;
2026
+ if (!CHIP) {
2027
+ rc = -ENODEV;
2028
+ goto Done;
2029
+ }
20222030
20232031 /* superblock */
20242032 sb->s_blocksize = PAGE_SIZE;
....@@ -2055,13 +2063,17 @@
20552063 * from binding to a controller.
20562064 */
20572065 the_device = dev;
2058
- return 0;
2066
+ rc = 0;
2067
+ goto Done;
20592068
2060
-Enomem:
2069
+ Enomem:
20612070 kfree(CHIP);
20622071 CHIP = NULL;
2072
+ rc = -ENOMEM;
20632073
2064
- return -ENOMEM;
2074
+ Done:
2075
+ mutex_unlock(&sb_mutex);
2076
+ return rc;
20652077 }
20662078
20672079 /* "mount -t gadgetfs path /dev/gadget" ends up here */
....@@ -2083,6 +2095,7 @@
20832095 static void
20842096 gadgetfs_kill_sb (struct super_block *sb)
20852097 {
2098
+ mutex_lock(&sb_mutex);
20862099 kill_litter_super (sb);
20872100 if (the_device) {
20882101 put_dev (the_device);
....@@ -2090,6 +2103,7 @@
20902103 }
20912104 kfree(CHIP);
20922105 CHIP = NULL;
2106
+ mutex_unlock(&sb_mutex);
20932107 }
20942108
20952109 /*----------------------------------------------------------------------*/