linux/include/target/target_core_backend.h

/* SPDX-License-Identifier: GPL-2.0 */
#ifndef TARGET_CORE_BACKEND_H
#define TARGET_CORE_BACKEND_H

#include <linux/types.h>
#include <asm/unaligned.h>
#include <target/target_core_base.h>

#define TRANSPORT_FLAG_PASSTHROUGH
/*
 * ALUA commands, state checks and setup operations are handled by the
 * backend module.
 */
#define TRANSPORT_FLAG_PASSTHROUGH_ALUA
#define TRANSPORT_FLAG_PASSTHROUGH_PGR

struct block_device;
struct scatterlist;

struct target_backend_ops {};

struct exec_cmd_ops {};

int	transport_backend_register(const struct target_backend_ops *);
void	target_backend_unregister(const struct target_backend_ops *);

void	target_complete_cmd(struct se_cmd *, u8);
void	target_set_cmd_data_length(struct se_cmd *, int);
void	target_complete_cmd_with_sense(struct se_cmd *, u8, sense_reason_t);
void	target_complete_cmd_with_length(struct se_cmd *, u8, int);

void	transport_copy_sense_to_cmd(struct se_cmd *, unsigned char *);

sense_reason_t	spc_parse_cdb(struct se_cmd *cmd, unsigned int *size);
sense_reason_t	spc_emulate_report_luns(struct se_cmd *cmd);
sense_reason_t	spc_emulate_inquiry_std(struct se_cmd *, unsigned char *);
sense_reason_t	spc_emulate_evpd_83(struct se_cmd *, unsigned char *);

sense_reason_t	sbc_parse_cdb(struct se_cmd *cmd, struct exec_cmd_ops *ops);
u32	sbc_get_device_rev(struct se_device *dev);
u32	sbc_get_device_type(struct se_device *dev);
sector_t	sbc_get_write_same_sectors(struct se_cmd *cmd);
void	sbc_dif_generate(struct se_cmd *);
sense_reason_t	sbc_dif_verify(struct se_cmd *, sector_t, unsigned int,
				     unsigned int, struct scatterlist *, int);
void sbc_dif_copy_prot(struct se_cmd *, unsigned int, bool,
		       struct scatterlist *, int);
void	transport_set_vpd_proto_id(struct t10_vpd *, unsigned char *);
int	transport_set_vpd_assoc(struct t10_vpd *, unsigned char *);
int	transport_set_vpd_ident_type(struct t10_vpd *, unsigned char *);
int	transport_set_vpd_ident(struct t10_vpd *, unsigned char *);

extern struct configfs_attribute *sbc_attrib_attrs[];
extern struct configfs_attribute *passthrough_attrib_attrs[];
extern struct configfs_attribute *passthrough_pr_attrib_attrs[];

/* core helpers also used by command snooping in pscsi */
void	*transport_kmap_data_sg(struct se_cmd *);
void	transport_kunmap_data_sg(struct se_cmd *);
/* core helpers also used by xcopy during internal command setup */
sense_reason_t	transport_generic_map_mem_to_cmd(struct se_cmd *,
		struct scatterlist *, u32, struct scatterlist *, u32);

bool	target_lun_is_rdonly(struct se_cmd *);
sense_reason_t passthrough_parse_cdb(struct se_cmd *cmd,
	sense_reason_t (*exec_cmd)(struct se_cmd *cmd));

bool target_sense_desc_format(struct se_device *dev);
sector_t target_to_linux_sector(struct se_device *dev, sector_t lb);
bool target_configure_unmap_from_queue(struct se_dev_attrib *attrib,
				       struct block_device *bdev);

static inline bool target_dev_configured(struct se_device *se_dev)
{}

#endif /* TARGET_CORE_BACKEND_H */