Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Christoph Hellwig and committed by
Nicholas Bellinger
b753d643 62e46942

+19 -40
-21
drivers/target/target_core_file.c
··· 519 519 } 520 520 521 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 522 fd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, 543 523 enum dma_data_direction data_direction) 544 524 { ··· 807 827 .execute_rw = fd_execute_rw, 808 828 .execute_sync_cache = fd_execute_sync_cache, 809 829 .execute_write_same = fd_execute_write_same, 810 - .execute_write_same_unmap = fd_execute_write_same_unmap, 811 830 .execute_unmap = fd_execute_unmap, 812 831 }; 813 832
-16
drivers/target/target_core_iblock.c
··· 431 431 } 432 432 433 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 434 iblock_execute_write_same(struct se_cmd *cmd) 450 435 { 451 436 struct iblock_req *ibr; ··· 821 836 .execute_rw = iblock_execute_rw, 822 837 .execute_sync_cache = iblock_execute_sync_cache, 823 838 .execute_write_same = iblock_execute_write_same, 824 - .execute_write_same_unmap = iblock_execute_write_same_unmap, 825 839 .execute_unmap = iblock_execute_unmap, 826 840 }; 827 841
+19 -2
drivers/target/target_core_sbc.c
··· 178 178 EXPORT_SYMBOL(sbc_get_write_same_sectors); 179 179 180 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 198 sbc_emulate_noop(struct se_cmd *cmd) 182 199 { 183 200 target_complete_cmd(cmd, GOOD); ··· 317 300 * translated into block discard requests within backend code. 318 301 */ 319 302 if (flags[0] & 0x08) { 320 - if (!ops->execute_write_same_unmap) 303 + if (!ops->execute_unmap) 321 304 return TCM_UNSUPPORTED_SCSI_OPCODE; 322 305 323 306 if (!dev->dev_attrib.emulate_tpws) { ··· 325 308 " has emulate_tpws disabled\n"); 326 309 return TCM_UNSUPPORTED_SCSI_OPCODE; 327 310 } 328 - cmd->execute_cmd = ops->execute_write_same_unmap; 311 + cmd->execute_cmd = sbc_execute_write_same_unmap; 329 312 return 0; 330 313 } 331 314 if (!ops->execute_write_same)
-1
include/target/target_core_backend.h
··· 49 49 u32, enum dma_data_direction); 50 50 sense_reason_t (*execute_sync_cache)(struct se_cmd *cmd); 51 51 sense_reason_t (*execute_write_same)(struct se_cmd *cmd); 52 - sense_reason_t (*execute_write_same_unmap)(struct se_cmd *cmd); 53 52 sense_reason_t (*execute_unmap)(struct se_cmd *cmd, 54 53 sector_t lba, sector_t nolb); 55 54 };