diff options
Diffstat (limited to 'drivers/scsi/sg.c')
| -rw-r--r-- | drivers/scsi/sg.c | 10 | 
1 files changed, 9 insertions, 1 deletions
| diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index 4e607d3065bc..65eef33846bb 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c @@ -1401,6 +1401,7 @@ sg_add(struct class_device *cl_dev, struct class_interface *cl_intf)  	Sg_device *sdp = NULL;  	struct cdev * cdev = NULL;  	int error, k; +	unsigned long iflags;  	disk = alloc_disk(1);  	if (!disk) { @@ -1428,7 +1429,7 @@ sg_add(struct class_device *cl_dev, struct class_interface *cl_intf)  	error = cdev_add(cdev, MKDEV(SCSI_GENERIC_MAJOR, k), 1);  	if (error) -		goto out; +		goto cdev_add_err;  	sdp->cdev = cdev;  	if (sg_sysfs_valid) { @@ -1455,6 +1456,13 @@ sg_add(struct class_device *cl_dev, struct class_interface *cl_intf)  	return 0; +cdev_add_err: +	write_lock_irqsave(&sg_dev_arr_lock, iflags); +	kfree(sg_dev_arr[k]); +	sg_dev_arr[k] = NULL; +	sg_nr_dev--; +	write_unlock_irqrestore(&sg_dev_arr_lock, iflags); +  out:  	put_disk(disk);  	if (cdev) | 
