aboutsummaryrefslogtreecommitdiffstats
path: root/include/target
diff options
context:
space:
mode:
authorAndy Grover <agrover@redhat.com>2011-05-02 20:12:10 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2011-07-22 05:37:44 -0400
commita1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6 (patch)
tree8cbfd54b4829fd5f0ed206e15c81c1e626e7701d /include/target
parentdd3a5ad8e0c8706659f02c4a72b8c87f6f7ab479 (diff)
target: Updates from AGrover and HCH (round 3)
This patch contains a squashed version of third round series cleanups, improvements ,and simplfications from Andy and Christoph ahead of the heavy lifting between round 3 -> 4 for the target core SGL conversion. This include cleanups to the main target I/O path and other miscellaneous updates. target: Replace custom sg<->buf functions with lib funcs target: Simplify sector limiting code target: get_cdb should never return NULL target: Simplify transport_memcpy_se_mem_read_contig target: Use assignment rather than increment for t_task_cdbs target: Don't pass dma_size to generic_get_mem target: Pass sg with type scatterlist in transport_map_sg_to_mem target: Move task_sg_num next to task_sg in struct se_task target: inline struct se_transport_task into struct se_cmd target: Change name & semantics of transport_get_sectors() target: Remove unused members of se_cmd target: Rename se_cmd.t_task_cdbs to t_task_list_num target: Fix some spelling target: Remove unused var from transport_generic_do_tmr target: map_sg_to_mem: return sg_count in return value target/pscsi: Use min_t for sector limits target/pscsi: Unused param for pscsi_get_bio() target: Rename get_cdb_count to allocate_tasks target: Make transport_generic_new_cmd() available for iscsi-target target: Remove fabric callback to allocate iovecs target: Fix transport_generic_new_cmd WRITE comment (hch: Use __GFP_ZERO usage for alloc_pages() usage) Signed-off-by: Andy Grover <agrover@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'include/target')
-rw-r--r--include/target/target_core_base.h105
-rw-r--r--include/target/target_core_fabric_ops.h5
-rw-r--r--include/target/target_core_transport.h3
3 files changed, 49 insertions, 64 deletions
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h
index 94c838dcfc3c..71c96ce9287e 100644
--- a/include/target/target_core_base.h
+++ b/include/target/target_core_base.h
@@ -403,64 +403,10 @@ struct se_queue_obj {
403 wait_queue_head_t thread_wq; 403 wait_queue_head_t thread_wq;
404} ____cacheline_aligned; 404} ____cacheline_aligned;
405 405
406/*
407 * Used one per struct se_cmd to hold all extra struct se_task
408 * metadata. This structure is setup and allocated in
409 * drivers/target/target_core_transport.c:__transport_alloc_se_cmd()
410 */
411struct se_transport_task {
412 unsigned char *t_task_cdb;
413 unsigned char __t_task_cdb[TCM_MAX_COMMAND_SIZE];
414 unsigned long long t_task_lba;
415 int t_tasks_failed;
416 int t_tasks_fua;
417 bool t_tasks_bidi;
418 u32 t_task_cdbs;
419 u32 t_tasks_check;
420 u32 t_tasks_no;
421 u32 t_tasks_sectors;
422 u32 t_tasks_se_num;
423 u32 t_tasks_se_bidi_num;
424 u32 t_tasks_sg_chained_no;
425 atomic_t t_fe_count;
426 atomic_t t_se_count;
427 atomic_t t_task_cdbs_left;
428 atomic_t t_task_cdbs_ex_left;
429 atomic_t t_task_cdbs_timeout_left;
430 atomic_t t_task_cdbs_sent;
431 atomic_t t_transport_aborted;
432 atomic_t t_transport_active;
433 atomic_t t_transport_complete;
434 atomic_t t_transport_queue_active;
435 atomic_t t_transport_sent;
436 atomic_t t_transport_stop;
437 atomic_t t_transport_timeout;
438 atomic_t transport_dev_active;
439 atomic_t transport_lun_active;
440 atomic_t transport_lun_fe_stop;
441 atomic_t transport_lun_stop;
442 spinlock_t t_state_lock;
443 struct completion t_transport_stop_comp;
444 struct completion transport_lun_fe_stop_comp;
445 struct completion transport_lun_stop_comp;
446 struct scatterlist *t_tasks_sg_chained;
447 struct scatterlist t_tasks_sg_bounce;
448 void *t_task_buf;
449 /*
450 * Used for pre-registered fabric SGL passthrough WRITE and READ
451 * with the special SCF_PASSTHROUGH_CONTIG_TO_SG case for TCM_Loop
452 * and other HW target mode fabric modules.
453 */
454 struct scatterlist *t_task_pt_sgl;
455 struct list_head t_mem_list;
456 /* Used for BIDI READ */
457 struct list_head t_mem_bidi_list;
458 struct list_head t_task_list;
459} ____cacheline_aligned;
460
461struct se_task { 406struct se_task {
462 unsigned char task_sense; 407 unsigned char task_sense;
463 struct scatterlist *task_sg; 408 struct scatterlist *task_sg;
409 u32 task_sg_num;
464 struct scatterlist *task_sg_bidi; 410 struct scatterlist *task_sg_bidi;
465 u8 task_scsi_status; 411 u8 task_scsi_status;
466 u8 task_flags; 412 u8 task_flags;
@@ -471,8 +417,6 @@ struct se_task {
471 u32 task_no; 417 u32 task_no;
472 u32 task_sectors; 418 u32 task_sectors;
473 u32 task_size; 419 u32 task_size;
474 u32 task_sg_num;
475 u32 task_sg_offset;
476 enum dma_data_direction task_data_direction; 420 enum dma_data_direction task_data_direction;
477 struct se_cmd *task_se_cmd; 421 struct se_cmd *task_se_cmd;
478 struct se_device *se_dev; 422 struct se_device *se_dev;
@@ -534,13 +478,58 @@ struct se_cmd {
534 /* Only used for internal passthrough and legacy TCM fabric modules */ 478 /* Only used for internal passthrough and legacy TCM fabric modules */
535 struct se_session *se_sess; 479 struct se_session *se_sess;
536 struct se_tmr_req *se_tmr_req; 480 struct se_tmr_req *se_tmr_req;
537 struct se_transport_task t_task;
538 struct list_head se_queue_node; 481 struct list_head se_queue_node;
539 struct target_core_fabric_ops *se_tfo; 482 struct target_core_fabric_ops *se_tfo;
540 int (*transport_emulate_cdb)(struct se_cmd *); 483 int (*transport_emulate_cdb)(struct se_cmd *);
541 void (*transport_split_cdb)(unsigned long long, u32 *, unsigned char *); 484 void (*transport_split_cdb)(unsigned long long, u32 *, unsigned char *);
542 void (*transport_wait_for_tasks)(struct se_cmd *, int, int); 485 void (*transport_wait_for_tasks)(struct se_cmd *, int, int);
543 void (*transport_complete_callback)(struct se_cmd *); 486 void (*transport_complete_callback)(struct se_cmd *);
487 unsigned char *t_task_cdb;
488 unsigned char __t_task_cdb[TCM_MAX_COMMAND_SIZE];
489 unsigned long long t_task_lba;
490 int t_tasks_failed;
491 int t_tasks_fua;
492 bool t_tasks_bidi;
493 u32 t_tasks_se_num;
494 u32 t_tasks_se_bidi_num;
495 u32 t_tasks_sg_chained_no;
496 atomic_t t_fe_count;
497 atomic_t t_se_count;
498 atomic_t t_task_cdbs_left;
499 atomic_t t_task_cdbs_ex_left;
500 atomic_t t_task_cdbs_timeout_left;
501 atomic_t t_task_cdbs_sent;
502 atomic_t t_transport_aborted;
503 atomic_t t_transport_active;
504 atomic_t t_transport_complete;
505 atomic_t t_transport_queue_active;
506 atomic_t t_transport_sent;
507 atomic_t t_transport_stop;
508 atomic_t t_transport_timeout;
509 atomic_t transport_dev_active;
510 atomic_t transport_lun_active;
511 atomic_t transport_lun_fe_stop;
512 atomic_t transport_lun_stop;
513 spinlock_t t_state_lock;
514 struct completion t_transport_stop_comp;
515 struct completion transport_lun_fe_stop_comp;
516 struct completion transport_lun_stop_comp;
517 struct scatterlist *t_tasks_sg_chained;
518 struct scatterlist t_tasks_sg_bounce;
519 void *t_task_buf;
520 /*
521 * Used for pre-registered fabric SGL passthrough WRITE and READ
522 * with the special SCF_PASSTHROUGH_CONTIG_TO_SG case for TCM_Loop
523 * and other HW target mode fabric modules.
524 */
525 struct scatterlist *t_task_pt_sgl;
526 u32 t_task_pt_sgl_num;
527 struct list_head t_mem_list;
528 /* Used for BIDI READ */
529 struct list_head t_mem_bidi_list;
530 struct list_head t_task_list;
531 u32 t_task_list_num;
532
544} ____cacheline_aligned; 533} ____cacheline_aligned;
545 534
546struct se_tmr_req { 535struct se_tmr_req {
diff --git a/include/target/target_core_fabric_ops.h b/include/target/target_core_fabric_ops.h
index 747e1404dca0..1752ed3f77fa 100644
--- a/include/target/target_core_fabric_ops.h
+++ b/include/target/target_core_fabric_ops.h
@@ -39,11 +39,6 @@ struct target_core_fabric_ops {
39 */ 39 */
40 int (*new_cmd_map)(struct se_cmd *); 40 int (*new_cmd_map)(struct se_cmd *);
41 /* 41 /*
42 * Optional function pointer for TCM fabric modules that use
43 * Linux/NET sockets to allocate struct iovec array to struct se_cmd
44 */
45 int (*alloc_cmd_iovecs)(struct se_cmd *);
46 /*
47 * Optional to release struct se_cmd and fabric dependent allocated 42 * Optional to release struct se_cmd and fabric dependent allocated
48 * I/O descriptor in transport_cmd_check_stop() 43 * I/O descriptor in transport_cmd_check_stop()
49 */ 44 */
diff --git a/include/target/target_core_transport.h b/include/target/target_core_transport.h
index acd591491767..c9846d521945 100644
--- a/include/target/target_core_transport.h
+++ b/include/target/target_core_transport.h
@@ -184,10 +184,11 @@ extern void transport_generic_free_cmd(struct se_cmd *, int, int, int);
184extern void transport_generic_wait_for_cmds(struct se_cmd *, int); 184extern void transport_generic_wait_for_cmds(struct se_cmd *, int);
185extern int transport_init_task_sg(struct se_task *, struct se_mem *, u32); 185extern int transport_init_task_sg(struct se_task *, struct se_mem *, u32);
186extern int transport_map_mem_to_sg(struct se_task *, struct list_head *, 186extern int transport_map_mem_to_sg(struct se_task *, struct list_head *,
187 void *, struct se_mem *, 187 struct scatterlist *, struct se_mem *,
188 struct se_mem **, u32 *, u32 *); 188 struct se_mem **, u32 *, u32 *);
189extern void transport_do_task_sg_chain(struct se_cmd *); 189extern void transport_do_task_sg_chain(struct se_cmd *);
190extern void transport_generic_process_write(struct se_cmd *); 190extern void transport_generic_process_write(struct se_cmd *);
191extern int transport_generic_new_cmd(struct se_cmd *);
191extern int transport_generic_do_tmr(struct se_cmd *); 192extern int transport_generic_do_tmr(struct se_cmd *);
192/* From target_core_alua.c */ 193/* From target_core_alua.c */
193extern int core_alua_check_nonop_delay(struct se_cmd *); 194extern int core_alua_check_nonop_delay(struct se_cmd *);