Commit 90ee3466 authored by Mark Haverkamp's avatar Mark Haverkamp Committed by James Bottomley

[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: default avatarMark Haverkamp <markh@osdl.org>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 8c23cd74
...@@ -489,6 +489,8 @@ int aac_probe_container(struct aac_dev *dev, int cid) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment