#include <linux/string.h>
#include <linux/parser.h>
#include <linux/timer.h>
#include <linux/fs.h>
#include <linux/blkdev.h>
#include <linux/blk-integrity.h>
#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/bio.h>
#include <linux/file.h>
#include <linux/module.h>
#include <linux/scatterlist.h>
#include <linux/pr.h>
#include <scsi/scsi_proto.h>
#include <scsi/scsi_common.h>
#include <asm/unaligned.h>
#include <target/target_core_base.h>
#include <target/target_core_backend.h>
#include "target_core_iblock.h"
#include "target_core_pr.h"
#define IBLOCK_MAX_BIO_PER_TASK …
#define IBLOCK_BIO_POOL_SIZE …
static inline struct iblock_dev *IBLOCK_DEV(struct se_device *dev)
{ … }
static int iblock_attach_hba(struct se_hba *hba, u32 host_id)
{ … }
static void iblock_detach_hba(struct se_hba *hba)
{ … }
static struct se_device *iblock_alloc_device(struct se_hba *hba, const char *name)
{ … }
static bool iblock_configure_unmap(struct se_device *dev)
{ … }
static int iblock_configure_device(struct se_device *dev)
{ … }
static void iblock_dev_call_rcu(struct rcu_head *p)
{ … }
static void iblock_free_device(struct se_device *dev)
{ … }
static void iblock_destroy_device(struct se_device *dev)
{ … }
static struct se_dev_plug *iblock_plug_device(struct se_device *se_dev)
{ … }
static void iblock_unplug_device(struct se_dev_plug *se_plug)
{ … }
static sector_t iblock_get_blocks(struct se_device *dev)
{ … }
static void iblock_complete_cmd(struct se_cmd *cmd, blk_status_t blk_status)
{ … }
static void iblock_bio_done(struct bio *bio)
{ … }
static struct bio *iblock_get_bio(struct se_cmd *cmd, sector_t lba, u32 sg_num,
blk_opf_t opf)
{ … }
static void iblock_submit_bios(struct bio_list *list)
{ … }
static void iblock_end_io_flush(struct bio *bio)
{ … }
static sense_reason_t
iblock_execute_sync_cache(struct se_cmd *cmd)
{ … }
static sense_reason_t
iblock_execute_unmap(struct se_cmd *cmd, sector_t lba, sector_t nolb)
{ … }
static sense_reason_t
iblock_execute_zero_out(struct block_device *bdev, struct se_cmd *cmd)
{ … }
static sense_reason_t
iblock_execute_write_same(struct se_cmd *cmd)
{ … }
enum { … };
static match_table_t tokens = …;
static ssize_t iblock_set_configfs_dev_params(struct se_device *dev,
const char *page, ssize_t count)
{ … }
static ssize_t iblock_show_configfs_dev_params(struct se_device *dev, char *b)
{ … }
static int
iblock_alloc_bip(struct se_cmd *cmd, struct bio *bio,
struct sg_mapping_iter *miter)
{ … }
static sense_reason_t
iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents,
enum dma_data_direction data_direction)
{ … }
static sense_reason_t iblock_execute_pr_out(struct se_cmd *cmd, u8 sa, u64 key,
u64 sa_key, u8 type, bool aptpl)
{ … }
static void iblock_pr_report_caps(unsigned char *param_data)
{ … }
static sense_reason_t iblock_pr_read_keys(struct se_cmd *cmd,
unsigned char *param_data)
{ … }
static sense_reason_t iblock_pr_read_reservation(struct se_cmd *cmd,
unsigned char *param_data)
{ … }
static sense_reason_t iblock_execute_pr_in(struct se_cmd *cmd, u8 sa,
unsigned char *param_data)
{ … }
static sector_t iblock_get_alignment_offset_lbas(struct se_device *dev)
{ … }
static unsigned int iblock_get_lbppbe(struct se_device *dev)
{ … }
static unsigned int iblock_get_io_min(struct se_device *dev)
{ … }
static unsigned int iblock_get_io_opt(struct se_device *dev)
{ … }
static struct exec_cmd_ops iblock_exec_cmd_ops = …;
static sense_reason_t
iblock_parse_cdb(struct se_cmd *cmd)
{ … }
static bool iblock_get_write_cache(struct se_device *dev)
{ … }
static const struct target_backend_ops iblock_ops = …;
static int __init iblock_module_init(void)
{ … }
static void __exit iblock_module_exit(void)
{ … }
MODULE_DESCRIPTION(…) …;
MODULE_AUTHOR(…) …;
MODULE_LICENSE(…) …;
module_init(…) …;
module_exit(iblock_module_exit);