Patch "scsi: mac_esp: Replace bogus memory barrier with spinlock" has been added to the 3.18-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
scsi: mac_esp: Replace bogus memory barrier with spinlock
to the 3.18-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
scsi-mac_esp-replace-bogus-memory-barrier-with-spinlock.patch
and it can be found in the queue-3.18 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Thu Mar 22 15:16:04 CET 2018
From: Finn Thain <[email protected]>
Date: Sun, 2 Apr 2017 17:08:05 +1000
Subject: scsi: mac_esp: Replace bogus memory barrier with spinlock
From: Finn Thain <[email protected]>
[ Upstream commit 4da2b1eb230ba4ad19b58984dc52e05b1073df5f ]
Commit da244654c66e ("[SCSI] mac_esp: fix for quadras with two esp chips") added mac_scsi_esp_intr() to handle the IRQ lines from a pair of on-board ESP chips (a normal shared IRQ did not work).
Proper mutual exclusion was missing from that patch. This patch fixes race conditions between comparison and assignment of esp_chips[] pointers.
--- drivers/scsi/mac_esp.c | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-)
drivers/scsi/mac_esp.c +23 -10
@@ -55,6 +55,7 @@ struct mac_esp_priv {int error; };static struct esp *esp_chips[2 ]; +static DEFINE_SPINLOCK (esp_chips_lock);#define MAC_ESP_GET_PRIV (esp) ((struct mac_esp_priv *) \ platform_get_drvdata((struct platform_device *) \
@@ -562,15 +563,18 @@ static int esp_mac_probe(struct platform } host->irq =IRQ_MAC_SCSI ; - esp_chips[dev->id] = esp; -mb (); -if (esp_chips[!dev->id] ==NULL ) { - err =request_irq (host->irq, mac_scsi_esp_intr,0 ,"ESP" ,NULL ); -if (err <0 ) { - esp_chips[dev->id] =NULL ; - goto fail_free_priv; - } + +/* The request_irq() call is intended to succeed for the first device +* and fail for the second device. +*/ + err =request_irq (host->irq, mac_scsi_esp_intr,0 ,"ESP" ,NULL ); +spin_lock (&esp_chips_lock); +if (err <0 && esp_chips[!dev->id] ==NULL ) { +spin_unlock (&esp_chips_lock); + goto fail_free_priv; } + esp_chips[dev->id] = esp; +spin_unlock (&esp_chips_lock); err =scsi_esp_register (esp, &dev->dev);if (err)
@@ -579,8 +583,13 @@ static int esp_mac_probe(struct platformreturn 0 ; fail_free_irq: -if (esp_chips[!dev->id] ==NULL ) +spin_lock (&esp_chips_lock); + esp_chips[dev->id] =NULL ; +if (esp_chips[!dev->id] ==NULL ) { +spin_unlock (&esp_chips_lock);free_irq (host->irq, esp); + }else +spin_unlock (&esp_chips_lock); fail_free_priv:kfree (mep); fail_free_command_block:
@@ -599,9 +608,13 @@ static int esp_mac_remove(struct platforscsi_esp_unregister (esp); +spin_lock (&esp_chips_lock); esp_chips[dev->id] =NULL ; -if (!(esp_chips[0 ] || esp_chips[1 ])) +if (esp_chips[!dev->id] ==NULL ) { +spin_unlock (&esp_chips_lock);free_irq (irq,NULL ); + }else +spin_unlock (&esp_chips_lock);kfree (mep);
Patches currently in stable-queue which might be from [email protected] are
queue-3.18/scsi-mac_esp-replace-bogus-memory-barrier-with-spinlock.patch