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

target: replace se_cmd->execute_rw with a protocol_data field

Instead of leaking this SBC read/write implementation detail just add an
opaqueue protocol specific pointer to struct se_cmd that we can assign
the sbc_ops vector to.

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
7a971b1b e2e21bd8

+8 -15
+7 -13
drivers/target/target_core_sbc.c
··· 381 381 static sense_reason_t 382 382 sbc_execute_rw(struct se_cmd *cmd) 383 383 { 384 - return cmd->execute_rw(cmd, cmd->t_data_sg, cmd->t_data_nents, 384 + struct sbc_ops *ops = cmd->protocol_data; 385 + 386 + return ops->execute_rw(cmd, cmd->t_data_sg, cmd->t_data_nents, 385 387 cmd->data_direction); 386 388 } 387 389 ··· 562 560 static sense_reason_t 563 561 sbc_compare_and_write(struct se_cmd *cmd) 564 562 { 563 + struct sbc_ops *ops = cmd->protocol_data; 565 564 struct se_device *dev = cmd->se_dev; 566 565 sense_reason_t ret; 567 566 int rc; ··· 582 579 */ 583 580 cmd->data_length = cmd->t_task_nolb * dev->dev_attrib.block_size; 584 581 585 - ret = cmd->execute_rw(cmd, cmd->t_bidi_data_sg, cmd->t_bidi_data_nents, 582 + ret = ops->execute_rw(cmd, cmd->t_bidi_data_sg, cmd->t_bidi_data_nents, 586 583 DMA_FROM_DEVICE); 587 584 if (ret) { 588 585 cmd->transport_complete_callback = NULL; ··· 769 766 u32 sectors = 0; 770 767 sense_reason_t ret; 771 768 769 + cmd->protocol_data = ops; 770 + 772 771 switch (cdb[0]) { 773 772 case READ_6: 774 773 sectors = transport_get_sectors_6(cdb); 775 774 cmd->t_task_lba = transport_lba_21(cdb); 776 775 cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB; 777 - cmd->execute_rw = ops->execute_rw; 778 776 cmd->execute_cmd = sbc_execute_rw; 779 777 break; 780 778 case READ_10: ··· 790 786 return ret; 791 787 792 788 cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB; 793 - cmd->execute_rw = ops->execute_rw; 794 789 cmd->execute_cmd = sbc_execute_rw; 795 790 break; 796 791 case READ_12: ··· 804 801 return ret; 805 802 806 803 cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB; 807 - cmd->execute_rw = ops->execute_rw; 808 804 cmd->execute_cmd = sbc_execute_rw; 809 805 break; 810 806 case READ_16: ··· 818 816 return ret; 819 817 820 818 cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB; 821 - cmd->execute_rw = ops->execute_rw; 822 819 cmd->execute_cmd = sbc_execute_rw; 823 820 break; 824 821 case WRITE_6: 825 822 sectors = transport_get_sectors_6(cdb); 826 823 cmd->t_task_lba = transport_lba_21(cdb); 827 824 cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB; 828 - cmd->execute_rw = ops->execute_rw; 829 825 cmd->execute_cmd = sbc_execute_rw; 830 826 break; 831 827 case WRITE_10: ··· 839 839 return ret; 840 840 841 841 cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB; 842 - cmd->execute_rw = ops->execute_rw; 843 842 cmd->execute_cmd = sbc_execute_rw; 844 843 break; 845 844 case WRITE_12: ··· 853 854 return ret; 854 855 855 856 cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB; 856 - cmd->execute_rw = ops->execute_rw; 857 857 cmd->execute_cmd = sbc_execute_rw; 858 858 break; 859 859 case WRITE_16: ··· 867 869 return ret; 868 870 869 871 cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB; 870 - cmd->execute_rw = ops->execute_rw; 871 872 cmd->execute_cmd = sbc_execute_rw; 872 873 break; 873 874 case XDWRITEREAD_10: ··· 884 887 /* 885 888 * Setup BIDI XOR callback to be run after I/O completion. 886 889 */ 887 - cmd->execute_rw = ops->execute_rw; 888 890 cmd->execute_cmd = sbc_execute_rw; 889 891 cmd->transport_complete_callback = &xdreadwrite_callback; 890 892 break; ··· 907 911 * Setup BIDI XOR callback to be run during after I/O 908 912 * completion. 909 913 */ 910 - cmd->execute_rw = ops->execute_rw; 911 914 cmd->execute_cmd = sbc_execute_rw; 912 915 cmd->transport_complete_callback = &xdreadwrite_callback; 913 916 break; ··· 950 955 cmd->t_task_lba = get_unaligned_be64(&cdb[2]); 951 956 cmd->t_task_nolb = sectors; 952 957 cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB | SCF_COMPARE_AND_WRITE; 953 - cmd->execute_rw = ops->execute_rw; 954 958 cmd->execute_cmd = sbc_compare_and_write; 955 959 cmd->transport_complete_callback = compare_and_write_callback; 956 960 break;
+1 -2
include/target/target_core_base.h
··· 490 490 struct kref cmd_kref; 491 491 const struct target_core_fabric_ops *se_tfo; 492 492 sense_reason_t (*execute_cmd)(struct se_cmd *); 493 - sense_reason_t (*execute_rw)(struct se_cmd *, struct scatterlist *, 494 - u32, enum dma_data_direction); 495 493 sense_reason_t (*transport_complete_callback)(struct se_cmd *, bool); 494 + void *protocol_data; 496 495 497 496 unsigned char *t_task_cdb; 498 497 unsigned char __t_task_cdb[TCM_MAX_COMMAND_SIZE];