greybus: connection: fix locking in gb_hd_connection_find
authorJohan Hovold <johan@hovoldconsulting.com>
Mon, 2 Mar 2015 08:55:26 +0000 (09:55 +0100)
committerGreg Kroah-Hartman <greg@kroah.com>
Tue, 3 Mar 2015 05:03:19 +0000 (21:03 -0800)
Fix unconditional re-enabling of interrupts in gb_hd_connection_find,
which can be called with local interrupts disabled from the USB
completion handler.

Signed-off-by: Johan Hovold <johan@hovoldconsulting.com>
Reviewed-by: Alex Elder <elder@linaro.org>
Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
drivers/staging/greybus/connection.c

index 5f60e83..3ec984c 100644 (file)
@@ -18,14 +18,15 @@ struct gb_connection *gb_hd_connection_find(struct greybus_host_device *hd,
                                                u16 cport_id)
 {
        struct gb_connection *connection = NULL;
+       unsigned long flags;
 
-       spin_lock_irq(&gb_connections_lock);
+       spin_lock_irqsave(&gb_connections_lock, flags);
        list_for_each_entry(connection, &hd->connections, hd_links)
                if (connection->hd_cport_id == cport_id)
                        goto found;
        connection = NULL;
  found:
-       spin_unlock_irq(&gb_connections_lock);
+       spin_unlock_irqrestore(&gb_connections_lock, flags);
 
        return connection;
 }