* [PATCH] aic7xxx: add back locking
@ 2005-05-17 21:09 James Bottomley
0 siblings, 0 replies; only message in thread
From: James Bottomley @ 2005-05-17 21:09 UTC (permalink / raw)
To: SCSI Mailing List
Tampering with the settings has to be done under the host lock ...
slave_alloc isn't called under any lock, so this has to be done
explicitly.
James
--- a/drivers/scsi/aic7xxx/aic7xxx_osm.c
+++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c
@@ -645,7 +645,9 @@ ahc_linux_slave_alloc(struct scsi_device
struct ahc_linux_target *targ;
struct scsi_target *starget = device->sdev_target;
struct ahc_linux_device *dev;
- u_int target_offset;
+ unsigned int target_offset;
+ unsigned long flags;
+ int retval = -ENOMEM;
target_offset = starget->id;
if (starget->channel != 0)
@@ -654,12 +656,14 @@ ahc_linux_slave_alloc(struct scsi_device
ahc = *((struct ahc_softc **)device->host->hostdata);
if (bootverbose)
printf("%s: Slave Alloc %d\n", ahc_name(ahc), device->id);
+ ahc_lock(ahc, &flags);
targ = ahc->platform_data->targets[target_offset];
if (targ == NULL) {
targ = ahc_linux_alloc_target(ahc, starget->channel, starget->id);
struct seeprom_config *sc = ahc->seep_config;
if (targ == NULL)
- return -ENOMEM;
+ goto out;
+
if (sc) {
unsigned short scsirate;
struct ahc_devinfo devinfo;
@@ -701,10 +705,13 @@ ahc_linux_slave_alloc(struct scsi_device
if (dev == NULL) {
dev = ahc_linux_alloc_device(ahc, targ, device->lun);
if (dev == NULL)
- return -ENOMEM;
+ goto out;
}
+ retval = 0;
- return 0;
+ out:
+ ahc_unlock(ahc, &flags);
+ return retval;
}
static int
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2005-05-17 21:09 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-05-17 21:09 [PATCH] aic7xxx: add back locking James Bottomley
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox