From 1668f3b1e869ac465c4571cb21d6c89263913dea Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Sat, 21 Feb 2009 11:04:45 +0900 Subject: [PATCH] --- yaml --- r: 131911 b: refs/heads/master c: 4034cc68157bfa0b6622efe368488d3d3e20f4e6 h: refs/heads/master i: 131909: 8afaaaabc6673a54cf8376404e8c788d47029c0c 131907: 068a31b56a523e2a47d5588bd028506e1bc6deb6 131903: 4b3169c219c58d24c6f1ec1f7058f71e36bb2c3a v: v3 --- [refs] | 2 +- trunk/drivers/scsi/sd.c | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 2a9aa6de5474..616c176f54b9 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: b7e7bd34465518f3527bf47a8055f35077d40c6c +refs/heads/master: 4034cc68157bfa0b6622efe368488d3d3e20f4e6 diff --git a/trunk/drivers/scsi/sd.c b/trunk/drivers/scsi/sd.c index d57566b8be0a..55310dbc10a6 100644 --- a/trunk/drivers/scsi/sd.c +++ b/trunk/drivers/scsi/sd.c @@ -107,6 +107,7 @@ static void scsi_disk_release(struct device *cdev); static void sd_print_sense_hdr(struct scsi_disk *, struct scsi_sense_hdr *); static void sd_print_result(struct scsi_disk *, int); +static DEFINE_SPINLOCK(sd_index_lock); static DEFINE_IDA(sd_index_ida); /* This semaphore is used to mediate the 0->1 reference get in the @@ -1914,7 +1915,9 @@ static int sd_probe(struct device *dev) if (!ida_pre_get(&sd_index_ida, GFP_KERNEL)) goto out_put; + spin_lock(&sd_index_lock); error = ida_get_new(&sd_index_ida, &index); + spin_unlock(&sd_index_lock); } while (error == -EAGAIN); if (error) @@ -1936,7 +1939,9 @@ static int sd_probe(struct device *dev) return 0; out_free_index: + spin_lock(&sd_index_lock); ida_remove(&sd_index_ida, index); + spin_unlock(&sd_index_lock); out_put: put_disk(gd); out_free: @@ -1986,7 +1991,9 @@ static void scsi_disk_release(struct device *dev) struct scsi_disk *sdkp = to_scsi_disk(dev); struct gendisk *disk = sdkp->disk; + spin_lock(&sd_index_lock); ida_remove(&sd_index_ida, sdkp->index); + spin_unlock(&sd_index_lock); disk->private_data = NULL; put_disk(disk);