#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/configfs.h>
#include <linux/delay.h>
#include <linux/export.h>
#include <linux/fcntl.h>
#include <linux/file.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_alua.h"
#include "target_core_ua.h"
static sense_reason_t core_alua_check_transition(int state, int valid,
int *primary, int explicit);
static int core_alua_set_tg_pt_secondary_state(
struct se_lun *lun, int explicit, int offline);
static char *core_alua_dump_state(int state);
static void __target_attach_tg_pt_gp(struct se_lun *lun,
struct t10_alua_tg_pt_gp *tg_pt_gp);
static u16 alua_lu_gps_counter;
static u32 alua_lu_gps_count;
static DEFINE_SPINLOCK(lu_gps_lock);
static LIST_HEAD(lu_gps_list);
struct t10_alua_lu_gp *default_lu_gp;
sense_reason_t
target_emulate_report_referrals(struct se_cmd *cmd)
{ … }
sense_reason_t
target_emulate_report_target_port_groups(struct se_cmd *cmd)
{ … }
sense_reason_t
target_emulate_set_target_port_groups(struct se_cmd *cmd)
{ … }
static inline void core_alua_state_nonoptimized(
struct se_cmd *cmd,
unsigned char *cdb,
int nonop_delay_msecs)
{ … }
static inline sense_reason_t core_alua_state_lba_dependent(
struct se_cmd *cmd,
u16 tg_pt_gp_id)
{ … }
static inline sense_reason_t core_alua_state_standby(
struct se_cmd *cmd,
unsigned char *cdb)
{ … }
static inline sense_reason_t core_alua_state_unavailable(
struct se_cmd *cmd,
unsigned char *cdb)
{ … }
static inline sense_reason_t core_alua_state_transition(
struct se_cmd *cmd,
unsigned char *cdb)
{ … }
sense_reason_t
target_alua_state_check(struct se_cmd *cmd)
{ … }
static sense_reason_t
core_alua_check_transition(int state, int valid, int *primary, int explicit)
{ … }
static char *core_alua_dump_state(int state)
{ … }
char *core_alua_dump_status(int status)
{ … }
int core_alua_check_nonop_delay(
struct se_cmd *cmd)
{ … }
static int core_alua_write_tpg_metadata(
const char *path,
unsigned char *md_buf,
u32 md_buf_len)
{ … }
static int core_alua_update_tpg_primary_metadata(
struct t10_alua_tg_pt_gp *tg_pt_gp)
{ … }
static void core_alua_queue_state_change_ua(struct t10_alua_tg_pt_gp *tg_pt_gp)
{ … }
static int core_alua_do_transition_tg_pt(
struct t10_alua_tg_pt_gp *tg_pt_gp,
int new_state,
int explicit)
{ … }
int core_alua_do_port_transition(
struct t10_alua_tg_pt_gp *l_tg_pt_gp,
struct se_device *l_dev,
struct se_lun *l_lun,
struct se_node_acl *l_nacl,
int new_state,
int explicit)
{ … }
static int core_alua_update_tpg_secondary_metadata(struct se_lun *lun)
{ … }
static int core_alua_set_tg_pt_secondary_state(
struct se_lun *lun,
int explicit,
int offline)
{ … }
struct t10_alua_lba_map *
core_alua_allocate_lba_map(struct list_head *list,
u64 first_lba, u64 last_lba)
{ … }
int
core_alua_allocate_lba_map_mem(struct t10_alua_lba_map *lba_map,
int pg_id, int state)
{ … }
void
core_alua_free_lba_map(struct list_head *lba_list)
{ … }
void
core_alua_set_lba_map(struct se_device *dev, struct list_head *lba_map_list,
int segment_size, int segment_mult)
{ … }
struct t10_alua_lu_gp *
core_alua_allocate_lu_gp(const char *name, int def_group)
{ … }
int core_alua_set_lu_gp_id(struct t10_alua_lu_gp *lu_gp, u16 lu_gp_id)
{ … }
static struct t10_alua_lu_gp_member *
core_alua_allocate_lu_gp_mem(struct se_device *dev)
{ … }
void core_alua_free_lu_gp(struct t10_alua_lu_gp *lu_gp)
{ … }
void core_alua_free_lu_gp_mem(struct se_device *dev)
{ … }
struct t10_alua_lu_gp *core_alua_get_lu_gp_by_name(const char *name)
{ … }
void core_alua_put_lu_gp_from_name(struct t10_alua_lu_gp *lu_gp)
{ … }
void __core_alua_attach_lu_gp_mem(
struct t10_alua_lu_gp_member *lu_gp_mem,
struct t10_alua_lu_gp *lu_gp)
{ … }
void __core_alua_drop_lu_gp_mem(
struct t10_alua_lu_gp_member *lu_gp_mem,
struct t10_alua_lu_gp *lu_gp)
{ … }
struct t10_alua_tg_pt_gp *core_alua_allocate_tg_pt_gp(struct se_device *dev,
const char *name, int def_group)
{ … }
int core_alua_set_tg_pt_gp_id(
struct t10_alua_tg_pt_gp *tg_pt_gp,
u16 tg_pt_gp_id)
{ … }
void core_alua_free_tg_pt_gp(
struct t10_alua_tg_pt_gp *tg_pt_gp)
{ … }
static struct t10_alua_tg_pt_gp *core_alua_get_tg_pt_gp_by_name(
struct se_device *dev, const char *name)
{ … }
static void core_alua_put_tg_pt_gp_from_name(
struct t10_alua_tg_pt_gp *tg_pt_gp)
{ … }
static void __target_attach_tg_pt_gp(struct se_lun *lun,
struct t10_alua_tg_pt_gp *tg_pt_gp)
{ … }
void target_attach_tg_pt_gp(struct se_lun *lun,
struct t10_alua_tg_pt_gp *tg_pt_gp)
{ … }
static void __target_detach_tg_pt_gp(struct se_lun *lun,
struct t10_alua_tg_pt_gp *tg_pt_gp)
{ … }
void target_detach_tg_pt_gp(struct se_lun *lun)
{ … }
static void target_swap_tg_pt_gp(struct se_lun *lun,
struct t10_alua_tg_pt_gp *old_tg_pt_gp,
struct t10_alua_tg_pt_gp *new_tg_pt_gp)
{ … }
ssize_t core_alua_show_tg_pt_gp_info(struct se_lun *lun, char *page)
{ … }
ssize_t core_alua_store_tg_pt_gp_info(
struct se_lun *lun,
const char *page,
size_t count)
{ … }
ssize_t core_alua_show_access_type(
struct t10_alua_tg_pt_gp *tg_pt_gp,
char *page)
{ … }
ssize_t core_alua_store_access_type(
struct t10_alua_tg_pt_gp *tg_pt_gp,
const char *page,
size_t count)
{ … }
ssize_t core_alua_show_nonop_delay_msecs(
struct t10_alua_tg_pt_gp *tg_pt_gp,
char *page)
{ … }
ssize_t core_alua_store_nonop_delay_msecs(
struct t10_alua_tg_pt_gp *tg_pt_gp,
const char *page,
size_t count)
{ … }
ssize_t core_alua_show_trans_delay_msecs(
struct t10_alua_tg_pt_gp *tg_pt_gp,
char *page)
{ … }
ssize_t core_alua_store_trans_delay_msecs(
struct t10_alua_tg_pt_gp *tg_pt_gp,
const char *page,
size_t count)
{ … }
ssize_t core_alua_show_implicit_trans_secs(
struct t10_alua_tg_pt_gp *tg_pt_gp,
char *page)
{ … }
ssize_t core_alua_store_implicit_trans_secs(
struct t10_alua_tg_pt_gp *tg_pt_gp,
const char *page,
size_t count)
{ … }
ssize_t core_alua_show_preferred_bit(
struct t10_alua_tg_pt_gp *tg_pt_gp,
char *page)
{ … }
ssize_t core_alua_store_preferred_bit(
struct t10_alua_tg_pt_gp *tg_pt_gp,
const char *page,
size_t count)
{ … }
ssize_t core_alua_show_offline_bit(struct se_lun *lun, char *page)
{ … }
ssize_t core_alua_store_offline_bit(
struct se_lun *lun,
const char *page,
size_t count)
{ … }
ssize_t core_alua_show_secondary_status(
struct se_lun *lun,
char *page)
{ … }
ssize_t core_alua_store_secondary_status(
struct se_lun *lun,
const char *page,
size_t count)
{ … }
ssize_t core_alua_show_secondary_write_metadata(
struct se_lun *lun,
char *page)
{ … }
ssize_t core_alua_store_secondary_write_metadata(
struct se_lun *lun,
const char *page,
size_t count)
{ … }
int core_setup_alua(struct se_device *dev)
{ … }