Merge tag 'memcpy-v5.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees...
[linux-2.6-microblaze.git] / drivers / scsi / libiscsi.c
index 059dae8..d09926e 100644 (file)
@@ -462,7 +462,7 @@ static void iscsi_free_task(struct iscsi_task *task)
 
        if (sc) {
                /* SCSI eh reuses commands to verify us */
-               sc->SCp.ptr = NULL;
+               iscsi_cmd(sc)->task = NULL;
                /*
                 * queue command may call this to free the task, so
                 * it will decide how to return sc to scsi-ml.
@@ -1344,10 +1344,10 @@ struct iscsi_task *iscsi_itt_to_ctask(struct iscsi_conn *conn, itt_t itt)
        if (!task || !task->sc)
                return NULL;
 
-       if (task->sc->SCp.phase != conn->session->age) {
+       if (iscsi_cmd(task->sc)->age != conn->session->age) {
                iscsi_session_printk(KERN_ERR, conn->session,
                                  "task's session age %d, expected %d\n",
-                                 task->sc->SCp.phase, conn->session->age);
+                                 iscsi_cmd(task->sc)->age, conn->session->age);
                return NULL;
        }
 
@@ -1645,8 +1645,8 @@ static inline struct iscsi_task *iscsi_alloc_task(struct iscsi_conn *conn,
                         (void *) &task, sizeof(void *)))
                return NULL;
 
-       sc->SCp.phase = conn->session->age;
-       sc->SCp.ptr = (char *) task;
+       iscsi_cmd(sc)->age = conn->session->age;
+       iscsi_cmd(sc)->task = task;
 
        refcount_set(&task->refcount, 1);
        task->state = ISCSI_TASK_PENDING;
@@ -1683,7 +1683,7 @@ int iscsi_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *sc)
        struct iscsi_task *task = NULL;
 
        sc->result = 0;
-       sc->SCp.ptr = NULL;
+       iscsi_cmd(sc)->task = NULL;
 
        ihost = shost_priv(host);
 
@@ -1997,7 +1997,7 @@ enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc)
 
        spin_lock_bh(&session->frwd_lock);
        spin_lock(&session->back_lock);
-       task = (struct iscsi_task *)sc->SCp.ptr;
+       task = iscsi_cmd(sc)->task;
        if (!task) {
                /*
                 * Raced with completion. Blk layer has taken ownership
@@ -2260,7 +2260,7 @@ int iscsi_eh_abort(struct scsi_cmnd *sc)
         * if session was ISCSI_STATE_IN_RECOVERY then we may not have
         * got the command.
         */
-       if (!sc->SCp.ptr) {
+       if (!iscsi_cmd(sc)->task) {
                ISCSI_DBG_EH(session, "sc never reached iscsi layer or "
                                      "it completed.\n");
                spin_unlock_bh(&session->frwd_lock);
@@ -2273,7 +2273,7 @@ int iscsi_eh_abort(struct scsi_cmnd *sc)
         * then let the host reset code handle this
         */
        if (!session->leadconn || session->state != ISCSI_STATE_LOGGED_IN ||
-           sc->SCp.phase != session->age) {
+           iscsi_cmd(sc)->age != session->age) {
                spin_unlock_bh(&session->frwd_lock);
                mutex_unlock(&session->eh_mutex);
                ISCSI_DBG_EH(session, "failing abort due to dropped "
@@ -2282,7 +2282,7 @@ int iscsi_eh_abort(struct scsi_cmnd *sc)
        }
 
        spin_lock(&session->back_lock);
-       task = (struct iscsi_task *)sc->SCp.ptr;
+       task = iscsi_cmd(sc)->task;
        if (!task || !task->sc) {
                /* task completed before time out */
                ISCSI_DBG_EH(session, "sc completed while abort in progress\n");
@@ -2798,11 +2798,9 @@ struct Scsi_Host *iscsi_host_alloc(struct scsi_host_template *sht,
        ihost = shost_priv(shost);
 
        if (xmit_can_sleep) {
-               snprintf(ihost->workq_name, sizeof(ihost->workq_name),
-                       "iscsi_q_%d", shost->host_no);
-               ihost->workq = alloc_workqueue("%s",
+               ihost->workq = alloc_workqueue("iscsi_q_%d",
                        WQ_SYSFS | __WQ_LEGACY | WQ_MEM_RECLAIM | WQ_UNBOUND,
-                       1, ihost->workq_name);
+                       1, shost->host_no);
                if (!ihost->workq)
                        goto free_host;
        }
@@ -3040,8 +3038,9 @@ iscsi_conn_setup(struct iscsi_cls_session *cls_session, int dd_size,
        struct iscsi_conn *conn;
        struct iscsi_cls_conn *cls_conn;
        char *data;
+       int err;
 
-       cls_conn = iscsi_create_conn(cls_session, sizeof(*conn) + dd_size,
+       cls_conn = iscsi_alloc_conn(cls_session, sizeof(*conn) + dd_size,
                                     conn_idx);
        if (!cls_conn)
                return NULL;
@@ -3078,13 +3077,21 @@ iscsi_conn_setup(struct iscsi_cls_session *cls_session, int dd_size,
                goto login_task_data_alloc_fail;
        conn->login_task->data = conn->data = data;
 
+       err = iscsi_add_conn(cls_conn);
+       if (err)
+               goto login_task_add_dev_fail;
+
        return cls_conn;
 
+login_task_add_dev_fail:
+       free_pages((unsigned long) conn->data,
+                  get_order(ISCSI_DEF_MAX_RECV_SEG_LEN));
+
 login_task_data_alloc_fail:
        kfifo_in(&session->cmdpool.queue, (void*)&conn->login_task,
                    sizeof(void*));
 login_task_alloc_fail:
-       iscsi_destroy_conn(cls_conn);
+       iscsi_put_conn(cls_conn);
        return NULL;
 }
 EXPORT_SYMBOL_GPL(iscsi_conn_setup);
@@ -3100,8 +3107,8 @@ void iscsi_conn_teardown(struct iscsi_cls_conn *cls_conn)
 {
        struct iscsi_conn *conn = cls_conn->dd_data;
        struct iscsi_session *session = conn->session;
-       char *tmp_persistent_address = conn->persistent_address;
-       char *tmp_local_ipaddr = conn->local_ipaddr;
+
+       iscsi_remove_conn(cls_conn);
 
        del_timer_sync(&conn->transport_timer);
 
@@ -3123,6 +3130,8 @@ void iscsi_conn_teardown(struct iscsi_cls_conn *cls_conn)
        spin_lock_bh(&session->frwd_lock);
        free_pages((unsigned long) conn->data,
                   get_order(ISCSI_DEF_MAX_RECV_SEG_LEN));
+       kfree(conn->persistent_address);
+       kfree(conn->local_ipaddr);
        /* regular RX path uses back_lock */
        spin_lock_bh(&session->back_lock);
        kfifo_in(&session->cmdpool.queue, (void*)&conn->login_task,
@@ -3133,9 +3142,7 @@ void iscsi_conn_teardown(struct iscsi_cls_conn *cls_conn)
        spin_unlock_bh(&session->frwd_lock);
        mutex_unlock(&session->eh_mutex);
 
-       iscsi_destroy_conn(cls_conn);
-       kfree(tmp_persistent_address);
-       kfree(tmp_local_ipaddr);
+       iscsi_put_conn(cls_conn);
 }
 EXPORT_SYMBOL_GPL(iscsi_conn_teardown);