Merge branch 'fixes' into misc
[sfrench/cifs-2.6.git] / drivers / scsi / aacraid / aachba.c
index a6619b8f48d98f581926267103f6ae4b26f82d55..a64285ab0728f14c870db3d72b19190d516d44f3 100644 (file)
@@ -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);