From e3f1ef6044db4d3077ef800b5d73831e619b1346 Mon Sep 17 00:00:00 2001 From: Stefan Richter Date: Sat, 18 Feb 2012 19:54:45 +0100 Subject: [PATCH] --- yaml --- r: 294116 b: refs/heads/master c: 90963f1cdb3baffc68321e7c98073bf9e99d2ec7 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/firewire/core-transaction.c | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index 866e5121d4fc..2e7c73aff6d8 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 280f64d4f108b7ac707d6208d50a59627b984dc5 +refs/heads/master: 90963f1cdb3baffc68321e7c98073bf9e99d2ec7 diff --git a/trunk/drivers/firewire/core-transaction.c b/trunk/drivers/firewire/core-transaction.c index 89e310ba03ba..190bf61533a2 100644 --- a/trunk/drivers/firewire/core-transaction.c +++ b/trunk/drivers/firewire/core-transaction.c @@ -602,6 +602,9 @@ EXPORT_SYMBOL(fw_core_add_address_handler); /** * fw_core_remove_address_handler() - unregister an address handler + * + * When fw_core_remove_address_handler() returns, @handler->callback() is + * guaranteed to not run on any CPU anymore. */ void fw_core_remove_address_handler(struct fw_address_handler *handler) { @@ -838,16 +841,16 @@ static void handle_exclusive_region_request(struct fw_card *card, spin_lock_irqsave(&address_handler_lock, flags); handler = lookup_enclosing_address_handler(&address_handler_list, offset, request->length); - spin_unlock_irqrestore(&address_handler_lock, flags); - - if (handler == NULL) - fw_send_response(card, request, RCODE_ADDRESS_ERROR); - else + if (handler) handler->address_callback(card, request, tcode, destination, source, p->generation, offset, request->data, request->length, handler->callback_data); + spin_unlock_irqrestore(&address_handler_lock, flags); + + if (!handler) + fw_send_response(card, request, RCODE_ADDRESS_ERROR); } static void handle_fcp_region_request(struct fw_card *card,