#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)
{ … }
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)
{ … }
static struct config_group *target_core_register_fabric(
struct config_group *group,
const char *name)
{ … }
static void target_core_deregister_fabric(
struct config_group *group,
struct config_item *item)
{ … }
static struct configfs_group_operations target_core_fabric_group_ops = …;
static struct configfs_attribute *target_core_fabric_item_attrs[] = …;
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(…);
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(…);
static inline struct se_dev_attrib *to_attrib(struct config_item *item)
{ … }
#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)
{ … }
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)
{ … }
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(…);
struct configfs_attribute *sbc_attrib_attrs[] = …;
EXPORT_SYMBOL(…);
struct configfs_attribute *passthrough_attrib_attrs[] = …;
EXPORT_SYMBOL(…);
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);
static struct t10_wwn *to_t10_wwn(struct config_item *item)
{ … }
static ssize_t target_check_inquiry_data(char *buf)
{ … }
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)
{ … }
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)
{ … }
static ssize_t target_wwn_vpd_protocol_identifier_show(struct config_item *item,
char *page)
{ … }
#define DEF_DEV_WWN_ASSOC_SHOW(_name, _assoc) …
DEF_DEV_WWN_ASSOC_SHOW(vpd_assoc_logical_unit, 0x00);
DEF_DEV_WWN_ASSOC_SHOW(vpd_assoc_target_port, 0x10);
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);
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);
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)
{ … }
struct configfs_item_operations target_core_dev_item_ops = …;
TB_CIT_SETUP(dev, &target_core_dev_item_ops, NULL, target_core_dev_attrs);
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 = …;
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 = …;
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 = …;
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);
static const struct config_item_type target_core_alua_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);
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 = …;
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);