aboutsummaryrefslogtreecommitdiffstats
path: root/include/target/target_core_base.h
diff options
context:
space:
mode:
authorNicholas Bellinger <nab@daterainc.com>2013-08-20 02:57:30 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2013-09-09 17:29:28 -0400
commita82a9538dd30471e6428a2d55e91e986c439866b (patch)
tree439d70dae8fd42cc19922a31d1ac2a6ecf9c32fb /include/target/target_core_base.h
parent818b571ca053e19be336de1cc75c01dd5445e969 (diff)
target: Allow sbc_ops->execute_rw() to accept SGLs + data_direction
COMPARE_AND_WRITE expects to be able to send down a DMA_FROM_DEVICE to obtain the necessary READ payload for comparision against the first half of the WRITE payload containing the verify user data. Currently virtual backends expect to internally reference SGLs, SGL nents, and data_direction, so change IBLOCK, FILEIO and RD sbc_ops->execute_rw() to accept this values as function parameters. Also add default sbc_execute_rw() handler for the typical case for cmd->execute_rw() submission using cmd->t_data_sg, cmd->t_data_nents, and cmd->data_direction). v2 Changes: - Add SCF_COMPARE_AND_WRITE command flag - Use sbc_execute_rw() for normal cmd->execute_rw() submission with expected se_cmd members. Cc: Christoph Hellwig <hch@lst.de> Cc: Hannes Reinecke <hare@suse.de> Cc: Martin Petersen <martin.petersen@oracle.com> Cc: Chris Mason <chris.mason@fusionio.com> Cc: James Bottomley <JBottomley@Parallels.com> Cc: Nicholas Bellinger <nab@linux-iscsi.org> Signed-off-by: Nicholas Bellinger <nab@daterainc.com>
Diffstat (limited to 'include/target/target_core_base.h')
-rw-r--r--include/target/target_core_base.h5
1 files changed, 5 insertions, 0 deletions
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h
index 3313b7d91ac8..4a26a18a24d6 100644
--- a/include/target/target_core_base.h
+++ b/include/target/target_core_base.h
@@ -159,6 +159,8 @@ enum se_cmd_flags_table {
159 SCF_ALUA_NON_OPTIMIZED = 0x00008000, 159 SCF_ALUA_NON_OPTIMIZED = 0x00008000,
160 SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC = 0x00020000, 160 SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC = 0x00020000,
161 SCF_ACK_KREF = 0x00040000, 161 SCF_ACK_KREF = 0x00040000,
162 SCF_COMPARE_AND_WRITE = 0x00080000,
163 SCF_COMPARE_AND_WRITE_POST = 0x00100000,
162}; 164};
163 165
164/* struct se_dev_entry->lun_flags and struct se_lun->lun_access */ 166/* struct se_dev_entry->lun_flags and struct se_lun->lun_access */
@@ -448,11 +450,14 @@ struct se_cmd {
448 struct kref cmd_kref; 450 struct kref cmd_kref;
449 struct target_core_fabric_ops *se_tfo; 451 struct target_core_fabric_ops *se_tfo;
450 sense_reason_t (*execute_cmd)(struct se_cmd *); 452 sense_reason_t (*execute_cmd)(struct se_cmd *);
453 sense_reason_t (*execute_rw)(struct se_cmd *, struct scatterlist *,
454 u32, enum dma_data_direction);
451 sense_reason_t (*transport_complete_callback)(struct se_cmd *); 455 sense_reason_t (*transport_complete_callback)(struct se_cmd *);
452 456
453 unsigned char *t_task_cdb; 457 unsigned char *t_task_cdb;
454 unsigned char __t_task_cdb[TCM_MAX_COMMAND_SIZE]; 458 unsigned char __t_task_cdb[TCM_MAX_COMMAND_SIZE];
455 unsigned long long t_task_lba; 459 unsigned long long t_task_lba;
460 unsigned int t_task_nolb;
456 unsigned int transport_state; 461 unsigned int transport_state;
457#define CMD_T_ABORTED (1 << 0) 462#define CMD_T_ABORTED (1 << 0)
458#define CMD_T_ACTIVE (1 << 1) 463#define CMD_T_ACTIVE (1 << 1)