[SCSI] aic7xxx: add back locking
authorJames Bottomley <James.Bottomley@steeleye.com>
Wed, 18 May 2005 02:09:52 +0000 (21:09 -0500)
committerJames Bottomley <jejb@titanic.(none)>
Fri, 20 May 2005 20:54:43 +0000 (15:54 -0500)
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.

Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
drivers/scsi/aic7xxx/aic7xxx_osm.c

index c03f2948607137a736e5752f0b9cb17d1b677dfd..b216de41bff4c138bb41d9d66e421ad7900d9a0f 100644 (file)
@@ -645,7 +645,9 @@ ahc_linux_slave_alloc(struct scsi_device *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 *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 *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