Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Input: psmouse-smbus - use guard notation when acquiring mutex

This makes the code more compact and error handling more robust
by ensuring that mutexes are released in all code paths when control
leaves critical section.

Link: https://lore.kernel.org/r/ZsrAa9XcDvHeIs9T@google.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

+10 -18
+10 -18
drivers/input/mouse/psmouse-smbus.c
··· 35 35 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_HOST_NOTIFY)) 36 36 return; 37 37 38 - mutex_lock(&psmouse_smbus_mutex); 38 + guard(mutex)(&psmouse_smbus_mutex); 39 39 40 40 list_for_each_entry(smbdev, &psmouse_smbus_list, node) { 41 41 if (smbdev->dead) ··· 55 55 "SMBus candidate adapter appeared, triggering rescan\n"); 56 56 serio_rescan(smbdev->psmouse->ps2dev.serio); 57 57 } 58 - 59 - mutex_unlock(&psmouse_smbus_mutex); 60 58 } 61 59 62 60 static void psmouse_smbus_detach_i2c_client(struct i2c_client *client) 63 61 { 64 62 struct psmouse_smbus_dev *smbdev, *tmp; 65 63 66 - mutex_lock(&psmouse_smbus_mutex); 64 + guard(mutex)(&psmouse_smbus_mutex); 67 65 68 66 list_for_each_entry_safe(smbdev, tmp, &psmouse_smbus_list, node) { 69 67 if (smbdev->client != client) ··· 83 85 kfree(smbdev); 84 86 } 85 87 } 86 - 87 - mutex_unlock(&psmouse_smbus_mutex); 88 88 } 89 89 90 90 static int psmouse_smbus_notifier_call(struct notifier_block *nb, ··· 167 171 { 168 172 struct psmouse_smbus_dev *smbdev = psmouse->private; 169 173 170 - mutex_lock(&psmouse_smbus_mutex); 174 + guard(mutex)(&psmouse_smbus_mutex); 171 175 172 176 if (smbdev->dead) { 173 177 list_del(&smbdev->node); ··· 181 185 dev_name(&smbdev->client->dev)); 182 186 psmouse_smbus_schedule_remove(smbdev->client); 183 187 } 184 - 185 - mutex_unlock(&psmouse_smbus_mutex); 186 188 187 189 psmouse->private = NULL; 188 190 } ··· 213 219 { 214 220 struct psmouse_smbus_dev *smbdev, *tmp; 215 221 216 - mutex_lock(&psmouse_smbus_mutex); 222 + guard(mutex)(&psmouse_smbus_mutex); 217 223 218 224 list_for_each_entry_safe(smbdev, tmp, &psmouse_smbus_list, node) { 219 225 if (psmouse == smbdev->psmouse) { ··· 221 227 kfree(smbdev); 222 228 } 223 229 } 224 - 225 - mutex_unlock(&psmouse_smbus_mutex); 226 230 } 227 231 228 232 int psmouse_smbus_init(struct psmouse *psmouse, ··· 259 267 psmouse->disconnect = psmouse_smbus_disconnect; 260 268 psmouse->resync_time = 0; 261 269 262 - mutex_lock(&psmouse_smbus_mutex); 263 - list_add_tail(&smbdev->node, &psmouse_smbus_list); 264 - mutex_unlock(&psmouse_smbus_mutex); 270 + scoped_guard(mutex, &psmouse_smbus_mutex) { 271 + list_add_tail(&smbdev->node, &psmouse_smbus_list); 272 + } 265 273 266 274 /* Bind to already existing adapters right away */ 267 275 error = i2c_for_each_dev(smbdev, psmouse_smbus_create_companion); ··· 285 293 smbdev->board.platform_data = NULL; 286 294 287 295 if (error < 0 || !leave_breadcrumbs) { 288 - mutex_lock(&psmouse_smbus_mutex); 289 - list_del(&smbdev->node); 290 - mutex_unlock(&psmouse_smbus_mutex); 296 + scoped_guard(mutex, &psmouse_smbus_mutex) { 297 + list_del(&smbdev->node); 298 + } 291 299 292 300 kfree(smbdev); 293 301 }