linux/drivers/target/target_core_configfs.c

// SPDX-License-Identifier: GPL-2.0-or-later
/*******************************************************************************
 * Filename:  target_core_configfs.c
 *
 * This file contains ConfigFS logic for the Generic Target Engine project.
 *
 * (c) Copyright 2008-2013 Datera, Inc.
 *
 * Nicholas A. Bellinger <[email protected]>
 *
 * based on configfs Copyright (C) 2005 Oracle.  All rights reserved.
 *
 ****************************************************************************/

#include <linux/kstrtox.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <generated/utsrelease.h>
#include <linux/utsname.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/namei.h>
#include <linux/slab.h>
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/unistd.h>
#include <linux/string.h>
#include <linux/parser.h>
#include <linux/syscalls.h>
#include <linux/configfs.h>
#include <linux/spinlock.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_pr.h"
#include "target_core_rd.h"
#include "target_core_xcopy.h"

#define TB_CIT_SETUP(_name, _item_ops, _group_ops, _attrs)

#define TB_CIT_SETUP_DRV(_name, _item_ops, _group_ops)

extern struct t10_alua_lu_gp *default_lu_gp;

static LIST_HEAD(g_tf_list);
static DEFINE_MUTEX(g_tf_lock);

static struct config_group target_core_hbagroup;
static struct config_group alua_group;
static struct config_group alua_lu_gps_group;

static unsigned int target_devices;
static DEFINE_MUTEX(target_devices_lock);

static inline struct se_hba *
item_to_hba(struct config_item *item)
{}

/*
 * Attributes for /sys/kernel/config/target/
 */
static ssize_t target_core_item_version_show(struct config_item *item,
		char *page)
{}

CONFIGFS_ATTR_RO();

char db_root[DB_ROOT_LEN] =;
static char db_root_stage[DB_ROOT_LEN];

static ssize_t target_core_item_dbroot_show(struct config_item *item,
					    char *page)
{}

static ssize_t target_core_item_dbroot_store(struct config_item *item,
					const char *page, size_t count)
{}

CONFIGFS_ATTR();

static struct target_fabric_configfs *target_core_get_fabric(
	const char *name)
{}

/*
 * Called from struct target_core_group_ops->make_group()
 */
static struct config_group *target_core_register_fabric(
	struct config_group *group,
	const char *name)
{}

/*
 * Called from struct target_core_group_ops->drop_item()
 */
static void target_core_deregister_fabric(
	struct config_group *group,
	struct config_item *item)
{}

static struct configfs_group_operations target_core_fabric_group_ops =;

/*
 * All item attributes appearing in /sys/kernel/target/ appear here.
 */
static struct configfs_attribute *target_core_fabric_item_attrs[] =;

/*
 * Provides Fabrics Groups and Item Attributes for /sys/kernel/config/target/
 */
static const struct config_item_type target_core_fabrics_item =;

static struct configfs_subsystem target_core_fabrics =;

int target_depend_item(struct config_item *item)
{}
EXPORT_SYMBOL();

void target_undepend_item(struct config_item *item)
{}
EXPORT_SYMBOL();

/*##############################################################################
// Start functions called by external Target Fabrics Modules
//############################################################################*/
static int target_disable_feature(struct se_portal_group *se_tpg)
{}

static u32 target_default_get_inst_index(struct se_portal_group *se_tpg)
{}

static u32 target_default_sess_get_index(struct se_session *se_sess)
{}

static void target_set_default_node_attributes(struct se_node_acl *se_acl)
{}

static int target_default_get_cmd_state(struct se_cmd *se_cmd)
{}

static int target_fabric_tf_ops_check(const struct target_core_fabric_ops *tfo)
{}

static void target_set_default_ops(struct target_core_fabric_ops *tfo)
{}

int target_register_template(const struct target_core_fabric_ops *fo)
{}
EXPORT_SYMBOL();

void target_unregister_template(const struct target_core_fabric_ops *fo)
{}
EXPORT_SYMBOL();

/*##############################################################################
// Stop functions called by external Target Fabrics Modules
//############################################################################*/

static inline struct se_dev_attrib *to_attrib(struct config_item *item)
{}

/* Start functions for struct config_item_type tb_dev_attrib_cit */
#define DEF_CONFIGFS_ATTRIB_SHOW(_name)

DEF_CONFIGFS_ATTRIB_SHOW(emulate_model_alias);
DEF_CONFIGFS_ATTRIB_SHOW(emulate_dpo);
DEF_CONFIGFS_ATTRIB_SHOW(emulate_fua_write);
DEF_CONFIGFS_ATTRIB_SHOW(emulate_fua_read);
DEF_CONFIGFS_ATTRIB_SHOW(emulate_write_cache);
DEF_CONFIGFS_ATTRIB_SHOW(emulate_ua_intlck_ctrl);
DEF_CONFIGFS_ATTRIB_SHOW(emulate_tas);
DEF_CONFIGFS_ATTRIB_SHOW(emulate_tpu);
DEF_CONFIGFS_ATTRIB_SHOW(emulate_tpws);
DEF_CONFIGFS_ATTRIB_SHOW(emulate_caw);
DEF_CONFIGFS_ATTRIB_SHOW(emulate_3pc);
DEF_CONFIGFS_ATTRIB_SHOW(emulate_pr);
DEF_CONFIGFS_ATTRIB_SHOW(pi_prot_type);
DEF_CONFIGFS_ATTRIB_SHOW(hw_pi_prot_type);
DEF_CONFIGFS_ATTRIB_SHOW(pi_prot_verify);
DEF_CONFIGFS_ATTRIB_SHOW(enforce_pr_isids);
DEF_CONFIGFS_ATTRIB_SHOW(is_nonrot);
DEF_CONFIGFS_ATTRIB_SHOW(emulate_rest_reord);
DEF_CONFIGFS_ATTRIB_SHOW(force_pr_aptpl);
DEF_CONFIGFS_ATTRIB_SHOW(hw_block_size);
DEF_CONFIGFS_ATTRIB_SHOW(block_size);
DEF_CONFIGFS_ATTRIB_SHOW(hw_max_sectors);
DEF_CONFIGFS_ATTRIB_SHOW(optimal_sectors);
DEF_CONFIGFS_ATTRIB_SHOW(hw_queue_depth);
DEF_CONFIGFS_ATTRIB_SHOW(queue_depth);
DEF_CONFIGFS_ATTRIB_SHOW(max_unmap_lba_count);
DEF_CONFIGFS_ATTRIB_SHOW(max_unmap_block_desc_count);
DEF_CONFIGFS_ATTRIB_SHOW(unmap_granularity);
DEF_CONFIGFS_ATTRIB_SHOW(unmap_granularity_alignment);
DEF_CONFIGFS_ATTRIB_SHOW(unmap_zeroes_data);
DEF_CONFIGFS_ATTRIB_SHOW(max_write_same_len);
DEF_CONFIGFS_ATTRIB_SHOW(emulate_rsoc);
DEF_CONFIGFS_ATTRIB_SHOW(submit_type);

#define DEF_CONFIGFS_ATTRIB_STORE_U32(_name)

DEF_CONFIGFS_ATTRIB_STORE_U32(max_unmap_lba_count);
DEF_CONFIGFS_ATTRIB_STORE_U32(max_unmap_block_desc_count);
DEF_CONFIGFS_ATTRIB_STORE_U32(unmap_granularity);
DEF_CONFIGFS_ATTRIB_STORE_U32(unmap_granularity_alignment);
DEF_CONFIGFS_ATTRIB_STORE_U32(max_write_same_len);

#define DEF_CONFIGFS_ATTRIB_STORE_BOOL(_name)

DEF_CONFIGFS_ATTRIB_STORE_BOOL(emulate_fua_write);
DEF_CONFIGFS_ATTRIB_STORE_BOOL(emulate_caw);
DEF_CONFIGFS_ATTRIB_STORE_BOOL(emulate_3pc);
DEF_CONFIGFS_ATTRIB_STORE_BOOL(emulate_pr);
DEF_CONFIGFS_ATTRIB_STORE_BOOL(enforce_pr_isids);
DEF_CONFIGFS_ATTRIB_STORE_BOOL(is_nonrot);

#define DEF_CONFIGFS_ATTRIB_STORE_STUB(_name)

DEF_CONFIGFS_ATTRIB_STORE_STUB(emulate_dpo);
DEF_CONFIGFS_ATTRIB_STORE_STUB(emulate_fua_read);

static void dev_set_t10_wwn_model_alias(struct se_device *dev)
{}

static ssize_t emulate_model_alias_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t emulate_write_cache_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t emulate_ua_intlck_ctrl_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t emulate_tas_store(struct config_item *item,
		const char *page, size_t count)
{}

static int target_try_configure_unmap(struct se_device *dev,
				      const char *config_opt)
{}

static ssize_t emulate_tpu_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t emulate_tpws_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t pi_prot_type_store(struct config_item *item,
		const char *page, size_t count)
{}

/* always zero, but attr needs to remain RW to avoid userspace breakage */
static ssize_t pi_prot_format_show(struct config_item *item, char *page)
{}

static ssize_t pi_prot_format_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t pi_prot_verify_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t force_pr_aptpl_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t emulate_rest_reord_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t unmap_zeroes_data_store(struct config_item *item,
		const char *page, size_t count)
{}

/*
 * Note, this can only be called on unexported SE Device Object.
 */
static ssize_t queue_depth_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t optimal_sectors_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t block_size_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t alua_support_show(struct config_item *item, char *page)
{}

static ssize_t alua_support_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t pgr_support_show(struct config_item *item, char *page)
{}

static ssize_t pgr_support_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t emulate_rsoc_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t submit_type_store(struct config_item *item, const char *page,
				 size_t count)
{}

CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR_RO();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR_RO();
CONFIGFS_ATTR();
CONFIGFS_ATTR_RO();
CONFIGFS_ATTR();
CONFIGFS_ATTR_RO();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();

/*
 * dev_attrib attributes for devices using the target core SBC/SPC
 * interpreter.  Any backend using spc_parse_cdb should be using
 * these.
 */
struct configfs_attribute *sbc_attrib_attrs[] =;
EXPORT_SYMBOL();

/*
 * Minimal dev_attrib attributes for devices passing through CDBs.
 * In this case we only provide a few read-only attributes for
 * backwards compatibility.
 */
struct configfs_attribute *passthrough_attrib_attrs[] =;
EXPORT_SYMBOL();

/*
 * pr related dev_attrib attributes for devices passing through CDBs,
 * but allowing in core pr emulation.
 */
struct configfs_attribute *passthrough_pr_attrib_attrs[] =;
EXPORT_SYMBOL();

TB_CIT_SETUP_DRV(dev_attrib, NULL, NULL);
TB_CIT_SETUP_DRV(dev_action, NULL, NULL);

/* End functions for struct config_item_type tb_dev_attrib_cit */

/*  Start functions for struct config_item_type tb_dev_wwn_cit */

static struct t10_wwn *to_t10_wwn(struct config_item *item)
{}

static ssize_t target_check_inquiry_data(char *buf)
{}

/*
 * STANDARD and VPD page 0x83 T10 Vendor Identification
 */
static ssize_t target_wwn_vendor_id_show(struct config_item *item,
		char *page)
{}

static ssize_t target_wwn_vendor_id_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t target_wwn_product_id_show(struct config_item *item,
		char *page)
{}

static ssize_t target_wwn_product_id_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t target_wwn_revision_show(struct config_item *item,
		char *page)
{}

static ssize_t target_wwn_revision_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t
target_wwn_company_id_show(struct config_item *item,
				char *page)
{}

static ssize_t
target_wwn_company_id_store(struct config_item *item,
				 const char *page, size_t count)
{}

/*
 * VPD page 0x80 Unit serial
 */
static ssize_t target_wwn_vpd_unit_serial_show(struct config_item *item,
		char *page)
{}

static ssize_t target_wwn_vpd_unit_serial_store(struct config_item *item,
		const char *page, size_t count)
{}

/*
 * VPD page 0x83 Protocol Identifier
 */
static ssize_t target_wwn_vpd_protocol_identifier_show(struct config_item *item,
		char *page)
{}

/*
 * Generic wrapper for dumping VPD identifiers by association.
 */
#define DEF_DEV_WWN_ASSOC_SHOW(_name, _assoc)

/* VPD page 0x83 Association: Logical Unit */
DEF_DEV_WWN_ASSOC_SHOW(vpd_assoc_logical_unit, 0x00);
/* VPD page 0x83 Association: Target Port */
DEF_DEV_WWN_ASSOC_SHOW(vpd_assoc_target_port, 0x10);
/* VPD page 0x83 Association: SCSI Target Device */
DEF_DEV_WWN_ASSOC_SHOW(vpd_assoc_scsi_target_device, 0x20);

CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR_RO();
CONFIGFS_ATTR_RO();
CONFIGFS_ATTR_RO();
CONFIGFS_ATTR_RO();

static struct configfs_attribute *target_core_dev_wwn_attrs[] =;

TB_CIT_SETUP(dev_wwn, NULL, NULL, target_core_dev_wwn_attrs);

/*  End functions for struct config_item_type tb_dev_wwn_cit */

/*  Start functions for struct config_item_type tb_dev_pr_cit */

static struct se_device *pr_to_dev(struct config_item *item)
{}

static ssize_t target_core_dev_pr_show_spc3_res(struct se_device *dev,
		char *page)
{}

static ssize_t target_core_dev_pr_show_spc2_res(struct se_device *dev,
		char *page)
{}

static ssize_t target_pr_res_holder_show(struct config_item *item, char *page)
{}

static ssize_t target_pr_res_pr_all_tgt_pts_show(struct config_item *item,
		char *page)
{}

static ssize_t target_pr_res_pr_generation_show(struct config_item *item,
		char *page)
{}


static ssize_t target_pr_res_pr_holder_tg_port_show(struct config_item *item,
		char *page)
{}


static ssize_t target_pr_res_pr_registered_i_pts_show(struct config_item *item,
		char *page)
{}

static ssize_t target_pr_res_pr_type_show(struct config_item *item, char *page)
{}

static ssize_t target_pr_res_type_show(struct config_item *item, char *page)
{}

static ssize_t target_pr_res_aptpl_active_show(struct config_item *item,
		char *page)
{}

static ssize_t target_pr_res_aptpl_metadata_show(struct config_item *item,
		char *page)
{}

enum {};

static match_table_t tokens =;

static ssize_t target_pr_res_aptpl_metadata_store(struct config_item *item,
		const char *page, size_t count)
{}


CONFIGFS_ATTR_RO();
CONFIGFS_ATTR_RO();
CONFIGFS_ATTR_RO();
CONFIGFS_ATTR_RO();
CONFIGFS_ATTR_RO();
CONFIGFS_ATTR_RO();
CONFIGFS_ATTR_RO();
CONFIGFS_ATTR_RO();
CONFIGFS_ATTR();

static struct configfs_attribute *target_core_dev_pr_attrs[] =;

TB_CIT_SETUP(dev_pr, NULL, NULL, target_core_dev_pr_attrs);

/*  End functions for struct config_item_type tb_dev_pr_cit */

/*  Start functions for struct config_item_type tb_dev_cit */

static inline struct se_device *to_device(struct config_item *item)
{}

static ssize_t target_dev_info_show(struct config_item *item, char *page)
{}

static ssize_t target_dev_control_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t target_dev_alias_show(struct config_item *item, char *page)
{}

static ssize_t target_dev_alias_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t target_dev_udev_path_show(struct config_item *item, char *page)
{}

static ssize_t target_dev_udev_path_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t target_dev_enable_show(struct config_item *item, char *page)
{}

static ssize_t target_dev_enable_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t target_dev_alua_lu_gp_show(struct config_item *item, char *page)
{}

static ssize_t target_dev_alua_lu_gp_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t target_dev_lba_map_show(struct config_item *item, char *page)
{}

static ssize_t target_dev_lba_map_store(struct config_item *item,
		const char *page, size_t count)
{}

CONFIGFS_ATTR_RO();
CONFIGFS_ATTR_WO();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();

static struct configfs_attribute *target_core_dev_attrs[] =;

static void target_core_dev_release(struct config_item *item)
{}

/*
 * Used in target_core_fabric_configfs.c to verify valid se_device symlink
 * within target_fabric_port_link()
 */
struct configfs_item_operations target_core_dev_item_ops =;

TB_CIT_SETUP(dev, &target_core_dev_item_ops, NULL, target_core_dev_attrs);

/* End functions for struct config_item_type tb_dev_cit */

/* Start functions for struct config_item_type target_core_alua_lu_gp_cit */

static inline struct t10_alua_lu_gp *to_lu_gp(struct config_item *item)
{}

static ssize_t target_lu_gp_lu_gp_id_show(struct config_item *item, char *page)
{}

static ssize_t target_lu_gp_lu_gp_id_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t target_lu_gp_members_show(struct config_item *item, char *page)
{}

CONFIGFS_ATTR();
CONFIGFS_ATTR_RO();

static struct configfs_attribute *target_core_alua_lu_gp_attrs[] =;

static void target_core_alua_lu_gp_release(struct config_item *item)
{}

static struct configfs_item_operations target_core_alua_lu_gp_ops =;

static const struct config_item_type target_core_alua_lu_gp_cit =;

/* End functions for struct config_item_type target_core_alua_lu_gp_cit */

/* Start functions for struct config_item_type target_core_alua_lu_gps_cit */

static struct config_group *target_core_alua_create_lu_gp(
	struct config_group *group,
	const char *name)
{}

static void target_core_alua_drop_lu_gp(
	struct config_group *group,
	struct config_item *item)
{}

static struct configfs_group_operations target_core_alua_lu_gps_group_ops =;

static const struct config_item_type target_core_alua_lu_gps_cit =;

/* End functions for struct config_item_type target_core_alua_lu_gps_cit */

/* Start functions for struct config_item_type target_core_alua_tg_pt_gp_cit */

static inline struct t10_alua_tg_pt_gp *to_tg_pt_gp(struct config_item *item)
{}

static ssize_t target_tg_pt_gp_alua_access_state_show(struct config_item *item,
		char *page)
{}

static ssize_t target_tg_pt_gp_alua_access_state_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t target_tg_pt_gp_alua_access_status_show(struct config_item *item,
		char *page)
{}

static ssize_t target_tg_pt_gp_alua_access_status_store(
		struct config_item *item, const char *page, size_t count)
{}

static ssize_t target_tg_pt_gp_alua_access_type_show(struct config_item *item,
		char *page)
{}

static ssize_t target_tg_pt_gp_alua_access_type_store(struct config_item *item,
		const char *page, size_t count)
{}

#define ALUA_SUPPORTED_STATE_ATTR(_name, _bit)

ALUA_SUPPORTED_STATE_ATTR(transitioning, ALUA_T_SUP);
ALUA_SUPPORTED_STATE_ATTR(offline, ALUA_O_SUP);
ALUA_SUPPORTED_STATE_ATTR(lba_dependent, ALUA_LBD_SUP);
ALUA_SUPPORTED_STATE_ATTR(unavailable, ALUA_U_SUP);
ALUA_SUPPORTED_STATE_ATTR(standby, ALUA_S_SUP);
ALUA_SUPPORTED_STATE_ATTR(active_optimized, ALUA_AO_SUP);
ALUA_SUPPORTED_STATE_ATTR(active_nonoptimized, ALUA_AN_SUP);

static ssize_t target_tg_pt_gp_alua_write_metadata_show(
		struct config_item *item, char *page)
{}

static ssize_t target_tg_pt_gp_alua_write_metadata_store(
		struct config_item *item, const char *page, size_t count)
{}

static ssize_t target_tg_pt_gp_nonop_delay_msecs_show(struct config_item *item,
		char *page)
{}

static ssize_t target_tg_pt_gp_nonop_delay_msecs_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t target_tg_pt_gp_trans_delay_msecs_show(struct config_item *item,
		char *page)
{}

static ssize_t target_tg_pt_gp_trans_delay_msecs_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t target_tg_pt_gp_implicit_trans_secs_show(
		struct config_item *item, char *page)
{}

static ssize_t target_tg_pt_gp_implicit_trans_secs_store(
		struct config_item *item, const char *page, size_t count)
{}

static ssize_t target_tg_pt_gp_preferred_show(struct config_item *item,
		char *page)
{}

static ssize_t target_tg_pt_gp_preferred_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t target_tg_pt_gp_tg_pt_gp_id_show(struct config_item *item,
		char *page)
{}

static ssize_t target_tg_pt_gp_tg_pt_gp_id_store(struct config_item *item,
		const char *page, size_t count)
{}

static ssize_t target_tg_pt_gp_members_show(struct config_item *item,
		char *page)
{}

CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR();
CONFIGFS_ATTR_RO();

static struct configfs_attribute *target_core_alua_tg_pt_gp_attrs[] =;

static void target_core_alua_tg_pt_gp_release(struct config_item *item)
{}

static struct configfs_item_operations target_core_alua_tg_pt_gp_ops =;

static const struct config_item_type target_core_alua_tg_pt_gp_cit =;

/* End functions for struct config_item_type target_core_alua_tg_pt_gp_cit */

/* Start functions for struct config_item_type tb_alua_tg_pt_gps_cit */

static struct config_group *target_core_alua_create_tg_pt_gp(
	struct config_group *group,
	const char *name)
{}

static void target_core_alua_drop_tg_pt_gp(
	struct config_group *group,
	struct config_item *item)
{}

static struct configfs_group_operations target_core_alua_tg_pt_gps_group_ops =;

TB_CIT_SETUP(dev_alua_tg_pt_gps, NULL, &target_core_alua_tg_pt_gps_group_ops, NULL);

/* End functions for struct config_item_type tb_alua_tg_pt_gps_cit */

/* Start functions for struct config_item_type target_core_alua_cit */

/*
 * target_core_alua_cit is a ConfigFS group that lives under
 * /sys/kernel/config/target/core/alua.  There are default groups
 * core/alua/lu_gps and core/alua/tg_pt_gps that are attached to
 * target_core_alua_cit in target_core_init_configfs() below.
 */
static const struct config_item_type target_core_alua_cit =;

/* End functions for struct config_item_type target_core_alua_cit */

/* Start functions for struct config_item_type tb_dev_stat_cit */

static struct config_group *target_core_stat_mkdir(
	struct config_group *group,
	const char *name)
{}

static void target_core_stat_rmdir(
	struct config_group *group,
	struct config_item *item)
{}

static struct configfs_group_operations target_core_stat_group_ops =;

TB_CIT_SETUP(dev_stat, NULL, &target_core_stat_group_ops, NULL);

/* End functions for struct config_item_type tb_dev_stat_cit */

/* Start functions for struct config_item_type target_core_hba_cit */

static struct config_group *target_core_make_subdev(
	struct config_group *group,
	const char *name)
{}

static void target_core_drop_subdev(
	struct config_group *group,
	struct config_item *item)
{}

static struct configfs_group_operations target_core_hba_group_ops =;


static inline struct se_hba *to_hba(struct config_item *item)
{}

static ssize_t target_hba_info_show(struct config_item *item, char *page)
{}

static ssize_t target_hba_mode_show(struct config_item *item, char *page)
{}

static ssize_t target_hba_mode_store(struct config_item *item,
		const char *page, size_t count)
{}

CONFIGFS_ATTR_RO();
CONFIGFS_ATTR();

static void target_core_hba_release(struct config_item *item)
{}

static struct configfs_attribute *target_core_hba_attrs[] =;

static struct configfs_item_operations target_core_hba_item_ops =;

static const struct config_item_type target_core_hba_cit =;

static struct config_group *target_core_call_addhbatotarget(
	struct config_group *group,
	const char *name)
{}

static void target_core_call_delhbafromtarget(
	struct config_group *group,
	struct config_item *item)
{}

static struct configfs_group_operations target_core_group_ops =;

static const struct config_item_type target_core_cit =;

/* Stop functions for struct config_item_type target_core_hba_cit */

void target_setup_backend_cits(struct target_backend *tb)
{}

static void target_init_dbroot(void)
{}

static int __init target_core_init_configfs(void)
{}

static void __exit target_core_exit_configfs(void)
{}

MODULE_DESCRIPTION();
MODULE_AUTHOR();
MODULE_LICENSE();

module_init();
module_exit(target_core_exit_configfs);