]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
firewire: core: use guard macro to maintain list of events for userspace clients
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Mon, 5 Aug 2024 08:54:00 +0000 (17:54 +0900)
committerTakashi Sakamoto <o-takashi@sakamocchi.jp>
Mon, 5 Aug 2024 08:54:00 +0000 (17:54 +0900)
The core function maintains events to userspace by list in the instance of
client. The concurrent access to the list is protected by spinlock in
the instance.

This commit uses guard macro to maintain the spinlock.

Link: https://lore.kernel.org/r/20240805085408.251763-10-o-takashi@sakamocchi.jp
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
drivers/firewire/core-cdev.c

index 90e9dfed8681fadec975b9338627e469e7dac154..2e2199eaa05bd7446a340abb8b0cba5c38c7ae4e 100644 (file)
@@ -287,19 +287,17 @@ static int fw_device_op_open(struct inode *inode, struct file *file)
 static void queue_event(struct client *client, struct event *event,
                        void *data0, size_t size0, void *data1, size_t size1)
 {
-       unsigned long flags;
-
        event->v[0].data = data0;
        event->v[0].size = size0;
        event->v[1].data = data1;
        event->v[1].size = size1;
 
-       spin_lock_irqsave(&client->lock, flags);
-       if (client->in_shutdown)
-               kfree(event);
-       else
-               list_add_tail(&event->link, &client->event_list);
-       spin_unlock_irqrestore(&client->lock, flags);
+       scoped_guard(spinlock_irqsave, &client->lock) {
+               if (client->in_shutdown)
+                       kfree(event);
+               else
+                       list_add_tail(&event->link, &client->event_list);
+       }
 
        wake_up_interruptible(&client->wait);
 }
@@ -321,10 +319,10 @@ static int dequeue_event(struct client *client,
                       fw_device_is_shutdown(client->device))
                return -ENODEV;
 
-       spin_lock_irq(&client->lock);
-       event = list_first_entry(&client->event_list, struct event, link);
-       list_del(&event->link);
-       spin_unlock_irq(&client->lock);
+       scoped_guard(spinlock_irq, &client->lock) {
+               event = list_first_entry(&client->event_list, struct event, link);
+               list_del(&event->link);
+       }
 
        total = 0;
        for (i = 0; i < ARRAY_SIZE(event->v) && total < count; i++) {
@@ -1887,9 +1885,8 @@ static int fw_device_op_release(struct inode *inode, struct file *file)
                fw_iso_buffer_destroy(&client->buffer, client->device->card);
 
        /* Freeze client->resource_idr and client->event_list */
-       spin_lock_irq(&client->lock);
-       client->in_shutdown = true;
-       spin_unlock_irq(&client->lock);
+       scoped_guard(spinlock_irq, &client->lock)
+               client->in_shutdown = true;
 
        wait_event(client->tx_flush_wait, !has_outbound_transactions(client));