Nicholas Bellinger | 057cbf4 | 2012-07-18 14:31:32 -0700 | [diff] [blame] | 1 | #define TCM_VHOST_VERSION "v0.1" |
| 2 | #define TCM_VHOST_NAMELEN 256 |
| 3 | #define TCM_VHOST_MAX_CDB_SIZE 32 |
| 4 | |
| 5 | struct tcm_vhost_cmd { |
| 6 | /* Descriptor from vhost_get_vq_desc() for virt_queue segment */ |
| 7 | int tvc_vq_desc; |
Nicholas Bellinger | 9f0abc1 | 2012-10-01 18:40:55 -0700 | [diff] [blame] | 8 | /* virtio-scsi initiator task attribute */ |
| 9 | int tvc_task_attr; |
| 10 | /* virtio-scsi initiator data direction */ |
| 11 | enum dma_data_direction tvc_data_direction; |
| 12 | /* Expected data transfer length from virtio-scsi header */ |
| 13 | u32 tvc_exp_data_len; |
Nicholas Bellinger | 057cbf4 | 2012-07-18 14:31:32 -0700 | [diff] [blame] | 14 | /* The Tag from include/linux/virtio_scsi.h:struct virtio_scsi_cmd_req */ |
| 15 | u64 tvc_tag; |
| 16 | /* The number of scatterlists associated with this cmd */ |
| 17 | u32 tvc_sgl_count; |
| 18 | /* Saved unpacked SCSI LUN for tcm_vhost_submission_work() */ |
| 19 | u32 tvc_lun; |
| 20 | /* Pointer to the SGL formatted memory from virtio-scsi */ |
| 21 | struct scatterlist *tvc_sgl; |
| 22 | /* Pointer to response */ |
| 23 | struct virtio_scsi_cmd_resp __user *tvc_resp; |
| 24 | /* Pointer to vhost_scsi for our device */ |
| 25 | struct vhost_scsi *tvc_vhost; |
Nicholas Bellinger | 9f0abc1 | 2012-10-01 18:40:55 -0700 | [diff] [blame] | 26 | /* Pointer to vhost nexus memory */ |
| 27 | struct tcm_vhost_nexus *tvc_nexus; |
Nicholas Bellinger | 057cbf4 | 2012-07-18 14:31:32 -0700 | [diff] [blame] | 28 | /* The TCM I/O descriptor that is accessed via container_of() */ |
| 29 | struct se_cmd tvc_se_cmd; |
| 30 | /* work item used for cmwq dispatch to tcm_vhost_submission_work() */ |
| 31 | struct work_struct work; |
| 32 | /* Copy of the incoming SCSI command descriptor block (CDB) */ |
| 33 | unsigned char tvc_cdb[TCM_VHOST_MAX_CDB_SIZE]; |
| 34 | /* Sense buffer that will be mapped into outgoing status */ |
| 35 | unsigned char tvc_sense_buf[TRANSPORT_SENSE_BUFFER]; |
| 36 | /* Completed commands list, serviced from vhost worker thread */ |
| 37 | struct list_head tvc_completion_list; |
| 38 | }; |
| 39 | |
| 40 | struct tcm_vhost_nexus { |
| 41 | /* Pointer to TCM session for I_T Nexus */ |
| 42 | struct se_session *tvn_se_sess; |
| 43 | }; |
| 44 | |
| 45 | struct tcm_vhost_nacl { |
| 46 | /* Binary World Wide unique Port Name for Vhost Initiator port */ |
| 47 | u64 iport_wwpn; |
| 48 | /* ASCII formatted WWPN for Sas Initiator port */ |
| 49 | char iport_name[TCM_VHOST_NAMELEN]; |
| 50 | /* Returned by tcm_vhost_make_nodeacl() */ |
| 51 | struct se_node_acl se_node_acl; |
| 52 | }; |
| 53 | |
| 54 | struct tcm_vhost_tpg { |
| 55 | /* Vhost port target portal group tag for TCM */ |
| 56 | u16 tport_tpgt; |
| 57 | /* Used to track number of TPG Port/Lun Links wrt to explict I_T Nexus shutdown */ |
Nicholas Bellinger | 101998f | 2012-07-30 13:30:00 -0700 | [diff] [blame] | 58 | int tv_tpg_port_count; |
| 59 | /* Used for vhost_scsi device reference to tpg_nexus, protected by tv_tpg_mutex */ |
| 60 | int tv_tpg_vhost_count; |
Nicholas Bellinger | 057cbf4 | 2012-07-18 14:31:32 -0700 | [diff] [blame] | 61 | /* list for tcm_vhost_list */ |
| 62 | struct list_head tv_tpg_list; |
| 63 | /* Used to protect access for tpg_nexus */ |
| 64 | struct mutex tv_tpg_mutex; |
| 65 | /* Pointer to the TCM VHost I_T Nexus for this TPG endpoint */ |
| 66 | struct tcm_vhost_nexus *tpg_nexus; |
| 67 | /* Pointer back to tcm_vhost_tport */ |
| 68 | struct tcm_vhost_tport *tport; |
| 69 | /* Returned by tcm_vhost_make_tpg() */ |
| 70 | struct se_portal_group se_tpg; |
| 71 | }; |
| 72 | |
| 73 | struct tcm_vhost_tport { |
| 74 | /* SCSI protocol the tport is providing */ |
| 75 | u8 tport_proto_id; |
| 76 | /* Binary World Wide unique Port Name for Vhost Target port */ |
| 77 | u64 tport_wwpn; |
| 78 | /* ASCII formatted WWPN for Vhost Target port */ |
| 79 | char tport_name[TCM_VHOST_NAMELEN]; |
| 80 | /* Returned by tcm_vhost_make_tport() */ |
| 81 | struct se_wwn tport_wwn; |
| 82 | }; |
| 83 | |
| 84 | /* |
| 85 | * As per request from MST, keep TCM_VHOST related ioctl defines out of |
| 86 | * linux/vhost.h (user-space) for now.. |
| 87 | */ |
| 88 | |
| 89 | #include <linux/vhost.h> |
| 90 | |
| 91 | /* |
| 92 | * Used by QEMU userspace to ensure a consistent vhost-scsi ABI. |
| 93 | * |
| 94 | * ABI Rev 0: July 2012 version starting point for v3.6-rc merge candidate + |
| 95 | * RFC-v2 vhost-scsi userspace. Add GET_ABI_VERSION ioctl usage |
| 96 | */ |
| 97 | |
| 98 | #define VHOST_SCSI_ABI_VERSION 0 |
| 99 | |
| 100 | struct vhost_scsi_target { |
| 101 | int abi_version; |
Nicholas Bellinger | 5b7517f | 2012-08-16 18:56:34 -0700 | [diff] [blame] | 102 | char vhost_wwpn[TRANSPORT_IQN_LEN]; |
Nicholas Bellinger | 057cbf4 | 2012-07-18 14:31:32 -0700 | [diff] [blame] | 103 | unsigned short vhost_tpgt; |
Michael S. Tsirkin | 6de7145 | 2012-08-18 15:44:09 -0700 | [diff] [blame] | 104 | unsigned short reserved; |
Nicholas Bellinger | 057cbf4 | 2012-07-18 14:31:32 -0700 | [diff] [blame] | 105 | }; |
| 106 | |
| 107 | /* VHOST_SCSI specific defines */ |
| 108 | #define VHOST_SCSI_SET_ENDPOINT _IOW(VHOST_VIRTIO, 0x40, struct vhost_scsi_target) |
| 109 | #define VHOST_SCSI_CLEAR_ENDPOINT _IOW(VHOST_VIRTIO, 0x41, struct vhost_scsi_target) |
Nicholas Bellinger | 101998f | 2012-07-30 13:30:00 -0700 | [diff] [blame] | 110 | /* Changing this breaks userspace. */ |
| 111 | #define VHOST_SCSI_GET_ABI_VERSION _IOW(VHOST_VIRTIO, 0x42, int) |