diff options
author | Christoph Hellwig <hch@infradead.org> | 2012-04-24 00:25:04 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2012-05-06 18:11:25 -0400 |
commit | 785fdf70b2b46588c973ad8b65ed62871994452f (patch) | |
tree | e564a42e34e5a471f6d69a3d8e5e845ebf8c8eef /drivers/target | |
parent | 4101f0a89d4eb13f04cb0344d59a335b862ca5f9 (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.c | 6 | ||||
-rw-r--r-- | drivers/target/target_core_transport.c | 121 |
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 | */ |
676 | void transport_complete_sync_cache(struct se_cmd *cmd, int good) | 677 | void 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 | ||
775 | void target_complete_cmd(struct se_cmd *cmd, u8 scsi_status) | 775 | void 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 | */ |
792 | static inline int transport_add_task_check_sam_attr( | 791 | static 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 | */ |
835 | static void __transport_add_task_to_execute_queue( | 829 | static 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 | } |
881 | out: | ||
886 | spin_unlock_irqrestore(&cmd->t_state_lock, flags); | 882 | spin_unlock_irqrestore(&cmd->t_state_lock, flags); |
887 | } | 883 | } |
888 | 884 | ||
889 | static void __transport_add_tasks_from_cmd(struct se_cmd *cmd) | 885 | static 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 | ||
906 | static void transport_add_tasks_from_cmd(struct se_cmd *cmd) | 894 | static 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 | ||
1896 | static int transport_stop_tasks_for_cmd(struct se_cmd *cmd) | 1883 | static 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 | } |
1919 | out: | ||
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 | } |
2493 | out: | ||
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 | ||
3430 | static void transport_free_dev_tasks(struct se_cmd *cmd) | 3411 | static 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 | ||
3452 | static inline void transport_free_sgl(struct scatterlist *sgl, int nents) | 3420 | static 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)); |