aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2012-04-24 00:25:04 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2012-05-06 18:11:25 -0400
commit785fdf70b2b46588c973ad8b65ed62871994452f (patch)
treee564a42e34e5a471f6d69a3d8e5e845ebf8c8eef /drivers/target
parent4101f0a89d4eb13f04cb0344d59a335b862ca5f9 (diff)
target: simplify command to task linkage
Now that we only have a single task per command we can use a direct pointer to it instead of list. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target')
-rw-r--r--drivers/target/target_core_tmr.c6
-rw-r--r--drivers/target/target_core_transport.c121
2 files changed, 44 insertions, 83 deletions
diff --git a/drivers/target/target_core_tmr.c b/drivers/target/target_core_tmr.c
index f015839aef89..98204d06cdf6 100644
--- a/drivers/target/target_core_tmr.c
+++ b/drivers/target/target_core_tmr.c
@@ -321,13 +321,11 @@ static void core_tmr_drain_task_list(
321 cmd->se_tfo->get_cmd_state(cmd), cmd->t_state, 321 cmd->se_tfo->get_cmd_state(cmd), cmd->t_state,
322 cmd->t_task_cdb[0]); 322 cmd->t_task_cdb[0]);
323 pr_debug("LUN_RESET: ITT[0x%08x] - pr_res_key: 0x%016Lx" 323 pr_debug("LUN_RESET: ITT[0x%08x] - pr_res_key: 0x%016Lx"
324 " t_task_cdbs: %d t_task_cdbs_left: %d" 324 " t_task_cdbs_left: %d"
325 " t_task_cdbs_sent: %d -- CMD_T_ACTIVE: %d" 325 " -- CMD_T_ACTIVE: %d"
326 " CMD_T_STOP: %d CMD_T_SENT: %d\n", 326 " CMD_T_STOP: %d CMD_T_SENT: %d\n",
327 cmd->se_tfo->get_task_tag(cmd), cmd->pr_res_key, 327 cmd->se_tfo->get_task_tag(cmd), cmd->pr_res_key,
328 cmd->t_task_list_num,
329 atomic_read(&cmd->t_task_cdbs_left), 328 atomic_read(&cmd->t_task_cdbs_left),
330 atomic_read(&cmd->t_task_cdbs_sent),
331 (cmd->transport_state & CMD_T_ACTIVE) != 0, 329 (cmd->transport_state & CMD_T_ACTIVE) != 0,
332 (cmd->transport_state & CMD_T_STOP) != 0, 330 (cmd->transport_state & CMD_T_STOP) != 0,
333 (cmd->transport_state & CMD_T_SENT) != 0); 331 (cmd->transport_state & CMD_T_SENT) != 0);
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
index 5267198688fe..a2246359e6f4 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -453,9 +453,10 @@ static void transport_all_task_dev_remove_state(struct se_cmd *cmd)
453 if (!dev) 453 if (!dev)
454 return; 454 return;
455 455
456 list_for_each_entry(task, &cmd->t_task_list, t_list) { 456 task = cmd->t_task;
457 if (task) {
457 if (task->task_flags & TF_ACTIVE) 458 if (task->task_flags & TF_ACTIVE)
458 continue; 459 return;
459 460
460 spin_lock_irqsave(&dev->execute_task_lock, flags); 461 spin_lock_irqsave(&dev->execute_task_lock, flags);
461 if (task->t_state_active) { 462 if (task->t_state_active) {
@@ -675,8 +676,7 @@ static void transport_remove_cmd_from_queue(struct se_cmd *cmd)
675 */ 676 */
676void transport_complete_sync_cache(struct se_cmd *cmd, int good) 677void transport_complete_sync_cache(struct se_cmd *cmd, int good)
677{ 678{
678 struct se_task *task = list_entry(cmd->t_task_list.next, 679 struct se_task *task = cmd->t_task;
679 struct se_task, t_list);
680 680
681 if (good) { 681 if (good) {
682 cmd->scsi_status = SAM_STAT_GOOD; 682 cmd->scsi_status = SAM_STAT_GOOD;
@@ -774,8 +774,7 @@ EXPORT_SYMBOL(transport_complete_task);
774 774
775void target_complete_cmd(struct se_cmd *cmd, u8 scsi_status) 775void target_complete_cmd(struct se_cmd *cmd, u8 scsi_status)
776{ 776{
777 struct se_task *task = list_entry(cmd->t_task_list.next, 777 struct se_task *task = cmd->t_task;
778 struct se_task, t_list);
779 778
780 task->task_scsi_status = scsi_status; 779 task->task_scsi_status = scsi_status;
781 transport_complete_task(task, scsi_status == GOOD); 780 transport_complete_task(task, scsi_status == GOOD);
@@ -791,7 +790,6 @@ EXPORT_SYMBOL(target_complete_cmd);
791 */ 790 */
792static inline int transport_add_task_check_sam_attr( 791static inline int transport_add_task_check_sam_attr(
793 struct se_task *task, 792 struct se_task *task,
794 struct se_task *task_prev,
795 struct se_device *dev) 793 struct se_device *dev)
796{ 794{
797 /* 795 /*
@@ -805,14 +803,10 @@ static inline int transport_add_task_check_sam_attr(
805 /* 803 /*
806 * HEAD_OF_QUEUE attribute for received CDB, which means 804 * HEAD_OF_QUEUE attribute for received CDB, which means
807 * the first task that is associated with a struct se_cmd goes to 805 * the first task that is associated with a struct se_cmd goes to
808 * head of the struct se_device->execute_task_list, and task_prev 806 * head of the struct se_device->execute_task_list.
809 * after that for each subsequent task
810 */ 807 */
811 if (task->task_se_cmd->sam_task_attr == MSG_HEAD_TAG) { 808 if (task->task_se_cmd->sam_task_attr == MSG_HEAD_TAG) {
812 list_add(&task->t_execute_list, 809 list_add(&task->t_execute_list, &dev->execute_task_list);
813 (task_prev != NULL) ?
814 &task_prev->t_execute_list :
815 &dev->execute_task_list);
816 810
817 pr_debug("Set HEAD_OF_QUEUE for task CDB: 0x%02x" 811 pr_debug("Set HEAD_OF_QUEUE for task CDB: 0x%02x"
818 " in execution queue\n", 812 " in execution queue\n",
@@ -834,12 +828,11 @@ static inline int transport_add_task_check_sam_attr(
834 */ 828 */
835static void __transport_add_task_to_execute_queue( 829static void __transport_add_task_to_execute_queue(
836 struct se_task *task, 830 struct se_task *task,
837 struct se_task *task_prev,
838 struct se_device *dev) 831 struct se_device *dev)
839{ 832{
840 int head_of_queue; 833 int head_of_queue;
841 834
842 head_of_queue = transport_add_task_check_sam_attr(task, task_prev, dev); 835 head_of_queue = transport_add_task_check_sam_attr(task, dev);
843 atomic_inc(&dev->execute_tasks); 836 atomic_inc(&dev->execute_tasks);
844 837
845 if (task->t_state_active) 838 if (task->t_state_active)
@@ -850,9 +843,7 @@ static void __transport_add_task_to_execute_queue(
850 * will always return head_of_queue == 0 here 843 * will always return head_of_queue == 0 here
851 */ 844 */
852 if (head_of_queue) 845 if (head_of_queue)
853 list_add(&task->t_state_list, (task_prev) ? 846 list_add(&task->t_state_list, &dev->state_task_list);
854 &task_prev->t_state_list :
855 &dev->state_task_list);
856 else 847 else
857 list_add_tail(&task->t_state_list, &dev->state_task_list); 848 list_add_tail(&task->t_state_list, &dev->state_task_list);
858 849
@@ -870,7 +861,11 @@ static void transport_add_tasks_to_state_queue(struct se_cmd *cmd)
870 unsigned long flags; 861 unsigned long flags;
871 862
872 spin_lock_irqsave(&cmd->t_state_lock, flags); 863 spin_lock_irqsave(&cmd->t_state_lock, flags);
873 list_for_each_entry(task, &cmd->t_task_list, t_list) { 864 task = cmd->t_task;
865 if (task) {
866 if (task->task_flags & TF_ACTIVE)
867 goto out;
868
874 spin_lock(&dev->execute_task_lock); 869 spin_lock(&dev->execute_task_lock);
875 if (!task->t_state_active) { 870 if (!task->t_state_active) {
876 list_add_tail(&task->t_state_list, 871 list_add_tail(&task->t_state_list,
@@ -883,24 +878,17 @@ static void transport_add_tasks_to_state_queue(struct se_cmd *cmd)
883 } 878 }
884 spin_unlock(&dev->execute_task_lock); 879 spin_unlock(&dev->execute_task_lock);
885 } 880 }
881out:
886 spin_unlock_irqrestore(&cmd->t_state_lock, flags); 882 spin_unlock_irqrestore(&cmd->t_state_lock, flags);
887} 883}
888 884
889static void __transport_add_tasks_from_cmd(struct se_cmd *cmd) 885static void __transport_add_tasks_from_cmd(struct se_cmd *cmd)
890{ 886{
891 struct se_device *dev = cmd->se_dev; 887 struct se_task *task;
892 struct se_task *task, *task_prev = NULL;
893 888
894 list_for_each_entry(task, &cmd->t_task_list, t_list) { 889 task = cmd->t_task;
895 if (!list_empty(&task->t_execute_list)) 890 if (task && list_empty(&task->t_execute_list))
896 continue; 891 __transport_add_task_to_execute_queue(task, cmd->se_dev);
897 /*
898 * __transport_add_task_to_execute_queue() handles the
899 * SAM Task Attribute emulation if enabled
900 */
901 __transport_add_task_to_execute_queue(task, task_prev, dev);
902 task_prev = task;
903 }
904} 892}
905 893
906static void transport_add_tasks_from_cmd(struct se_cmd *cmd) 894static void transport_add_tasks_from_cmd(struct se_cmd *cmd)
@@ -1494,7 +1482,6 @@ void transport_init_se_cmd(
1494 INIT_LIST_HEAD(&cmd->se_qf_node); 1482 INIT_LIST_HEAD(&cmd->se_qf_node);
1495 INIT_LIST_HEAD(&cmd->se_queue_node); 1483 INIT_LIST_HEAD(&cmd->se_queue_node);
1496 INIT_LIST_HEAD(&cmd->se_cmd_list); 1484 INIT_LIST_HEAD(&cmd->se_cmd_list);
1497 INIT_LIST_HEAD(&cmd->t_task_list);
1498 init_completion(&cmd->transport_lun_fe_stop_comp); 1485 init_completion(&cmd->transport_lun_fe_stop_comp);
1499 init_completion(&cmd->transport_lun_stop_comp); 1486 init_completion(&cmd->transport_lun_stop_comp);
1500 init_completion(&cmd->t_transport_stop_comp); 1487 init_completion(&cmd->t_transport_stop_comp);
@@ -1895,7 +1882,7 @@ bool target_stop_task(struct se_task *task, unsigned long *flags)
1895 1882
1896static int transport_stop_tasks_for_cmd(struct se_cmd *cmd) 1883static int transport_stop_tasks_for_cmd(struct se_cmd *cmd)
1897{ 1884{
1898 struct se_task *task, *task_tmp; 1885 struct se_task *task;
1899 unsigned long flags; 1886 unsigned long flags;
1900 int ret = 0; 1887 int ret = 0;
1901 1888
@@ -1906,8 +1893,8 @@ static int transport_stop_tasks_for_cmd(struct se_cmd *cmd)
1906 * No tasks remain in the execution queue 1893 * No tasks remain in the execution queue
1907 */ 1894 */
1908 spin_lock_irqsave(&cmd->t_state_lock, flags); 1895 spin_lock_irqsave(&cmd->t_state_lock, flags);
1909 list_for_each_entry_safe(task, task_tmp, 1896 task = cmd->t_task;
1910 &cmd->t_task_list, t_list) { 1897 if (task) {
1911 pr_debug("Processing task %p\n", task); 1898 pr_debug("Processing task %p\n", task);
1912 /* 1899 /*
1913 * If the struct se_task has not been sent and is not active, 1900 * If the struct se_task has not been sent and is not active,
@@ -1921,7 +1908,7 @@ static int transport_stop_tasks_for_cmd(struct se_cmd *cmd)
1921 1908
1922 pr_debug("Task %p removed from execute queue\n", task); 1909 pr_debug("Task %p removed from execute queue\n", task);
1923 spin_lock_irqsave(&cmd->t_state_lock, flags); 1910 spin_lock_irqsave(&cmd->t_state_lock, flags);
1924 continue; 1911 goto out;
1925 } 1912 }
1926 1913
1927 if (!target_stop_task(task, &flags)) { 1914 if (!target_stop_task(task, &flags)) {
@@ -1929,8 +1916,8 @@ static int transport_stop_tasks_for_cmd(struct se_cmd *cmd)
1929 ret++; 1916 ret++;
1930 } 1917 }
1931 } 1918 }
1919out:
1932 spin_unlock_irqrestore(&cmd->t_state_lock, flags); 1920 spin_unlock_irqrestore(&cmd->t_state_lock, flags);
1933
1934 return ret; 1921 return ret;
1935} 1922}
1936 1923
@@ -1947,12 +1934,10 @@ void transport_generic_request_failure(struct se_cmd *cmd)
1947 pr_debug("-----[ i_state: %d t_state: %d scsi_sense_reason: %d\n", 1934 pr_debug("-----[ i_state: %d t_state: %d scsi_sense_reason: %d\n",
1948 cmd->se_tfo->get_cmd_state(cmd), 1935 cmd->se_tfo->get_cmd_state(cmd),
1949 cmd->t_state, cmd->scsi_sense_reason); 1936 cmd->t_state, cmd->scsi_sense_reason);
1950 pr_debug("-----[ t_tasks: %d t_task_cdbs_left: %d" 1937 pr_debug("-----[ t_task_cdbs_left: %d"
1951 " t_task_cdbs_sent: %d t_task_cdbs_ex_left: %d --" 1938 " t_task_cdbs_ex_left: %d --"
1952 " CMD_T_ACTIVE: %d CMD_T_STOP: %d CMD_T_SENT: %d\n", 1939 " CMD_T_ACTIVE: %d CMD_T_STOP: %d CMD_T_SENT: %d\n",
1953 cmd->t_task_list_num,
1954 atomic_read(&cmd->t_task_cdbs_left), 1940 atomic_read(&cmd->t_task_cdbs_left),
1955 atomic_read(&cmd->t_task_cdbs_sent),
1956 atomic_read(&cmd->t_task_cdbs_ex_left), 1941 atomic_read(&cmd->t_task_cdbs_ex_left),
1957 (cmd->transport_state & CMD_T_ACTIVE) != 0, 1942 (cmd->transport_state & CMD_T_ACTIVE) != 0,
1958 (cmd->transport_state & CMD_T_STOP) != 0, 1943 (cmd->transport_state & CMD_T_STOP) != 0,
@@ -2212,11 +2197,7 @@ check_depth:
2212 cmd = task->task_se_cmd; 2197 cmd = task->task_se_cmd;
2213 spin_lock_irqsave(&cmd->t_state_lock, flags); 2198 spin_lock_irqsave(&cmd->t_state_lock, flags);
2214 task->task_flags |= (TF_ACTIVE | TF_SENT); 2199 task->task_flags |= (TF_ACTIVE | TF_SENT);
2215 atomic_inc(&cmd->t_task_cdbs_sent); 2200 cmd->transport_state |= CMD_T_SENT;
2216
2217 if (atomic_read(&cmd->t_task_cdbs_sent) ==
2218 cmd->t_task_list_num)
2219 cmd->transport_state |= CMD_T_SENT;
2220 2201
2221 spin_unlock_irqrestore(&cmd->t_state_lock, flags); 2202 spin_unlock_irqrestore(&cmd->t_state_lock, flags);
2222 2203
@@ -2458,7 +2439,7 @@ static int transport_get_sense_data(struct se_cmd *cmd)
2458{ 2439{
2459 unsigned char *buffer = cmd->sense_buffer, *sense_buffer = NULL; 2440 unsigned char *buffer = cmd->sense_buffer, *sense_buffer = NULL;
2460 struct se_device *dev = cmd->se_dev; 2441 struct se_device *dev = cmd->se_dev;
2461 struct se_task *task = NULL, *task_tmp; 2442 struct se_task *task = NULL;
2462 unsigned long flags; 2443 unsigned long flags;
2463 u32 offset = 0; 2444 u32 offset = 0;
2464 2445
@@ -2473,15 +2454,15 @@ static int transport_get_sense_data(struct se_cmd *cmd)
2473 return 0; 2454 return 0;
2474 } 2455 }
2475 2456
2476 list_for_each_entry_safe(task, task_tmp, 2457 task = cmd->t_task;
2477 &cmd->t_task_list, t_list) { 2458 if (task) {
2478 if (!(task->task_flags & TF_HAS_SENSE)) 2459 if (!(task->task_flags & TF_HAS_SENSE))
2479 continue; 2460 goto out;
2480 2461
2481 if (!dev->transport->get_sense_buffer) { 2462 if (!dev->transport->get_sense_buffer) {
2482 pr_err("dev->transport->get_sense_buffer" 2463 pr_err("dev->transport->get_sense_buffer"
2483 " is NULL\n"); 2464 " is NULL\n");
2484 continue; 2465 goto out;
2485 } 2466 }
2486 2467
2487 sense_buffer = dev->transport->get_sense_buffer(task); 2468 sense_buffer = dev->transport->get_sense_buffer(task);
@@ -2489,7 +2470,7 @@ static int transport_get_sense_data(struct se_cmd *cmd)
2489 pr_err("ITT[0x%08x]_TASK[%p]: Unable to locate" 2470 pr_err("ITT[0x%08x]_TASK[%p]: Unable to locate"
2490 " sense buffer for task with sense\n", 2471 " sense buffer for task with sense\n",
2491 cmd->se_tfo->get_task_tag(cmd), task); 2472 cmd->se_tfo->get_task_tag(cmd), task);
2492 continue; 2473 goto out;
2493 } 2474 }
2494 spin_unlock_irqrestore(&cmd->t_state_lock, flags); 2475 spin_unlock_irqrestore(&cmd->t_state_lock, flags);
2495 2476
@@ -2509,8 +2490,8 @@ static int transport_get_sense_data(struct se_cmd *cmd)
2509 cmd->scsi_status); 2490 cmd->scsi_status);
2510 return 0; 2491 return 0;
2511 } 2492 }
2493out:
2512 spin_unlock_irqrestore(&cmd->t_state_lock, flags); 2494 spin_unlock_irqrestore(&cmd->t_state_lock, flags);
2513
2514 return -1; 2495 return -1;
2515} 2496}
2516 2497
@@ -3429,24 +3410,11 @@ queue_full:
3429 3410
3430static void transport_free_dev_tasks(struct se_cmd *cmd) 3411static void transport_free_dev_tasks(struct se_cmd *cmd)
3431{ 3412{
3432 struct se_task *task, *task_tmp; 3413 struct se_task *task;
3433 unsigned long flags;
3434 LIST_HEAD(dispose_list);
3435
3436 spin_lock_irqsave(&cmd->t_state_lock, flags);
3437 list_for_each_entry_safe(task, task_tmp,
3438 &cmd->t_task_list, t_list) {
3439 if (!(task->task_flags & TF_ACTIVE))
3440 list_move_tail(&task->t_list, &dispose_list);
3441 }
3442 spin_unlock_irqrestore(&cmd->t_state_lock, flags);
3443
3444 while (!list_empty(&dispose_list)) {
3445 task = list_first_entry(&dispose_list, struct se_task, t_list);
3446 3414
3447 list_del(&task->t_list); 3415 task = cmd->t_task;
3416 if (task && !(task->task_flags & TF_ACTIVE))
3448 cmd->se_dev->transport->free_task(task); 3417 cmd->se_dev->transport->free_task(task);
3449 }
3450} 3418}
3451 3419
3452static inline void transport_free_sgl(struct scatterlist *sgl, int nents) 3420static inline void transport_free_sgl(struct scatterlist *sgl, int nents)
@@ -3690,7 +3658,6 @@ int transport_generic_new_cmd(struct se_cmd *cmd)
3690{ 3658{
3691 struct se_device *dev = cmd->se_dev; 3659 struct se_device *dev = cmd->se_dev;
3692 struct se_task *task; 3660 struct se_task *task;
3693 unsigned long flags;
3694 int ret = 0; 3661 int ret = 0;
3695 3662
3696 /* 3663 /*
@@ -3742,7 +3709,6 @@ int transport_generic_new_cmd(struct se_cmd *cmd)
3742 goto out_fail; 3709 goto out_fail;
3743 } 3710 }
3744 3711
3745 INIT_LIST_HEAD(&task->t_list);
3746 INIT_LIST_HEAD(&task->t_execute_list); 3712 INIT_LIST_HEAD(&task->t_execute_list);
3747 INIT_LIST_HEAD(&task->t_state_list); 3713 INIT_LIST_HEAD(&task->t_state_list);
3748 init_completion(&task->task_stop_comp); 3714 init_completion(&task->task_stop_comp);
@@ -3751,16 +3717,13 @@ int transport_generic_new_cmd(struct se_cmd *cmd)
3751 task->task_sg = cmd->t_data_sg; 3717 task->task_sg = cmd->t_data_sg;
3752 task->task_sg_nents = cmd->t_data_nents; 3718 task->task_sg_nents = cmd->t_data_nents;
3753 3719
3754 spin_lock_irqsave(&cmd->t_state_lock, flags); 3720 cmd->t_task = task;
3755 list_add_tail(&task->t_list, &cmd->t_task_list);
3756 spin_unlock_irqrestore(&cmd->t_state_lock, flags);
3757 3721
3758 atomic_inc(&cmd->t_fe_count); 3722 atomic_inc(&cmd->t_fe_count);
3759 atomic_inc(&cmd->t_se_count); 3723 atomic_inc(&cmd->t_se_count);
3760 3724
3761 cmd->t_task_list_num = 1; 3725 atomic_set(&cmd->t_task_cdbs_left, 1);
3762 atomic_set(&cmd->t_task_cdbs_left, cmd->t_task_list_num); 3726 atomic_set(&cmd->t_task_cdbs_ex_left, 1);
3763 atomic_set(&cmd->t_task_cdbs_ex_left, cmd->t_task_list_num);
3764 3727
3765 /* 3728 /*
3766 * For WRITEs, let the fabric know its buffer is ready.. 3729 * For WRITEs, let the fabric know its buffer is ready..
@@ -4026,8 +3989,8 @@ static int transport_lun_wait_for_tasks(struct se_cmd *cmd, struct se_lun *lun)
4026 3989
4027 ret = transport_stop_tasks_for_cmd(cmd); 3990 ret = transport_stop_tasks_for_cmd(cmd);
4028 3991
4029 pr_debug("ConfigFS: cmd: %p t_tasks: %d stop tasks ret:" 3992 pr_debug("ConfigFS: cmd: %p stop tasks ret:"
4030 " %d\n", cmd, cmd->t_task_list_num, ret); 3993 " %d\n", cmd, ret);
4031 if (!ret) { 3994 if (!ret) {
4032 pr_debug("ConfigFS: ITT[0x%08x] - stopping cmd....\n", 3995 pr_debug("ConfigFS: ITT[0x%08x] - stopping cmd....\n",
4033 cmd->se_tfo->get_task_tag(cmd)); 3996 cmd->se_tfo->get_task_tag(cmd));