diff options
author | Christoph Hellwig <hch@lst.de> | 2015-06-19 09:10:59 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2015-06-23 03:43:44 -0400 |
commit | 62e4694256dd3cbe301ebc0da799df8779b97014 (patch) | |
tree | 4d0900d5d8d2dcb5acd2f1e2d390c9d18e1e0629 | |
parent | 7a971b1b3055f0e76ff09b8fd0dd809ea3b48279 (diff) |
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>
-rw-r--r-- | drivers/target/target_core_file.c | 17 | ||||
-rw-r--r-- | drivers/target/target_core_iblock.c | 16 | ||||
-rw-r--r-- | drivers/target/target_core_sbc.c | 14 | ||||
-rw-r--r-- | include/target/target_core_backend.h | 7 |
4 files changed, 14 insertions, 40 deletions
diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c index 238e3a256d04..ced8c4fdc23d 100644 --- a/drivers/target/target_core_file.c +++ b/drivers/target/target_core_file.c | |||
@@ -475,9 +475,9 @@ fd_do_prot_unmap(struct se_cmd *cmd, sector_t lba, sector_t nolb) | |||
475 | } | 475 | } |
476 | 476 | ||
477 | static sense_reason_t | 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 | struct inode *inode = file->f_mapping->host; | 481 | struct inode *inode = file->f_mapping->host; |
482 | int ret; | 482 | int ret; |
483 | 483 | ||
@@ -521,9 +521,6 @@ fd_do_unmap(struct se_cmd *cmd, void *priv, sector_t lba, sector_t nolb) | |||
521 | static sense_reason_t | 521 | static sense_reason_t |
522 | fd_execute_write_same_unmap(struct se_cmd *cmd) | 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 | sector_t lba = cmd->t_task_lba; | 524 | sector_t lba = cmd->t_task_lba; |
528 | sector_t nolb = sbc_get_write_same_sectors(cmd); | 525 | sector_t nolb = sbc_get_write_same_sectors(cmd); |
529 | sense_reason_t ret; | 526 | sense_reason_t ret; |
@@ -533,7 +530,7 @@ fd_execute_write_same_unmap(struct se_cmd *cmd) | |||
533 | return 0; | 530 | return 0; |
534 | } | 531 | } |
535 | 532 | ||
536 | ret = fd_do_unmap(cmd, file, lba, nolb); | 533 | ret = fd_execute_unmap(cmd, lba, nolb); |
537 | if (ret) | 534 | if (ret) |
538 | return ret; | 535 | return ret; |
539 | 536 | ||
@@ -542,14 +539,6 @@ fd_execute_write_same_unmap(struct se_cmd *cmd) | |||
542 | } | 539 | } |
543 | 540 | ||
544 | static sense_reason_t | 541 | static sense_reason_t |
545 | fd_execute_unmap(struct se_cmd *cmd) | ||
546 | { | ||
547 | struct file *file = FD_DEV(cmd->se_dev)->fd_file; | ||
548 | |||
549 | return sbc_execute_unmap(cmd, fd_do_unmap, file); | ||
550 | } | ||
551 | |||
552 | static sense_reason_t | ||
553 | fd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, | 542 | fd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, |
554 | enum dma_data_direction data_direction) | 543 | enum dma_data_direction data_direction) |
555 | { | 544 | { |
diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c index ae8ad2da6632..0a2308891c81 100644 --- a/drivers/target/target_core_iblock.c +++ b/drivers/target/target_core_iblock.c | |||
@@ -416,10 +416,9 @@ iblock_execute_sync_cache(struct se_cmd *cmd) | |||
416 | } | 416 | } |
417 | 417 | ||
418 | static sense_reason_t | 418 | static sense_reason_t |
419 | iblock_do_unmap(struct se_cmd *cmd, void *priv, | 419 | iblock_execute_unmap(struct se_cmd *cmd, sector_t lba, sector_t nolb) |
420 | 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 | int ret; | 422 | int ret; |
424 | 423 | ||
425 | ret = blkdev_issue_discard(bdev, lba, nolb, GFP_KERNEL, 0); | 424 | ret = blkdev_issue_discard(bdev, lba, nolb, GFP_KERNEL, 0); |
@@ -432,22 +431,13 @@ iblock_do_unmap(struct se_cmd *cmd, void *priv, | |||
432 | } | 431 | } |
433 | 432 | ||
434 | static sense_reason_t | 433 | static sense_reason_t |
435 | iblock_execute_unmap(struct se_cmd *cmd) | ||
436 | { | ||
437 | struct block_device *bdev = IBLOCK_DEV(cmd->se_dev)->ibd_bd; | ||
438 | |||
439 | return sbc_execute_unmap(cmd, iblock_do_unmap, bdev); | ||
440 | } | ||
441 | |||
442 | static sense_reason_t | ||
443 | iblock_execute_write_same_unmap(struct se_cmd *cmd) | 434 | iblock_execute_write_same_unmap(struct se_cmd *cmd) |
444 | { | 435 | { |
445 | struct block_device *bdev = IBLOCK_DEV(cmd->se_dev)->ibd_bd; | ||
446 | sector_t lba = cmd->t_task_lba; | 436 | sector_t lba = cmd->t_task_lba; |
447 | sector_t nolb = sbc_get_write_same_sectors(cmd); | 437 | sector_t nolb = sbc_get_write_same_sectors(cmd); |
448 | sense_reason_t ret; | 438 | sense_reason_t ret; |
449 | 439 | ||
450 | ret = iblock_do_unmap(cmd, bdev, lba, nolb); | 440 | ret = iblock_execute_unmap(cmd, lba, nolb); |
451 | if (ret) | 441 | if (ret) |
452 | return ret; | 442 | return ret; |
453 | 443 | ||
diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c index 287843e19275..c16a66698725 100644 --- a/drivers/target/target_core_sbc.c +++ b/drivers/target/target_core_sbc.c | |||
@@ -38,6 +38,7 @@ | |||
38 | 38 | ||
39 | static sense_reason_t | 39 | static sense_reason_t |
40 | sbc_check_prot(struct se_device *, struct se_cmd *, unsigned char *, u32, bool); | 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 | static sense_reason_t | 43 | static sense_reason_t |
43 | sbc_emulate_readcapacity(struct se_cmd *cmd) | 44 | sbc_emulate_readcapacity(struct se_cmd *cmd) |
@@ -999,7 +1000,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops) | |||
999 | return TCM_UNSUPPORTED_SCSI_OPCODE; | 1000 | return TCM_UNSUPPORTED_SCSI_OPCODE; |
1000 | } | 1001 | } |
1001 | size = get_unaligned_be16(&cdb[7]); | 1002 | size = get_unaligned_be16(&cdb[7]); |
1002 | cmd->execute_cmd = ops->execute_unmap; | 1003 | cmd->execute_cmd = sbc_execute_unmap; |
1003 | break; | 1004 | break; |
1004 | case WRITE_SAME_16: | 1005 | case WRITE_SAME_16: |
1005 | sectors = transport_get_sectors_16(cdb); | 1006 | sectors = transport_get_sectors_16(cdb); |
@@ -1087,12 +1088,10 @@ u32 sbc_get_device_type(struct se_device *dev) | |||
1087 | } | 1088 | } |
1088 | EXPORT_SYMBOL(sbc_get_device_type); | 1089 | EXPORT_SYMBOL(sbc_get_device_type); |
1089 | 1090 | ||
1090 | sense_reason_t | 1091 | static sense_reason_t |
1091 | sbc_execute_unmap(struct se_cmd *cmd, | 1092 | sbc_execute_unmap(struct se_cmd *cmd) |
1092 | sense_reason_t (*do_unmap_fn)(struct se_cmd *, void *, | ||
1093 | sector_t, sector_t), | ||
1094 | void *priv) | ||
1095 | { | 1093 | { |
1094 | struct sbc_ops *ops = cmd->protocol_data; | ||
1096 | struct se_device *dev = cmd->se_dev; | 1095 | struct se_device *dev = cmd->se_dev; |
1097 | unsigned char *buf, *ptr = NULL; | 1096 | unsigned char *buf, *ptr = NULL; |
1098 | sector_t lba; | 1097 | sector_t lba; |
@@ -1156,7 +1155,7 @@ sbc_execute_unmap(struct se_cmd *cmd, | |||
1156 | goto err; | 1155 | goto err; |
1157 | } | 1156 | } |
1158 | 1157 | ||
1159 | ret = do_unmap_fn(cmd, priv, lba, range); | 1158 | ret = ops->execute_unmap(cmd, lba, range); |
1160 | if (ret) | 1159 | if (ret) |
1161 | goto err; | 1160 | goto err; |
1162 | 1161 | ||
@@ -1170,7 +1169,6 @@ err: | |||
1170 | target_complete_cmd(cmd, GOOD); | 1169 | target_complete_cmd(cmd, GOOD); |
1171 | return ret; | 1170 | return ret; |
1172 | } | 1171 | } |
1173 | EXPORT_SYMBOL(sbc_execute_unmap); | ||
1174 | 1172 | ||
1175 | void | 1173 | void |
1176 | sbc_dif_generate(struct se_cmd *cmd) | 1174 | sbc_dif_generate(struct se_cmd *cmd) |
diff --git a/include/target/target_core_backend.h b/include/target/target_core_backend.h index 566c7d27f6d0..ff399369a21a 100644 --- a/include/target/target_core_backend.h +++ b/include/target/target_core_backend.h | |||
@@ -50,7 +50,8 @@ struct sbc_ops { | |||
50 | sense_reason_t (*execute_sync_cache)(struct se_cmd *cmd); | 50 | sense_reason_t (*execute_sync_cache)(struct se_cmd *cmd); |
51 | sense_reason_t (*execute_write_same)(struct se_cmd *cmd); | 51 | sense_reason_t (*execute_write_same)(struct se_cmd *cmd); |
52 | sense_reason_t (*execute_write_same_unmap)(struct se_cmd *cmd); | 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 | int transport_backend_register(const struct target_backend_ops *); | 57 | int transport_backend_register(const struct target_backend_ops *); |
@@ -68,10 +69,6 @@ sense_reason_t sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops); | |||
68 | u32 sbc_get_device_rev(struct se_device *dev); | 69 | u32 sbc_get_device_rev(struct se_device *dev); |
69 | u32 sbc_get_device_type(struct se_device *dev); | 70 | u32 sbc_get_device_type(struct se_device *dev); |
70 | sector_t sbc_get_write_same_sectors(struct se_cmd *cmd); | 71 | sector_t sbc_get_write_same_sectors(struct se_cmd *cmd); |
71 | sense_reason_t sbc_execute_unmap(struct se_cmd *cmd, | ||
72 | sense_reason_t (*do_unmap_fn)(struct se_cmd *cmd, void *priv, | ||
73 | sector_t lba, sector_t nolb), | ||
74 | void *priv); | ||
75 | void sbc_dif_generate(struct se_cmd *); | 72 | void sbc_dif_generate(struct se_cmd *); |
76 | sense_reason_t sbc_dif_verify(struct se_cmd *, sector_t, unsigned int, | 73 | sense_reason_t sbc_dif_verify(struct se_cmd *, sector_t, unsigned int, |
77 | unsigned int, struct scatterlist *, int); | 74 | unsigned int, struct scatterlist *, int); |