diff options
author | Christoph Hellwig <hch@lst.de> | 2015-06-19 09:11:00 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2015-06-23 03:43:46 -0400 |
commit | b753d643555e548163adfa2de9d75e0257e4b356 (patch) | |
tree | d2b1f871b7815e28699886430bb6ede5a2cf0761 /drivers/target | |
parent | 62e4694256dd3cbe301ebc0da799df8779b97014 (diff) |
target: implement WRITE_SAME with UNMAP bit using ->execute_unmap
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-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/target_core_file.c | 21 | ||||
-rw-r--r-- | drivers/target/target_core_iblock.c | 16 | ||||
-rw-r--r-- | drivers/target/target_core_sbc.c | 21 |
3 files changed, 19 insertions, 39 deletions
diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c index ced8c4fdc23d..f5da2c1891b5 100644 --- a/drivers/target/target_core_file.c +++ b/drivers/target/target_core_file.c | |||
@@ -519,26 +519,6 @@ fd_execute_unmap(struct se_cmd *cmd, sector_t lba, sector_t nolb) | |||
519 | } | 519 | } |
520 | 520 | ||
521 | static sense_reason_t | 521 | static sense_reason_t |
522 | fd_execute_write_same_unmap(struct se_cmd *cmd) | ||
523 | { | ||
524 | sector_t lba = cmd->t_task_lba; | ||
525 | sector_t nolb = sbc_get_write_same_sectors(cmd); | ||
526 | sense_reason_t ret; | ||
527 | |||
528 | if (!nolb) { | ||
529 | target_complete_cmd(cmd, SAM_STAT_GOOD); | ||
530 | return 0; | ||
531 | } | ||
532 | |||
533 | ret = fd_execute_unmap(cmd, lba, nolb); | ||
534 | if (ret) | ||
535 | return ret; | ||
536 | |||
537 | target_complete_cmd(cmd, GOOD); | ||
538 | return 0; | ||
539 | } | ||
540 | |||
541 | static sense_reason_t | ||
542 | fd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, | 522 | fd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, |
543 | enum dma_data_direction data_direction) | 523 | enum dma_data_direction data_direction) |
544 | { | 524 | { |
@@ -827,7 +807,6 @@ static struct sbc_ops fd_sbc_ops = { | |||
827 | .execute_rw = fd_execute_rw, | 807 | .execute_rw = fd_execute_rw, |
828 | .execute_sync_cache = fd_execute_sync_cache, | 808 | .execute_sync_cache = fd_execute_sync_cache, |
829 | .execute_write_same = fd_execute_write_same, | 809 | .execute_write_same = fd_execute_write_same, |
830 | .execute_write_same_unmap = fd_execute_write_same_unmap, | ||
831 | .execute_unmap = fd_execute_unmap, | 810 | .execute_unmap = fd_execute_unmap, |
832 | }; | 811 | }; |
833 | 812 | ||
diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c index 0a2308891c81..a869022b136e 100644 --- a/drivers/target/target_core_iblock.c +++ b/drivers/target/target_core_iblock.c | |||
@@ -431,21 +431,6 @@ iblock_execute_unmap(struct se_cmd *cmd, sector_t lba, sector_t nolb) | |||
431 | } | 431 | } |
432 | 432 | ||
433 | static sense_reason_t | 433 | static sense_reason_t |
434 | iblock_execute_write_same_unmap(struct se_cmd *cmd) | ||
435 | { | ||
436 | sector_t lba = cmd->t_task_lba; | ||
437 | sector_t nolb = sbc_get_write_same_sectors(cmd); | ||
438 | sense_reason_t ret; | ||
439 | |||
440 | ret = iblock_execute_unmap(cmd, lba, nolb); | ||
441 | if (ret) | ||
442 | return ret; | ||
443 | |||
444 | target_complete_cmd(cmd, GOOD); | ||
445 | return 0; | ||
446 | } | ||
447 | |||
448 | static sense_reason_t | ||
449 | iblock_execute_write_same(struct se_cmd *cmd) | 434 | iblock_execute_write_same(struct se_cmd *cmd) |
450 | { | 435 | { |
451 | struct iblock_req *ibr; | 436 | struct iblock_req *ibr; |
@@ -836,7 +821,6 @@ static struct sbc_ops iblock_sbc_ops = { | |||
836 | .execute_rw = iblock_execute_rw, | 821 | .execute_rw = iblock_execute_rw, |
837 | .execute_sync_cache = iblock_execute_sync_cache, | 822 | .execute_sync_cache = iblock_execute_sync_cache, |
838 | .execute_write_same = iblock_execute_write_same, | 823 | .execute_write_same = iblock_execute_write_same, |
839 | .execute_write_same_unmap = iblock_execute_write_same_unmap, | ||
840 | .execute_unmap = iblock_execute_unmap, | 824 | .execute_unmap = iblock_execute_unmap, |
841 | }; | 825 | }; |
842 | 826 | ||
diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c index c16a66698725..9a5e7d094a5d 100644 --- a/drivers/target/target_core_sbc.c +++ b/drivers/target/target_core_sbc.c | |||
@@ -178,6 +178,23 @@ sector_t sbc_get_write_same_sectors(struct se_cmd *cmd) | |||
178 | EXPORT_SYMBOL(sbc_get_write_same_sectors); | 178 | EXPORT_SYMBOL(sbc_get_write_same_sectors); |
179 | 179 | ||
180 | static sense_reason_t | 180 | static sense_reason_t |
181 | sbc_execute_write_same_unmap(struct se_cmd *cmd) | ||
182 | { | ||
183 | struct sbc_ops *ops = cmd->protocol_data; | ||
184 | sector_t nolb = sbc_get_write_same_sectors(cmd); | ||
185 | sense_reason_t ret; | ||
186 | |||
187 | if (nolb) { | ||
188 | ret = ops->execute_unmap(cmd, cmd->t_task_lba, nolb); | ||
189 | if (ret) | ||
190 | return ret; | ||
191 | } | ||
192 | |||
193 | target_complete_cmd(cmd, GOOD); | ||
194 | return 0; | ||
195 | } | ||
196 | |||
197 | static sense_reason_t | ||
181 | sbc_emulate_noop(struct se_cmd *cmd) | 198 | sbc_emulate_noop(struct se_cmd *cmd) |
182 | { | 199 | { |
183 | target_complete_cmd(cmd, GOOD); | 200 | target_complete_cmd(cmd, GOOD); |
@@ -300,7 +317,7 @@ sbc_setup_write_same(struct se_cmd *cmd, unsigned char *flags, struct sbc_ops *o | |||
300 | * translated into block discard requests within backend code. | 317 | * translated into block discard requests within backend code. |
301 | */ | 318 | */ |
302 | if (flags[0] & 0x08) { | 319 | if (flags[0] & 0x08) { |
303 | if (!ops->execute_write_same_unmap) | 320 | if (!ops->execute_unmap) |
304 | return TCM_UNSUPPORTED_SCSI_OPCODE; | 321 | return TCM_UNSUPPORTED_SCSI_OPCODE; |
305 | 322 | ||
306 | if (!dev->dev_attrib.emulate_tpws) { | 323 | if (!dev->dev_attrib.emulate_tpws) { |
@@ -308,7 +325,7 @@ sbc_setup_write_same(struct se_cmd *cmd, unsigned char *flags, struct sbc_ops *o | |||
308 | " has emulate_tpws disabled\n"); | 325 | " has emulate_tpws disabled\n"); |
309 | return TCM_UNSUPPORTED_SCSI_OPCODE; | 326 | return TCM_UNSUPPORTED_SCSI_OPCODE; |
310 | } | 327 | } |
311 | cmd->execute_cmd = ops->execute_write_same_unmap; | 328 | cmd->execute_cmd = sbc_execute_write_same_unmap; |
312 | return 0; | 329 | return 0; |
313 | } | 330 | } |
314 | if (!ops->execute_write_same) | 331 | if (!ops->execute_write_same) |