|
@@ -549,7 +549,9 @@ static void get_container_name_callback(void *context, struct fib * fibptr)
|
|
|
if ((le32_to_cpu(get_name_reply->status) == CT_OK)
|
|
|
&& (get_name_reply->data[0] != '\0')) {
|
|
|
char *sp = get_name_reply->data;
|
|
|
- sp[sizeof(((struct aac_get_name_resp *)NULL)->data)] = '\0';
|
|
|
+ int data_size = FIELD_SIZEOF(struct aac_get_name_resp, data);
|
|
|
+
|
|
|
+ sp[data_size - 1] = '\0';
|
|
|
while (*sp == ' ')
|
|
|
++sp;
|
|
|
if (*sp) {
|
|
@@ -579,21 +581,25 @@ static void get_container_name_callback(void *context, struct fib * fibptr)
|
|
|
static int aac_get_container_name(struct scsi_cmnd * scsicmd)
|
|
|
{
|
|
|
int status;
|
|
|
+ int data_size;
|
|
|
struct aac_get_name *dinfo;
|
|
|
struct fib * cmd_fibcontext;
|
|
|
struct aac_dev * dev;
|
|
|
|
|
|
dev = (struct aac_dev *)scsicmd->device->host->hostdata;
|
|
|
|
|
|
+ data_size = FIELD_SIZEOF(struct aac_get_name_resp, data);
|
|
|
+
|
|
|
cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
|
|
|
|
|
|
aac_fib_init(cmd_fibcontext);
|
|
|
dinfo = (struct aac_get_name *) fib_data(cmd_fibcontext);
|
|
|
+ scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
|
|
|
|
|
|
dinfo->command = cpu_to_le32(VM_ContainerConfig);
|
|
|
dinfo->type = cpu_to_le32(CT_READ_NAME);
|
|
|
dinfo->cid = cpu_to_le32(scmd_id(scsicmd));
|
|
|
- dinfo->count = cpu_to_le32(sizeof(((struct aac_get_name_resp *)NULL)->data));
|
|
|
+ dinfo->count = cpu_to_le32(data_size - 1);
|
|
|
|
|
|
status = aac_fib_send(ContainerCommand,
|
|
|
cmd_fibcontext,
|
|
@@ -606,10 +612,8 @@ static int aac_get_container_name(struct scsi_cmnd * scsicmd)
|
|
|
/*
|
|
|
* Check that the command queued to the controller
|
|
|
*/
|
|
|
- if (status == -EINPROGRESS) {
|
|
|
- scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
|
|
|
+ if (status == -EINPROGRESS)
|
|
|
return 0;
|
|
|
- }
|
|
|
|
|
|
printk(KERN_WARNING "aac_get_container_name: aac_fib_send failed with status: %d.\n", status);
|
|
|
aac_fib_complete(cmd_fibcontext);
|
|
@@ -720,6 +724,7 @@ static void _aac_probe_container1(void * context, struct fib * fibptr)
|
|
|
|
|
|
dinfo->count = cpu_to_le32(scmd_id(scsicmd));
|
|
|
dinfo->type = cpu_to_le32(FT_FILESYS);
|
|
|
+ scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
|
|
|
|
|
|
status = aac_fib_send(ContainerCommand,
|
|
|
fibptr,
|
|
@@ -731,9 +736,7 @@ static void _aac_probe_container1(void * context, struct fib * fibptr)
|
|
|
/*
|
|
|
* Check that the command queued to the controller
|
|
|
*/
|
|
|
- if (status == -EINPROGRESS)
|
|
|
- scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
|
|
|
- else if (status < 0) {
|
|
|
+ if (status < 0 && status != -EINPROGRESS) {
|
|
|
/* Inherit results from VM_NameServe, if any */
|
|
|
dresp->status = cpu_to_le32(ST_OK);
|
|
|
_aac_probe_container2(context, fibptr);
|
|
@@ -761,6 +764,7 @@ static int _aac_probe_container(struct scsi_cmnd * scsicmd, int (*callback)(stru
|
|
|
dinfo->count = cpu_to_le32(scmd_id(scsicmd));
|
|
|
dinfo->type = cpu_to_le32(FT_FILESYS);
|
|
|
scsicmd->SCp.ptr = (char *)callback;
|
|
|
+ scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
|
|
|
|
|
|
status = aac_fib_send(ContainerCommand,
|
|
|
fibptr,
|
|
@@ -772,10 +776,9 @@ static int _aac_probe_container(struct scsi_cmnd * scsicmd, int (*callback)(stru
|
|
|
/*
|
|
|
* Check that the command queued to the controller
|
|
|
*/
|
|
|
- if (status == -EINPROGRESS) {
|
|
|
- scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
|
|
|
+ if (status == -EINPROGRESS)
|
|
|
return 0;
|
|
|
- }
|
|
|
+
|
|
|
if (status < 0) {
|
|
|
scsicmd->SCp.ptr = NULL;
|
|
|
aac_fib_complete(fibptr);
|
|
@@ -1121,6 +1124,7 @@ static int aac_get_container_serial(struct scsi_cmnd * scsicmd)
|
|
|
dinfo->command = cpu_to_le32(VM_ContainerConfig);
|
|
|
dinfo->type = cpu_to_le32(CT_CID_TO_32BITS_UID);
|
|
|
dinfo->cid = cpu_to_le32(scmd_id(scsicmd));
|
|
|
+ scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
|
|
|
|
|
|
status = aac_fib_send(ContainerCommand,
|
|
|
cmd_fibcontext,
|
|
@@ -1133,10 +1137,8 @@ static int aac_get_container_serial(struct scsi_cmnd * scsicmd)
|
|
|
/*
|
|
|
* Check that the command queued to the controller
|
|
|
*/
|
|
|
- if (status == -EINPROGRESS) {
|
|
|
- scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
|
|
|
+ if (status == -EINPROGRESS)
|
|
|
return 0;
|
|
|
- }
|
|
|
|
|
|
printk(KERN_WARNING "aac_get_container_serial: aac_fib_send failed with status: %d.\n", status);
|
|
|
aac_fib_complete(cmd_fibcontext);
|
|
@@ -2330,16 +2332,14 @@ static int aac_read(struct scsi_cmnd * scsicmd)
|
|
|
* Alocate and initialize a Fib
|
|
|
*/
|
|
|
cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
|
|
|
-
|
|
|
+ scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
|
|
|
status = aac_adapter_read(cmd_fibcontext, scsicmd, lba, count);
|
|
|
|
|
|
/*
|
|
|
* Check that the command queued to the controller
|
|
|
*/
|
|
|
- if (status == -EINPROGRESS) {
|
|
|
- scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
|
|
|
+ if (status == -EINPROGRESS)
|
|
|
return 0;
|
|
|
- }
|
|
|
|
|
|
printk(KERN_WARNING "aac_read: aac_fib_send failed with status: %d.\n", status);
|
|
|
/*
|
|
@@ -2424,16 +2424,14 @@ static int aac_write(struct scsi_cmnd * scsicmd)
|
|
|
* Allocate and initialize a Fib then setup a BlockWrite command
|
|
|
*/
|
|
|
cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
|
|
|
-
|
|
|
+ scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
|
|
|
status = aac_adapter_write(cmd_fibcontext, scsicmd, lba, count, fua);
|
|
|
|
|
|
/*
|
|
|
* Check that the command queued to the controller
|
|
|
*/
|
|
|
- if (status == -EINPROGRESS) {
|
|
|
- scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
|
|
|
+ if (status == -EINPROGRESS)
|
|
|
return 0;
|
|
|
- }
|
|
|
|
|
|
printk(KERN_WARNING "aac_write: aac_fib_send failed with status: %d\n", status);
|
|
|
/*
|
|
@@ -2583,6 +2581,7 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd)
|
|
|
synchronizecmd->cid = cpu_to_le32(scmd_id(scsicmd));
|
|
|
synchronizecmd->count =
|
|
|
cpu_to_le32(sizeof(((struct aac_synchronize_reply *)NULL)->data));
|
|
|
+ scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
|
|
|
|
|
|
/*
|
|
|
* Now send the Fib to the adapter
|
|
@@ -2598,10 +2597,8 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd)
|
|
|
/*
|
|
|
* Check that the command queued to the controller
|
|
|
*/
|
|
|
- if (status == -EINPROGRESS) {
|
|
|
- scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
|
|
|
+ if (status == -EINPROGRESS)
|
|
|
return 0;
|
|
|
- }
|
|
|
|
|
|
printk(KERN_WARNING
|
|
|
"aac_synchronize: aac_fib_send failed with status: %d.\n", status);
|
|
@@ -2661,6 +2658,7 @@ static int aac_start_stop(struct scsi_cmnd *scsicmd)
|
|
|
pmcmd->cid = cpu_to_le32(sdev_id(sdev));
|
|
|
pmcmd->parm = (scsicmd->cmnd[1] & 1) ?
|
|
|
cpu_to_le32(CT_PM_UNIT_IMMEDIATE) : 0;
|
|
|
+ scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
|
|
|
|
|
|
/*
|
|
|
* Now send the Fib to the adapter
|
|
@@ -2676,10 +2674,8 @@ static int aac_start_stop(struct scsi_cmnd *scsicmd)
|
|
|
/*
|
|
|
* Check that the command queued to the controller
|
|
|
*/
|
|
|
- if (status == -EINPROGRESS) {
|
|
|
- scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
|
|
|
+ if (status == -EINPROGRESS)
|
|
|
return 0;
|
|
|
- }
|
|
|
|
|
|
aac_fib_complete(cmd_fibcontext);
|
|
|
aac_fib_free(cmd_fibcontext);
|
|
@@ -3198,10 +3194,11 @@ static int query_disk(struct aac_dev *dev, void __user *arg)
|
|
|
return -EBUSY;
|
|
|
if (copy_from_user(&qd, arg, sizeof (struct aac_query_disk)))
|
|
|
return -EFAULT;
|
|
|
- if (qd.cnum == -1)
|
|
|
+ if (qd.cnum == -1) {
|
|
|
+ if (qd.id < 0 || qd.id >= dev->maximum_num_containers)
|
|
|
+ return -EINVAL;
|
|
|
qd.cnum = qd.id;
|
|
|
- else if ((qd.bus == -1) && (qd.id == -1) && (qd.lun == -1))
|
|
|
- {
|
|
|
+ } else if ((qd.bus == -1) && (qd.id == -1) && (qd.lun == -1)) {
|
|
|
if (qd.cnum < 0 || qd.cnum >= dev->maximum_num_containers)
|
|
|
return -EINVAL;
|
|
|
qd.instance = dev->scsi_host_ptr->host_no;
|
|
@@ -3686,16 +3683,14 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
|
|
|
* Allocate and initialize a Fib then setup a BlockWrite command
|
|
|
*/
|
|
|
cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
|
|
|
-
|
|
|
+ scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
|
|
|
status = aac_adapter_scsi(cmd_fibcontext, scsicmd);
|
|
|
|
|
|
/*
|
|
|
* Check that the command queued to the controller
|
|
|
*/
|
|
|
- if (status == -EINPROGRESS) {
|
|
|
- scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
|
|
|
+ if (status == -EINPROGRESS)
|
|
|
return 0;
|
|
|
- }
|
|
|
|
|
|
printk(KERN_WARNING "aac_srb: aac_fib_send failed with status: %d\n", status);
|
|
|
aac_fib_complete(cmd_fibcontext);
|
|
@@ -3733,15 +3728,14 @@ static int aac_send_hba_fib(struct scsi_cmnd *scsicmd)
|
|
|
if (!cmd_fibcontext)
|
|
|
return -1;
|
|
|
|
|
|
+ scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
|
|
|
status = aac_adapter_hba(cmd_fibcontext, scsicmd);
|
|
|
|
|
|
/*
|
|
|
* Check that the command queued to the controller
|
|
|
*/
|
|
|
- if (status == -EINPROGRESS) {
|
|
|
- scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
|
|
|
+ if (status == -EINPROGRESS)
|
|
|
return 0;
|
|
|
- }
|
|
|
|
|
|
pr_warn("aac_hba_cmd_req: aac_fib_send failed with status: %d\n",
|
|
|
status);
|