aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target
diff options
context:
space:
mode:
authorAndy Grover <agrover@redhat.com>2011-07-20 15:28:46 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2011-07-22 05:37:48 -0400
commitec98f7825c6eaa4a9afb0eb518826efc8a2ed4a2 (patch)
treeb4ccee24db5d7d54ccfa5e3be2441d3a4e37f295 /drivers/target
parent3a86720567fd92819b449df10db85a2f73447d87 (diff)
target: Eliminate usage of struct se_mem
Both backstores and fabrics use arrays of struct scatterlist to describe data buffers. However TCM used struct se_mems, basically a linked list of scatterlist entries. We are able to simplify the code by eliminating this intermediate data structure and just using struct scatterlist[] throughout. Also, moved attachment of task to cmd out of transport_generic_get_task and into allocate_control_task and allocate_data_tasks. The reasoning is that it's nonintuitive that get_task should automatically add it to the cmd's task list -- it should just return an allocated, initialized task. That's all it should do, based on the function's name, so either the function shouldn't do it, or the name should change to encapsulate the entire essence of what it does. (nab: Fix compile warnings in tcm_fc, and make transport_kmap_first_data_page honor sg->offset for SGLs from contigious memory with TCM_Loop, and fix control se_cmd descriptor memory leak) Signed-off-by: Andy Grover <agrover@redhat.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target')
-rw-r--r--drivers/target/loopback/tcm_loop.c5
-rw-r--r--drivers/target/target_core_iblock.c2
-rw-r--r--drivers/target/target_core_pscsi.c2
-rw-r--r--drivers/target/target_core_transport.c995
-rw-r--r--drivers/target/tcm_fc/tfc_cmd.c25
-rw-r--r--drivers/target/tcm_fc/tfc_io.c58
6 files changed, 307 insertions, 780 deletions
diff --git a/drivers/target/loopback/tcm_loop.c b/drivers/target/loopback/tcm_loop.c
index fe11a336b598..99603bc45786 100644
--- a/drivers/target/loopback/tcm_loop.c
+++ b/drivers/target/loopback/tcm_loop.c
@@ -175,10 +175,7 @@ static int tcm_loop_new_cmd_map(struct se_cmd *se_cmd)
175 sgl_bidi_count = sdb->table.nents; 175 sgl_bidi_count = sdb->table.nents;
176 } 176 }
177 177
178 /* 178 /* Tell the core about our preallocated memory */
179 * Map the SG memory into struct se_mem->page linked list using the same
180 * physical memory at sg->page_link.
181 */
182 ret = transport_generic_map_mem_to_cmd(se_cmd, scsi_sglist(sc), 179 ret = transport_generic_map_mem_to_cmd(se_cmd, scsi_sglist(sc),
183 scsi_sg_count(sc), sgl_bidi, sgl_bidi_count); 180 scsi_sg_count(sc), sgl_bidi, sgl_bidi_count);
184 if (ret < 0) 181 if (ret < 0)
diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c
index 392e75fb1087..164b72106b88 100644
--- a/drivers/target/target_core_iblock.c
+++ b/drivers/target/target_core_iblock.c
@@ -634,7 +634,7 @@ static int iblock_map_task_SG(struct se_task *task)
634 hbio = tbio = bio; 634 hbio = tbio = bio;
635 /* 635 /*
636 * Use fs/bio.c:bio_add_pages() to setup the bio_vec maplist 636 * Use fs/bio.c:bio_add_pages() to setup the bio_vec maplist
637 * from TCM struct se_mem -> task->task_sg -> struct scatterlist memory. 637 * from task->task_sg -> struct scatterlist memory.
638 */ 638 */
639 for_each_sg(task->task_sg, sg, task->task_sg_num, i) { 639 for_each_sg(task->task_sg, sg, task->task_sg_num, i) {
640 DEBUG_IBLOCK("task: %p bio: %p Calling bio_add_page(): page:" 640 DEBUG_IBLOCK("task: %p bio: %p Calling bio_add_page(): page:"
diff --git a/drivers/target/target_core_pscsi.c b/drivers/target/target_core_pscsi.c
index d9569242e3dc..318ef14fe37d 100644
--- a/drivers/target/target_core_pscsi.c
+++ b/drivers/target/target_core_pscsi.c
@@ -1097,7 +1097,7 @@ static int __pscsi_map_task_SG(
1097 return 0; 1097 return 0;
1098 /* 1098 /*
1099 * For SCF_SCSI_DATA_SG_IO_CDB, Use fs/bio.c:bio_add_page() to setup 1099 * For SCF_SCSI_DATA_SG_IO_CDB, Use fs/bio.c:bio_add_page() to setup
1100 * the bio_vec maplist from TC< struct se_mem -> task->task_sg -> 1100 * the bio_vec maplist from task->task_sg ->
1101 * struct scatterlist memory. The struct se_task->task_sg[] currently needs 1101 * struct scatterlist memory. The struct se_task->task_sg[] currently needs
1102 * to be attached to struct bios for submission to Linux/SCSI using 1102 * to be attached to struct bios for submission to Linux/SCSI using
1103 * struct request to struct scsi_device->request_queue. 1103 * struct request to struct scsi_device->request_queue.
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
index b499d14f4637..c743d94baf77 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -190,7 +190,6 @@ static struct kmem_cache *se_cmd_cache;
190static struct kmem_cache *se_sess_cache; 190static struct kmem_cache *se_sess_cache;
191struct kmem_cache *se_tmr_req_cache; 191struct kmem_cache *se_tmr_req_cache;
192struct kmem_cache *se_ua_cache; 192struct kmem_cache *se_ua_cache;
193struct kmem_cache *se_mem_cache;
194struct kmem_cache *t10_pr_reg_cache; 193struct kmem_cache *t10_pr_reg_cache;
195struct kmem_cache *t10_alua_lu_gp_cache; 194struct kmem_cache *t10_alua_lu_gp_cache;
196struct kmem_cache *t10_alua_lu_gp_mem_cache; 195struct kmem_cache *t10_alua_lu_gp_mem_cache;
@@ -210,17 +209,12 @@ static void transport_handle_queue_full(struct se_cmd *cmd,
210static void transport_direct_request_timeout(struct se_cmd *cmd); 209static void transport_direct_request_timeout(struct se_cmd *cmd);
211static void transport_free_dev_tasks(struct se_cmd *cmd); 210static void transport_free_dev_tasks(struct se_cmd *cmd);
212static u32 transport_allocate_tasks(struct se_cmd *cmd, 211static u32 transport_allocate_tasks(struct se_cmd *cmd,
213 unsigned long long starting_lba, u32 sectors, 212 unsigned long long starting_lba,
214 enum dma_data_direction data_direction, 213 enum dma_data_direction data_direction,
215 struct list_head *mem_list, int set_counts); 214 struct scatterlist *sgl, unsigned int nents);
216static int transport_generic_get_mem(struct se_cmd *cmd); 215static int transport_generic_get_mem(struct se_cmd *cmd);
217static int transport_generic_remove(struct se_cmd *cmd, 216static int transport_generic_remove(struct se_cmd *cmd,
218 int session_reinstatement); 217 int session_reinstatement);
219static int transport_cmd_get_valid_sectors(struct se_cmd *cmd);
220static int transport_map_sg_to_mem(struct se_cmd *cmd,
221 struct list_head *se_mem_list, struct scatterlist *sgl);
222static void transport_memcpy_se_mem_read_contig(unsigned char *dst,
223 struct list_head *se_mem_list, u32 len);
224static void transport_release_fe_cmd(struct se_cmd *cmd); 218static void transport_release_fe_cmd(struct se_cmd *cmd);
225static void transport_remove_cmd_from_queue(struct se_cmd *cmd, 219static void transport_remove_cmd_from_queue(struct se_cmd *cmd,
226 struct se_queue_obj *qobj); 220 struct se_queue_obj *qobj);
@@ -258,12 +252,6 @@ int init_se_kmem_caches(void)
258 printk(KERN_ERR "kmem_cache_create() for struct se_ua failed\n"); 252 printk(KERN_ERR "kmem_cache_create() for struct se_ua failed\n");
259 goto out; 253 goto out;
260 } 254 }
261 se_mem_cache = kmem_cache_create("se_mem_cache",
262 sizeof(struct se_mem), __alignof__(struct se_mem), 0, NULL);
263 if (!(se_mem_cache)) {
264 printk(KERN_ERR "kmem_cache_create() for struct se_mem failed\n");
265 goto out;
266 }
267 t10_pr_reg_cache = kmem_cache_create("t10_pr_reg_cache", 255 t10_pr_reg_cache = kmem_cache_create("t10_pr_reg_cache",
268 sizeof(struct t10_pr_registration), 256 sizeof(struct t10_pr_registration),
269 __alignof__(struct t10_pr_registration), 0, NULL); 257 __alignof__(struct t10_pr_registration), 0, NULL);
@@ -317,8 +305,6 @@ out:
317 kmem_cache_destroy(se_sess_cache); 305 kmem_cache_destroy(se_sess_cache);
318 if (se_ua_cache) 306 if (se_ua_cache)
319 kmem_cache_destroy(se_ua_cache); 307 kmem_cache_destroy(se_ua_cache);
320 if (se_mem_cache)
321 kmem_cache_destroy(se_mem_cache);
322 if (t10_pr_reg_cache) 308 if (t10_pr_reg_cache)
323 kmem_cache_destroy(t10_pr_reg_cache); 309 kmem_cache_destroy(t10_pr_reg_cache);
324 if (t10_alua_lu_gp_cache) 310 if (t10_alua_lu_gp_cache)
@@ -338,7 +324,6 @@ void release_se_kmem_caches(void)
338 kmem_cache_destroy(se_tmr_req_cache); 324 kmem_cache_destroy(se_tmr_req_cache);
339 kmem_cache_destroy(se_sess_cache); 325 kmem_cache_destroy(se_sess_cache);
340 kmem_cache_destroy(se_ua_cache); 326 kmem_cache_destroy(se_ua_cache);
341 kmem_cache_destroy(se_mem_cache);
342 kmem_cache_destroy(t10_pr_reg_cache); 327 kmem_cache_destroy(t10_pr_reg_cache);
343 kmem_cache_destroy(t10_alua_lu_gp_cache); 328 kmem_cache_destroy(t10_alua_lu_gp_cache);
344 kmem_cache_destroy(t10_alua_lu_gp_mem_cache); 329 kmem_cache_destroy(t10_alua_lu_gp_mem_cache);
@@ -1702,7 +1687,6 @@ transport_generic_get_task(struct se_cmd *cmd,
1702{ 1687{
1703 struct se_task *task; 1688 struct se_task *task;
1704 struct se_device *dev = cmd->se_dev; 1689 struct se_device *dev = cmd->se_dev;
1705 unsigned long flags;
1706 1690
1707 task = dev->transport->alloc_task(cmd); 1691 task = dev->transport->alloc_task(cmd);
1708 if (!task) { 1692 if (!task) {
@@ -1718,10 +1702,6 @@ transport_generic_get_task(struct se_cmd *cmd,
1718 task->se_dev = dev; 1702 task->se_dev = dev;
1719 task->task_data_direction = data_direction; 1703 task->task_data_direction = data_direction;
1720 1704
1721 spin_lock_irqsave(&cmd->t_state_lock, flags);
1722 list_add_tail(&task->t_list, &cmd->t_task_list);
1723 spin_unlock_irqrestore(&cmd->t_state_lock, flags);
1724
1725 return task; 1705 return task;
1726} 1706}
1727 1707
@@ -1745,8 +1725,6 @@ void transport_init_se_cmd(
1745 INIT_LIST_HEAD(&cmd->se_ordered_node); 1725 INIT_LIST_HEAD(&cmd->se_ordered_node);
1746 INIT_LIST_HEAD(&cmd->se_qf_node); 1726 INIT_LIST_HEAD(&cmd->se_qf_node);
1747 1727
1748 INIT_LIST_HEAD(&cmd->t_mem_list);
1749 INIT_LIST_HEAD(&cmd->t_mem_bidi_list);
1750 INIT_LIST_HEAD(&cmd->t_task_list); 1728 INIT_LIST_HEAD(&cmd->t_task_list);
1751 init_completion(&cmd->transport_lun_fe_stop_comp); 1729 init_completion(&cmd->transport_lun_fe_stop_comp);
1752 init_completion(&cmd->transport_lun_stop_comp); 1730 init_completion(&cmd->transport_lun_stop_comp);
@@ -2838,9 +2816,10 @@ EXPORT_SYMBOL(transport_asciihex_to_binaryhex);
2838static void transport_xor_callback(struct se_cmd *cmd) 2816static void transport_xor_callback(struct se_cmd *cmd)
2839{ 2817{
2840 unsigned char *buf, *addr; 2818 unsigned char *buf, *addr;
2841 struct se_mem *se_mem; 2819 struct scatterlist *sg;
2842 unsigned int offset; 2820 unsigned int offset;
2843 int i; 2821 int i;
2822 int count;
2844 /* 2823 /*
2845 * From sbc3r22.pdf section 5.48 XDWRITEREAD (10) command 2824 * From sbc3r22.pdf section 5.48 XDWRITEREAD (10) command
2846 * 2825 *
@@ -2858,28 +2837,32 @@ static void transport_xor_callback(struct se_cmd *cmd)
2858 return; 2837 return;
2859 } 2838 }
2860 /* 2839 /*
2861 * Copy the scatterlist WRITE buffer located at cmd->t_mem_list 2840 * Copy the scatterlist WRITE buffer located at cmd->t_data_sg
2862 * into the locally allocated *buf 2841 * into the locally allocated *buf
2863 */ 2842 */
2864 transport_memcpy_se_mem_read_contig(buf, &cmd->t_mem_list, 2843 sg_copy_to_buffer(cmd->t_data_sg,
2865 cmd->data_length); 2844 cmd->t_data_nents,
2845 buf,
2846 cmd->data_length);
2847
2866 /* 2848 /*
2867 * Now perform the XOR against the BIDI read memory located at 2849 * Now perform the XOR against the BIDI read memory located at
2868 * cmd->t_mem_bidi_list 2850 * cmd->t_mem_bidi_list
2869 */ 2851 */
2870 2852
2871 offset = 0; 2853 offset = 0;
2872 list_for_each_entry(se_mem, &cmd->t_mem_bidi_list, se_list) { 2854 for_each_sg(cmd->t_bidi_data_sg, sg, cmd->t_bidi_data_nents, count) {
2873 addr = (unsigned char *)kmap_atomic(se_mem->se_page, KM_USER0); 2855 addr = kmap_atomic(sg_page(sg), KM_USER0);
2874 if (!(addr)) 2856 if (!addr)
2875 goto out; 2857 goto out;
2876 2858
2877 for (i = 0; i < se_mem->se_len; i++) 2859 for (i = 0; i < sg->length; i++)
2878 *(addr + se_mem->se_off + i) ^= *(buf + offset + i); 2860 *(addr + sg->offset + i) ^= *(buf + offset + i);
2879 2861
2880 offset += se_mem->se_len; 2862 offset += sg->length;
2881 kunmap_atomic(addr, KM_USER0); 2863 kunmap_atomic(addr, KM_USER0);
2882 } 2864 }
2865
2883out: 2866out:
2884 kfree(buf); 2867 kfree(buf);
2885} 2868}
@@ -2971,6 +2954,35 @@ transport_handle_reservation_conflict(struct se_cmd *cmd)
2971 return -EINVAL; 2954 return -EINVAL;
2972} 2955}
2973 2956
2957static inline long long transport_dev_end_lba(struct se_device *dev)
2958{
2959 return dev->transport->get_blocks(dev) + 1;
2960}
2961
2962static int transport_cmd_get_valid_sectors(struct se_cmd *cmd)
2963{
2964 struct se_device *dev = cmd->se_dev;
2965 u32 sectors;
2966
2967 if (dev->transport->get_device_type(dev) != TYPE_DISK)
2968 return 0;
2969
2970 sectors = (cmd->data_length / dev->se_sub_dev->se_dev_attrib.block_size);
2971
2972 if ((cmd->t_task_lba + sectors) >
2973 transport_dev_end_lba(dev)) {
2974 printk(KERN_ERR "LBA: %llu Sectors: %u exceeds"
2975 " transport_dev_end_lba(): %llu\n",
2976 cmd->t_task_lba, sectors,
2977 transport_dev_end_lba(dev));
2978 printk(KERN_ERR " We should return CHECK_CONDITION"
2979 " but we don't yet\n");
2980 return 0;
2981 }
2982
2983 return sectors;
2984}
2985
2974/* transport_generic_cmd_sequencer(): 2986/* transport_generic_cmd_sequencer():
2975 * 2987 *
2976 * Generic Command Sequencer that should work for most DAS transport 2988 * Generic Command Sequencer that should work for most DAS transport
@@ -3580,28 +3592,6 @@ out_invalid_cdb_field:
3580 return -EINVAL; 3592 return -EINVAL;
3581} 3593}
3582 3594
3583static inline void transport_release_tasks(struct se_cmd *);
3584
3585static void transport_memcpy_se_mem_read_contig(
3586 unsigned char *dst,
3587 struct list_head *se_mem_list,
3588 u32 tot_len)
3589{
3590 struct se_mem *se_mem;
3591 void *src;
3592 u32 length;
3593
3594 list_for_each_entry(se_mem, se_mem_list, se_list) {
3595 length = min_t(u32, se_mem->se_len, tot_len);
3596 src = page_address(se_mem->se_page) + se_mem->se_off;
3597 memcpy(dst, src, length);
3598 tot_len -= length;
3599 if (!tot_len)
3600 break;
3601 dst += length;
3602 }
3603}
3604
3605/* 3595/*
3606 * Called from transport_generic_complete_ok() and 3596 * Called from transport_generic_complete_ok() and
3607 * transport_generic_request_failure() to determine which dormant/delayed 3597 * transport_generic_request_failure() to determine which dormant/delayed
@@ -3684,7 +3674,7 @@ static int transport_complete_qf(struct se_cmd *cmd)
3684 ret = cmd->se_tfo->queue_data_in(cmd); 3674 ret = cmd->se_tfo->queue_data_in(cmd);
3685 break; 3675 break;
3686 case DMA_TO_DEVICE: 3676 case DMA_TO_DEVICE:
3687 if (!list_empty(&cmd->t_mem_bidi_list)) { 3677 if (cmd->t_bidi_data_sg) {
3688 ret = cmd->se_tfo->queue_data_in(cmd); 3678 ret = cmd->se_tfo->queue_data_in(cmd);
3689 if (ret < 0) 3679 if (ret < 0)
3690 return ret; 3680 return ret;
@@ -3794,7 +3784,7 @@ static void transport_generic_complete_ok(struct se_cmd *cmd)
3794 /* 3784 /*
3795 * Check if we need to send READ payload for BIDI-COMMAND 3785 * Check if we need to send READ payload for BIDI-COMMAND
3796 */ 3786 */
3797 if (!list_empty(&cmd->t_mem_bidi_list)) { 3787 if (cmd->t_bidi_data_sg) {
3798 spin_lock(&cmd->se_lun->lun_sep_lock); 3788 spin_lock(&cmd->se_lun->lun_sep_lock);
3799 if (cmd->se_lun->lun_sep) { 3789 if (cmd->se_lun->lun_sep) {
3800 cmd->se_lun->lun_sep->sep_stats.tx_data_octets += 3790 cmd->se_lun->lun_sep->sep_stats.tx_data_octets +=
@@ -3856,41 +3846,42 @@ static void transport_free_dev_tasks(struct se_cmd *cmd)
3856 3846
3857static inline void transport_free_pages(struct se_cmd *cmd) 3847static inline void transport_free_pages(struct se_cmd *cmd)
3858{ 3848{
3859 struct se_mem *se_mem, *se_mem_tmp; 3849 struct scatterlist *sg;
3860 int free_page = 1; 3850 int free_page = 1;
3851 int count;
3861 3852
3862 if (cmd->se_cmd_flags & SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC) 3853 if (cmd->se_cmd_flags & SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC)
3863 free_page = 0; 3854 free_page = 0;
3864 if (cmd->se_dev->transport->do_se_mem_map) 3855 if (cmd->se_dev->transport->do_se_mem_map)
3865 free_page = 0; 3856 free_page = 0;
3866 3857
3867 list_for_each_entry_safe(se_mem, se_mem_tmp, 3858 for_each_sg(cmd->t_data_sg, sg, cmd->t_data_nents, count) {
3868 &cmd->t_mem_list, se_list) {
3869 /* 3859 /*
3870 * We only release call __free_page(struct se_mem->se_page) when 3860 * Only called if
3871 * SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC is NOT in use, 3861 * SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC is NOT in use,
3872 */ 3862 */
3873 if (free_page) 3863 if (free_page)
3874 __free_page(se_mem->se_page); 3864 __free_page(sg_page(sg));
3875 3865
3876 list_del(&se_mem->se_list);
3877 kmem_cache_free(se_mem_cache, se_mem);
3878 } 3866 }
3879 cmd->t_tasks_se_num = 0; 3867 if (free_page)
3868 kfree(cmd->t_data_sg);
3869 cmd->t_data_sg = NULL;
3870 cmd->t_data_nents = 0;
3880 3871
3881 list_for_each_entry_safe(se_mem, se_mem_tmp, 3872 for_each_sg(cmd->t_bidi_data_sg, sg, cmd->t_bidi_data_nents, count) {
3882 &cmd->t_mem_bidi_list, se_list) {
3883 /* 3873 /*
3884 * We only release call __free_page(struct se_mem->se_page) when 3874 * Only called if
3885 * SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC is NOT in use, 3875 * SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC is NOT in use,
3886 */ 3876 */
3887 if (free_page) 3877 if (free_page)
3888 __free_page(se_mem->se_page); 3878 __free_page(sg_page(sg));
3889 3879
3890 list_del(&se_mem->se_list);
3891 kmem_cache_free(se_mem_cache, se_mem);
3892 } 3880 }
3893 cmd->t_tasks_se_bidi_num = 0; 3881 if (free_page)
3882 kfree(cmd->t_bidi_data_sg);
3883 cmd->t_bidi_data_sg = NULL;
3884 cmd->t_bidi_data_nents = 0;
3894} 3885}
3895 3886
3896static inline void transport_release_tasks(struct se_cmd *cmd) 3887static inline void transport_release_tasks(struct se_cmd *cmd)
@@ -3979,7 +3970,8 @@ free_pages:
3979} 3970}
3980 3971
3981/* 3972/*
3982 * transport_generic_map_mem_to_cmd - Perform SGL -> struct se_mem map 3973 * transport_generic_map_mem_to_cmd - Use fabric-alloced pages instead of
3974 * allocating in the core.
3983 * @cmd: Associated se_cmd descriptor 3975 * @cmd: Associated se_cmd descriptor
3984 * @mem: SGL style memory for TCM WRITE / READ 3976 * @mem: SGL style memory for TCM WRITE / READ
3985 * @sg_mem_num: Number of SGL elements 3977 * @sg_mem_num: Number of SGL elements
@@ -3996,35 +3988,18 @@ int transport_generic_map_mem_to_cmd(
3996 struct scatterlist *sgl_bidi, 3988 struct scatterlist *sgl_bidi,
3997 u32 sgl_bidi_count) 3989 u32 sgl_bidi_count)
3998{ 3990{
3999 int ret;
4000
4001 if (!sgl || !sgl_count) 3991 if (!sgl || !sgl_count)
4002 return 0; 3992 return 0;
4003 3993
4004 /*
4005 * Convert sgls (sgl, sgl_bidi) to list of se_mems
4006 */
4007 if ((cmd->se_cmd_flags & SCF_SCSI_DATA_SG_IO_CDB) || 3994 if ((cmd->se_cmd_flags & SCF_SCSI_DATA_SG_IO_CDB) ||
4008 (cmd->se_cmd_flags & SCF_SCSI_CONTROL_SG_IO_CDB)) { 3995 (cmd->se_cmd_flags & SCF_SCSI_CONTROL_SG_IO_CDB)) {
4009 /*
4010 * For CDB using TCM struct se_mem linked list scatterlist memory
4011 * processed into a TCM struct se_subsystem_dev, we do the mapping
4012 * from the passed physical memory to struct se_mem->se_page here.
4013 */
4014 ret = transport_map_sg_to_mem(cmd, &cmd->t_mem_list, sgl);
4015 if (ret < 0)
4016 return -ENOMEM;
4017 3996
4018 cmd->t_tasks_se_num = ret; 3997 cmd->t_data_sg = sgl;
4019 /* 3998 cmd->t_data_nents = sgl_count;
4020 * Setup BIDI READ list of struct se_mem elements
4021 */
4022 if (sgl_bidi && sgl_bidi_count) {
4023 ret = transport_map_sg_to_mem(cmd, &cmd->t_mem_bidi_list, sgl_bidi);
4024 if (ret < 0)
4025 return -ENOMEM;
4026 3999
4027 cmd->t_tasks_se_bidi_num = ret; 4000 if (sgl_bidi && sgl_bidi_count) {
4001 cmd->t_bidi_data_sg = sgl_bidi;
4002 cmd->t_bidi_data_nents = sgl_bidi_count;
4028 } 4003 }
4029 cmd->se_cmd_flags |= SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC; 4004 cmd->se_cmd_flags |= SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC;
4030 } 4005 }
@@ -4033,91 +4008,58 @@ int transport_generic_map_mem_to_cmd(
4033} 4008}
4034EXPORT_SYMBOL(transport_generic_map_mem_to_cmd); 4009EXPORT_SYMBOL(transport_generic_map_mem_to_cmd);
4035 4010
4036
4037static inline long long transport_dev_end_lba(struct se_device *dev)
4038{
4039 return dev->transport->get_blocks(dev) + 1;
4040}
4041
4042static int transport_cmd_get_valid_sectors(struct se_cmd *cmd)
4043{
4044 struct se_device *dev = cmd->se_dev;
4045 u32 sectors;
4046
4047 if (dev->transport->get_device_type(dev) != TYPE_DISK)
4048 return 0;
4049
4050 sectors = (cmd->data_length / dev->se_sub_dev->se_dev_attrib.block_size);
4051
4052 if ((cmd->t_task_lba + sectors) >
4053 transport_dev_end_lba(dev)) {
4054 printk(KERN_ERR "LBA: %llu Sectors: %u exceeds"
4055 " transport_dev_end_lba(): %llu\n",
4056 cmd->t_task_lba, sectors,
4057 transport_dev_end_lba(dev));
4058 return 0;
4059 }
4060
4061 return sectors;
4062}
4063
4064static int transport_new_cmd_obj(struct se_cmd *cmd) 4011static int transport_new_cmd_obj(struct se_cmd *cmd)
4065{ 4012{
4066 struct se_device *dev = cmd->se_dev; 4013 struct se_device *dev = cmd->se_dev;
4067 u32 task_cdbs; 4014 u32 task_cdbs;
4068 u32 rc; 4015 u32 rc;
4016 int set_counts = 1;
4069 4017
4070 if (!(cmd->se_cmd_flags & SCF_SCSI_DATA_SG_IO_CDB)) { 4018 /*
4071 task_cdbs = 1; 4019 * Setup any BIDI READ tasks and memory from
4072 cmd->t_task_list_num = 1; 4020 * cmd->t_mem_bidi_list so the READ struct se_tasks
4073 } else { 4021 * are queued first for the non pSCSI passthrough case.
4074 int set_counts = 1; 4022 */
4075 4023 if (cmd->t_bidi_data_sg &&
4076 /* 4024 (dev->transport->transport_type != TRANSPORT_PLUGIN_PHBA_PDEV)) {
4077 * Setup any BIDI READ tasks and memory from 4025 rc = transport_allocate_tasks(cmd,
4078 * cmd->t_mem_bidi_list so the READ struct se_tasks 4026 cmd->t_task_lba,
4079 * are queued first for the non pSCSI passthrough case. 4027 DMA_FROM_DEVICE,
4080 */ 4028 cmd->t_bidi_data_sg,
4081 if (!list_empty(&cmd->t_mem_bidi_list) && 4029 cmd->t_bidi_data_nents);
4082 (dev->transport->transport_type != TRANSPORT_PLUGIN_PHBA_PDEV)) { 4030 if (!rc) {
4083 rc = transport_allocate_tasks(cmd,
4084 cmd->t_task_lba,
4085 transport_cmd_get_valid_sectors(cmd),
4086 DMA_FROM_DEVICE, &cmd->t_mem_bidi_list,
4087 set_counts);
4088 if (!(rc)) {
4089 cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
4090 cmd->scsi_sense_reason =
4091 TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
4092 return PYX_TRANSPORT_LU_COMM_FAILURE;
4093 }
4094 set_counts = 0;
4095 }
4096 /*
4097 * Setup the tasks and memory from cmd->t_mem_list
4098 * Note for BIDI transfers this will contain the WRITE payload
4099 */
4100 task_cdbs = transport_allocate_tasks(cmd,
4101 cmd->t_task_lba,
4102 transport_cmd_get_valid_sectors(cmd),
4103 cmd->data_direction, &cmd->t_mem_list,
4104 set_counts);
4105 if (!(task_cdbs)) {
4106 cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION; 4031 cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
4107 cmd->scsi_sense_reason = 4032 cmd->scsi_sense_reason =
4108 TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; 4033 TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
4109 return PYX_TRANSPORT_LU_COMM_FAILURE; 4034 return PYX_TRANSPORT_LU_COMM_FAILURE;
4110 } 4035 }
4111 cmd->t_task_list_num = task_cdbs; 4036 atomic_inc(&cmd->t_fe_count);
4037 atomic_inc(&cmd->t_se_count);
4038 set_counts = 0;
4039 }
4040 /*
4041 * Setup the tasks and memory from cmd->t_mem_list
4042 * Note for BIDI transfers this will contain the WRITE payload
4043 */
4044 task_cdbs = transport_allocate_tasks(cmd,
4045 cmd->t_task_lba,
4046 cmd->data_direction,
4047 cmd->t_data_sg,
4048 cmd->t_data_nents);
4049 if (!task_cdbs) {
4050 cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
4051 cmd->scsi_sense_reason =
4052 TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
4053 return PYX_TRANSPORT_LU_COMM_FAILURE;
4054 }
4112 4055
4113#if 0 4056 if (set_counts) {
4114 printk(KERN_INFO "data_length: %u, LBA: %llu t_tasks_sectors:" 4057 atomic_inc(&cmd->t_fe_count);
4115 " %u, t_task_cdbs: %u\n", obj_ptr, cmd->data_length, 4058 atomic_inc(&cmd->t_se_count);
4116 cmd->t_task_lba, cmd->t_tasks_sectors,
4117 cmd->t_task_cdbs);
4118#endif
4119 } 4059 }
4120 4060
4061 cmd->t_task_list_num = task_cdbs;
4062
4121 atomic_set(&cmd->t_task_cdbs_left, task_cdbs); 4063 atomic_set(&cmd->t_task_cdbs_left, task_cdbs);
4122 atomic_set(&cmd->t_task_cdbs_ex_left, task_cdbs); 4064 atomic_set(&cmd->t_task_cdbs_ex_left, task_cdbs);
4123 atomic_set(&cmd->t_task_cdbs_timeout_left, task_cdbs); 4065 atomic_set(&cmd->t_task_cdbs_timeout_left, task_cdbs);
@@ -4126,39 +4068,31 @@ static int transport_new_cmd_obj(struct se_cmd *cmd)
4126 4068
4127void *transport_kmap_first_data_page(struct se_cmd *cmd) 4069void *transport_kmap_first_data_page(struct se_cmd *cmd)
4128{ 4070{
4129 struct se_mem *se_mem; 4071 struct scatterlist *sg = cmd->t_data_sg;
4130
4131 BUG_ON(list_empty(&cmd->t_mem_list));
4132
4133 se_mem = list_first_entry(&cmd->t_mem_list, struct se_mem, se_list);
4134 4072
4073 BUG_ON(!sg);
4135 /* 4074 /*
4136 * 1st se_mem should point to a page, and we shouldn't need more than 4075 * We need to take into account a possible offset here for fabrics like
4137 * that for this cmd 4076 * tcm_loop who may be using a contig buffer from the SCSI midlayer for
4077 * control CDBs passed as SGLs via transport_generic_map_mem_to_cmd()
4138 */ 4078 */
4139 BUG_ON(cmd->data_length > PAGE_SIZE); 4079 return kmap(sg_page(sg)) + sg->offset;
4140
4141 return kmap(se_mem->se_page);
4142} 4080}
4143EXPORT_SYMBOL(transport_kmap_first_data_page); 4081EXPORT_SYMBOL(transport_kmap_first_data_page);
4144 4082
4145void transport_kunmap_first_data_page(struct se_cmd *cmd) 4083void transport_kunmap_first_data_page(struct se_cmd *cmd)
4146{ 4084{
4147 struct se_mem *se_mem; 4085 kunmap(sg_page(cmd->t_data_sg));
4148
4149 BUG_ON(list_empty(&cmd->t_mem_list));
4150
4151 se_mem = list_first_entry(&cmd->t_mem_list, struct se_mem, se_list);
4152
4153 kunmap(se_mem->se_page);
4154} 4086}
4155EXPORT_SYMBOL(transport_kunmap_first_data_page); 4087EXPORT_SYMBOL(transport_kunmap_first_data_page);
4156 4088
4157static int 4089static int
4158transport_generic_get_mem(struct se_cmd *cmd) 4090transport_generic_get_mem(struct se_cmd *cmd)
4159{ 4091{
4160 struct se_mem *se_mem; 4092 u32 length = cmd->data_length;
4161 int length = cmd->data_length; 4093 unsigned int nents;
4094 struct page *page;
4095 int i = 0;
4162 4096
4163 /* 4097 /*
4164 * If the device uses memory mapping this is enough. 4098 * If the device uses memory mapping this is enough.
@@ -4166,161 +4100,34 @@ transport_generic_get_mem(struct se_cmd *cmd)
4166 if (cmd->se_dev->transport->do_se_mem_map) 4100 if (cmd->se_dev->transport->do_se_mem_map)
4167 return 0; 4101 return 0;
4168 4102
4169 /* Even cmds with length 0 will get here, btw */ 4103 nents = DIV_ROUND_UP(length, PAGE_SIZE);
4170 while (length) { 4104 cmd->t_data_sg = kmalloc(sizeof(struct scatterlist) * nents, GFP_KERNEL);
4171 se_mem = kmem_cache_zalloc(se_mem_cache, GFP_KERNEL); 4105 if (!cmd->t_data_sg)
4172 if (!(se_mem)) { 4106 return -ENOMEM;
4173 printk(KERN_ERR "Unable to allocate struct se_mem\n");
4174 goto out;
4175 }
4176
4177/* #warning FIXME Allocate contigous pages for struct se_mem elements */
4178 se_mem->se_page = alloc_pages(GFP_KERNEL | __GFP_ZERO, 0);
4179 if (!(se_mem->se_page)) {
4180 printk(KERN_ERR "alloc_pages() failed\n");
4181 goto out;
4182 }
4183 4107
4184 INIT_LIST_HEAD(&se_mem->se_list); 4108 cmd->t_data_nents = nents;
4185 se_mem->se_len = min_t(u32, length, PAGE_SIZE); 4109 sg_init_table(cmd->t_data_sg, nents);
4186 list_add_tail(&se_mem->se_list, &cmd->t_mem_list);
4187 cmd->t_tasks_se_num++;
4188 4110
4189 DEBUG_MEM("Allocated struct se_mem page(%p) Length(%u)" 4111 while (length) {
4190 " Offset(%u)\n", se_mem->se_page, se_mem->se_len, 4112 u32 page_len = min_t(u32, length, PAGE_SIZE);
4191 se_mem->se_off); 4113 page = alloc_page(GFP_KERNEL | __GFP_ZERO);
4114 if (!page)
4115 goto out;
4192 4116
4193 length -= se_mem->se_len; 4117 sg_set_page(&cmd->t_data_sg[i], page, page_len, 0);
4118 length -= page_len;
4119 i++;
4194 } 4120 }
4195
4196 DEBUG_MEM("Allocated total struct se_mem elements(%u)\n",
4197 cmd->t_tasks_se_num);
4198
4199 return 0; 4121 return 0;
4200out:
4201 if (se_mem)
4202 __free_pages(se_mem->se_page, 0);
4203 kmem_cache_free(se_mem_cache, se_mem);
4204 return -ENOMEM;
4205}
4206
4207int transport_init_task_sg(
4208 struct se_task *task,
4209 struct se_mem *in_se_mem,
4210 u32 task_offset)
4211{
4212 struct se_cmd *se_cmd = task->task_se_cmd;
4213 struct se_device *se_dev = se_cmd->se_dev;
4214 struct se_mem *se_mem = in_se_mem;
4215 struct target_core_fabric_ops *tfo = se_cmd->se_tfo;
4216 u32 sg_length, task_size = task->task_size, task_sg_num_padded;
4217
4218 while (task_size != 0) {
4219 DEBUG_SC("se_mem->se_page(%p) se_mem->se_len(%u)"
4220 " se_mem->se_off(%u) task_offset(%u)\n",
4221 se_mem->se_page, se_mem->se_len,
4222 se_mem->se_off, task_offset);
4223
4224 if (task_offset == 0) {
4225 if (task_size >= se_mem->se_len) {
4226 sg_length = se_mem->se_len;
4227
4228 if (!(list_is_last(&se_mem->se_list,
4229 &se_cmd->t_mem_list)))
4230 se_mem = list_entry(se_mem->se_list.next,
4231 struct se_mem, se_list);
4232 } else {
4233 sg_length = task_size;
4234 task_size -= sg_length;
4235 goto next;
4236 }
4237
4238 DEBUG_SC("sg_length(%u) task_size(%u)\n",
4239 sg_length, task_size);
4240 } else {
4241 if ((se_mem->se_len - task_offset) > task_size) {
4242 sg_length = task_size;
4243 task_size -= sg_length;
4244 goto next;
4245 } else {
4246 sg_length = (se_mem->se_len - task_offset);
4247
4248 if (!(list_is_last(&se_mem->se_list,
4249 &se_cmd->t_mem_list)))
4250 se_mem = list_entry(se_mem->se_list.next,
4251 struct se_mem, se_list);
4252 }
4253 4122
4254 DEBUG_SC("sg_length(%u) task_size(%u)\n", 4123out:
4255 sg_length, task_size); 4124 while (i >= 0) {
4256 4125 __free_page(sg_page(&cmd->t_data_sg[i]));
4257 task_offset = 0; 4126 i--;
4258 }
4259 task_size -= sg_length;
4260next:
4261 DEBUG_SC("task[%u] - Reducing task_size to(%u)\n",
4262 task->task_no, task_size);
4263
4264 task->task_sg_num++;
4265 }
4266 /*
4267 * Check if the fabric module driver is requesting that all
4268 * struct se_task->task_sg[] be chained together.. If so,
4269 * then allocate an extra padding SG entry for linking and
4270 * marking the end of the chained SGL.
4271 */
4272 if (tfo->task_sg_chaining) {
4273 task_sg_num_padded = (task->task_sg_num + 1);
4274 task->task_padded_sg = 1;
4275 } else
4276 task_sg_num_padded = task->task_sg_num;
4277
4278 task->task_sg = kzalloc(task_sg_num_padded *
4279 sizeof(struct scatterlist), GFP_KERNEL);
4280 if (!(task->task_sg)) {
4281 printk(KERN_ERR "Unable to allocate memory for"
4282 " task->task_sg\n");
4283 return -ENOMEM;
4284 }
4285 sg_init_table(&task->task_sg[0], task_sg_num_padded);
4286 /*
4287 * Setup task->task_sg_bidi for SCSI READ payload for
4288 * TCM/pSCSI passthrough if present for BIDI-COMMAND
4289 */
4290 if (!list_empty(&se_cmd->t_mem_bidi_list) &&
4291 (se_dev->transport->transport_type == TRANSPORT_PLUGIN_PHBA_PDEV)) {
4292 task->task_sg_bidi = kzalloc(task_sg_num_padded *
4293 sizeof(struct scatterlist), GFP_KERNEL);
4294 if (!(task->task_sg_bidi)) {
4295 kfree(task->task_sg);
4296 task->task_sg = NULL;
4297 printk(KERN_ERR "Unable to allocate memory for"
4298 " task->task_sg_bidi\n");
4299 return -ENOMEM;
4300 }
4301 sg_init_table(&task->task_sg_bidi[0], task_sg_num_padded);
4302 }
4303 /*
4304 * For the chaining case, setup the proper end of SGL for the
4305 * initial submission struct task into struct se_subsystem_api.
4306 * This will be cleared later by transport_do_task_sg_chain()
4307 */
4308 if (task->task_padded_sg) {
4309 sg_mark_end(&task->task_sg[task->task_sg_num - 1]);
4310 /*
4311 * Added the 'if' check before marking end of bi-directional
4312 * scatterlist (which gets created only in case of request
4313 * (RD + WR).
4314 */
4315 if (task->task_sg_bidi)
4316 sg_mark_end(&task->task_sg_bidi[task->task_sg_num - 1]);
4317 } 4127 }
4318 4128 kfree(cmd->t_data_sg);
4319 DEBUG_SC("Successfully allocated task->task_sg_num(%u)," 4129 cmd->t_data_sg = NULL;
4320 " task_sg_num_padded(%u)\n", task->task_sg_num, 4130 return -ENOMEM;
4321 task_sg_num_padded);
4322
4323 return task->task_sg_num;
4324} 4131}
4325 4132
4326/* Reduce sectors if they are too long for the device */ 4133/* Reduce sectors if they are too long for the device */
@@ -4338,165 +4145,6 @@ static inline sector_t transport_limit_task_sectors(
4338 return sectors; 4145 return sectors;
4339} 4146}
4340 4147
4341/*
4342 * Convert a sgl into a linked list of se_mems.
4343 */
4344static int transport_map_sg_to_mem(
4345 struct se_cmd *cmd,
4346 struct list_head *se_mem_list,
4347 struct scatterlist *sg)
4348{
4349 struct se_mem *se_mem;
4350 u32 cmd_size = cmd->data_length;
4351 int sg_count = 0;
4352
4353 WARN_ON(!sg);
4354
4355 while (cmd_size) {
4356 /*
4357 * NOTE: it is safe to return -ENOMEM at any time in creating this
4358 * list because transport_free_pages() will eventually be called, and is
4359 * smart enough to deallocate all list items for sg and sg_bidi lists.
4360 */
4361 se_mem = kmem_cache_zalloc(se_mem_cache, GFP_KERNEL);
4362 if (!(se_mem)) {
4363 printk(KERN_ERR "Unable to allocate struct se_mem\n");
4364 return -ENOMEM;
4365 }
4366 INIT_LIST_HEAD(&se_mem->se_list);
4367 DEBUG_MEM("sg_to_mem: Starting loop with cmd_size: %u"
4368 " sg_page: %p offset: %d length: %d\n", cmd_size,
4369 sg_page(sg), sg->offset, sg->length);
4370
4371 se_mem->se_page = sg_page(sg);
4372 se_mem->se_off = sg->offset;
4373
4374 if (cmd_size > sg->length) {
4375 se_mem->se_len = sg->length;
4376 sg = sg_next(sg);
4377 } else
4378 se_mem->se_len = cmd_size;
4379
4380 cmd_size -= se_mem->se_len;
4381 sg_count++;
4382
4383 DEBUG_MEM("sg_to_mem: sg_count: %u cmd_size: %u\n",
4384 sg_count, cmd_size);
4385 DEBUG_MEM("sg_to_mem: Final se_page: %p se_off: %d se_len: %d\n",
4386 se_mem->se_page, se_mem->se_off, se_mem->se_len);
4387
4388 list_add_tail(&se_mem->se_list, se_mem_list);
4389 }
4390
4391 DEBUG_MEM("task[0] - Mapped(%u) struct scatterlist segments\n", sg_count);
4392
4393 return sg_count;
4394}
4395
4396/* transport_map_mem_to_sg():
4397 *
4398 *
4399 */
4400int transport_map_mem_to_sg(
4401 struct se_task *task,
4402 struct list_head *se_mem_list,
4403 struct scatterlist *sg,
4404 struct se_mem *in_se_mem,
4405 struct se_mem **out_se_mem,
4406 u32 *se_mem_cnt,
4407 u32 *task_offset)
4408{
4409 struct se_cmd *se_cmd = task->task_se_cmd;
4410 struct se_mem *se_mem = in_se_mem;
4411 u32 task_size = task->task_size, sg_no = 0;
4412
4413 if (!sg) {
4414 printk(KERN_ERR "Unable to locate valid struct"
4415 " scatterlist pointer\n");
4416 return -EINVAL;
4417 }
4418
4419 while (task_size != 0) {
4420 /*
4421 * Setup the contiguous array of scatterlists for
4422 * this struct se_task.
4423 */
4424 sg_assign_page(sg, se_mem->se_page);
4425
4426 if (*task_offset == 0) {
4427 sg->offset = se_mem->se_off;
4428
4429 if (task_size >= se_mem->se_len) {
4430 sg->length = se_mem->se_len;
4431
4432 if (!(list_is_last(&se_mem->se_list,
4433 &se_cmd->t_mem_list))) {
4434 se_mem = list_entry(se_mem->se_list.next,
4435 struct se_mem, se_list);
4436 (*se_mem_cnt)++;
4437 }
4438 } else {
4439 sg->length = task_size;
4440 /*
4441 * Determine if we need to calculate an offset
4442 * into the struct se_mem on the next go around..
4443 */
4444 task_size -= sg->length;
4445 if (!(task_size))
4446 *task_offset = sg->length;
4447
4448 goto next;
4449 }
4450
4451 } else {
4452 sg->offset = (*task_offset + se_mem->se_off);
4453
4454 if ((se_mem->se_len - *task_offset) > task_size) {
4455 sg->length = task_size;
4456 /*
4457 * Determine if we need to calculate an offset
4458 * into the struct se_mem on the next go around..
4459 */
4460 task_size -= sg->length;
4461 if (!(task_size))
4462 *task_offset += sg->length;
4463
4464 goto next;
4465 } else {
4466 sg->length = (se_mem->se_len - *task_offset);
4467
4468 if (!(list_is_last(&se_mem->se_list,
4469 &se_cmd->t_mem_list))) {
4470 se_mem = list_entry(se_mem->se_list.next,
4471 struct se_mem, se_list);
4472 (*se_mem_cnt)++;
4473 }
4474 }
4475
4476 *task_offset = 0;
4477 }
4478 task_size -= sg->length;
4479next:
4480 DEBUG_MEM("task[%u] mem_to_sg - sg[%u](%p)(%u)(%u) - Reducing"
4481 " task_size to(%u), task_offset: %u\n", task->task_no, sg_no,
4482 sg_page(sg), sg->length, sg->offset, task_size, *task_offset);
4483
4484 sg_no++;
4485 if (!(task_size))
4486 break;
4487
4488 sg = sg_next(sg);
4489
4490 if (task_size > se_cmd->data_length)
4491 BUG();
4492 }
4493 *out_se_mem = se_mem;
4494
4495 DEBUG_MEM("task[%u] - Mapped(%u) struct se_mem segments to total(%u)"
4496 " SGs\n", task->task_no, *se_mem_cnt, sg_no);
4497
4498 return 0;
4499}
4500 4148
4501/* 4149/*
4502 * This function can be used by HW target mode drivers to create a linked 4150 * This function can be used by HW target mode drivers to create a linked
@@ -4506,81 +4154,43 @@ next:
4506 */ 4154 */
4507void transport_do_task_sg_chain(struct se_cmd *cmd) 4155void transport_do_task_sg_chain(struct se_cmd *cmd)
4508{ 4156{
4509 struct scatterlist *sg_head = NULL, *sg_link = NULL, *sg_first = NULL; 4157 struct scatterlist *sg_first = NULL;
4510 struct scatterlist *sg_head_cur = NULL, *sg_link_cur = NULL; 4158 struct scatterlist *sg_prev = NULL;
4511 struct scatterlist *sg, *sg_end = NULL, *sg_end_cur = NULL; 4159 int sg_prev_nents = 0;
4160 struct scatterlist *sg;
4512 struct se_task *task; 4161 struct se_task *task;
4513 struct target_core_fabric_ops *tfo = cmd->se_tfo; 4162 u32 chained_nents = 0;
4514 u32 task_sg_num = 0, sg_count = 0;
4515 int i; 4163 int i;
4516 4164
4517 if (tfo->task_sg_chaining == 0) { 4165 BUG_ON(!cmd->se_tfo->task_sg_chaining);
4518 printk(KERN_ERR "task_sg_chaining is diabled for fabric module:" 4166
4519 " %s\n", tfo->get_fabric_name());
4520 dump_stack();
4521 return;
4522 }
4523 /* 4167 /*
4524 * Walk the struct se_task list and setup scatterlist chains 4168 * Walk the struct se_task list and setup scatterlist chains
4525 * for each contiguously allocated struct se_task->task_sg[]. 4169 * for each contiguously allocated struct se_task->task_sg[].
4526 */ 4170 */
4527 list_for_each_entry(task, &cmd->t_task_list, t_list) { 4171 list_for_each_entry(task, &cmd->t_task_list, t_list) {
4528 if (!(task->task_sg) || !(task->task_padded_sg)) 4172 if (!task->task_sg)
4529 continue; 4173 continue;
4530 4174
4531 if (sg_head && sg_link) { 4175 BUG_ON(!task->task_padded_sg);
4532 sg_head_cur = &task->task_sg[0];
4533 sg_link_cur = &task->task_sg[task->task_sg_num];
4534 /*
4535 * Either add chain or mark end of scatterlist
4536 */
4537 if (!(list_is_last(&task->t_list,
4538 &cmd->t_task_list))) {
4539 /*
4540 * Clear existing SGL termination bit set in
4541 * transport_init_task_sg(), see sg_mark_end()
4542 */
4543 sg_end_cur = &task->task_sg[task->task_sg_num - 1];
4544 sg_end_cur->page_link &= ~0x02;
4545
4546 sg_chain(sg_head, task_sg_num, sg_head_cur);
4547 sg_count += task->task_sg_num;
4548 task_sg_num = (task->task_sg_num + 1);
4549 } else {
4550 sg_chain(sg_head, task_sg_num, sg_head_cur);
4551 sg_count += task->task_sg_num;
4552 task_sg_num = task->task_sg_num;
4553 }
4554 4176
4555 sg_head = sg_head_cur; 4177 if (!sg_first) {
4556 sg_link = sg_link_cur; 4178 sg_first = task->task_sg;
4557 continue; 4179 chained_nents = task->task_sg_num;
4558 }
4559 sg_head = sg_first = &task->task_sg[0];
4560 sg_link = &task->task_sg[task->task_sg_num];
4561 /*
4562 * Check for single task..
4563 */
4564 if (!(list_is_last(&task->t_list, &cmd->t_task_list))) {
4565 /*
4566 * Clear existing SGL termination bit set in
4567 * transport_init_task_sg(), see sg_mark_end()
4568 */
4569 sg_end = &task->task_sg[task->task_sg_num - 1];
4570 sg_end->page_link &= ~0x02;
4571 sg_count += task->task_sg_num;
4572 task_sg_num = (task->task_sg_num + 1);
4573 } else { 4180 } else {
4574 sg_count += task->task_sg_num; 4181 sg_chain(sg_prev, sg_prev_nents, task->task_sg);
4575 task_sg_num = task->task_sg_num; 4182 chained_nents += task->task_sg_num;
4576 } 4183 }
4184
4185 sg_prev = task->task_sg;
4186 sg_prev_nents = task->task_sg_num;
4577 } 4187 }
4578 /* 4188 /*
4579 * Setup the starting pointer and total t_tasks_sg_linked_no including 4189 * Setup the starting pointer and total t_tasks_sg_linked_no including
4580 * padding SGs for linking and to mark the end. 4190 * padding SGs for linking and to mark the end.
4581 */ 4191 */
4582 cmd->t_tasks_sg_chained = sg_first; 4192 cmd->t_tasks_sg_chained = sg_first;
4583 cmd->t_tasks_sg_chained_no = sg_count; 4193 cmd->t_tasks_sg_chained_no = chained_nents;
4584 4194
4585 DEBUG_CMD_M("Setup cmd: %p cmd->t_tasks_sg_chained: %p and" 4195 DEBUG_CMD_M("Setup cmd: %p cmd->t_tasks_sg_chained: %p and"
4586 " t_tasks_sg_chained_no: %u\n", cmd, cmd->t_tasks_sg_chained, 4196 " t_tasks_sg_chained_no: %u\n", cmd, cmd->t_tasks_sg_chained,
@@ -4599,129 +4209,46 @@ void transport_do_task_sg_chain(struct se_cmd *cmd)
4599} 4209}
4600EXPORT_SYMBOL(transport_do_task_sg_chain); 4210EXPORT_SYMBOL(transport_do_task_sg_chain);
4601 4211
4602static int transport_do_se_mem_map(
4603 struct se_device *dev,
4604 struct se_task *task,
4605 struct list_head *se_mem_list,
4606 void *in_mem,
4607 struct se_mem *in_se_mem,
4608 struct se_mem **out_se_mem,
4609 u32 *se_mem_cnt,
4610 u32 *task_offset_in)
4611{
4612 u32 task_offset = *task_offset_in;
4613 int ret = 0;
4614 /*
4615 * se_subsystem_api_t->do_se_mem_map is used when internal allocation
4616 * has been done by the transport plugin.
4617 */
4618 if (dev->transport->do_se_mem_map) {
4619 ret = dev->transport->do_se_mem_map(task, se_mem_list,
4620 in_mem, in_se_mem, out_se_mem, se_mem_cnt,
4621 task_offset_in);
4622 if (ret == 0)
4623 task->task_se_cmd->t_tasks_se_num += *se_mem_cnt;
4624
4625 return ret;
4626 }
4627
4628 BUG_ON(list_empty(se_mem_list));
4629 /*
4630 * This is the normal path for all normal non BIDI and BIDI-COMMAND
4631 * WRITE payloads.. If we need to do BIDI READ passthrough for
4632 * TCM/pSCSI the first call to transport_do_se_mem_map ->
4633 * transport_init_task_sg() -> transport_map_mem_to_sg() will do the
4634 * allocation for task->task_sg_bidi, and the subsequent call to
4635 * transport_do_se_mem_map() from transport_generic_get_cdb_count()
4636 */
4637 if (!(task->task_sg_bidi)) {
4638 /*
4639 * Assume default that transport plugin speaks preallocated
4640 * scatterlists.
4641 */
4642 ret = transport_init_task_sg(task, in_se_mem, task_offset);
4643 if (ret <= 0)
4644 return ret;
4645 /*
4646 * struct se_task->task_sg now contains the struct scatterlist array.
4647 */
4648 return transport_map_mem_to_sg(task, se_mem_list, task->task_sg,
4649 in_se_mem, out_se_mem, se_mem_cnt,
4650 task_offset_in);
4651 }
4652 /*
4653 * Handle the se_mem_list -> struct task->task_sg_bidi
4654 * memory map for the extra BIDI READ payload
4655 */
4656 return transport_map_mem_to_sg(task, se_mem_list, task->task_sg_bidi,
4657 in_se_mem, out_se_mem, se_mem_cnt,
4658 task_offset_in);
4659}
4660
4661/* 4212/*
4662 * Break up cmd into chunks transport can handle 4213 * Break up cmd into chunks transport can handle
4663 */ 4214 */
4664static u32 transport_allocate_tasks( 4215static int transport_allocate_data_tasks(
4665 struct se_cmd *cmd, 4216 struct se_cmd *cmd,
4666 unsigned long long lba, 4217 unsigned long long lba,
4667 u32 sectors,
4668 enum dma_data_direction data_direction, 4218 enum dma_data_direction data_direction,
4669 struct list_head *mem_list, 4219 struct scatterlist *sgl,
4670 int set_counts) 4220 unsigned int sgl_nents)
4671{ 4221{
4672 unsigned char *cdb = NULL; 4222 unsigned char *cdb = NULL;
4673 struct se_task *task; 4223 struct se_task *task;
4674 struct se_mem *se_mem = NULL;
4675 struct se_mem *se_mem_lout = NULL;
4676 struct se_mem *se_mem_bidi = NULL;
4677 struct se_mem *se_mem_bidi_lout = NULL;
4678 struct se_device *dev = cmd->se_dev; 4224 struct se_device *dev = cmd->se_dev;
4679 int ret; 4225 unsigned long flags;
4680 u32 task_offset_in = 0; 4226 sector_t sectors;
4681 u32 se_mem_cnt = 0; 4227 int task_count;
4682 u32 se_mem_bidi_cnt = 0; 4228 int i;
4683 u32 task_cdbs = 0; 4229 sector_t dev_max_sectors = dev->se_sub_dev->se_dev_attrib.max_sectors;
4684 4230 u32 sector_size = dev->se_sub_dev->se_dev_attrib.block_size;
4685 BUG_ON(!mem_list); 4231 struct scatterlist *sg;
4686 /* 4232 struct scatterlist *cmd_sg;
4687 * While using RAMDISK_DR backstores is the only case where
4688 * mem_list will ever be empty at this point.
4689 */
4690 if (!(list_empty(mem_list)))
4691 se_mem = list_first_entry(mem_list, struct se_mem, se_list);
4692 /*
4693 * Check for extra se_mem_bidi mapping for BIDI-COMMANDs to
4694 * struct se_task->task_sg_bidi for TCM/pSCSI passthrough operation
4695 */
4696 if (!list_empty(&cmd->t_mem_bidi_list) &&
4697 (dev->transport->transport_type == TRANSPORT_PLUGIN_PHBA_PDEV))
4698 se_mem_bidi = list_first_entry(&cmd->t_mem_bidi_list,
4699 struct se_mem, se_list);
4700 4233
4701 while (sectors) { 4234 WARN_ON(cmd->data_length % sector_size);
4702 sector_t limited_sectors; 4235 sectors = DIV_ROUND_UP(cmd->data_length, sector_size);
4236 task_count = DIV_ROUND_UP(sectors, dev_max_sectors);
4703 4237
4704 DEBUG_VOL("ITT[0x%08x] LBA(%llu) SectorsLeft(%u) EOBJ(%llu)\n", 4238 cmd_sg = sgl;
4705 cmd->se_tfo->get_task_tag(cmd), lba, sectors, 4239 for (i = 0; i < task_count; i++) {
4706 transport_dev_end_lba(dev)); 4240 unsigned int task_size;
4707 4241 int count;
4708 limited_sectors = transport_limit_task_sectors(dev, lba, sectors);
4709 if (!limited_sectors)
4710 break;
4711 4242
4712 task = transport_generic_get_task(cmd, data_direction); 4243 task = transport_generic_get_task(cmd, data_direction);
4713 if (!task) 4244 if (!task)
4714 goto out; 4245 return -ENOMEM;
4715 4246
4716 task->task_lba = lba; 4247 task->task_lba = lba;
4717 task->task_sectors = limited_sectors; 4248 task->task_sectors = min(sectors, dev_max_sectors);
4718 lba += task->task_sectors; 4249 task->task_size = task->task_sectors * sector_size;
4719 sectors -= task->task_sectors;
4720 task->task_size = (task->task_sectors *
4721 dev->se_sub_dev->se_dev_attrib.block_size);
4722 4250
4723 cdb = dev->transport->get_cdb(task); 4251 cdb = dev->transport->get_cdb(task);
4724 /* Should be part of task, can't fail */
4725 BUG_ON(!cdb); 4252 BUG_ON(!cdb);
4726 4253
4727 memcpy(cdb, cmd->t_task_cdb, 4254 memcpy(cdb, cmd->t_task_cdb,
@@ -4731,94 +4258,86 @@ static u32 transport_allocate_tasks(
4731 cmd->transport_split_cdb(task->task_lba, task->task_sectors, cdb); 4258 cmd->transport_split_cdb(task->task_lba, task->task_sectors, cdb);
4732 4259
4733 /* 4260 /*
4734 * Perform the SE OBJ plugin and/or Transport plugin specific 4261 * Check if the fabric module driver is requesting that all
4735 * mapping for cmd->t_mem_list. And setup the 4262 * struct se_task->task_sg[] be chained together.. If so,
4736 * task->task_sg and if necessary task->task_sg_bidi 4263 * then allocate an extra padding SG entry for linking and
4264 * marking the end of the chained SGL.
4265 * Possibly over-allocate task sgl size by using cmd sgl size.
4266 * It's so much easier and only a waste when task_count > 1.
4267 * That is extremely rare.
4737 */ 4268 */
4738 ret = transport_do_se_mem_map(dev, task, mem_list, 4269 task->task_sg_num = sgl_nents;
4739 NULL, se_mem, &se_mem_lout, &se_mem_cnt, 4270 if (cmd->se_tfo->task_sg_chaining) {
4740 &task_offset_in); 4271 task->task_sg_num++;
4741 if (ret < 0) 4272 task->task_padded_sg = 1;
4742 goto out; 4273 }
4743 4274
4744 se_mem = se_mem_lout; 4275 task->task_sg = kmalloc(sizeof(struct scatterlist) * \
4745 /* 4276 task->task_sg_num, GFP_KERNEL);
4746 * Setup the cmd->t_mem_bidi_list -> task->task_sg_bidi 4277 if (!task->task_sg) {
4747 * mapping for SCSI READ for BIDI-COMMAND passthrough with TCM/pSCSI 4278 cmd->se_dev->transport->free_task(task);
4748 * 4279 return -ENOMEM;
4749 * Note that the first call to transport_do_se_mem_map() above will 4280 }
4750 * allocate struct se_task->task_sg_bidi in transport_do_se_mem_map()
4751 * -> transport_init_task_sg(), and the second here will do the
4752 * mapping for SCSI READ for BIDI-COMMAND passthrough with TCM/pSCSI.
4753 */
4754 if (task->task_sg_bidi != NULL) {
4755 ret = transport_do_se_mem_map(dev, task,
4756 &cmd->t_mem_bidi_list, NULL,
4757 se_mem_bidi, &se_mem_bidi_lout, &se_mem_bidi_cnt,
4758 &task_offset_in);
4759 if (ret < 0)
4760 goto out;
4761 4281
4762 se_mem_bidi = se_mem_bidi_lout; 4282 sg_init_table(task->task_sg, task->task_sg_num);
4283
4284 task_size = task->task_size;
4285
4286 /* Build new sgl, only up to task_size */
4287 for_each_sg(task->task_sg, sg, task->task_sg_num, count) {
4288 if (cmd_sg->length > task_size)
4289 break;
4290
4291 *sg = *cmd_sg;
4292 task_size -= cmd_sg->length;
4293 cmd_sg = sg_next(cmd_sg);
4763 } 4294 }
4764 task_cdbs++;
4765 4295
4766 DEBUG_VOL("Incremented task_cdbs(%u) task->task_sg_num(%u)\n", 4296 lba += task->task_sectors;
4767 task_cdbs, task->task_sg_num); 4297 sectors -= task->task_sectors;
4768 }
4769 4298
4770 if (set_counts) { 4299 spin_lock_irqsave(&cmd->t_state_lock, flags);
4771 atomic_inc(&cmd->t_fe_count); 4300 list_add_tail(&task->t_list, &cmd->t_task_list);
4772 atomic_inc(&cmd->t_se_count); 4301 spin_unlock_irqrestore(&cmd->t_state_lock, flags);
4773 } 4302 }
4774 4303
4775 DEBUG_VOL("ITT[0x%08x] total %s cdbs(%u)\n", 4304 return task_count;
4776 cmd->se_tfo->get_task_tag(cmd), (data_direction == DMA_TO_DEVICE)
4777 ? "DMA_TO_DEVICE" : "DMA_FROM_DEVICE", task_cdbs);
4778
4779 return task_cdbs;
4780out:
4781 return 0;
4782} 4305}
4783 4306
4784static int 4307static int
4785transport_map_control_cmd_to_task(struct se_cmd *cmd) 4308transport_allocate_control_task(struct se_cmd *cmd)
4786{ 4309{
4787 struct se_device *dev = cmd->se_dev; 4310 struct se_device *dev = cmd->se_dev;
4788 unsigned char *cdb; 4311 unsigned char *cdb;
4789 struct se_task *task; 4312 struct se_task *task;
4790 int ret; 4313 unsigned long flags;
4791 4314
4792 task = transport_generic_get_task(cmd, cmd->data_direction); 4315 task = transport_generic_get_task(cmd, cmd->data_direction);
4793 if (!task) 4316 if (!task)
4794 return PYX_TRANSPORT_OUT_OF_MEMORY_RESOURCES; 4317 return -ENOMEM;
4795 4318
4796 cdb = dev->transport->get_cdb(task); 4319 cdb = dev->transport->get_cdb(task);
4797 BUG_ON(!cdb); 4320 BUG_ON(!cdb);
4798 memcpy(cdb, cmd->t_task_cdb, 4321 memcpy(cdb, cmd->t_task_cdb,
4799 scsi_command_size(cmd->t_task_cdb)); 4322 scsi_command_size(cmd->t_task_cdb));
4800 4323
4324 task->task_sg = kmalloc(sizeof(struct scatterlist) * cmd->t_data_nents,
4325 GFP_KERNEL);
4326 if (!task->task_sg) {
4327 cmd->se_dev->transport->free_task(task);
4328 return -ENOMEM;
4329 }
4330
4331 memcpy(task->task_sg, cmd->t_data_sg,
4332 sizeof(struct scatterlist) * cmd->t_data_nents);
4801 task->task_size = cmd->data_length; 4333 task->task_size = cmd->data_length;
4802 task->task_sg_num = 4334 task->task_sg_num = cmd->t_data_nents;
4803 (cmd->se_cmd_flags & SCF_SCSI_CONTROL_SG_IO_CDB) ? 1 : 0;
4804 4335
4805 atomic_inc(&cmd->t_fe_count); 4336 spin_lock_irqsave(&cmd->t_state_lock, flags);
4806 atomic_inc(&cmd->t_se_count); 4337 list_add_tail(&task->t_list, &cmd->t_task_list);
4338 spin_unlock_irqrestore(&cmd->t_state_lock, flags);
4807 4339
4808 if (cmd->se_cmd_flags & SCF_SCSI_CONTROL_SG_IO_CDB) { 4340 if (cmd->se_cmd_flags & SCF_SCSI_CONTROL_SG_IO_CDB) {
4809 struct se_mem *se_mem = NULL, *se_mem_lout = NULL;
4810 u32 se_mem_cnt = 0, task_offset = 0;
4811
4812 if (!list_empty(&cmd->t_mem_list))
4813 se_mem = list_first_entry(&cmd->t_mem_list,
4814 struct se_mem, se_list);
4815
4816 ret = transport_do_se_mem_map(dev, task,
4817 &cmd->t_mem_list, NULL, se_mem,
4818 &se_mem_lout, &se_mem_cnt, &task_offset);
4819 if (ret < 0)
4820 return PYX_TRANSPORT_OUT_OF_MEMORY_RESOURCES;
4821
4822 if (dev->transport->map_task_SG) 4341 if (dev->transport->map_task_SG)
4823 return dev->transport->map_task_SG(task); 4342 return dev->transport->map_task_SG(task);
4824 return 0; 4343 return 0;
@@ -4828,10 +4347,32 @@ transport_map_control_cmd_to_task(struct se_cmd *cmd)
4828 return 0; 4347 return 0;
4829 } else { 4348 } else {
4830 BUG(); 4349 BUG();
4831 return PYX_TRANSPORT_OUT_OF_MEMORY_RESOURCES; 4350 return -ENOMEM;
4832 } 4351 }
4833} 4352}
4834 4353
4354static u32 transport_allocate_tasks(
4355 struct se_cmd *cmd,
4356 unsigned long long lba,
4357 enum dma_data_direction data_direction,
4358 struct scatterlist *sgl,
4359 unsigned int sgl_nents)
4360{
4361 int ret;
4362
4363 if (cmd->se_cmd_flags & SCF_SCSI_DATA_SG_IO_CDB) {
4364 return transport_allocate_data_tasks(cmd, lba, data_direction,
4365 sgl, sgl_nents);
4366 } else {
4367 ret = transport_allocate_control_task(cmd);
4368 if (ret < 0)
4369 return ret;
4370 else
4371 return 1;
4372 }
4373}
4374
4375
4835/* transport_generic_new_cmd(): Called from transport_processing_thread() 4376/* transport_generic_new_cmd(): Called from transport_processing_thread()
4836 * 4377 *
4837 * Allocate storage transport resources from a set of values predefined 4378 * Allocate storage transport resources from a set of values predefined
@@ -4850,10 +4391,10 @@ int transport_generic_new_cmd(struct se_cmd *cmd)
4850 /* 4391 /*
4851 * Determine is the TCM fabric module has already allocated physical 4392 * Determine is the TCM fabric module has already allocated physical
4852 * memory, and is directly calling transport_generic_map_mem_to_cmd() 4393 * memory, and is directly calling transport_generic_map_mem_to_cmd()
4853 * to setup beforehand the linked list of physical memory at 4394 * beforehand.
4854 * cmd->t_mem_list of struct se_mem->se_page
4855 */ 4395 */
4856 if (!(cmd->se_cmd_flags & SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC)) { 4396 if (!(cmd->se_cmd_flags & SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC) &&
4397 cmd->data_length) {
4857 ret = transport_generic_get_mem(cmd); 4398 ret = transport_generic_get_mem(cmd);
4858 if (ret < 0) 4399 if (ret < 0)
4859 return ret; 4400 return ret;
@@ -4863,19 +4404,13 @@ int transport_generic_new_cmd(struct se_cmd *cmd)
4863 if (ret < 0) 4404 if (ret < 0)
4864 return ret; 4405 return ret;
4865 4406
4866 if (cmd->se_cmd_flags & SCF_SCSI_DATA_SG_IO_CDB) { 4407 list_for_each_entry(task, &cmd->t_task_list, t_list) {
4867 list_for_each_entry(task, &cmd->t_task_list, t_list) { 4408 if (atomic_read(&task->task_sent))
4868 if (atomic_read(&task->task_sent)) 4409 continue;
4869 continue; 4410 if (!dev->transport->map_task_SG)
4870 if (!dev->transport->map_task_SG) 4411 continue;
4871 continue;
4872 4412
4873 ret = dev->transport->map_task_SG(task); 4413 ret = dev->transport->map_task_SG(task);
4874 if (ret < 0)
4875 return ret;
4876 }
4877 } else {
4878 ret = transport_map_control_cmd_to_task(cmd);
4879 if (ret < 0) 4414 if (ret < 0)
4880 return ret; 4415 return ret;
4881 } 4416 }
diff --git a/drivers/target/tcm_fc/tfc_cmd.c b/drivers/target/tcm_fc/tfc_cmd.c
index 1017f56bbbcc..9365e53947ad 100644
--- a/drivers/target/tcm_fc/tfc_cmd.c
+++ b/drivers/target/tcm_fc/tfc_cmd.c
@@ -59,7 +59,8 @@ void ft_dump_cmd(struct ft_cmd *cmd, const char *caller)
59 struct fc_exch *ep; 59 struct fc_exch *ep;
60 struct fc_seq *sp; 60 struct fc_seq *sp;
61 struct se_cmd *se_cmd; 61 struct se_cmd *se_cmd;
62 struct se_mem *mem; 62 struct scatterlist *sg;
63 int count;
63 64
64 if (!(ft_debug_logging & FT_DEBUG_IO)) 65 if (!(ft_debug_logging & FT_DEBUG_IO))
65 return; 66 return;
@@ -71,15 +72,16 @@ void ft_dump_cmd(struct ft_cmd *cmd, const char *caller)
71 caller, cmd, cmd->cdb); 72 caller, cmd, cmd->cdb);
72 printk(KERN_INFO "%s: cmd %p lun %d\n", caller, cmd, cmd->lun); 73 printk(KERN_INFO "%s: cmd %p lun %d\n", caller, cmd, cmd->lun);
73 74
74 printk(KERN_INFO "%s: cmd %p se_num %u len %u se_cmd_flags <0x%x>\n", 75 printk(KERN_INFO "%s: cmd %p data_nents %u len %u se_cmd_flags <0x%x>\n",
75 caller, cmd, se_cmd->t_tasks_se_num, 76 caller, cmd, se_cmd->t_data_nents,
76 se_cmd->data_length, se_cmd->se_cmd_flags); 77 se_cmd->data_length, se_cmd->se_cmd_flags);
77 78
78 list_for_each_entry(mem, &se_cmd->t_mem_list, se_list) 79 for_each_sg(se_cmd->t_data_sg, sg, se_cmd->t_data_nents, count)
79 printk(KERN_INFO "%s: cmd %p mem %p page %p " 80 printk(KERN_INFO "%s: cmd %p sg %p page %p "
80 "len 0x%x off 0x%x\n", 81 "len 0x%x off 0x%x\n",
81 caller, cmd, mem, 82 caller, cmd, sg,
82 mem->se_page, mem->se_len, mem->se_off); 83 sg_page(sg), sg->length, sg->offset);
84
83 sp = cmd->seq; 85 sp = cmd->seq;
84 if (sp) { 86 if (sp) {
85 ep = fc_seq_exch(sp); 87 ep = fc_seq_exch(sp);
@@ -256,10 +258,9 @@ int ft_write_pending(struct se_cmd *se_cmd)
256 (fh->fh_r_ctl == FC_RCTL_DD_DATA_DESC)) { 258 (fh->fh_r_ctl == FC_RCTL_DD_DATA_DESC)) {
257 if (se_cmd->se_cmd_flags & SCF_SCSI_DATA_SG_IO_CDB) { 259 if (se_cmd->se_cmd_flags & SCF_SCSI_DATA_SG_IO_CDB) {
258 /* 260 /*
259 * Map se_mem list to scatterlist, so that 261 * cmd may have been broken up into multiple
260 * DDP can be setup. DDP setup function require 262 * tasks. Link their sgs together so we can
261 * scatterlist. se_mem_list is internal to 263 * operate on them all at once.
262 * TCM/LIO target
263 */ 264 */
264 transport_do_task_sg_chain(se_cmd); 265 transport_do_task_sg_chain(se_cmd);
265 cmd->sg = se_cmd->t_tasks_sg_chained; 266 cmd->sg = se_cmd->t_tasks_sg_chained;
diff --git a/drivers/target/tcm_fc/tfc_io.c b/drivers/target/tcm_fc/tfc_io.c
index 837660728563..3563a9029c4a 100644
--- a/drivers/target/tcm_fc/tfc_io.c
+++ b/drivers/target/tcm_fc/tfc_io.c
@@ -68,17 +68,17 @@ int ft_queue_data_in(struct se_cmd *se_cmd)
68 struct fc_frame *fp = NULL; 68 struct fc_frame *fp = NULL;
69 struct fc_exch *ep; 69 struct fc_exch *ep;
70 struct fc_lport *lport; 70 struct fc_lport *lport;
71 struct se_mem *mem; 71 struct scatterlist *sg = NULL;
72 size_t remaining; 72 size_t remaining;
73 u32 f_ctl = FC_FC_EX_CTX | FC_FC_REL_OFF; 73 u32 f_ctl = FC_FC_EX_CTX | FC_FC_REL_OFF;
74 u32 mem_off; 74 u32 mem_off = 0;
75 u32 fh_off = 0; 75 u32 fh_off = 0;
76 u32 frame_off = 0; 76 u32 frame_off = 0;
77 size_t frame_len = 0; 77 size_t frame_len = 0;
78 size_t mem_len; 78 size_t mem_len = 0;
79 size_t tlen; 79 size_t tlen;
80 size_t off_in_page; 80 size_t off_in_page;
81 struct page *page; 81 struct page *page = NULL;
82 int use_sg; 82 int use_sg;
83 int error; 83 int error;
84 void *page_addr; 84 void *page_addr;
@@ -94,13 +94,12 @@ int ft_queue_data_in(struct se_cmd *se_cmd)
94 /* 94 /*
95 * Setup to use first mem list entry, unless no data. 95 * Setup to use first mem list entry, unless no data.
96 */ 96 */
97 BUG_ON(remaining && list_empty(&se_cmd->t_mem_list)); 97 BUG_ON(remaining && !se_cmd->t_data_sg);
98 if (remaining) { 98 if (remaining) {
99 mem = list_first_entry(&se_cmd->t_mem_list, 99 sg = se_cmd->t_data_sg;
100 struct se_mem, se_list); 100 mem_len = sg->length;
101 mem_len = mem->se_len; 101 mem_off = sg->offset;
102 mem_off = mem->se_off; 102 page = sg_page(sg);
103 page = mem->se_page;
104 } 103 }
105 104
106 /* no scatter/gather in skb for odd word length due to fc_seq_send() */ 105 /* no scatter/gather in skb for odd word length due to fc_seq_send() */
@@ -108,12 +107,10 @@ int ft_queue_data_in(struct se_cmd *se_cmd)
108 107
109 while (remaining) { 108 while (remaining) {
110 if (!mem_len) { 109 if (!mem_len) {
111 BUG_ON(!mem); 110 sg = sg_next(sg);
112 mem = list_entry(mem->se_list.next, 111 mem_len = min((size_t)sg->length, remaining);
113 struct se_mem, se_list); 112 mem_off = sg->offset;
114 mem_len = min((size_t)mem->se_len, remaining); 113 page = sg_page(sg);
115 mem_off = mem->se_off;
116 page = mem->se_page;
117 } 114 }
118 if (!frame_len) { 115 if (!frame_len) {
119 /* 116 /*
@@ -200,13 +197,13 @@ void ft_recv_write_data(struct ft_cmd *cmd, struct fc_frame *fp)
200 struct fc_exch *ep; 197 struct fc_exch *ep;
201 struct fc_lport *lport; 198 struct fc_lport *lport;
202 struct fc_frame_header *fh; 199 struct fc_frame_header *fh;
203 struct se_mem *mem; 200 struct scatterlist *sg = NULL;
204 u32 mem_off; 201 u32 mem_off = 0;
205 u32 rel_off; 202 u32 rel_off;
206 size_t frame_len; 203 size_t frame_len;
207 size_t mem_len; 204 size_t mem_len = 0;
208 size_t tlen; 205 size_t tlen;
209 struct page *page; 206 struct page *page = NULL;
210 void *page_addr; 207 void *page_addr;
211 void *from; 208 void *from;
212 void *to; 209 void *to;
@@ -288,23 +285,20 @@ void ft_recv_write_data(struct ft_cmd *cmd, struct fc_frame *fp)
288 /* 285 /*
289 * Setup to use first mem list entry, unless no data. 286 * Setup to use first mem list entry, unless no data.
290 */ 287 */
291 BUG_ON(frame_len && list_empty(&se_cmd->t_mem_list)); 288 BUG_ON(frame_len && !se_cmd->t_data_sg);
292 if (frame_len) { 289 if (frame_len) {
293 mem = list_first_entry(&se_cmd->t_mem_list, 290 sg = se_cmd->t_data_sg;
294 struct se_mem, se_list); 291 mem_len = sg->length;
295 mem_len = mem->se_len; 292 mem_off = sg->offset;
296 mem_off = mem->se_off; 293 page = sg_page(sg);
297 page = mem->se_page;
298 } 294 }
299 295
300 while (frame_len) { 296 while (frame_len) {
301 if (!mem_len) { 297 if (!mem_len) {
302 BUG_ON(!mem); 298 sg = sg_next(sg);
303 mem = list_entry(mem->se_list.next, 299 mem_len = sg->length;
304 struct se_mem, se_list); 300 mem_off = sg->offset;
305 mem_len = mem->se_len; 301 page = sg_page(sg);
306 mem_off = mem->se_off;
307 page = mem->se_page;
308 } 302 }
309 if (rel_off >= mem_len) { 303 if (rel_off >= mem_len) {
310 rel_off -= mem_len; 304 rel_off -= mem_len;