#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/list.h>
#include <linux/vmalloc.h>
#include <linux/file.h>
#include <linux/fcntl.h>
#include <linux/fs.h>
#include <scsi/scsi_proto.h>
#include <asm/unaligned.h>
#include <target/target_core_base.h>
#include <target/target_core_backend.h>
#include <target/target_core_fabric.h>
#include "target_core_internal.h"
#include "target_core_pr.h"
#include "target_core_ua.h"
struct pr_transport_id_holder { … };
void core_pr_dump_initiator_port(
struct t10_pr_registration *pr_reg,
char *buf,
u32 size)
{ … }
enum register_type { … };
enum preempt_type { … };
static void __core_scsi3_complete_pro_release(struct se_device *, struct se_node_acl *,
struct t10_pr_registration *, int, int);
static int is_reservation_holder(
struct t10_pr_registration *pr_res_holder,
struct t10_pr_registration *pr_reg)
{ … }
static sense_reason_t
target_scsi2_reservation_check(struct se_cmd *cmd)
{ … }
static struct t10_pr_registration *core_scsi3_locate_pr_reg(struct se_device *,
struct se_node_acl *, struct se_session *);
static void core_scsi3_put_pr_reg(struct t10_pr_registration *);
static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd)
{ … }
void target_release_reservation(struct se_device *dev)
{ … }
sense_reason_t
target_scsi2_reservation_release(struct se_cmd *cmd)
{ … }
sense_reason_t
target_scsi2_reservation_reserve(struct se_cmd *cmd)
{ … }
static int core_scsi3_pr_seq_non_holder(struct se_cmd *cmd, u32 pr_reg_type,
bool isid_mismatch)
{ … }
static sense_reason_t
target_scsi3_pr_reservation_check(struct se_cmd *cmd)
{ … }
static u32 core_scsi3_pr_generation(struct se_device *dev)
{ … }
static struct t10_pr_registration *__core_scsi3_do_alloc_registration(
struct se_device *dev,
struct se_node_acl *nacl,
struct se_lun *lun,
struct se_dev_entry *dest_deve,
u64 mapped_lun,
unsigned char *isid,
u64 sa_res_key,
int all_tg_pt,
int aptpl)
{ … }
static int core_scsi3_lunacl_depend_item(struct se_dev_entry *);
static void core_scsi3_lunacl_undepend_item(struct se_dev_entry *);
static struct t10_pr_registration *__core_scsi3_alloc_registration(
struct se_device *dev,
struct se_node_acl *nacl,
struct se_lun *lun,
struct se_dev_entry *deve,
u64 mapped_lun,
unsigned char *isid,
u64 sa_res_key,
int all_tg_pt,
int aptpl)
{ … }
int core_scsi3_alloc_aptpl_registration(
struct t10_reservation *pr_tmpl,
u64 sa_res_key,
unsigned char *i_port,
unsigned char *isid,
u64 mapped_lun,
unsigned char *t_port,
u16 tpgt,
u64 target_lun,
int res_holder,
int all_tg_pt,
u8 type)
{ … }
static void core_scsi3_aptpl_reserve(
struct se_device *dev,
struct se_portal_group *tpg,
struct se_node_acl *node_acl,
struct t10_pr_registration *pr_reg)
{ … }
static void __core_scsi3_add_registration(struct se_device *, struct se_node_acl *,
struct t10_pr_registration *, enum register_type, int);
static int __core_scsi3_check_aptpl_registration(
struct se_device *dev,
struct se_portal_group *tpg,
struct se_lun *lun,
u64 target_lun,
struct se_node_acl *nacl,
u64 mapped_lun)
{ … }
int core_scsi3_check_aptpl_registration(
struct se_device *dev,
struct se_portal_group *tpg,
struct se_lun *lun,
struct se_node_acl *nacl,
u64 mapped_lun)
{ … }
static void __core_scsi3_dump_registration(
const struct target_core_fabric_ops *tfo,
struct se_device *dev,
struct se_node_acl *nacl,
struct t10_pr_registration *pr_reg,
enum register_type register_type)
{ … }
static void __core_scsi3_add_registration(
struct se_device *dev,
struct se_node_acl *nacl,
struct t10_pr_registration *pr_reg,
enum register_type register_type,
int register_move)
{ … }
static int core_scsi3_alloc_registration(
struct se_device *dev,
struct se_node_acl *nacl,
struct se_lun *lun,
struct se_dev_entry *deve,
u64 mapped_lun,
unsigned char *isid,
u64 sa_res_key,
int all_tg_pt,
int aptpl,
enum register_type register_type,
int register_move)
{ … }
static struct t10_pr_registration *__core_scsi3_locate_pr_reg(
struct se_device *dev,
struct se_node_acl *nacl,
unsigned char *isid)
{ … }
static struct t10_pr_registration *core_scsi3_locate_pr_reg(
struct se_device *dev,
struct se_node_acl *nacl,
struct se_session *sess)
{ … }
static void core_scsi3_put_pr_reg(struct t10_pr_registration *pr_reg)
{ … }
static int core_scsi3_check_implicit_release(
struct se_device *dev,
struct t10_pr_registration *pr_reg)
{ … }
static void __core_scsi3_free_registration(
struct se_device *dev,
struct t10_pr_registration *pr_reg,
struct list_head *preempt_and_abort_list,
int dec_holders)
__releases(&pr_tmpl->registration_lock)
__acquires(&pr_tmpl->registration_lock)
{ … }
void core_scsi3_free_pr_reg_from_nacl(
struct se_device *dev,
struct se_node_acl *nacl)
{ … }
void core_scsi3_free_all_registrations(
struct se_device *dev)
{ … }
static int core_scsi3_tpg_depend_item(struct se_portal_group *tpg)
{ … }
static void core_scsi3_tpg_undepend_item(struct se_portal_group *tpg)
{ … }
static int core_scsi3_nodeacl_depend_item(struct se_node_acl *nacl)
{ … }
static void core_scsi3_nodeacl_undepend_item(struct se_node_acl *nacl)
{ … }
static int core_scsi3_lunacl_depend_item(struct se_dev_entry *se_deve)
{ … }
static void core_scsi3_lunacl_undepend_item(struct se_dev_entry *se_deve)
{ … }
static sense_reason_t
core_scsi3_decode_spec_i_port(
struct se_cmd *cmd,
struct se_portal_group *tpg,
unsigned char *l_isid,
u64 sa_res_key,
int all_tg_pt,
int aptpl)
{ … }
static int core_scsi3_update_aptpl_buf(
struct se_device *dev,
unsigned char *buf,
u32 pr_aptpl_buf_len)
{ … }
static int __core_scsi3_write_aptpl_to_file(
struct se_device *dev,
unsigned char *buf)
{ … }
static sense_reason_t core_scsi3_update_and_write_aptpl(struct se_device *dev, bool aptpl)
{ … }
static sense_reason_t
core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 res_key, u64 sa_res_key,
bool aptpl, bool all_tg_pt, bool spec_i_pt, enum register_type register_type)
{ … }
unsigned char *core_scsi3_pr_dump_type(int type)
{ … }
static sense_reason_t
core_scsi3_pro_reserve(struct se_cmd *cmd, int type, int scope, u64 res_key)
{ … }
static sense_reason_t
core_scsi3_emulate_pro_reserve(struct se_cmd *cmd, int type, int scope,
u64 res_key)
{ … }
static void __core_scsi3_complete_pro_release(
struct se_device *dev,
struct se_node_acl *se_nacl,
struct t10_pr_registration *pr_reg,
int explicit,
int unreg)
{ … }
static sense_reason_t
core_scsi3_emulate_pro_release(struct se_cmd *cmd, int type, int scope,
u64 res_key)
{ … }
static sense_reason_t
core_scsi3_emulate_pro_clear(struct se_cmd *cmd, u64 res_key)
{ … }
static void __core_scsi3_complete_pro_preempt(
struct se_device *dev,
struct t10_pr_registration *pr_reg,
struct list_head *preempt_and_abort_list,
int type,
int scope,
enum preempt_type preempt_type)
{ … }
static void core_scsi3_release_preempt_and_abort(
struct list_head *preempt_and_abort_list,
struct t10_pr_registration *pr_reg_holder)
{ … }
static sense_reason_t
core_scsi3_pro_preempt(struct se_cmd *cmd, int type, int scope, u64 res_key,
u64 sa_res_key, enum preempt_type preempt_type)
{ … }
static sense_reason_t
core_scsi3_emulate_pro_preempt(struct se_cmd *cmd, int type, int scope,
u64 res_key, u64 sa_res_key, enum preempt_type preempt_type)
{ … }
static sense_reason_t
core_scsi3_emulate_pro_register_and_move(struct se_cmd *cmd, u64 res_key,
u64 sa_res_key, int aptpl, int unreg)
{ … }
static sense_reason_t
target_try_pr_out_pt(struct se_cmd *cmd, u8 sa, u64 res_key, u64 sa_res_key,
u8 type, bool aptpl, bool all_tg_pt, bool spec_i_pt)
{ … }
sense_reason_t
target_scsi3_emulate_pr_out(struct se_cmd *cmd)
{ … }
static sense_reason_t
core_scsi3_pri_read_keys(struct se_cmd *cmd)
{ … }
static sense_reason_t
core_scsi3_pri_read_reservation(struct se_cmd *cmd)
{ … }
static sense_reason_t
core_scsi3_pri_report_capabilities(struct se_cmd *cmd)
{ … }
static sense_reason_t
core_scsi3_pri_read_full_status(struct se_cmd *cmd)
{ … }
static sense_reason_t target_try_pr_in_pt(struct se_cmd *cmd, u8 sa)
{ … }
sense_reason_t
target_scsi3_emulate_pr_in(struct se_cmd *cmd)
{ … }
sense_reason_t
target_check_reservation(struct se_cmd *cmd)
{ … }