diff options
author | Nicholas Bellinger <nab@daterainc.com> | 2013-08-25 19:10:57 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2013-09-09 17:29:32 -0400 |
commit | 8cefe07b5e9c2b0212ad6809a219e4489807a746 (patch) | |
tree | 7396ced8cbb14370c506479a307a38790e41a7be | |
parent | 200939940e040fa11609956a09c78a5782310c61 (diff) |
target: Do memory allocation for bidi commands using target_alloc_sgl
This patch updates transport_generic_new_cmd() to call target_alloc_sgl()
for SGL + page memory allocation for se_cmd->t_bidi_data_sg.
It also adds the special case for SCF_COMPARE_AND_WRITE to calculate a
different bidi_length based upon se_cmd->t_task_nolb.
Reported-by: Christoph Hellwig <hch@lst.de>
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>
-rw-r--r-- | drivers/target/target_core_transport.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index 607bc3d2bb40..c974e1373c77 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c | |||
@@ -2149,6 +2149,23 @@ transport_generic_new_cmd(struct se_cmd *cmd) | |||
2149 | cmd->data_length) { | 2149 | cmd->data_length) { |
2150 | bool zero_flag = !(cmd->se_cmd_flags & SCF_SCSI_DATA_CDB); | 2150 | bool zero_flag = !(cmd->se_cmd_flags & SCF_SCSI_DATA_CDB); |
2151 | 2151 | ||
2152 | if ((cmd->se_cmd_flags & SCF_BIDI) || | ||
2153 | (cmd->se_cmd_flags & SCF_COMPARE_AND_WRITE)) { | ||
2154 | u32 bidi_length; | ||
2155 | |||
2156 | if (cmd->se_cmd_flags & SCF_COMPARE_AND_WRITE) | ||
2157 | bidi_length = cmd->t_task_nolb * | ||
2158 | cmd->se_dev->dev_attrib.block_size; | ||
2159 | else | ||
2160 | bidi_length = cmd->data_length; | ||
2161 | |||
2162 | ret = target_alloc_sgl(&cmd->t_bidi_data_sg, | ||
2163 | &cmd->t_bidi_data_nents, | ||
2164 | bidi_length, zero_flag); | ||
2165 | if (ret < 0) | ||
2166 | return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; | ||
2167 | } | ||
2168 | |||
2152 | ret = target_alloc_sgl(&cmd->t_data_sg, &cmd->t_data_nents, | 2169 | ret = target_alloc_sgl(&cmd->t_data_sg, &cmd->t_data_nents, |
2153 | cmd->data_length, zero_flag); | 2170 | cmd->data_length, zero_flag); |
2154 | if (ret < 0) | 2171 | if (ret < 0) |