diff options
| author | Tejun Heo <tj@kernel.org> | 2013-02-27 17:04:42 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-27 19:10:18 -0800 | 
| commit | b98c52b5721f5d88cd9b18aaf532049b44f7815a (patch) | |
| tree | d7e218596f509dab3bf96eedebfc509a1af06b35 | |
| parent | 70a9755d5fe71d9ecf3010c5c345449378fb0898 (diff) | |
| download | olio-linux-3.10-b98c52b5721f5d88cd9b18aaf532049b44f7815a.tar.xz olio-linux-3.10-b98c52b5721f5d88cd9b18aaf532049b44f7815a.zip  | |
scsi: convert to idr_alloc()
Convert to the much saner new idr interface.
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
| -rw-r--r-- | drivers/scsi/ch.c | 21 | ||||
| -rw-r--r-- | drivers/scsi/sg.c | 43 | ||||
| -rw-r--r-- | drivers/scsi/st.c | 27 | 
3 files changed, 34 insertions, 57 deletions
diff --git a/drivers/scsi/ch.c b/drivers/scsi/ch.c index a15474eef5f..2a323742ce0 100644 --- a/drivers/scsi/ch.c +++ b/drivers/scsi/ch.c @@ -895,7 +895,7 @@ static int ch_probe(struct device *dev)  {  	struct scsi_device *sd = to_scsi_device(dev);  	struct device *class_dev; -	int minor, ret = -ENOMEM; +	int ret;  	scsi_changer *ch;  	if (sd->type != TYPE_MEDIUM_CHANGER) @@ -905,22 +905,19 @@ static int ch_probe(struct device *dev)  	if (NULL == ch)  		return -ENOMEM; -	if (!idr_pre_get(&ch_index_idr, GFP_KERNEL)) -		goto free_ch; - +	idr_preload(GFP_KERNEL);  	spin_lock(&ch_index_lock); -	ret = idr_get_new(&ch_index_idr, ch, &minor); +	ret = idr_alloc(&ch_index_idr, ch, 0, CH_MAX_DEVS + 1, GFP_NOWAIT);  	spin_unlock(&ch_index_lock); +	idr_preload_end(); -	if (ret) +	if (ret < 0) { +		if (ret == -ENOSPC) +			ret = -ENODEV;  		goto free_ch; - -	if (minor > CH_MAX_DEVS) { -		ret = -ENODEV; -		goto remove_idr;  	} -	ch->minor = minor; +	ch->minor = ret;  	sprintf(ch->name,"ch%d",ch->minor);  	class_dev = device_create(ch_sysfs_class, dev, @@ -944,7 +941,7 @@ static int ch_probe(struct device *dev)  	return 0;  remove_idr: -	idr_remove(&ch_index_idr, minor); +	idr_remove(&ch_index_idr, ch->minor);  free_ch:  	kfree(ch);  	return ret; diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index be2c9a6561f..9f0c4654745 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c @@ -1391,24 +1391,23 @@ static Sg_device *sg_alloc(struct gendisk *disk, struct scsi_device *scsidp)  		return ERR_PTR(-ENOMEM);  	} -	if (!idr_pre_get(&sg_index_idr, GFP_KERNEL)) { -		printk(KERN_WARNING "idr expansion Sg_device failure\n"); -		error = -ENOMEM; -		goto out; -	} - +	idr_preload(GFP_KERNEL);  	write_lock_irqsave(&sg_index_lock, iflags); -	error = idr_get_new(&sg_index_idr, sdp, &k); -	if (error) { -		write_unlock_irqrestore(&sg_index_lock, iflags); -		printk(KERN_WARNING "idr allocation Sg_device failure: %d\n", -		       error); -		goto out; +	error = idr_alloc(&sg_index_idr, sdp, 0, SG_MAX_DEVS, GFP_NOWAIT); +	if (error < 0) { +		if (error == -ENOSPC) { +			sdev_printk(KERN_WARNING, scsidp, +				    "Unable to attach sg device type=%d, minor number exceeds %d\n", +				    scsidp->type, SG_MAX_DEVS - 1); +			error = -ENODEV; +		} else { +			printk(KERN_WARNING +			       "idr allocation Sg_device failure: %d\n", error); +		} +		goto out_unlock;  	} - -	if (unlikely(k >= SG_MAX_DEVS)) -		goto overflow; +	k = error;  	SCSI_LOG_TIMEOUT(3, printk("sg_alloc: dev=%d \n", k));  	sprintf(disk->disk_name, "sg%d", k); @@ -1420,25 +1419,17 @@ static Sg_device *sg_alloc(struct gendisk *disk, struct scsi_device *scsidp)  	sdp->sg_tablesize = queue_max_segments(q);  	sdp->index = k;  	kref_init(&sdp->d_ref); +	error = 0; +out_unlock:  	write_unlock_irqrestore(&sg_index_lock, iflags); +	idr_preload_end(); -	error = 0; - out:  	if (error) {  		kfree(sdp);  		return ERR_PTR(error);  	}  	return sdp; - - overflow: -	idr_remove(&sg_index_idr, k); -	write_unlock_irqrestore(&sg_index_lock, iflags); -	sdev_printk(KERN_WARNING, scsidp, -		    "Unable to attach sg device type=%d, minor " -		    "number exceeds %d\n", scsidp->type, SG_MAX_DEVS - 1); -	error = -ENODEV; -	goto out;  }  static int diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 3e2b3717cb5..86974471af6 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -4076,7 +4076,7 @@ static int st_probe(struct device *dev)  	struct st_modedef *STm;  	struct st_partstat *STps;  	struct st_buffer *buffer; -	int i, dev_num, error; +	int i, error;  	char *stp;  	if (SDp->type != TYPE_TAPE) @@ -4178,27 +4178,17 @@ static int st_probe(struct device *dev)  	    tpnt->blksize_changed = 0;  	mutex_init(&tpnt->lock); -	if (!idr_pre_get(&st_index_idr, GFP_KERNEL)) { -		pr_warn("st: idr expansion failed\n"); -		error = -ENOMEM; -		goto out_put_disk; -	} - +	idr_preload(GFP_KERNEL);  	spin_lock(&st_index_lock); -	error = idr_get_new(&st_index_idr, tpnt, &dev_num); +	error = idr_alloc(&st_index_idr, tpnt, 0, ST_MAX_TAPES + 1, GFP_NOWAIT);  	spin_unlock(&st_index_lock); -	if (error) { +	idr_preload_end(); +	if (error < 0) {  		pr_warn("st: idr allocation failed: %d\n", error);  		goto out_put_disk;  	} - -	if (dev_num > ST_MAX_TAPES) { -		pr_err("st: Too many tape devices (max. %d).\n", ST_MAX_TAPES); -		goto out_put_index; -	} - -	tpnt->index = dev_num; -	sprintf(disk->disk_name, "st%d", dev_num); +	tpnt->index = error; +	sprintf(disk->disk_name, "st%d", tpnt->index);  	dev_set_drvdata(dev, tpnt); @@ -4218,9 +4208,8 @@ static int st_probe(struct device *dev)  out_remove_devs:  	remove_cdevs(tpnt); -out_put_index:  	spin_lock(&st_index_lock); -	idr_remove(&st_index_idr, dev_num); +	idr_remove(&st_index_idr, tpnt->index);  	spin_unlock(&st_index_lock);  out_put_disk:  	put_disk(disk);  |