Commit 1a655040 authored by Salyzyn, Mark's avatar Salyzyn, Mark Committed by James Bottomley

[SCSI] aacraid: probe related code cleanup

Sundry cleanups:
1) Use kzalloc instead of kmalloc.
2) Make sure probe worked before recalling the SCSI command to finalize
processing.
3) _aac_probe_container2 and _aac_probe_container1 return value goes
unused, change return to void.
4) Use a lower depth pointer reference to pick up the driver instance
variable.
5) Although effectively unused except to fake for scsicmd validity, set
the scsi_done in probe code to aac_probe_container_callback1 instead of
the less valid dummy reference to _aac_probe_container1.
6) SCp.phase is set in aac_valid_context, drop setting up this value in
caller when unnecessary.
7) take container target id at the beginning, rather than referencing
scmd_id() to pick it up.

There should be no side effects or functionality changes.
Signed-off-by: default avatarMark Salyzyn <aacraid@adaptec.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent beb87c33
...@@ -312,11 +312,10 @@ int aac_get_containers(struct aac_dev *dev) ...@@ -312,11 +312,10 @@ int aac_get_containers(struct aac_dev *dev)
if (maximum_num_containers < MAXIMUM_NUM_CONTAINERS) if (maximum_num_containers < MAXIMUM_NUM_CONTAINERS)
maximum_num_containers = MAXIMUM_NUM_CONTAINERS; maximum_num_containers = MAXIMUM_NUM_CONTAINERS;
fsa_dev_ptr = kmalloc(sizeof(*fsa_dev_ptr) * maximum_num_containers, fsa_dev_ptr = kzalloc(sizeof(*fsa_dev_ptr) * maximum_num_containers,
GFP_KERNEL); GFP_KERNEL);
if (!fsa_dev_ptr) if (!fsa_dev_ptr)
return -ENOMEM; return -ENOMEM;
memset(fsa_dev_ptr, 0, sizeof(*fsa_dev_ptr) * maximum_num_containers);
dev->fsa_dev = fsa_dev_ptr; dev->fsa_dev = fsa_dev_ptr;
dev->maximum_num_containers = maximum_num_containers; dev->maximum_num_containers = maximum_num_containers;
...@@ -446,7 +445,7 @@ static int aac_probe_container_callback2(struct scsi_cmnd * scsicmd) ...@@ -446,7 +445,7 @@ static int aac_probe_container_callback2(struct scsi_cmnd * scsicmd)
{ {
struct fsa_dev_info *fsa_dev_ptr = ((struct aac_dev *)(scsicmd->device->host->hostdata))->fsa_dev; struct fsa_dev_info *fsa_dev_ptr = ((struct aac_dev *)(scsicmd->device->host->hostdata))->fsa_dev;
if (fsa_dev_ptr[scmd_id(scsicmd)].valid) if ((fsa_dev_ptr[scmd_id(scsicmd)].valid & 1))
return aac_scsi_cmd(scsicmd); return aac_scsi_cmd(scsicmd);
scsicmd->result = DID_NO_CONNECT << 16; scsicmd->result = DID_NO_CONNECT << 16;
...@@ -454,18 +453,18 @@ static int aac_probe_container_callback2(struct scsi_cmnd * scsicmd) ...@@ -454,18 +453,18 @@ static int aac_probe_container_callback2(struct scsi_cmnd * scsicmd)
return 0; return 0;
} }
static int _aac_probe_container2(void * context, struct fib * fibptr) static void _aac_probe_container2(void * context, struct fib * fibptr)
{ {
struct fsa_dev_info *fsa_dev_ptr; struct fsa_dev_info *fsa_dev_ptr;
int (*callback)(struct scsi_cmnd *); int (*callback)(struct scsi_cmnd *);
struct scsi_cmnd * scsicmd = (struct scsi_cmnd *)context; struct scsi_cmnd * scsicmd = (struct scsi_cmnd *)context;
if (!aac_valid_context(scsicmd, fibptr))
return 0;
fsa_dev_ptr = ((struct aac_dev *)(scsicmd->device->host->hostdata))->fsa_dev; if (!aac_valid_context(scsicmd, fibptr))
return;
scsicmd->SCp.Status = 0; scsicmd->SCp.Status = 0;
fsa_dev_ptr = fibptr->dev->fsa_dev;
if (fsa_dev_ptr) { if (fsa_dev_ptr) {
struct aac_mount * dresp = (struct aac_mount *) fib_data(fibptr); struct aac_mount * dresp = (struct aac_mount *) fib_data(fibptr);
fsa_dev_ptr += scmd_id(scsicmd); fsa_dev_ptr += scmd_id(scsicmd);
...@@ -488,10 +487,11 @@ static int _aac_probe_container2(void * context, struct fib * fibptr) ...@@ -488,10 +487,11 @@ static int _aac_probe_container2(void * context, struct fib * fibptr)
aac_fib_free(fibptr); aac_fib_free(fibptr);
callback = (int (*)(struct scsi_cmnd *))(scsicmd->SCp.ptr); callback = (int (*)(struct scsi_cmnd *))(scsicmd->SCp.ptr);
scsicmd->SCp.ptr = NULL; scsicmd->SCp.ptr = NULL;
return (*callback)(scsicmd); (*callback)(scsicmd);
return;
} }
static int _aac_probe_container1(void * context, struct fib * fibptr) static void _aac_probe_container1(void * context, struct fib * fibptr)
{ {
struct scsi_cmnd * scsicmd; struct scsi_cmnd * scsicmd;
struct aac_mount * dresp; struct aac_mount * dresp;
...@@ -501,13 +501,14 @@ static int _aac_probe_container1(void * context, struct fib * fibptr) ...@@ -501,13 +501,14 @@ static int _aac_probe_container1(void * context, struct fib * fibptr)
dresp = (struct aac_mount *) fib_data(fibptr); dresp = (struct aac_mount *) fib_data(fibptr);
dresp->mnt[0].capacityhigh = 0; dresp->mnt[0].capacityhigh = 0;
if ((le32_to_cpu(dresp->status) != ST_OK) || if ((le32_to_cpu(dresp->status) != ST_OK) ||
(le32_to_cpu(dresp->mnt[0].vol) != CT_NONE)) (le32_to_cpu(dresp->mnt[0].vol) != CT_NONE)) {
return _aac_probe_container2(context, fibptr); _aac_probe_container2(context, fibptr);
return;
}
scsicmd = (struct scsi_cmnd *) context; scsicmd = (struct scsi_cmnd *) context;
scsicmd->SCp.phase = AAC_OWNER_MIDLEVEL;
if (!aac_valid_context(scsicmd, fibptr)) if (!aac_valid_context(scsicmd, fibptr))
return 0; return;
aac_fib_init(fibptr); aac_fib_init(fibptr);
...@@ -522,21 +523,18 @@ static int _aac_probe_container1(void * context, struct fib * fibptr) ...@@ -522,21 +523,18 @@ static int _aac_probe_container1(void * context, struct fib * fibptr)
sizeof(struct aac_query_mount), sizeof(struct aac_query_mount),
FsaNormal, FsaNormal,
0, 1, 0, 1,
(fib_callback) _aac_probe_container2, _aac_probe_container2,
(void *) scsicmd); (void *) scsicmd);
/* /*
* Check that the command queued to the controller * Check that the command queued to the controller
*/ */
if (status == -EINPROGRESS) { if (status == -EINPROGRESS)
scsicmd->SCp.phase = AAC_OWNER_FIRMWARE; scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
return 0; else if (status < 0) {
}
if (status < 0) {
/* Inherit results from VM_NameServe, if any */ /* Inherit results from VM_NameServe, if any */
dresp->status = cpu_to_le32(ST_OK); dresp->status = cpu_to_le32(ST_OK);
return _aac_probe_container2(context, fibptr); _aac_probe_container2(context, fibptr);
} }
return 0;
} }
static int _aac_probe_container(struct scsi_cmnd * scsicmd, int (*callback)(struct scsi_cmnd *)) static int _aac_probe_container(struct scsi_cmnd * scsicmd, int (*callback)(struct scsi_cmnd *))
...@@ -561,7 +559,7 @@ static int _aac_probe_container(struct scsi_cmnd * scsicmd, int (*callback)(stru ...@@ -561,7 +559,7 @@ static int _aac_probe_container(struct scsi_cmnd * scsicmd, int (*callback)(stru
sizeof(struct aac_query_mount), sizeof(struct aac_query_mount),
FsaNormal, FsaNormal,
0, 1, 0, 1,
(fib_callback) _aac_probe_container1, _aac_probe_container1,
(void *) scsicmd); (void *) scsicmd);
/* /*
* Check that the command queued to the controller * Check that the command queued to the controller
...@@ -615,7 +613,7 @@ int aac_probe_container(struct aac_dev *dev, int cid) ...@@ -615,7 +613,7 @@ int aac_probe_container(struct aac_dev *dev, int cid)
return -ENOMEM; return -ENOMEM;
} }
scsicmd->list.next = NULL; scsicmd->list.next = NULL;
scsicmd->scsi_done = (void (*)(struct scsi_cmnd*))_aac_probe_container1; scsicmd->scsi_done = (void (*)(struct scsi_cmnd*))aac_probe_container_callback1;
scsicmd->device = scsidev; scsicmd->device = scsidev;
scsidev->sdev_state = 0; scsidev->sdev_state = 0;
...@@ -1329,7 +1327,7 @@ static void io_callback(void *context, struct fib * fibptr) ...@@ -1329,7 +1327,7 @@ static void io_callback(void *context, struct fib * fibptr)
if (!aac_valid_context(scsicmd, fibptr)) if (!aac_valid_context(scsicmd, fibptr))
return; return;
dev = (struct aac_dev *)scsicmd->device->host->hostdata; dev = fibptr->dev;
cid = scmd_id(scsicmd); cid = scmd_id(scsicmd);
if (nblank(dprintk(x))) { if (nblank(dprintk(x))) {
...@@ -1587,7 +1585,7 @@ static void synchronize_callback(void *context, struct fib *fibptr) ...@@ -1587,7 +1585,7 @@ static void synchronize_callback(void *context, struct fib *fibptr)
COMMAND_COMPLETE << 8 | SAM_STAT_GOOD; COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
else { else {
struct scsi_device *sdev = cmd->device; struct scsi_device *sdev = cmd->device;
struct aac_dev *dev = (struct aac_dev *)sdev->host->hostdata; struct aac_dev *dev = fibptr->dev;
u32 cid = sdev_id(sdev); u32 cid = sdev_id(sdev);
printk(KERN_WARNING printk(KERN_WARNING
"synchronize_callback: synchronize failed, status = %d\n", "synchronize_callback: synchronize failed, status = %d\n",
...@@ -1694,7 +1692,7 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd) ...@@ -1694,7 +1692,7 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd)
int aac_scsi_cmd(struct scsi_cmnd * scsicmd) int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
{ {
u32 cid = 0; u32 cid;
struct Scsi_Host *host = scsicmd->device->host; struct Scsi_Host *host = scsicmd->device->host;
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;
...@@ -1706,15 +1704,15 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd) ...@@ -1706,15 +1704,15 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
* 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
* itself. * itself.
*/ */
if (scmd_id(scsicmd) != host->this_id) { cid = scmd_id(scsicmd);
if ((scmd_channel(scsicmd) == CONTAINER_CHANNEL)) { if (cid != host->this_id) {
if((scmd_id(scsicmd) >= dev->maximum_num_containers) || if (scmd_channel(scsicmd) == CONTAINER_CHANNEL) {
if((cid >= dev->maximum_num_containers) ||
(scsicmd->device->lun != 0)) { (scsicmd->device->lun != 0)) {
scsicmd->result = DID_NO_CONNECT << 16; scsicmd->result = DID_NO_CONNECT << 16;
scsicmd->scsi_done(scsicmd); scsicmd->scsi_done(scsicmd);
return 0; return 0;
} }
cid = scmd_id(scsicmd);
/* /*
* If the target container doesn't exist, it may have * If the target container doesn't exist, it may have
...@@ -1777,7 +1775,7 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd) ...@@ -1777,7 +1775,7 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
{ {
struct inquiry_data inq_data; struct inquiry_data inq_data;
dprintk((KERN_DEBUG "INQUIRY command, ID: %d.\n", scmd_id(scsicmd))); dprintk((KERN_DEBUG "INQUIRY command, ID: %d.\n", cid));
memset(&inq_data, 0, sizeof (struct inquiry_data)); memset(&inq_data, 0, sizeof (struct inquiry_data));
inq_data.inqd_ver = 2; /* claim compliance to SCSI-2 */ inq_data.inqd_ver = 2; /* claim compliance to SCSI-2 */
...@@ -1789,7 +1787,7 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd) ...@@ -1789,7 +1787,7 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
* Set the Vendor, Product, and Revision Level * Set the Vendor, Product, and Revision Level
* see: <vendor>.c i.e. aac.c * see: <vendor>.c i.e. aac.c
*/ */
if (scmd_id(scsicmd) == host->this_id) { if (cid == host->this_id) {
setinqstr(dev, (void *) (inq_data.inqd_vid), ARRAY_SIZE(container_types)); setinqstr(dev, (void *) (inq_data.inqd_vid), ARRAY_SIZE(container_types));
inq_data.inqd_pdt = INQD_PDT_PROC; /* Processor device */ inq_data.inqd_pdt = INQD_PDT_PROC; /* Processor device */
aac_internal_transfer(scsicmd, &inq_data, 0, sizeof(inq_data)); aac_internal_transfer(scsicmd, &inq_data, 0, sizeof(inq_data));
...@@ -2160,10 +2158,10 @@ static void aac_srb_callback(void *context, struct fib * fibptr) ...@@ -2160,10 +2158,10 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
if (!aac_valid_context(scsicmd, fibptr)) if (!aac_valid_context(scsicmd, fibptr))
return; return;
dev = (struct aac_dev *)scsicmd->device->host->hostdata;
BUG_ON(fibptr == NULL); BUG_ON(fibptr == NULL);
dev = fibptr->dev;
srbreply = (struct aac_srb_reply *) fib_data(fibptr); srbreply = (struct aac_srb_reply *) fib_data(fibptr);
scsicmd->sense_buffer[0] = '\0'; /* Initialize sense valid flag to false */ scsicmd->sense_buffer[0] = '\0'; /* Initialize sense valid flag to false */
......
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