[SCSI] aacraid: Check for unlikely errors
Received from Mark Salyzyn The enclosed patch cleans up some code fragments, adds some paranoia (unproven causes of potential driver failures). Signed-off-by: Mark Haverkamp <markh@osdl.org> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
parent
8c23cd7457
commit
90ee346651
|
@ -489,6 +489,8 @@ int aac_probe_container(struct aac_dev *dev, int cid)
|
||||||
unsigned instance;
|
unsigned instance;
|
||||||
|
|
||||||
fsa_dev_ptr = dev->fsa_dev;
|
fsa_dev_ptr = dev->fsa_dev;
|
||||||
|
if (!fsa_dev_ptr)
|
||||||
|
return -ENOMEM;
|
||||||
instance = dev->scsi_host_ptr->unique_id;
|
instance = dev->scsi_host_ptr->unique_id;
|
||||||
|
|
||||||
if (!(fibptr = aac_fib_alloc(dev)))
|
if (!(fibptr = aac_fib_alloc(dev)))
|
||||||
|
@ -1392,6 +1394,7 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd, int cid)
|
||||||
struct scsi_cmnd *cmd;
|
struct scsi_cmnd *cmd;
|
||||||
struct scsi_device *sdev = scsicmd->device;
|
struct scsi_device *sdev = scsicmd->device;
|
||||||
int active = 0;
|
int active = 0;
|
||||||
|
struct aac_dev *aac;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1413,11 +1416,11 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd, int cid)
|
||||||
if (active)
|
if (active)
|
||||||
return SCSI_MLQUEUE_DEVICE_BUSY;
|
return SCSI_MLQUEUE_DEVICE_BUSY;
|
||||||
|
|
||||||
|
aac = (struct aac_dev *)scsicmd->device->host->hostdata;
|
||||||
/*
|
/*
|
||||||
* Allocate and initialize a Fib
|
* Allocate and initialize a Fib
|
||||||
*/
|
*/
|
||||||
if (!(cmd_fibcontext =
|
if (!(cmd_fibcontext = aac_fib_alloc(aac)))
|
||||||
aac_fib_alloc((struct aac_dev *)scsicmd->device->host->hostdata)))
|
|
||||||
return SCSI_MLQUEUE_HOST_BUSY;
|
return SCSI_MLQUEUE_HOST_BUSY;
|
||||||
|
|
||||||
aac_fib_init(cmd_fibcontext);
|
aac_fib_init(cmd_fibcontext);
|
||||||
|
@ -1470,6 +1473,8 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
|
||||||
struct aac_dev *dev = (struct aac_dev *)host->hostdata;
|
struct aac_dev *dev = (struct aac_dev *)host->hostdata;
|
||||||
struct fsa_dev_info *fsa_dev_ptr = dev->fsa_dev;
|
struct fsa_dev_info *fsa_dev_ptr = dev->fsa_dev;
|
||||||
|
|
||||||
|
if (fsa_dev_ptr == NULL)
|
||||||
|
return -1;
|
||||||
/*
|
/*
|
||||||
* If the bus, id or lun is out of range, return fail
|
* If the bus, id or lun is out of range, return fail
|
||||||
* Test does not apply to ID 16, the pseudo id for the controller
|
* Test does not apply to ID 16, the pseudo id for the controller
|
||||||
|
@ -1782,6 +1787,8 @@ static int query_disk(struct aac_dev *dev, void __user *arg)
|
||||||
struct fsa_dev_info *fsa_dev_ptr;
|
struct fsa_dev_info *fsa_dev_ptr;
|
||||||
|
|
||||||
fsa_dev_ptr = dev->fsa_dev;
|
fsa_dev_ptr = dev->fsa_dev;
|
||||||
|
if (!fsa_dev_ptr)
|
||||||
|
return -ENODEV;
|
||||||
if (copy_from_user(&qd, arg, sizeof (struct aac_query_disk)))
|
if (copy_from_user(&qd, arg, sizeof (struct aac_query_disk)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
if (qd.cnum == -1)
|
if (qd.cnum == -1)
|
||||||
|
@ -1843,6 +1850,10 @@ static int delete_disk(struct aac_dev *dev, void __user *arg)
|
||||||
struct fsa_dev_info *fsa_dev_ptr;
|
struct fsa_dev_info *fsa_dev_ptr;
|
||||||
|
|
||||||
fsa_dev_ptr = dev->fsa_dev;
|
fsa_dev_ptr = dev->fsa_dev;
|
||||||
|
if (!fsa_dev_ptr)
|
||||||
|
return -ENODEV;
|
||||||
|
if (!fsa_dev_ptr)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
if (copy_from_user(&dd, arg, sizeof (struct aac_delete_disk)))
|
if (copy_from_user(&dd, arg, sizeof (struct aac_delete_disk)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
|
@ -180,7 +180,7 @@ int aac_send_shutdown(struct aac_dev * dev)
|
||||||
-2 /* Timeout silently */, 1,
|
-2 /* Timeout silently */, 1,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
|
|
||||||
if (status == 0)
|
if (status >= 0)
|
||||||
aac_fib_complete(fibctx);
|
aac_fib_complete(fibctx);
|
||||||
aac_fib_free(fibctx);
|
aac_fib_free(fibctx);
|
||||||
return status;
|
return status;
|
||||||
|
|
|
@ -1013,6 +1013,10 @@ static void __devexit aac_remove_one(struct pci_dev *pdev)
|
||||||
list_del(&aac->entry);
|
list_del(&aac->entry);
|
||||||
scsi_host_put(shost);
|
scsi_host_put(shost);
|
||||||
pci_disable_device(pdev);
|
pci_disable_device(pdev);
|
||||||
|
if (list_empty(&aac_devices)) {
|
||||||
|
unregister_chrdev(aac_cfg_major, "aac");
|
||||||
|
aac_cfg_major = -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pci_driver aac_pci_driver = {
|
static struct pci_driver aac_pci_driver = {
|
||||||
|
|
Loading…
Reference in New Issue