| 1 |
|
| 2 | #ifndef TARGET_CORE_BACKEND_H
|
| 3 | #define TARGET_CORE_BACKEND_H
|
| 4 |
|
| 5 | #include <linux/types.h>
|
| 6 | #include <linux/unaligned.h>
|
| 7 | #include <target/target_core_base.h>
|
| 8 |
|
| 9 | #define TRANSPORT_FLAG_PASSTHROUGH 0x1
|
| 10 | |
| 11 | * ALUA commands, state checks and setup operations are handled by the
|
| 12 | * backend module.
|
| 13 |
|
| 14 | #define TRANSPORT_FLAG_PASSTHROUGH_ALUA 0x2
|
| 15 | #define TRANSPORT_FLAG_PASSTHROUGH_PGR 0x4
|
| 16 |
|
| 17 | struct block_device;
|
| 18 | struct scatterlist;
|
| 19 |
|
| 20 | struct target_backend_ops {
|
| 21 | char name[16];
|
| 22 | char inquiry_prod[16];
|
| 23 | char inquiry_rev[4];
|
| 24 | struct module *owner;
|
| 25 |
|
| 26 | u8 transport_flags_default;
|
| 27 | u8 transport_flags_changeable;
|
| 28 |
|
| 29 | int (*attach_hba)(struct se_hba *, u32);
|
| 30 | void (*detach_hba)(struct se_hba *);
|
| 31 | int (*pmode_enable_hba)(struct se_hba *, unsigned long);
|
| 32 |
|
| 33 | struct se_device *(*alloc_device)(struct se_hba *, const char *);
|
| 34 | int (*configure_device)(struct se_device *);
|
| 35 | void (*destroy_device)(struct se_device *);
|
| 36 | void (*free_device)(struct se_device *device);
|
| 37 | struct se_dev_plug *(*plug_device)(struct se_device *se_dev);
|
| 38 | void (*unplug_device)(struct se_dev_plug *se_plug);
|
| 39 |
|
| 40 | bool (*configure_unmap)(struct se_device *se_dev);
|
| 41 | ssize_t (*set_configfs_dev_params)(struct se_device *,
|
| 42 | const char *, ssize_t);
|
| 43 | ssize_t (*show_configfs_dev_params)(struct se_device *, char *);
|
| 44 |
|
| 45 | sense_reason_t (*parse_cdb)(struct se_cmd *cmd);
|
| 46 | void (*tmr_notify)(struct se_device *se_dev, enum tcm_tmreq_table,
|
| 47 | struct list_head *aborted_cmds);
|
| 48 | u32 (*get_device_type)(struct se_device *);
|
| 49 | sector_t (*get_blocks)(struct se_device *);
|
| 50 | sector_t (*get_alignment_offset_lbas)(struct se_device *);
|
| 51 |
|
| 52 | unsigned int (*get_lbppbe)(struct se_device *);
|
| 53 | unsigned int (*get_io_min)(struct se_device *);
|
| 54 | unsigned int (*get_io_opt)(struct se_device *);
|
| 55 | unsigned char *(*get_sense_buffer)(struct se_cmd *);
|
| 56 | bool (*get_write_cache)(struct se_device *);
|
| 57 | int (*init_prot)(struct se_device *);
|
| 58 | int (*format_prot)(struct se_device *);
|
| 59 | void (*free_prot)(struct se_device *);
|
| 60 |
|
| 61 | struct configfs_attribute **tb_dev_attrib_attrs;
|
| 62 | struct configfs_attribute **tb_dev_action_attrs;
|
| 63 | };
|
| 64 |
|
| 65 | struct exec_cmd_ops {
|
| 66 | sense_reason_t (*execute_rw)(struct se_cmd *cmd, struct scatterlist *,
|
| 67 | u32, enum dma_data_direction);
|
| 68 | sense_reason_t (*execute_sync_cache)(struct se_cmd *cmd);
|
| 69 | sense_reason_t (*execute_write_same)(struct se_cmd *cmd);
|
| 70 | sense_reason_t (*execute_unmap)(struct se_cmd *cmd,
|
| 71 | sector_t lba, sector_t nolb);
|
| 72 | sense_reason_t (*execute_pr_out)(struct se_cmd *cmd, u8 sa, u64 key,
|
| 73 | u64 sa_key, u8 type, bool aptpl);
|
| 74 | sense_reason_t (*execute_pr_in)(struct se_cmd *cmd, u8 sa,
|
| 75 | unsigned char *param_data);
|
| 76 | };
|
| 77 |
|
| 78 | int transport_backend_register(const struct target_backend_ops *);
|
| 79 | void target_backend_unregister(const struct target_backend_ops *);
|
| 80 |
|
| 81 | void target_complete_cmd(struct se_cmd *, u8);
|
| 82 | void target_set_cmd_data_length(struct se_cmd *, int);
|
| 83 | void target_complete_cmd_with_sense(struct se_cmd *, u8, sense_reason_t);
|
| 84 | void target_complete_cmd_with_length(struct se_cmd *, u8, int);
|
| 85 |
|
| 86 | void transport_copy_sense_to_cmd(struct se_cmd *, unsigned char *);
|
| 87 |
|
| 88 | sense_reason_t spc_parse_cdb(struct se_cmd *cmd, unsigned int *size);
|
| 89 | sense_reason_t spc_emulate_report_luns(struct se_cmd *cmd);
|
| 90 | sense_reason_t spc_emulate_inquiry_std(struct se_cmd *, unsigned char *);
|
| 91 | sense_reason_t spc_emulate_evpd_83(struct se_cmd *, unsigned char *);
|
| 92 |
|
| 93 | sense_reason_t sbc_parse_cdb(struct se_cmd *cmd, struct exec_cmd_ops *ops);
|
| 94 | u32 sbc_get_device_rev(struct se_device *dev);
|
| 95 | u32 sbc_get_device_type(struct se_device *dev);
|
| 96 | sector_t sbc_get_write_same_sectors(struct se_cmd *cmd);
|
| 97 | void sbc_dif_generate(struct se_cmd *);
|
| 98 | sense_reason_t sbc_dif_verify(struct se_cmd *, sector_t, unsigned int,
|
| 99 | unsigned int, struct scatterlist *, int);
|
| 100 | void sbc_dif_copy_prot(struct se_cmd *, unsigned int, bool,
|
| 101 | struct scatterlist *, int);
|
| 102 | void transport_set_vpd_proto_id(struct t10_vpd *, unsigned char *);
|
| 103 | int transport_set_vpd_assoc(struct t10_vpd *, unsigned char *);
|
| 104 | int transport_set_vpd_ident_type(struct t10_vpd *, unsigned char *);
|
| 105 | int transport_set_vpd_ident(struct t10_vpd *, unsigned char *);
|
| 106 |
|
| 107 | extern struct configfs_attribute *sbc_attrib_attrs[];
|
| 108 | extern struct configfs_attribute *passthrough_attrib_attrs[];
|
| 109 | extern struct configfs_attribute *passthrough_pr_attrib_attrs[];
|
| 110 |
|
| 111 |
|
| 112 | void *transport_kmap_data_sg(struct se_cmd *);
|
| 113 | void transport_kunmap_data_sg(struct se_cmd *);
|
| 114 |
|
| 115 | sense_reason_t transport_generic_map_mem_to_cmd(struct se_cmd *,
|
| 116 | struct scatterlist *, u32, struct scatterlist *, u32);
|
| 117 |
|
| 118 | bool target_lun_is_rdonly(struct se_cmd *);
|
| 119 | sense_reason_t passthrough_parse_cdb(struct se_cmd *cmd,
|
| 120 | sense_reason_t (*exec_cmd)(struct se_cmd *cmd));
|
| 121 |
|
| 122 | bool target_sense_desc_format(struct se_device *dev);
|
| 123 | sector_t target_to_linux_sector(struct se_device *dev, sector_t lb);
|
| 124 | bool target_configure_unmap_from_bdev(struct se_dev_attrib *attrib,
|
| 125 | struct block_device *bdev);
|
| 126 | void target_configure_write_atomic_from_bdev(struct se_dev_attrib *attrib,
|
| 127 | struct block_device *bdev);
|
| 128 |
|
| 129 | static inline bool target_dev_configured(struct se_device *se_dev)
|
| 130 | {
|
| 131 | return !!(se_dev->dev_flags & DF_CONFIGURED);
|
| 132 | }
|
| 133 |
|
| 134 | #endif
|