scsi: qla2xxx: Enable type checking for the SRB free and done callback functions
[linux-2.6-block.git] / drivers / scsi / qla2xxx / qla_init.c
index c24d7667d3c9e00a9614a6bbfcdd98d5ff832af4..3fa8ca63429c7f80c9719eac550ced8384fa1d62 100644 (file)
@@ -63,10 +63,8 @@ qla2x00_sp_timeout(struct timer_list *t)
        iocb->timeout(sp);
 }
 
-void
-qla2x00_sp_free(void *ptr)
+void qla2x00_sp_free(srb_t *sp)
 {
-       srb_t *sp = ptr;
        struct srb_iocb *iocb = &sp->u.iocb_cmd;
 
        del_timer(&iocb->timer);
@@ -117,18 +115,15 @@ static void qla24xx_abort_iocb_timeout(void *data)
        sp->done(sp, QLA_OS_TIMER_EXPIRED);
 }
 
-static void qla24xx_abort_sp_done(void *ptr, int res)
+static void qla24xx_abort_sp_done(srb_t *sp, int res)
 {
-       srb_t *sp = ptr;
        struct srb_iocb *abt = &sp->u.iocb_cmd;
 
-       if ((res == QLA_OS_TIMER_EXPIRED) ||
-           del_timer(&sp->u.iocb_cmd.timer)) {
-               if (sp->flags & SRB_WAKEUP_ON_COMP)
-                       complete(&abt->u.abt.comp);
-               else
-                       sp->free(sp);
-       }
+       del_timer(&sp->u.iocb_cmd.timer);
+       if (sp->flags & SRB_WAKEUP_ON_COMP)
+               complete(&abt->u.abt.comp);
+       else
+               sp->free(sp);
 }
 
 static int qla24xx_async_abort_cmd(srb_t *cmd_sp, bool wait)
@@ -251,10 +246,8 @@ qla2x00_async_iocb_timeout(void *data)
        }
 }
 
-static void
-qla2x00_async_login_sp_done(void *ptr, int res)
+static void qla2x00_async_login_sp_done(srb_t *sp, int res)
 {
-       srb_t *sp = ptr;
        struct scsi_qla_host *vha = sp->vha;
        struct srb_iocb *lio = &sp->u.iocb_cmd;
        struct event_arg ea;
@@ -360,11 +353,8 @@ done:
        return rval;
 }
 
-static void
-qla2x00_async_logout_sp_done(void *ptr, int res)
+static void qla2x00_async_logout_sp_done(srb_t *sp, int res)
 {
-       srb_t *sp = ptr;
-
        sp->fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
        sp->fcport->login_gen++;
        qlt_logo_completion_handler(sp->fcport, res);
@@ -421,10 +411,8 @@ qla2x00_async_prlo_done(struct scsi_qla_host *vha, fc_port_t *fcport,
        qlt_logo_completion_handler(fcport, data[0]);
 }
 
-static void
-qla2x00_async_prlo_sp_done(void *s, int res)
+static void qla2x00_async_prlo_sp_done(srb_t *sp, int res)
 {
-       srb_t *sp = (srb_t *)s;
        struct srb_iocb *lio = &sp->u.iocb_cmd;
        struct scsi_qla_host *vha = sp->vha;
 
@@ -527,10 +515,8 @@ static int qla_post_els_plogi_work(struct scsi_qla_host *vha, fc_port_t *fcport)
        return qla2x00_post_work(vha, e);
 }
 
-static void
-qla2x00_async_adisc_sp_done(void *ptr, int res)
+static void qla2x00_async_adisc_sp_done(srb_t *sp, int res)
 {
-       srb_t *sp = ptr;
        struct scsi_qla_host *vha = sp->vha;
        struct event_arg ea;
        struct srb_iocb *lio = &sp->u.iocb_cmd;
@@ -933,10 +919,8 @@ static void qla24xx_handle_gnl_done_event(scsi_qla_host_t *vha,
        }
 } /* gnl_event */
 
-static void
-qla24xx_async_gnl_sp_done(void *s, int res)
+static void qla24xx_async_gnl_sp_done(srb_t *sp, int res)
 {
-       struct srb *sp = s;
        struct scsi_qla_host *vha = sp->vha;
        unsigned long flags;
        struct fc_port *fcport = NULL, *tf;
@@ -1123,10 +1107,8 @@ int qla24xx_post_gnl_work(struct scsi_qla_host *vha, fc_port_t *fcport)
        return qla2x00_post_work(vha, e);
 }
 
-static
-void qla24xx_async_gpdb_sp_done(void *s, int res)
+static void qla24xx_async_gpdb_sp_done(srb_t *sp, int res)
 {
-       struct srb *sp = s;
        struct scsi_qla_host *vha = sp->vha;
        struct qla_hw_data *ha = vha->hw;
        fc_port_t *fcport = sp->fcport;
@@ -1170,10 +1152,8 @@ static int qla24xx_post_prli_work(struct scsi_qla_host *vha, fc_port_t *fcport)
        return qla2x00_post_work(vha, e);
 }
 
-static void
-qla2x00_async_prli_sp_done(void *ptr, int res)
+static void qla2x00_async_prli_sp_done(srb_t *sp, int res)
 {
-       srb_t *sp = ptr;
        struct scsi_qla_host *vha = sp->vha;
        struct srb_iocb *lio = &sp->u.iocb_cmd;
        struct event_arg ea;
@@ -1810,10 +1790,8 @@ qla2x00_tmf_iocb_timeout(void *data)
        complete(&tmf->u.tmf.comp);
 }
 
-static void
-qla2x00_tmf_sp_done(void *ptr, int res)
+static void qla2x00_tmf_sp_done(srb_t *sp, int res)
 {
-       srb_t *sp = ptr;
        struct srb_iocb *tmf = &sp->u.iocb_cmd;
 
        complete(&tmf->u.tmf.comp);
@@ -4428,7 +4406,7 @@ qla2x00_configure_hba(scsi_qla_host_t *vha)
 
 inline void
 qla2x00_set_model_info(scsi_qla_host_t *vha, uint8_t *model, size_t len,
-       char *def)
+                      const char *def)
 {
        char *st, *en;
        uint16_t index;
@@ -4440,7 +4418,7 @@ qla2x00_set_model_info(scsi_qla_host_t *vha, uint8_t *model, size_t len,
        if (len > sizeof(zero))
                len = sizeof(zero);
        if (memcmp(model, &zero, len) != 0) {
-               strncpy(ha->model_number, model, len);
+               memcpy(ha->model_number, model, len);
                st = en = ha->model_number;
                en += len - 1;
                while (en > st) {
@@ -4453,21 +4431,23 @@ qla2x00_set_model_info(scsi_qla_host_t *vha, uint8_t *model, size_t len,
                if (use_tbl &&
                    ha->pdev->subsystem_vendor == PCI_VENDOR_ID_QLOGIC &&
                    index < QLA_MODEL_NAMES)
-                       strncpy(ha->model_desc,
+                       strlcpy(ha->model_desc,
                            qla2x00_model_name[index * 2 + 1],
-                           sizeof(ha->model_desc) - 1);
+                           sizeof(ha->model_desc));
        } else {
                index = (ha->pdev->subsystem_device & 0xff);
                if (use_tbl &&
                    ha->pdev->subsystem_vendor == PCI_VENDOR_ID_QLOGIC &&
                    index < QLA_MODEL_NAMES) {
-                       strcpy(ha->model_number,
-                           qla2x00_model_name[index * 2]);
-                       strncpy(ha->model_desc,
+                       strlcpy(ha->model_number,
+                               qla2x00_model_name[index * 2],
+                               sizeof(ha->model_number));
+                       strlcpy(ha->model_desc,
                            qla2x00_model_name[index * 2 + 1],
-                           sizeof(ha->model_desc) - 1);
+                           sizeof(ha->model_desc));
                } else {
-                       strcpy(ha->model_number, def);
+                       strlcpy(ha->model_number, def,
+                               sizeof(ha->model_number));
                }
        }
        if (IS_FWI2_CAPABLE(ha))
@@ -6636,7 +6616,8 @@ qla2x00_quiesce_io(scsi_qla_host_t *vha)
                                        LOOP_DOWN_TIME);
        }
        /* Wait for pending cmds to complete */
-       qla2x00_eh_wait_for_pending_commands(vha, 0, 0, WAIT_HOST);
+       WARN_ON_ONCE(qla2x00_eh_wait_for_pending_commands(vha, 0, 0, WAIT_HOST)
+                    != QLA_SUCCESS);
 }
 
 void
@@ -7561,8 +7542,12 @@ qla27xx_get_active_image(struct scsi_qla_host *vha,
                goto check_sec_image;
        }
 
-       qla24xx_read_flash_data(vha, (void *)(&pri_image_status),
-           ha->flt_region_img_status_pri, sizeof(pri_image_status) >> 2);
+       if (qla24xx_read_flash_data(vha, (void *)(&pri_image_status),
+           ha->flt_region_img_status_pri, sizeof(pri_image_status) >> 2) !=
+           QLA_SUCCESS) {
+               WARN_ON_ONCE(true);
+               goto check_sec_image;
+       }
        qla27xx_print_image(vha, "Primary image", &pri_image_status);
 
        if (qla27xx_check_image_status_signature(&pri_image_status)) {