aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2015-06-19 09:10:59 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2015-06-23 03:43:44 -0400
commit62e4694256dd3cbe301ebc0da799df8779b97014 (patch)
tree4d0900d5d8d2dcb5acd2f1e2d390c9d18e1e0629
parent7a971b1b3055f0e76ff09b8fd0dd809ea3b48279 (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.c17
-rw-r--r--drivers/target/target_core_iblock.c16
-rw-r--r--drivers/target/target_core_sbc.c14
-rw-r--r--include/target/target_core_backend.h7
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
477static sense_reason_t 477static sense_reason_t
478fd_do_unmap(struct se_cmd *cmd, void *priv, sector_t lba, sector_t nolb) 478fd_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)
521static sense_reason_t 521static sense_reason_t
522fd_execute_write_same_unmap(struct se_cmd *cmd) 522fd_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
544static sense_reason_t 541static sense_reason_t
545fd_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
552static sense_reason_t
553fd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, 542fd_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
418static sense_reason_t 418static sense_reason_t
419iblock_do_unmap(struct se_cmd *cmd, void *priv, 419iblock_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
434static sense_reason_t 433static sense_reason_t
435iblock_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
442static sense_reason_t
443iblock_execute_write_same_unmap(struct se_cmd *cmd) 434iblock_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
39static sense_reason_t 39static sense_reason_t
40sbc_check_prot(struct se_device *, struct se_cmd *, unsigned char *, u32, bool); 40sbc_check_prot(struct se_device *, struct se_cmd *, unsigned char *, u32, bool);
41static sense_reason_t sbc_execute_unmap(struct se_cmd *cmd);
41 42
42static sense_reason_t 43static sense_reason_t
43sbc_emulate_readcapacity(struct se_cmd *cmd) 44sbc_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}
1088EXPORT_SYMBOL(sbc_get_device_type); 1089EXPORT_SYMBOL(sbc_get_device_type);
1089 1090
1090sense_reason_t 1091static sense_reason_t
1091sbc_execute_unmap(struct se_cmd *cmd, 1092sbc_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}
1173EXPORT_SYMBOL(sbc_execute_unmap);
1174 1172
1175void 1173void
1176sbc_dif_generate(struct se_cmd *cmd) 1174sbc_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
56int transport_backend_register(const struct target_backend_ops *); 57int 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);
68u32 sbc_get_device_rev(struct se_device *dev); 69u32 sbc_get_device_rev(struct se_device *dev);
69u32 sbc_get_device_type(struct se_device *dev); 70u32 sbc_get_device_type(struct se_device *dev);
70sector_t sbc_get_write_same_sectors(struct se_cmd *cmd); 71sector_t sbc_get_write_same_sectors(struct se_cmd *cmd);
71sense_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);
75void sbc_dif_generate(struct se_cmd *); 72void sbc_dif_generate(struct se_cmd *);
76sense_reason_t sbc_dif_verify(struct se_cmd *, sector_t, unsigned int, 73sense_reason_t sbc_dif_verify(struct se_cmd *, sector_t, unsigned int,
77 unsigned int, struct scatterlist *, int); 74 unsigned int, struct scatterlist *, int);