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

target: simplify UNMAP handling

Move a little more processing into the core code, and lift the previous
do_unmap callback into the sbc_ops structure.

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
62e46942 7a971b1b

+14 -40
+3 -14
drivers/target/target_core_file.c
··· 475 475 } 476 476 477 477 static sense_reason_t 478 - fd_do_unmap(struct se_cmd *cmd, void *priv, sector_t lba, sector_t nolb) 478 + fd_execute_unmap(struct se_cmd *cmd, sector_t lba, sector_t nolb) 479 479 { 480 - struct file *file = priv; 480 + struct file *file = FD_DEV(cmd->se_dev)->fd_file; 481 481 struct inode *inode = file->f_mapping->host; 482 482 int ret; 483 483 ··· 521 521 static sense_reason_t 522 522 fd_execute_write_same_unmap(struct se_cmd *cmd) 523 523 { 524 - struct se_device *se_dev = cmd->se_dev; 525 - struct fd_dev *fd_dev = FD_DEV(se_dev); 526 - struct file *file = fd_dev->fd_file; 527 524 sector_t lba = cmd->t_task_lba; 528 525 sector_t nolb = sbc_get_write_same_sectors(cmd); 529 526 sense_reason_t ret; ··· 530 533 return 0; 531 534 } 532 535 533 - ret = fd_do_unmap(cmd, file, lba, nolb); 536 + ret = fd_execute_unmap(cmd, lba, nolb); 534 537 if (ret) 535 538 return ret; 536 539 537 540 target_complete_cmd(cmd, GOOD); 538 541 return 0; 539 - } 540 - 541 - static sense_reason_t 542 - fd_execute_unmap(struct se_cmd *cmd) 543 - { 544 - struct file *file = FD_DEV(cmd->se_dev)->fd_file; 545 - 546 - return sbc_execute_unmap(cmd, fd_do_unmap, file); 547 542 } 548 543 549 544 static sense_reason_t
+3 -13
drivers/target/target_core_iblock.c
··· 416 416 } 417 417 418 418 static sense_reason_t 419 - iblock_do_unmap(struct se_cmd *cmd, void *priv, 420 - sector_t lba, sector_t nolb) 419 + iblock_execute_unmap(struct se_cmd *cmd, sector_t lba, sector_t nolb) 421 420 { 422 - struct block_device *bdev = priv; 421 + struct block_device *bdev = IBLOCK_DEV(cmd->se_dev)->ibd_bd; 423 422 int ret; 424 423 425 424 ret = blkdev_issue_discard(bdev, lba, nolb, GFP_KERNEL, 0); ··· 431 432 } 432 433 433 434 static sense_reason_t 434 - iblock_execute_unmap(struct se_cmd *cmd) 435 - { 436 - struct block_device *bdev = IBLOCK_DEV(cmd->se_dev)->ibd_bd; 437 - 438 - return sbc_execute_unmap(cmd, iblock_do_unmap, bdev); 439 - } 440 - 441 - static sense_reason_t 442 435 iblock_execute_write_same_unmap(struct se_cmd *cmd) 443 436 { 444 - struct block_device *bdev = IBLOCK_DEV(cmd->se_dev)->ibd_bd; 445 437 sector_t lba = cmd->t_task_lba; 446 438 sector_t nolb = sbc_get_write_same_sectors(cmd); 447 439 sense_reason_t ret; 448 440 449 - ret = iblock_do_unmap(cmd, bdev, lba, nolb); 441 + ret = iblock_execute_unmap(cmd, lba, nolb); 450 442 if (ret) 451 443 return ret; 452 444
+6 -8
drivers/target/target_core_sbc.c
··· 38 38 39 39 static sense_reason_t 40 40 sbc_check_prot(struct se_device *, struct se_cmd *, unsigned char *, u32, bool); 41 + static sense_reason_t sbc_execute_unmap(struct se_cmd *cmd); 41 42 42 43 static sense_reason_t 43 44 sbc_emulate_readcapacity(struct se_cmd *cmd) ··· 1000 999 return TCM_UNSUPPORTED_SCSI_OPCODE; 1001 1000 } 1002 1001 size = get_unaligned_be16(&cdb[7]); 1003 - cmd->execute_cmd = ops->execute_unmap; 1002 + cmd->execute_cmd = sbc_execute_unmap; 1004 1003 break; 1005 1004 case WRITE_SAME_16: 1006 1005 sectors = transport_get_sectors_16(cdb); ··· 1088 1087 } 1089 1088 EXPORT_SYMBOL(sbc_get_device_type); 1090 1089 1091 - sense_reason_t 1092 - sbc_execute_unmap(struct se_cmd *cmd, 1093 - sense_reason_t (*do_unmap_fn)(struct se_cmd *, void *, 1094 - sector_t, sector_t), 1095 - void *priv) 1090 + static sense_reason_t 1091 + sbc_execute_unmap(struct se_cmd *cmd) 1096 1092 { 1093 + struct sbc_ops *ops = cmd->protocol_data; 1097 1094 struct se_device *dev = cmd->se_dev; 1098 1095 unsigned char *buf, *ptr = NULL; 1099 1096 sector_t lba; ··· 1155 1156 goto err; 1156 1157 } 1157 1158 1158 - ret = do_unmap_fn(cmd, priv, lba, range); 1159 + ret = ops->execute_unmap(cmd, lba, range); 1159 1160 if (ret) 1160 1161 goto err; 1161 1162 ··· 1169 1170 target_complete_cmd(cmd, GOOD); 1170 1171 return ret; 1171 1172 } 1172 - EXPORT_SYMBOL(sbc_execute_unmap); 1173 1173 1174 1174 void 1175 1175 sbc_dif_generate(struct se_cmd *cmd)
+2 -5
include/target/target_core_backend.h
··· 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 52 sense_reason_t (*execute_write_same_unmap)(struct se_cmd *cmd); 53 - sense_reason_t (*execute_unmap)(struct se_cmd *cmd); 53 + sense_reason_t (*execute_unmap)(struct se_cmd *cmd, 54 + sector_t lba, sector_t nolb); 54 55 }; 55 56 56 57 int transport_backend_register(const struct target_backend_ops *); ··· 69 68 u32 sbc_get_device_rev(struct se_device *dev); 70 69 u32 sbc_get_device_type(struct se_device *dev); 71 70 sector_t sbc_get_write_same_sectors(struct se_cmd *cmd); 72 - sense_reason_t sbc_execute_unmap(struct se_cmd *cmd, 73 - sense_reason_t (*do_unmap_fn)(struct se_cmd *cmd, void *priv, 74 - sector_t lba, sector_t nolb), 75 - void *priv); 76 71 void sbc_dif_generate(struct se_cmd *); 77 72 sense_reason_t sbc_dif_verify(struct se_cmd *, sector_t, unsigned int, 78 73 unsigned int, struct scatterlist *, int);