Ignore:
Timestamp:
Apr 21, 2017, 4:28:29 AM (4 months ago)
Author:
brainslayer
Message:

update

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/linux/universal/linux-3.18/drivers/scsi/libiscsi.c

    r27888 r31885  
    561561        task->state = state;
    562562
    563         if (!list_empty(&task->running))
     563        spin_lock_bh(&conn->taskqueuelock);
     564        if (!list_empty(&task->running)) {
     565                pr_debug_once("%s while task on list", __func__);
    564566                list_del_init(&task->running);
     567        }
     568        spin_unlock_bh(&conn->taskqueuelock);
    565569
    566570        if (conn->task == task)
     
    784788                        goto free_task;
    785789        } else {
     790                spin_lock_bh(&conn->taskqueuelock);
    786791                list_add_tail(&task->running, &conn->mgmtqueue);
     792                spin_unlock_bh(&conn->taskqueuelock);
    787793                iscsi_conn_queue_work(conn);
    788794        }
     
    14751481         * is handling the r2ts while we are adding new ones
    14761482         */
     1483        spin_lock_bh(&conn->taskqueuelock);
    14771484        if (list_empty(&task->running))
    14781485                list_add_tail(&task->running, &conn->requeue);
     1486        spin_unlock_bh(&conn->taskqueuelock);
    14791487        iscsi_conn_queue_work(conn);
    14801488}
     
    15131521         * overflow us with nop-ins
    15141522         */
     1523        spin_lock_bh(&conn->taskqueuelock);
    15151524check_mgmt:
    15161525        while (!list_empty(&conn->mgmtqueue)) {
     
    15181527                                         struct iscsi_task, running);
    15191528                list_del_init(&conn->task->running);
     1529                spin_unlock_bh(&conn->taskqueuelock);
    15201530                if (iscsi_prep_mgmt_task(conn, conn->task)) {
    15211531                        /* regular RX path uses back_lock */
     
    15241534                        spin_unlock_bh(&conn->session->back_lock);
    15251535                        conn->task = NULL;
     1536                        spin_lock_bh(&conn->taskqueuelock);
    15261537                        continue;
    15271538                }
     
    15291540                if (rc)
    15301541                        goto done;
     1542                spin_lock_bh(&conn->taskqueuelock);
    15311543        }
    15321544
     
    15361548                                        running);
    15371549                list_del_init(&conn->task->running);
     1550                spin_unlock_bh(&conn->taskqueuelock);
    15381551                if (conn->session->state == ISCSI_STATE_LOGGING_OUT) {
    15391552                        fail_scsi_task(conn->task, DID_IMM_RETRY);
     1553                        spin_lock_bh(&conn->taskqueuelock);
    15401554                        continue;
    15411555                }
     
    15431557                if (rc) {
    15441558                        if (rc == -ENOMEM || rc == -EACCES) {
     1559                                spin_lock_bh(&conn->taskqueuelock);
    15451560                                list_add_tail(&conn->task->running,
    15461561                                              &conn->cmdqueue);
    15471562                                conn->task = NULL;
     1563                                spin_unlock_bh(&conn->taskqueuelock);
    15481564                                goto done;
    15491565                        } else
    15501566                                fail_scsi_task(conn->task, DID_ABORT);
     1567                        spin_lock_bh(&conn->taskqueuelock);
    15511568                        continue;
    15521569                }
     
    15591576                 * be sent to aviod starvation
    15601577                 */
     1578                spin_lock_bh(&conn->taskqueuelock);
    15611579                if (!list_empty(&conn->mgmtqueue))
    15621580                        goto check_mgmt;
     
    15781596                list_del_init(&conn->task->running);
    15791597                conn->task->state = ISCSI_TASK_RUNNING;
     1598                spin_unlock_bh(&conn->taskqueuelock);
    15801599                rc = iscsi_xmit_task(conn);
    15811600                if (rc)
    15821601                        goto done;
     1602                spin_lock_bh(&conn->taskqueuelock);
    15831603                if (!list_empty(&conn->mgmtqueue))
    15841604                        goto check_mgmt;
    15851605        }
     1606        spin_unlock_bh(&conn->taskqueuelock);
    15861607        spin_unlock_bh(&conn->session->frwd_lock);
    15871608        return -ENODATA;
     
    17391760                }
    17401761        } else {
     1762                spin_lock_bh(&conn->taskqueuelock);
    17411763                list_add_tail(&task->running, &conn->cmdqueue);
     1764                spin_unlock_bh(&conn->taskqueuelock);
    17421765                iscsi_conn_queue_work(conn);
    17431766        }
     
    29182941        INIT_LIST_HEAD(&conn->cmdqueue);
    29192942        INIT_LIST_HEAD(&conn->requeue);
     2943        spin_lock_init(&conn->taskqueuelock);
    29202944        INIT_WORK(&conn->xmitwork, iscsi_xmitworker);
    29212945
Note: See TracChangeset for help on using the changeset viewer.