]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
firewire: core: use guard macro to maintain RCU scope for transaction address handler
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Mon, 5 Aug 2024 08:53:56 +0000 (17:53 +0900)
committerTakashi Sakamoto <o-takashi@sakamocchi.jp>
Mon, 5 Aug 2024 08:53:56 +0000 (17:53 +0900)
The core function maintains address handlers by list. RCU is utilized
for efficient read access to any entries in the list.

This commit uses guard macro to maintain RCU locking and releasing.

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

index 2a2cbd6e2f9be1bc076120e2cb6de71366790979..a0224d4d8e11b22633b535c46a11905d1205616b 100644 (file)
@@ -925,16 +925,14 @@ static void handle_exclusive_region_request(struct fw_card *card,
        if (tcode == TCODE_LOCK_REQUEST)
                tcode = 0x10 + async_header_get_extended_tcode(p->header);
 
-       rcu_read_lock();
-       handler = lookup_enclosing_address_handler(&address_handler_list,
-                                                  offset, request->length);
-       if (handler)
-               handler->address_callback(card, request,
-                                         tcode, destination, source,
-                                         p->generation, offset,
-                                         request->data, request->length,
-                                         handler->callback_data);
-       rcu_read_unlock();
+       scoped_guard(rcu) {
+               handler = lookup_enclosing_address_handler(&address_handler_list, offset,
+                                                          request->length);
+               if (handler)
+                       handler->address_callback(card, request, tcode, destination, source,
+                                                 p->generation, offset, request->data,
+                                                 request->length, handler->callback_data);
+       }
 
        if (!handler)
                fw_send_response(card, request, RCODE_ADDRESS_ERROR);
@@ -967,17 +965,14 @@ static void handle_fcp_region_request(struct fw_card *card,
                return;
        }
 
-       rcu_read_lock();
-       list_for_each_entry_rcu(handler, &address_handler_list, link) {
-               if (is_enclosing_handler(handler, offset, request->length))
-                       handler->address_callback(card, request, tcode,
-                                                 destination, source,
-                                                 p->generation, offset,
-                                                 request->data,
-                                                 request->length,
-                                                 handler->callback_data);
+       scoped_guard(rcu) {
+               list_for_each_entry_rcu(handler, &address_handler_list, link) {
+                       if (is_enclosing_handler(handler, offset, request->length))
+                               handler->address_callback(card, request, tcode, destination, source,
+                                                         p->generation, offset, request->data,
+                                                         request->length, handler->callback_data);
+               }
        }
-       rcu_read_unlock();
 
        fw_send_response(card, request, RCODE_COMPLETE);
 }