linux/drivers/target/target_core_configfs.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*******************************************************************************
   3 * Filename:  target_core_configfs.c
   4 *
   5 * This file contains ConfigFS logic for the Generic Target Engine project.
   6 *
   7 * (c) Copyright 2008-2013 Datera, Inc.
   8 *
   9 * Nicholas A. Bellinger <nab@kernel.org>
  10 *
  11 * based on configfs Copyright (C) 2005 Oracle.  All rights reserved.
  12 *
  13 ****************************************************************************/
  14
  15#include <linux/module.h>
  16#include <linux/moduleparam.h>
  17#include <generated/utsrelease.h>
  18#include <linux/utsname.h>
  19#include <linux/init.h>
  20#include <linux/fs.h>
  21#include <linux/namei.h>
  22#include <linux/slab.h>
  23#include <linux/types.h>
  24#include <linux/delay.h>
  25#include <linux/unistd.h>
  26#include <linux/string.h>
  27#include <linux/parser.h>
  28#include <linux/syscalls.h>
  29#include <linux/configfs.h>
  30#include <linux/spinlock.h>
  31
  32#include <target/target_core_base.h>
  33#include <target/target_core_backend.h>
  34#include <target/target_core_fabric.h>
  35
  36#include "target_core_internal.h"
  37#include "target_core_alua.h"
  38#include "target_core_pr.h"
  39#include "target_core_rd.h"
  40#include "target_core_xcopy.h"
  41
  42#define TB_CIT_SETUP(_name, _item_ops, _group_ops, _attrs)              \
  43static void target_core_setup_##_name##_cit(struct target_backend *tb)  \
  44{                                                                       \
  45        struct config_item_type *cit = &tb->tb_##_name##_cit;           \
  46                                                                        \
  47        cit->ct_item_ops = _item_ops;                                   \
  48        cit->ct_group_ops = _group_ops;                                 \
  49        cit->ct_attrs = _attrs;                                         \
  50        cit->ct_owner = tb->ops->owner;                                 \
  51        pr_debug("Setup generic %s\n", __stringify(_name));             \
  52}
  53
  54#define TB_CIT_SETUP_DRV(_name, _item_ops, _group_ops)                  \
  55static void target_core_setup_##_name##_cit(struct target_backend *tb)  \
  56{                                                                       \
  57        struct config_item_type *cit = &tb->tb_##_name##_cit;           \
  58                                                                        \
  59        cit->ct_item_ops = _item_ops;                                   \
  60        cit->ct_group_ops = _group_ops;                                 \
  61        cit->ct_attrs = tb->ops->tb_##_name##_attrs;                    \
  62        cit->ct_owner = tb->ops->owner;                                 \
  63        pr_debug("Setup generic %s\n", __stringify(_name));             \
  64}
  65
  66extern struct t10_alua_lu_gp *default_lu_gp;
  67
  68static LIST_HEAD(g_tf_list);
  69static DEFINE_MUTEX(g_tf_lock);
  70
  71static struct config_group target_core_hbagroup;
  72static struct config_group alua_group;
  73static struct config_group alua_lu_gps_group;
  74
  75static inline struct se_hba *
  76item_to_hba(struct config_item *item)
  77{
  78        return container_of(to_config_group(item), struct se_hba, hba_group);
  79}
  80
  81/*
  82 * Attributes for /sys/kernel/config/target/
  83 */
  84static ssize_t target_core_item_version_show(struct config_item *item,
  85                char *page)
  86{
  87        return sprintf(page, "Target Engine Core ConfigFS Infrastructure %s"
  88                " on %s/%s on "UTS_RELEASE"\n", TARGET_CORE_VERSION,
  89                utsname()->sysname, utsname()->machine);
  90}
  91
  92CONFIGFS_ATTR_RO(target_core_item_, version);
  93
  94char db_root[DB_ROOT_LEN] = DB_ROOT_DEFAULT;
  95static char db_root_stage[DB_ROOT_LEN];
  96
  97static ssize_t target_core_item_dbroot_show(struct config_item *item,
  98                                            char *page)
  99{
 100        return sprintf(page, "%s\n", db_root);
 101}
 102
 103static ssize_t target_core_item_dbroot_store(struct config_item *item,
 104                                        const char *page, size_t count)
 105{
 106        ssize_t read_bytes;
 107        struct file *fp;
 108
 109        mutex_lock(&g_tf_lock);
 110        if (!list_empty(&g_tf_list)) {
 111                mutex_unlock(&g_tf_lock);
 112                pr_err("db_root: cannot be changed: target drivers registered");
 113                return -EINVAL;
 114        }
 115
 116        if (count > (DB_ROOT_LEN - 1)) {
 117                mutex_unlock(&g_tf_lock);
 118                pr_err("db_root: count %d exceeds DB_ROOT_LEN-1: %u\n",
 119                       (int)count, DB_ROOT_LEN - 1);
 120                return -EINVAL;
 121        }
 122
 123        read_bytes = snprintf(db_root_stage, DB_ROOT_LEN, "%s", page);
 124        if (!read_bytes) {
 125                mutex_unlock(&g_tf_lock);
 126                return -EINVAL;
 127        }
 128        if (db_root_stage[read_bytes - 1] == '\n')
 129                db_root_stage[read_bytes - 1] = '\0';
 130
 131        /* validate new db root before accepting it */
 132        fp = filp_open(db_root_stage, O_RDONLY, 0);
 133        if (IS_ERR(fp)) {
 134                mutex_unlock(&g_tf_lock);
 135                pr_err("db_root: cannot open: %s\n", db_root_stage);
 136                return -EINVAL;
 137        }
 138        if (!S_ISDIR(file_inode(fp)->i_mode)) {
 139                filp_close(fp, NULL);
 140                mutex_unlock(&g_tf_lock);
 141                pr_err("db_root: not a directory: %s\n", db_root_stage);
 142                return -EINVAL;
 143        }
 144        filp_close(fp, NULL);
 145
 146        strncpy(db_root, db_root_stage, read_bytes);
 147
 148        mutex_unlock(&g_tf_lock);
 149
 150        pr_debug("Target_Core_ConfigFS: db_root set to %s\n", db_root);
 151
 152        return read_bytes;
 153}
 154
 155CONFIGFS_ATTR(target_core_item_, dbroot);
 156
 157static struct target_fabric_configfs *target_core_get_fabric(
 158        const char *name)
 159{
 160        struct target_fabric_configfs *tf;
 161
 162        if (!name)
 163                return NULL;
 164
 165        mutex_lock(&g_tf_lock);
 166        list_for_each_entry(tf, &g_tf_list, tf_list) {
 167                const char *cmp_name = tf->tf_ops->fabric_alias;
 168                if (!cmp_name)
 169                        cmp_name = tf->tf_ops->fabric_name;
 170                if (!strcmp(cmp_name, name)) {
 171                        atomic_inc(&tf->tf_access_cnt);
 172                        mutex_unlock(&g_tf_lock);
 173                        return tf;
 174                }
 175        }
 176        mutex_unlock(&g_tf_lock);
 177
 178        return NULL;
 179}
 180
 181/*
 182 * Called from struct target_core_group_ops->make_group()
 183 */
 184static struct config_group *target_core_register_fabric(
 185        struct config_group *group,
 186        const char *name)
 187{
 188        struct target_fabric_configfs *tf;
 189        int ret;
 190
 191        pr_debug("Target_Core_ConfigFS: REGISTER -> group: %p name:"
 192                        " %s\n", group, name);
 193
 194        tf = target_core_get_fabric(name);
 195        if (!tf) {
 196                pr_debug("target_core_register_fabric() trying autoload for %s\n",
 197                         name);
 198
 199                /*
 200                 * Below are some hardcoded request_module() calls to automatically
 201                 * local fabric modules when the following is called:
 202                 *
 203                 * mkdir -p /sys/kernel/config/target/$MODULE_NAME
 204                 *
 205                 * Note that this does not limit which TCM fabric module can be
 206                 * registered, but simply provids auto loading logic for modules with
 207                 * mkdir(2) system calls with known TCM fabric modules.
 208                 */
 209
 210                if (!strncmp(name, "iscsi", 5)) {
 211                        /*
 212                         * Automatically load the LIO Target fabric module when the
 213                         * following is called:
 214                         *
 215                         * mkdir -p $CONFIGFS/target/iscsi
 216                         */
 217                        ret = request_module("iscsi_target_mod");
 218                        if (ret < 0) {
 219                                pr_debug("request_module() failed for"
 220                                         " iscsi_target_mod.ko: %d\n", ret);
 221                                return ERR_PTR(-EINVAL);
 222                        }
 223                } else if (!strncmp(name, "loopback", 8)) {
 224                        /*
 225                         * Automatically load the tcm_loop fabric module when the
 226                         * following is called:
 227                         *
 228                         * mkdir -p $CONFIGFS/target/loopback
 229                         */
 230                        ret = request_module("tcm_loop");
 231                        if (ret < 0) {
 232                                pr_debug("request_module() failed for"
 233                                         " tcm_loop.ko: %d\n", ret);
 234                                return ERR_PTR(-EINVAL);
 235                        }
 236                }
 237
 238                tf = target_core_get_fabric(name);
 239        }
 240
 241        if (!tf) {
 242                pr_debug("target_core_get_fabric() failed for %s\n",
 243                         name);
 244                return ERR_PTR(-EINVAL);
 245        }
 246        pr_debug("Target_Core_ConfigFS: REGISTER -> Located fabric:"
 247                        " %s\n", tf->tf_ops->fabric_name);
 248        /*
 249         * On a successful target_core_get_fabric() look, the returned
 250         * struct target_fabric_configfs *tf will contain a usage reference.
 251         */
 252        pr_debug("Target_Core_ConfigFS: REGISTER tfc_wwn_cit -> %p\n",
 253                        &tf->tf_wwn_cit);
 254
 255        config_group_init_type_name(&tf->tf_group, name, &tf->tf_wwn_cit);
 256
 257        config_group_init_type_name(&tf->tf_disc_group, "discovery_auth",
 258                        &tf->tf_discovery_cit);
 259        configfs_add_default_group(&tf->tf_disc_group, &tf->tf_group);
 260
 261        pr_debug("Target_Core_ConfigFS: REGISTER -> Allocated Fabric: %s\n",
 262                 config_item_name(&tf->tf_group.cg_item));
 263        return &tf->tf_group;
 264}
 265
 266/*
 267 * Called from struct target_core_group_ops->drop_item()
 268 */
 269static void target_core_deregister_fabric(
 270        struct config_group *group,
 271        struct config_item *item)
 272{
 273        struct target_fabric_configfs *tf = container_of(
 274                to_config_group(item), struct target_fabric_configfs, tf_group);
 275
 276        pr_debug("Target_Core_ConfigFS: DEREGISTER -> Looking up %s in"
 277                " tf list\n", config_item_name(item));
 278
 279        pr_debug("Target_Core_ConfigFS: DEREGISTER -> located fabric:"
 280                        " %s\n", tf->tf_ops->fabric_name);
 281        atomic_dec(&tf->tf_access_cnt);
 282
 283        pr_debug("Target_Core_ConfigFS: DEREGISTER -> Releasing ci"
 284                        " %s\n", config_item_name(item));
 285
 286        configfs_remove_default_groups(&tf->tf_group);
 287        config_item_put(item);
 288}
 289
 290static struct configfs_group_operations target_core_fabric_group_ops = {
 291        .make_group     = &target_core_register_fabric,
 292        .drop_item      = &target_core_deregister_fabric,
 293};
 294
 295/*
 296 * All item attributes appearing in /sys/kernel/target/ appear here.
 297 */
 298static struct configfs_attribute *target_core_fabric_item_attrs[] = {
 299        &target_core_item_attr_version,
 300        &target_core_item_attr_dbroot,
 301        NULL,
 302};
 303
 304/*
 305 * Provides Fabrics Groups and Item Attributes for /sys/kernel/config/target/
 306 */
 307static const struct config_item_type target_core_fabrics_item = {
 308        .ct_group_ops   = &target_core_fabric_group_ops,
 309        .ct_attrs       = target_core_fabric_item_attrs,
 310        .ct_owner       = THIS_MODULE,
 311};
 312
 313static struct configfs_subsystem target_core_fabrics = {
 314        .su_group = {
 315                .cg_item = {
 316                        .ci_namebuf = "target",
 317                        .ci_type = &target_core_fabrics_item,
 318                },
 319        },
 320};
 321
 322int target_depend_item(struct config_item *item)
 323{
 324        return configfs_depend_item(&target_core_fabrics, item);
 325}
 326EXPORT_SYMBOL(target_depend_item);
 327
 328void target_undepend_item(struct config_item *item)
 329{
 330        return configfs_undepend_item(item);
 331}
 332EXPORT_SYMBOL(target_undepend_item);
 333
 334/*##############################################################################
 335// Start functions called by external Target Fabrics Modules
 336//############################################################################*/
 337
 338static int target_fabric_tf_ops_check(const struct target_core_fabric_ops *tfo)
 339{
 340        if (tfo->fabric_alias) {
 341                if (strlen(tfo->fabric_alias) >= TARGET_FABRIC_NAME_SIZE) {
 342                        pr_err("Passed alias: %s exceeds "
 343                                "TARGET_FABRIC_NAME_SIZE\n", tfo->fabric_alias);
 344                        return -EINVAL;
 345                }
 346        }
 347        if (!tfo->fabric_name) {
 348                pr_err("Missing tfo->fabric_name\n");
 349                return -EINVAL;
 350        }
 351        if (strlen(tfo->fabric_name) >= TARGET_FABRIC_NAME_SIZE) {
 352                pr_err("Passed name: %s exceeds "
 353                        "TARGET_FABRIC_NAME_SIZE\n", tfo->fabric_name);
 354                return -EINVAL;
 355        }
 356        if (!tfo->tpg_get_wwn) {
 357                pr_err("Missing tfo->tpg_get_wwn()\n");
 358                return -EINVAL;
 359        }
 360        if (!tfo->tpg_get_tag) {
 361                pr_err("Missing tfo->tpg_get_tag()\n");
 362                return -EINVAL;
 363        }
 364        if (!tfo->tpg_check_demo_mode) {
 365                pr_err("Missing tfo->tpg_check_demo_mode()\n");
 366                return -EINVAL;
 367        }
 368        if (!tfo->tpg_check_demo_mode_cache) {
 369                pr_err("Missing tfo->tpg_check_demo_mode_cache()\n");
 370                return -EINVAL;
 371        }
 372        if (!tfo->tpg_check_demo_mode_write_protect) {
 373                pr_err("Missing tfo->tpg_check_demo_mode_write_protect()\n");
 374                return -EINVAL;
 375        }
 376        if (!tfo->tpg_check_prod_mode_write_protect) {
 377                pr_err("Missing tfo->tpg_check_prod_mode_write_protect()\n");
 378                return -EINVAL;
 379        }
 380        if (!tfo->tpg_get_inst_index) {
 381                pr_err("Missing tfo->tpg_get_inst_index()\n");
 382                return -EINVAL;
 383        }
 384        if (!tfo->release_cmd) {
 385                pr_err("Missing tfo->release_cmd()\n");
 386                return -EINVAL;
 387        }
 388        if (!tfo->sess_get_index) {
 389                pr_err("Missing tfo->sess_get_index()\n");
 390                return -EINVAL;
 391        }
 392        if (!tfo->write_pending) {
 393                pr_err("Missing tfo->write_pending()\n");
 394                return -EINVAL;
 395        }
 396        if (!tfo->set_default_node_attributes) {
 397                pr_err("Missing tfo->set_default_node_attributes()\n");
 398                return -EINVAL;
 399        }
 400        if (!tfo->get_cmd_state) {
 401                pr_err("Missing tfo->get_cmd_state()\n");
 402                return -EINVAL;
 403        }
 404        if (!tfo->queue_data_in) {
 405                pr_err("Missing tfo->queue_data_in()\n");
 406                return -EINVAL;
 407        }
 408        if (!tfo->queue_status) {
 409                pr_err("Missing tfo->queue_status()\n");
 410                return -EINVAL;
 411        }
 412        if (!tfo->queue_tm_rsp) {
 413                pr_err("Missing tfo->queue_tm_rsp()\n");
 414                return -EINVAL;
 415        }
 416        if (!tfo->aborted_task) {
 417                pr_err("Missing tfo->aborted_task()\n");
 418                return -EINVAL;
 419        }
 420        if (!tfo->check_stop_free) {
 421                pr_err("Missing tfo->check_stop_free()\n");
 422                return -EINVAL;
 423        }
 424        /*
 425         * We at least require tfo->fabric_make_wwn(), tfo->fabric_drop_wwn()
 426         * tfo->fabric_make_tpg() and tfo->fabric_drop_tpg() in
 427         * target_core_fabric_configfs.c WWN+TPG group context code.
 428         */
 429        if (!tfo->fabric_make_wwn) {
 430                pr_err("Missing tfo->fabric_make_wwn()\n");
 431                return -EINVAL;
 432        }
 433        if (!tfo->fabric_drop_wwn) {
 434                pr_err("Missing tfo->fabric_drop_wwn()\n");
 435                return -EINVAL;
 436        }
 437        if (!tfo->fabric_make_tpg) {
 438                pr_err("Missing tfo->fabric_make_tpg()\n");
 439                return -EINVAL;
 440        }
 441        if (!tfo->fabric_drop_tpg) {
 442                pr_err("Missing tfo->fabric_drop_tpg()\n");
 443                return -EINVAL;
 444        }
 445
 446        return 0;
 447}
 448
 449int target_register_template(const struct target_core_fabric_ops *fo)
 450{
 451        struct target_fabric_configfs *tf;
 452        int ret;
 453
 454        ret = target_fabric_tf_ops_check(fo);
 455        if (ret)
 456                return ret;
 457
 458        tf = kzalloc(sizeof(struct target_fabric_configfs), GFP_KERNEL);
 459        if (!tf) {
 460                pr_err("%s: could not allocate memory!\n", __func__);
 461                return -ENOMEM;
 462        }
 463
 464        INIT_LIST_HEAD(&tf->tf_list);
 465        atomic_set(&tf->tf_access_cnt, 0);
 466        tf->tf_ops = fo;
 467        target_fabric_setup_cits(tf);
 468
 469        mutex_lock(&g_tf_lock);
 470        list_add_tail(&tf->tf_list, &g_tf_list);
 471        mutex_unlock(&g_tf_lock);
 472
 473        return 0;
 474}
 475EXPORT_SYMBOL(target_register_template);
 476
 477void target_unregister_template(const struct target_core_fabric_ops *fo)
 478{
 479        struct target_fabric_configfs *t;
 480
 481        mutex_lock(&g_tf_lock);
 482        list_for_each_entry(t, &g_tf_list, tf_list) {
 483                if (!strcmp(t->tf_ops->fabric_name, fo->fabric_name)) {
 484                        BUG_ON(atomic_read(&t->tf_access_cnt));
 485                        list_del(&t->tf_list);
 486                        mutex_unlock(&g_tf_lock);
 487                        /*
 488                         * Wait for any outstanding fabric se_deve_entry->rcu_head
 489                         * callbacks to complete post kfree_rcu(), before allowing
 490                         * fabric driver unload of TFO->module to proceed.
 491                         */
 492                        rcu_barrier();
 493                        kfree(t);
 494                        return;
 495                }
 496        }
 497        mutex_unlock(&g_tf_lock);
 498}
 499EXPORT_SYMBOL(target_unregister_template);
 500
 501/*##############################################################################
 502// Stop functions called by external Target Fabrics Modules
 503//############################################################################*/
 504
 505static inline struct se_dev_attrib *to_attrib(struct config_item *item)
 506{
 507        return container_of(to_config_group(item), struct se_dev_attrib,
 508                        da_group);
 509}
 510
 511/* Start functions for struct config_item_type tb_dev_attrib_cit */
 512#define DEF_CONFIGFS_ATTRIB_SHOW(_name)                                 \
 513static ssize_t _name##_show(struct config_item *item, char *page)       \
 514{                                                                       \
 515        return snprintf(page, PAGE_SIZE, "%u\n", to_attrib(item)->_name); \
 516}
 517
 518DEF_CONFIGFS_ATTRIB_SHOW(emulate_model_alias);
 519DEF_CONFIGFS_ATTRIB_SHOW(emulate_dpo);
 520DEF_CONFIGFS_ATTRIB_SHOW(emulate_fua_write);
 521DEF_CONFIGFS_ATTRIB_SHOW(emulate_fua_read);
 522DEF_CONFIGFS_ATTRIB_SHOW(emulate_write_cache);
 523DEF_CONFIGFS_ATTRIB_SHOW(emulate_ua_intlck_ctrl);
 524DEF_CONFIGFS_ATTRIB_SHOW(emulate_tas);
 525DEF_CONFIGFS_ATTRIB_SHOW(emulate_tpu);
 526DEF_CONFIGFS_ATTRIB_SHOW(emulate_tpws);
 527DEF_CONFIGFS_ATTRIB_SHOW(emulate_caw);
 528DEF_CONFIGFS_ATTRIB_SHOW(emulate_3pc);
 529DEF_CONFIGFS_ATTRIB_SHOW(emulate_pr);
 530DEF_CONFIGFS_ATTRIB_SHOW(pi_prot_type);
 531DEF_CONFIGFS_ATTRIB_SHOW(hw_pi_prot_type);
 532DEF_CONFIGFS_ATTRIB_SHOW(pi_prot_verify);
 533DEF_CONFIGFS_ATTRIB_SHOW(enforce_pr_isids);
 534DEF_CONFIGFS_ATTRIB_SHOW(is_nonrot);
 535DEF_CONFIGFS_ATTRIB_SHOW(emulate_rest_reord);
 536DEF_CONFIGFS_ATTRIB_SHOW(force_pr_aptpl);
 537DEF_CONFIGFS_ATTRIB_SHOW(hw_block_size);
 538DEF_CONFIGFS_ATTRIB_SHOW(block_size);
 539DEF_CONFIGFS_ATTRIB_SHOW(hw_max_sectors);
 540DEF_CONFIGFS_ATTRIB_SHOW(optimal_sectors);
 541DEF_CONFIGFS_ATTRIB_SHOW(hw_queue_depth);
 542DEF_CONFIGFS_ATTRIB_SHOW(queue_depth);
 543DEF_CONFIGFS_ATTRIB_SHOW(max_unmap_lba_count);
 544DEF_CONFIGFS_ATTRIB_SHOW(max_unmap_block_desc_count);
 545DEF_CONFIGFS_ATTRIB_SHOW(unmap_granularity);
 546DEF_CONFIGFS_ATTRIB_SHOW(unmap_granularity_alignment);
 547DEF_CONFIGFS_ATTRIB_SHOW(unmap_zeroes_data);
 548DEF_CONFIGFS_ATTRIB_SHOW(max_write_same_len);
 549
 550#define DEF_CONFIGFS_ATTRIB_STORE_U32(_name)                            \
 551static ssize_t _name##_store(struct config_item *item, const char *page,\
 552                size_t count)                                           \
 553{                                                                       \
 554        struct se_dev_attrib *da = to_attrib(item);                     \
 555        u32 val;                                                        \
 556        int ret;                                                        \
 557                                                                        \
 558        ret = kstrtou32(page, 0, &val);                                 \
 559        if (ret < 0)                                                    \
 560                return ret;                                             \
 561        da->_name = val;                                                \
 562        return count;                                                   \
 563}
 564
 565DEF_CONFIGFS_ATTRIB_STORE_U32(max_unmap_lba_count);
 566DEF_CONFIGFS_ATTRIB_STORE_U32(max_unmap_block_desc_count);
 567DEF_CONFIGFS_ATTRIB_STORE_U32(unmap_granularity);
 568DEF_CONFIGFS_ATTRIB_STORE_U32(unmap_granularity_alignment);
 569DEF_CONFIGFS_ATTRIB_STORE_U32(max_write_same_len);
 570
 571#define DEF_CONFIGFS_ATTRIB_STORE_BOOL(_name)                           \
 572static ssize_t _name##_store(struct config_item *item, const char *page,        \
 573                size_t count)                                           \
 574{                                                                       \
 575        struct se_dev_attrib *da = to_attrib(item);                     \
 576        bool flag;                                                      \
 577        int ret;                                                        \
 578                                                                        \
 579        ret = strtobool(page, &flag);                                   \
 580        if (ret < 0)                                                    \
 581                return ret;                                             \
 582        da->_name = flag;                                               \
 583        return count;                                                   \
 584}
 585
 586DEF_CONFIGFS_ATTRIB_STORE_BOOL(emulate_fua_write);
 587DEF_CONFIGFS_ATTRIB_STORE_BOOL(emulate_caw);
 588DEF_CONFIGFS_ATTRIB_STORE_BOOL(emulate_3pc);
 589DEF_CONFIGFS_ATTRIB_STORE_BOOL(emulate_pr);
 590DEF_CONFIGFS_ATTRIB_STORE_BOOL(enforce_pr_isids);
 591DEF_CONFIGFS_ATTRIB_STORE_BOOL(is_nonrot);
 592
 593#define DEF_CONFIGFS_ATTRIB_STORE_STUB(_name)                           \
 594static ssize_t _name##_store(struct config_item *item, const char *page,\
 595                size_t count)                                           \
 596{                                                                       \
 597        printk_once(KERN_WARNING                                        \
 598                "ignoring deprecated %s attribute\n",                   \
 599                __stringify(_name));                                    \
 600        return count;                                                   \
 601}
 602
 603DEF_CONFIGFS_ATTRIB_STORE_STUB(emulate_dpo);
 604DEF_CONFIGFS_ATTRIB_STORE_STUB(emulate_fua_read);
 605
 606static void dev_set_t10_wwn_model_alias(struct se_device *dev)
 607{
 608        const char *configname;
 609
 610        configname = config_item_name(&dev->dev_group.cg_item);
 611        if (strlen(configname) >= INQUIRY_MODEL_LEN) {
 612                pr_warn("dev[%p]: Backstore name '%s' is too long for "
 613                        "INQUIRY_MODEL, truncating to 15 characters\n", dev,
 614                        configname);
 615        }
 616        /*
 617         * XXX We can't use sizeof(dev->t10_wwn.model) (INQUIRY_MODEL_LEN + 1)
 618         * here without potentially breaking existing setups, so continue to
 619         * truncate one byte shorter than what can be carried in INQUIRY.
 620         */
 621        strlcpy(dev->t10_wwn.model, configname, INQUIRY_MODEL_LEN);
 622}
 623
 624static ssize_t emulate_model_alias_store(struct config_item *item,
 625                const char *page, size_t count)
 626{
 627        struct se_dev_attrib *da = to_attrib(item);
 628        struct se_device *dev = da->da_dev;
 629        bool flag;
 630        int ret;
 631
 632        if (dev->export_count) {
 633                pr_err("dev[%p]: Unable to change model alias"
 634                        " while export_count is %d\n",
 635                        dev, dev->export_count);
 636                return -EINVAL;
 637        }
 638
 639        ret = strtobool(page, &flag);
 640        if (ret < 0)
 641                return ret;
 642
 643        BUILD_BUG_ON(sizeof(dev->t10_wwn.model) != INQUIRY_MODEL_LEN + 1);
 644        if (flag) {
 645                dev_set_t10_wwn_model_alias(dev);
 646        } else {
 647                strlcpy(dev->t10_wwn.model, dev->transport->inquiry_prod,
 648                        sizeof(dev->t10_wwn.model));
 649        }
 650        da->emulate_model_alias = flag;
 651        return count;
 652}
 653
 654static ssize_t emulate_write_cache_store(struct config_item *item,
 655                const char *page, size_t count)
 656{
 657        struct se_dev_attrib *da = to_attrib(item);
 658        bool flag;
 659        int ret;
 660
 661        ret = strtobool(page, &flag);
 662        if (ret < 0)
 663                return ret;
 664
 665        if (flag && da->da_dev->transport->get_write_cache) {
 666                pr_err("emulate_write_cache not supported for this device\n");
 667                return -EINVAL;
 668        }
 669
 670        da->emulate_write_cache = flag;
 671        pr_debug("dev[%p]: SE Device WRITE_CACHE_EMULATION flag: %d\n",
 672                        da->da_dev, flag);
 673        return count;
 674}
 675
 676static ssize_t emulate_ua_intlck_ctrl_store(struct config_item *item,
 677                const char *page, size_t count)
 678{
 679        struct se_dev_attrib *da = to_attrib(item);
 680        u32 val;
 681        int ret;
 682
 683        ret = kstrtou32(page, 0, &val);
 684        if (ret < 0)
 685                return ret;
 686
 687        if (val != TARGET_UA_INTLCK_CTRL_CLEAR
 688         && val != TARGET_UA_INTLCK_CTRL_NO_CLEAR
 689         && val != TARGET_UA_INTLCK_CTRL_ESTABLISH_UA) {
 690                pr_err("Illegal value %d\n", val);
 691                return -EINVAL;
 692        }
 693
 694        if (da->da_dev->export_count) {
 695                pr_err("dev[%p]: Unable to change SE Device"
 696                        " UA_INTRLCK_CTRL while export_count is %d\n",
 697                        da->da_dev, da->da_dev->export_count);
 698                return -EINVAL;
 699        }
 700        da->emulate_ua_intlck_ctrl = val;
 701        pr_debug("dev[%p]: SE Device UA_INTRLCK_CTRL flag: %d\n",
 702                da->da_dev, val);
 703        return count;
 704}
 705
 706static ssize_t emulate_tas_store(struct config_item *item,
 707                const char *page, size_t count)
 708{
 709        struct se_dev_attrib *da = to_attrib(item);
 710        bool flag;
 711        int ret;
 712
 713        ret = strtobool(page, &flag);
 714        if (ret < 0)
 715                return ret;
 716
 717        if (da->da_dev->export_count) {
 718                pr_err("dev[%p]: Unable to change SE Device TAS while"
 719                        " export_count is %d\n",
 720                        da->da_dev, da->da_dev->export_count);
 721                return -EINVAL;
 722        }
 723        da->emulate_tas = flag;
 724        pr_debug("dev[%p]: SE Device TASK_ABORTED status bit: %s\n",
 725                da->da_dev, flag ? "Enabled" : "Disabled");
 726
 727        return count;
 728}
 729
 730static ssize_t emulate_tpu_store(struct config_item *item,
 731                const char *page, size_t count)
 732{
 733        struct se_dev_attrib *da = to_attrib(item);
 734        bool flag;
 735        int ret;
 736
 737        ret = strtobool(page, &flag);
 738        if (ret < 0)
 739                return ret;
 740
 741        /*
 742         * We expect this value to be non-zero when generic Block Layer
 743         * Discard supported is detected iblock_create_virtdevice().
 744         */
 745        if (flag && !da->max_unmap_block_desc_count) {
 746                pr_err("Generic Block Discard not supported\n");
 747                return -ENOSYS;
 748        }
 749
 750        da->emulate_tpu = flag;
 751        pr_debug("dev[%p]: SE Device Thin Provisioning UNMAP bit: %d\n",
 752                da->da_dev, flag);
 753        return count;
 754}
 755
 756static ssize_t emulate_tpws_store(struct config_item *item,
 757                const char *page, size_t count)
 758{
 759        struct se_dev_attrib *da = to_attrib(item);
 760        bool flag;
 761        int ret;
 762
 763        ret = strtobool(page, &flag);
 764        if (ret < 0)
 765                return ret;
 766
 767        /*
 768         * We expect this value to be non-zero when generic Block Layer
 769         * Discard supported is detected iblock_create_virtdevice().
 770         */
 771        if (flag && !da->max_unmap_block_desc_count) {
 772                pr_err("Generic Block Discard not supported\n");
 773                return -ENOSYS;
 774        }
 775
 776        da->emulate_tpws = flag;
 777        pr_debug("dev[%p]: SE Device Thin Provisioning WRITE_SAME: %d\n",
 778                                da->da_dev, flag);
 779        return count;
 780}
 781
 782static ssize_t pi_prot_type_store(struct config_item *item,
 783                const char *page, size_t count)
 784{
 785        struct se_dev_attrib *da = to_attrib(item);
 786        int old_prot = da->pi_prot_type, ret;
 787        struct se_device *dev = da->da_dev;
 788        u32 flag;
 789
 790        ret = kstrtou32(page, 0, &flag);
 791        if (ret < 0)
 792                return ret;
 793
 794        if (flag != 0 && flag != 1 && flag != 2 && flag != 3) {
 795                pr_err("Illegal value %d for pi_prot_type\n", flag);
 796                return -EINVAL;
 797        }
 798        if (flag == 2) {
 799                pr_err("DIF TYPE2 protection currently not supported\n");
 800                return -ENOSYS;
 801        }
 802        if (da->hw_pi_prot_type) {
 803                pr_warn("DIF protection enabled on underlying hardware,"
 804                        " ignoring\n");
 805                return count;
 806        }
 807        if (!dev->transport->init_prot || !dev->transport->free_prot) {
 808                /* 0 is only allowed value for non-supporting backends */
 809                if (flag == 0)
 810                        return count;
 811
 812                pr_err("DIF protection not supported by backend: %s\n",
 813                       dev->transport->name);
 814                return -ENOSYS;
 815        }
 816        if (!target_dev_configured(dev)) {
 817                pr_err("DIF protection requires device to be configured\n");
 818                return -ENODEV;
 819        }
 820        if (dev->export_count) {
 821                pr_err("dev[%p]: Unable to change SE Device PROT type while"
 822                       " export_count is %d\n", dev, dev->export_count);
 823                return -EINVAL;
 824        }
 825
 826        da->pi_prot_type = flag;
 827
 828        if (flag && !old_prot) {
 829                ret = dev->transport->init_prot(dev);
 830                if (ret) {
 831                        da->pi_prot_type = old_prot;
 832                        da->pi_prot_verify = (bool) da->pi_prot_type;
 833                        return ret;
 834                }
 835
 836        } else if (!flag && old_prot) {
 837                dev->transport->free_prot(dev);
 838        }
 839
 840        da->pi_prot_verify = (bool) da->pi_prot_type;
 841        pr_debug("dev[%p]: SE Device Protection Type: %d\n", dev, flag);
 842        return count;
 843}
 844
 845/* always zero, but attr needs to remain RW to avoid userspace breakage */
 846static ssize_t pi_prot_format_show(struct config_item *item, char *page)
 847{
 848        return snprintf(page, PAGE_SIZE, "0\n");
 849}
 850
 851static ssize_t pi_prot_format_store(struct config_item *item,
 852                const char *page, size_t count)
 853{
 854        struct se_dev_attrib *da = to_attrib(item);
 855        struct se_device *dev = da->da_dev;
 856        bool flag;
 857        int ret;
 858
 859        ret = strtobool(page, &flag);
 860        if (ret < 0)
 861                return ret;
 862
 863        if (!flag)
 864                return count;
 865
 866        if (!dev->transport->format_prot) {
 867                pr_err("DIF protection format not supported by backend %s\n",
 868                       dev->transport->name);
 869                return -ENOSYS;
 870        }
 871        if (!target_dev_configured(dev)) {
 872                pr_err("DIF protection format requires device to be configured\n");
 873                return -ENODEV;
 874        }
 875        if (dev->export_count) {
 876                pr_err("dev[%p]: Unable to format SE Device PROT type while"
 877                       " export_count is %d\n", dev, dev->export_count);
 878                return -EINVAL;
 879        }
 880
 881        ret = dev->transport->format_prot(dev);
 882        if (ret)
 883                return ret;
 884
 885        pr_debug("dev[%p]: SE Device Protection Format complete\n", dev);
 886        return count;
 887}
 888
 889static ssize_t pi_prot_verify_store(struct config_item *item,
 890                const char *page, size_t count)
 891{
 892        struct se_dev_attrib *da = to_attrib(item);
 893        bool flag;
 894        int ret;
 895
 896        ret = strtobool(page, &flag);
 897        if (ret < 0)
 898                return ret;
 899
 900        if (!flag) {
 901                da->pi_prot_verify = flag;
 902                return count;
 903        }
 904        if (da->hw_pi_prot_type) {
 905                pr_warn("DIF protection enabled on underlying hardware,"
 906                        " ignoring\n");
 907                return count;
 908        }
 909        if (!da->pi_prot_type) {
 910                pr_warn("DIF protection not supported by backend, ignoring\n");
 911                return count;
 912        }
 913        da->pi_prot_verify = flag;
 914
 915        return count;
 916}
 917
 918static ssize_t force_pr_aptpl_store(struct config_item *item,
 919                const char *page, size_t count)
 920{
 921        struct se_dev_attrib *da = to_attrib(item);
 922        bool flag;
 923        int ret;
 924
 925        ret = strtobool(page, &flag);
 926        if (ret < 0)
 927                return ret;
 928        if (da->da_dev->export_count) {
 929                pr_err("dev[%p]: Unable to set force_pr_aptpl while"
 930                       " export_count is %d\n",
 931                       da->da_dev, da->da_dev->export_count);
 932                return -EINVAL;
 933        }
 934
 935        da->force_pr_aptpl = flag;
 936        pr_debug("dev[%p]: SE Device force_pr_aptpl: %d\n", da->da_dev, flag);
 937        return count;
 938}
 939
 940static ssize_t emulate_rest_reord_store(struct config_item *item,
 941                const char *page, size_t count)
 942{
 943        struct se_dev_attrib *da = to_attrib(item);
 944        bool flag;
 945        int ret;
 946
 947        ret = strtobool(page, &flag);
 948        if (ret < 0)
 949                return ret;
 950
 951        if (flag != 0) {
 952                printk(KERN_ERR "dev[%p]: SE Device emulation of restricted"
 953                        " reordering not implemented\n", da->da_dev);
 954                return -ENOSYS;
 955        }
 956        da->emulate_rest_reord = flag;
 957        pr_debug("dev[%p]: SE Device emulate_rest_reord: %d\n",
 958                da->da_dev, flag);
 959        return count;
 960}
 961
 962static ssize_t unmap_zeroes_data_store(struct config_item *item,
 963                const char *page, size_t count)
 964{
 965        struct se_dev_attrib *da = to_attrib(item);
 966        bool flag;
 967        int ret;
 968
 969        ret = strtobool(page, &flag);
 970        if (ret < 0)
 971                return ret;
 972
 973        if (da->da_dev->export_count) {
 974                pr_err("dev[%p]: Unable to change SE Device"
 975                       " unmap_zeroes_data while export_count is %d\n",
 976                       da->da_dev, da->da_dev->export_count);
 977                return -EINVAL;
 978        }
 979        /*
 980         * We expect this value to be non-zero when generic Block Layer
 981         * Discard supported is detected iblock_configure_device().
 982         */
 983        if (flag && !da->max_unmap_block_desc_count) {
 984                pr_err("dev[%p]: Thin Provisioning LBPRZ will not be set"
 985                       " because max_unmap_block_desc_count is zero\n",
 986                       da->da_dev);
 987                return -ENOSYS;
 988        }
 989        da->unmap_zeroes_data = flag;
 990        pr_debug("dev[%p]: SE Device Thin Provisioning LBPRZ bit: %d\n",
 991                 da->da_dev, flag);
 992        return count;
 993}
 994
 995/*
 996 * Note, this can only be called on unexported SE Device Object.
 997 */
 998static ssize_t queue_depth_store(struct config_item *item,
 999                const char *page, size_t count)
1000{
1001        struct se_dev_attrib *da = to_attrib(item);
1002        struct se_device *dev = da->da_dev;
1003        u32 val;
1004        int ret;
1005
1006        ret = kstrtou32(page, 0, &val);
1007        if (ret < 0)
1008                return ret;
1009
1010        if (dev->export_count) {
1011                pr_err("dev[%p]: Unable to change SE Device TCQ while"
1012                        " export_count is %d\n",
1013                        dev, dev->export_count);
1014                return -EINVAL;
1015        }
1016        if (!val) {
1017                pr_err("dev[%p]: Illegal ZERO value for queue_depth\n", dev);
1018                return -EINVAL;
1019        }
1020
1021        if (val > dev->dev_attrib.queue_depth) {
1022                if (val > dev->dev_attrib.hw_queue_depth) {
1023                        pr_err("dev[%p]: Passed queue_depth:"
1024                                " %u exceeds TCM/SE_Device MAX"
1025                                " TCQ: %u\n", dev, val,
1026                                dev->dev_attrib.hw_queue_depth);
1027                        return -EINVAL;
1028                }
1029        }
1030        da->queue_depth = dev->queue_depth = val;
1031        pr_debug("dev[%p]: SE Device TCQ Depth changed to: %u\n", dev, val);
1032        return count;
1033}
1034
1035static ssize_t optimal_sectors_store(struct config_item *item,
1036                const char *page, size_t count)
1037{
1038        struct se_dev_attrib *da = to_attrib(item);
1039        u32 val;
1040        int ret;
1041
1042        ret = kstrtou32(page, 0, &val);
1043        if (ret < 0)
1044                return ret;
1045
1046        if (da->da_dev->export_count) {
1047                pr_err("dev[%p]: Unable to change SE Device"
1048                        " optimal_sectors while export_count is %d\n",
1049                        da->da_dev, da->da_dev->export_count);
1050                return -EINVAL;
1051        }
1052        if (val > da->hw_max_sectors) {
1053                pr_err("dev[%p]: Passed optimal_sectors %u cannot be"
1054                        " greater than hw_max_sectors: %u\n",
1055                        da->da_dev, val, da->hw_max_sectors);
1056                return -EINVAL;
1057        }
1058
1059        da->optimal_sectors = val;
1060        pr_debug("dev[%p]: SE Device optimal_sectors changed to %u\n",
1061                        da->da_dev, val);
1062        return count;
1063}
1064
1065static ssize_t block_size_store(struct config_item *item,
1066                const char *page, size_t count)
1067{
1068        struct se_dev_attrib *da = to_attrib(item);
1069        u32 val;
1070        int ret;
1071
1072        ret = kstrtou32(page, 0, &val);
1073        if (ret < 0)
1074                return ret;
1075
1076        if (da->da_dev->export_count) {
1077                pr_err("dev[%p]: Unable to change SE Device block_size"
1078                        " while export_count is %d\n",
1079                        da->da_dev, da->da_dev->export_count);
1080                return -EINVAL;
1081        }
1082
1083        if (val != 512 && val != 1024 && val != 2048 && val != 4096) {
1084                pr_err("dev[%p]: Illegal value for block_device: %u"
1085                        " for SE device, must be 512, 1024, 2048 or 4096\n",
1086                        da->da_dev, val);
1087                return -EINVAL;
1088        }
1089
1090        da->block_size = val;
1091        if (da->max_bytes_per_io)
1092                da->hw_max_sectors = da->max_bytes_per_io / val;
1093
1094        pr_debug("dev[%p]: SE Device block_size changed to %u\n",
1095                        da->da_dev, val);
1096        return count;
1097}
1098
1099static ssize_t alua_support_show(struct config_item *item, char *page)
1100{
1101        struct se_dev_attrib *da = to_attrib(item);
1102        u8 flags = da->da_dev->transport_flags;
1103
1104        return snprintf(page, PAGE_SIZE, "%d\n",
1105                        flags & TRANSPORT_FLAG_PASSTHROUGH_ALUA ? 0 : 1);
1106}
1107
1108static ssize_t alua_support_store(struct config_item *item,
1109                const char *page, size_t count)
1110{
1111        struct se_dev_attrib *da = to_attrib(item);
1112        struct se_device *dev = da->da_dev;
1113        bool flag;
1114        int ret;
1115
1116        if (!(dev->transport->transport_flags_changeable &
1117              TRANSPORT_FLAG_PASSTHROUGH_ALUA)) {
1118                pr_err("dev[%p]: Unable to change SE Device alua_support:"
1119                        " alua_support has fixed value\n", dev);
1120                return -EINVAL;
1121        }
1122
1123        ret = strtobool(page, &flag);
1124        if (ret < 0)
1125                return ret;
1126
1127        if (flag)
1128                dev->transport_flags &= ~TRANSPORT_FLAG_PASSTHROUGH_ALUA;
1129        else
1130                dev->transport_flags |= TRANSPORT_FLAG_PASSTHROUGH_ALUA;
1131        return count;
1132}
1133
1134static ssize_t pgr_support_show(struct config_item *item, char *page)
1135{
1136        struct se_dev_attrib *da = to_attrib(item);
1137        u8 flags = da->da_dev->transport_flags;
1138
1139        return snprintf(page, PAGE_SIZE, "%d\n",
1140                        flags & TRANSPORT_FLAG_PASSTHROUGH_PGR ? 0 : 1);
1141}
1142
1143static ssize_t pgr_support_store(struct config_item *item,
1144                const char *page, size_t count)
1145{
1146        struct se_dev_attrib *da = to_attrib(item);
1147        struct se_device *dev = da->da_dev;
1148        bool flag;
1149        int ret;
1150
1151        if (!(dev->transport->transport_flags_changeable &
1152              TRANSPORT_FLAG_PASSTHROUGH_PGR)) {
1153                pr_err("dev[%p]: Unable to change SE Device pgr_support:"
1154                        " pgr_support has fixed value\n", dev);
1155                return -EINVAL;
1156        }
1157
1158        ret = strtobool(page, &flag);
1159        if (ret < 0)
1160                return ret;
1161
1162        if (flag)
1163                dev->transport_flags &= ~TRANSPORT_FLAG_PASSTHROUGH_PGR;
1164        else
1165                dev->transport_flags |= TRANSPORT_FLAG_PASSTHROUGH_PGR;
1166        return count;
1167}
1168
1169CONFIGFS_ATTR(, emulate_model_alias);
1170CONFIGFS_ATTR(, emulate_dpo);
1171CONFIGFS_ATTR(, emulate_fua_write);
1172CONFIGFS_ATTR(, emulate_fua_read);
1173CONFIGFS_ATTR(, emulate_write_cache);
1174CONFIGFS_ATTR(, emulate_ua_intlck_ctrl);
1175CONFIGFS_ATTR(, emulate_tas);
1176CONFIGFS_ATTR(, emulate_tpu);
1177CONFIGFS_ATTR(, emulate_tpws);
1178CONFIGFS_ATTR(, emulate_caw);
1179CONFIGFS_ATTR(, emulate_3pc);
1180CONFIGFS_ATTR(, emulate_pr);
1181CONFIGFS_ATTR(, pi_prot_type);
1182CONFIGFS_ATTR_RO(, hw_pi_prot_type);
1183CONFIGFS_ATTR(, pi_prot_format);
1184CONFIGFS_ATTR(, pi_prot_verify);
1185CONFIGFS_ATTR(, enforce_pr_isids);
1186CONFIGFS_ATTR(, is_nonrot);
1187CONFIGFS_ATTR(, emulate_rest_reord);
1188CONFIGFS_ATTR(, force_pr_aptpl);
1189CONFIGFS_ATTR_RO(, hw_block_size);
1190CONFIGFS_ATTR(, block_size);
1191CONFIGFS_ATTR_RO(, hw_max_sectors);
1192CONFIGFS_ATTR(, optimal_sectors);
1193CONFIGFS_ATTR_RO(, hw_queue_depth);
1194CONFIGFS_ATTR(, queue_depth);
1195CONFIGFS_ATTR(, max_unmap_lba_count);
1196CONFIGFS_ATTR(, max_unmap_block_desc_count);
1197CONFIGFS_ATTR(, unmap_granularity);
1198CONFIGFS_ATTR(, unmap_granularity_alignment);
1199CONFIGFS_ATTR(, unmap_zeroes_data);
1200CONFIGFS_ATTR(, max_write_same_len);
1201CONFIGFS_ATTR(, alua_support);
1202CONFIGFS_ATTR(, pgr_support);
1203
1204/*
1205 * dev_attrib attributes for devices using the target core SBC/SPC
1206 * interpreter.  Any backend using spc_parse_cdb should be using
1207 * these.
1208 */
1209struct configfs_attribute *sbc_attrib_attrs[] = {
1210        &attr_emulate_model_alias,
1211        &attr_emulate_dpo,
1212        &attr_emulate_fua_write,
1213        &attr_emulate_fua_read,
1214        &attr_emulate_write_cache,
1215        &attr_emulate_ua_intlck_ctrl,
1216        &attr_emulate_tas,
1217        &attr_emulate_tpu,
1218        &attr_emulate_tpws,
1219        &attr_emulate_caw,
1220        &attr_emulate_3pc,
1221        &attr_emulate_pr,
1222        &attr_pi_prot_type,
1223        &attr_hw_pi_prot_type,
1224        &attr_pi_prot_format,
1225        &attr_pi_prot_verify,
1226        &attr_enforce_pr_isids,
1227        &attr_is_nonrot,
1228        &attr_emulate_rest_reord,
1229        &attr_force_pr_aptpl,
1230        &attr_hw_block_size,
1231        &attr_block_size,
1232        &attr_hw_max_sectors,
1233        &attr_optimal_sectors,
1234        &attr_hw_queue_depth,
1235        &attr_queue_depth,
1236        &attr_max_unmap_lba_count,
1237        &attr_max_unmap_block_desc_count,
1238        &attr_unmap_granularity,
1239        &attr_unmap_granularity_alignment,
1240        &attr_unmap_zeroes_data,
1241        &attr_max_write_same_len,
1242        &attr_alua_support,
1243        &attr_pgr_support,
1244        NULL,
1245};
1246EXPORT_SYMBOL(sbc_attrib_attrs);
1247
1248/*
1249 * Minimal dev_attrib attributes for devices passing through CDBs.
1250 * In this case we only provide a few read-only attributes for
1251 * backwards compatibility.
1252 */
1253struct configfs_attribute *passthrough_attrib_attrs[] = {
1254        &attr_hw_pi_prot_type,
1255        &attr_hw_block_size,
1256        &attr_hw_max_sectors,
1257        &attr_hw_queue_depth,
1258        &attr_emulate_pr,
1259        &attr_alua_support,
1260        &attr_pgr_support,
1261        NULL,
1262};
1263EXPORT_SYMBOL(passthrough_attrib_attrs);
1264
1265/*
1266 * pr related dev_attrib attributes for devices passing through CDBs,
1267 * but allowing in core pr emulation.
1268 */
1269struct configfs_attribute *passthrough_pr_attrib_attrs[] = {
1270        &attr_enforce_pr_isids,
1271        &attr_force_pr_aptpl,
1272        NULL,
1273};
1274EXPORT_SYMBOL(passthrough_pr_attrib_attrs);
1275
1276TB_CIT_SETUP_DRV(dev_attrib, NULL, NULL);
1277TB_CIT_SETUP_DRV(dev_action, NULL, NULL);
1278
1279/* End functions for struct config_item_type tb_dev_attrib_cit */
1280
1281/*  Start functions for struct config_item_type tb_dev_wwn_cit */
1282
1283static struct t10_wwn *to_t10_wwn(struct config_item *item)
1284{
1285        return container_of(to_config_group(item), struct t10_wwn, t10_wwn_group);
1286}
1287
1288static ssize_t target_check_inquiry_data(char *buf)
1289{
1290        size_t len;
1291        int i;
1292
1293        len = strlen(buf);
1294
1295        /*
1296         * SPC 4.3.1:
1297         * ASCII data fields shall contain only ASCII printable characters
1298         * (i.e., code values 20h to 7Eh) and may be terminated with one or
1299         * more ASCII null (00h) characters.
1300         */
1301        for (i = 0; i < len; i++) {
1302                if (buf[i] < 0x20 || buf[i] > 0x7E) {
1303                        pr_err("Emulated T10 Inquiry Data contains non-ASCII-printable characters\n");
1304                        return -EINVAL;
1305                }
1306        }
1307
1308        return len;
1309}
1310
1311/*
1312 * STANDARD and VPD page 0x83 T10 Vendor Identification
1313 */
1314static ssize_t target_wwn_vendor_id_show(struct config_item *item,
1315                char *page)
1316{
1317        return sprintf(page, "%s\n", &to_t10_wwn(item)->vendor[0]);
1318}
1319
1320static ssize_t target_wwn_vendor_id_store(struct config_item *item,
1321                const char *page, size_t count)
1322{
1323        struct t10_wwn *t10_wwn = to_t10_wwn(item);
1324        struct se_device *dev = t10_wwn->t10_dev;
1325        /* +2 to allow for a trailing (stripped) '\n' and null-terminator */
1326        unsigned char buf[INQUIRY_VENDOR_LEN + 2];
1327        char *stripped = NULL;
1328        size_t len;
1329        ssize_t ret;
1330
1331        len = strlcpy(buf, page, sizeof(buf));
1332        if (len < sizeof(buf)) {
1333                /* Strip any newline added from userspace. */
1334                stripped = strstrip(buf);
1335                len = strlen(stripped);
1336        }
1337        if (len > INQUIRY_VENDOR_LEN) {
1338                pr_err("Emulated T10 Vendor Identification exceeds"
1339                        " INQUIRY_VENDOR_LEN: " __stringify(INQUIRY_VENDOR_LEN)
1340                        "\n");
1341                return -EOVERFLOW;
1342        }
1343
1344        ret = target_check_inquiry_data(stripped);
1345
1346        if (ret < 0)
1347                return ret;
1348
1349        /*
1350         * Check to see if any active exports exist.  If they do exist, fail
1351         * here as changing this information on the fly (underneath the
1352         * initiator side OS dependent multipath code) could cause negative
1353         * effects.
1354         */
1355        if (dev->export_count) {
1356                pr_err("Unable to set T10 Vendor Identification while"
1357                        " active %d exports exist\n", dev->export_count);
1358                return -EINVAL;
1359        }
1360
1361        BUILD_BUG_ON(sizeof(dev->t10_wwn.vendor) != INQUIRY_VENDOR_LEN + 1);
1362        strlcpy(dev->t10_wwn.vendor, stripped, sizeof(dev->t10_wwn.vendor));
1363
1364        pr_debug("Target_Core_ConfigFS: Set emulated T10 Vendor Identification:"
1365                 " %s\n", dev->t10_wwn.vendor);
1366
1367        return count;
1368}
1369
1370static ssize_t target_wwn_product_id_show(struct config_item *item,
1371                char *page)
1372{
1373        return sprintf(page, "%s\n", &to_t10_wwn(item)->model[0]);
1374}
1375
1376static ssize_t target_wwn_product_id_store(struct config_item *item,
1377                const char *page, size_t count)
1378{
1379        struct t10_wwn *t10_wwn = to_t10_wwn(item);
1380        struct se_device *dev = t10_wwn->t10_dev;
1381        /* +2 to allow for a trailing (stripped) '\n' and null-terminator */
1382        unsigned char buf[INQUIRY_MODEL_LEN + 2];
1383        char *stripped = NULL;
1384        size_t len;
1385        ssize_t ret;
1386
1387        len = strlcpy(buf, page, sizeof(buf));
1388        if (len < sizeof(buf)) {
1389                /* Strip any newline added from userspace. */
1390                stripped = strstrip(buf);
1391                len = strlen(stripped);
1392        }
1393        if (len > INQUIRY_MODEL_LEN) {
1394                pr_err("Emulated T10 Vendor exceeds INQUIRY_MODEL_LEN: "
1395                         __stringify(INQUIRY_MODEL_LEN)
1396                        "\n");
1397                return -EOVERFLOW;
1398        }
1399
1400        ret = target_check_inquiry_data(stripped);
1401
1402        if (ret < 0)
1403                return ret;
1404
1405        /*
1406         * Check to see if any active exports exist.  If they do exist, fail
1407         * here as changing this information on the fly (underneath the
1408         * initiator side OS dependent multipath code) could cause negative
1409         * effects.
1410         */
1411        if (dev->export_count) {
1412                pr_err("Unable to set T10 Model while active %d exports exist\n",
1413                        dev->export_count);
1414                return -EINVAL;
1415        }
1416
1417        BUILD_BUG_ON(sizeof(dev->t10_wwn.model) != INQUIRY_MODEL_LEN + 1);
1418        strlcpy(dev->t10_wwn.model, stripped, sizeof(dev->t10_wwn.model));
1419
1420        pr_debug("Target_Core_ConfigFS: Set emulated T10 Model Identification: %s\n",
1421                 dev->t10_wwn.model);
1422
1423        return count;
1424}
1425
1426static ssize_t target_wwn_revision_show(struct config_item *item,
1427                char *page)
1428{
1429        return sprintf(page, "%s\n", &to_t10_wwn(item)->revision[0]);
1430}
1431
1432static ssize_t target_wwn_revision_store(struct config_item *item,
1433                const char *page, size_t count)
1434{
1435        struct t10_wwn *t10_wwn = to_t10_wwn(item);
1436        struct se_device *dev = t10_wwn->t10_dev;
1437        /* +2 to allow for a trailing (stripped) '\n' and null-terminator */
1438        unsigned char buf[INQUIRY_REVISION_LEN + 2];
1439        char *stripped = NULL;
1440        size_t len;
1441        ssize_t ret;
1442
1443        len = strlcpy(buf, page, sizeof(buf));
1444        if (len < sizeof(buf)) {
1445                /* Strip any newline added from userspace. */
1446                stripped = strstrip(buf);
1447                len = strlen(stripped);
1448        }
1449        if (len > INQUIRY_REVISION_LEN) {
1450                pr_err("Emulated T10 Revision exceeds INQUIRY_REVISION_LEN: "
1451                         __stringify(INQUIRY_REVISION_LEN)
1452                        "\n");
1453                return -EOVERFLOW;
1454        }
1455
1456        ret = target_check_inquiry_data(stripped);
1457
1458        if (ret < 0)
1459                return ret;
1460
1461        /*
1462         * Check to see if any active exports exist.  If they do exist, fail
1463         * here as changing this information on the fly (underneath the
1464         * initiator side OS dependent multipath code) could cause negative
1465         * effects.
1466         */
1467        if (dev->export_count) {
1468                pr_err("Unable to set T10 Revision while active %d exports exist\n",
1469                        dev->export_count);
1470                return -EINVAL;
1471        }
1472
1473        BUILD_BUG_ON(sizeof(dev->t10_wwn.revision) != INQUIRY_REVISION_LEN + 1);
1474        strlcpy(dev->t10_wwn.revision, stripped, sizeof(dev->t10_wwn.revision));
1475
1476        pr_debug("Target_Core_ConfigFS: Set emulated T10 Revision: %s\n",
1477                 dev->t10_wwn.revision);
1478
1479        return count;
1480}
1481
1482static ssize_t
1483target_wwn_company_id_show(struct config_item *item,
1484                                char *page)
1485{
1486        return snprintf(page, PAGE_SIZE, "%#08x\n",
1487                        to_t10_wwn(item)->company_id);
1488}
1489
1490static ssize_t
1491target_wwn_company_id_store(struct config_item *item,
1492                                 const char *page, size_t count)
1493{
1494        struct t10_wwn *t10_wwn = to_t10_wwn(item);
1495        struct se_device *dev = t10_wwn->t10_dev;
1496        u32 val;
1497        int ret;
1498
1499        /*
1500         * The IEEE COMPANY_ID field should contain a 24-bit canonical
1501         * form OUI assigned by the IEEE.
1502         */
1503        ret = kstrtou32(page, 0, &val);
1504        if (ret < 0)
1505                return ret;
1506
1507        if (val >= 0x1000000)
1508                return -EOVERFLOW;
1509
1510        /*
1511         * Check to see if any active exports exist. If they do exist, fail
1512         * here as changing this information on the fly (underneath the
1513         * initiator side OS dependent multipath code) could cause negative
1514         * effects.
1515         */
1516        if (dev->export_count) {
1517                pr_err("Unable to set Company ID while %u exports exist\n",
1518                       dev->export_count);
1519                return -EINVAL;
1520        }
1521
1522        t10_wwn->company_id = val;
1523
1524        pr_debug("Target_Core_ConfigFS: Set IEEE Company ID: %#08x\n",
1525                 t10_wwn->company_id);
1526
1527        return count;
1528}
1529
1530/*
1531 * VPD page 0x80 Unit serial
1532 */
1533static ssize_t target_wwn_vpd_unit_serial_show(struct config_item *item,
1534                char *page)
1535{
1536        return sprintf(page, "T10 VPD Unit Serial Number: %s\n",
1537                &to_t10_wwn(item)->unit_serial[0]);
1538}
1539
1540static ssize_t target_wwn_vpd_unit_serial_store(struct config_item *item,
1541                const char *page, size_t count)
1542{
1543        struct t10_wwn *t10_wwn = to_t10_wwn(item);
1544        struct se_device *dev = t10_wwn->t10_dev;
1545        unsigned char buf[INQUIRY_VPD_SERIAL_LEN] = { };
1546
1547        /*
1548         * If Linux/SCSI subsystem_api_t plugin got a VPD Unit Serial
1549         * from the struct scsi_device level firmware, do not allow
1550         * VPD Unit Serial to be emulated.
1551         *
1552         * Note this struct scsi_device could also be emulating VPD
1553         * information from its drivers/scsi LLD.  But for now we assume
1554         * it is doing 'the right thing' wrt a world wide unique
1555         * VPD Unit Serial Number that OS dependent multipath can depend on.
1556         */
1557        if (dev->dev_flags & DF_FIRMWARE_VPD_UNIT_SERIAL) {
1558                pr_err("Underlying SCSI device firmware provided VPD"
1559                        " Unit Serial, ignoring request\n");
1560                return -EOPNOTSUPP;
1561        }
1562
1563        if (strlen(page) >= INQUIRY_VPD_SERIAL_LEN) {
1564                pr_err("Emulated VPD Unit Serial exceeds"
1565                " INQUIRY_VPD_SERIAL_LEN: %d\n", INQUIRY_VPD_SERIAL_LEN);
1566                return -EOVERFLOW;
1567        }
1568        /*
1569         * Check to see if any active $FABRIC_MOD exports exist.  If they
1570         * do exist, fail here as changing this information on the fly
1571         * (underneath the initiator side OS dependent multipath code)
1572         * could cause negative effects.
1573         */
1574        if (dev->export_count) {
1575                pr_err("Unable to set VPD Unit Serial while"
1576                        " active %d $FABRIC_MOD exports exist\n",
1577                        dev->export_count);
1578                return -EINVAL;
1579        }
1580
1581        /*
1582         * This currently assumes ASCII encoding for emulated VPD Unit Serial.
1583         *
1584         * Also, strip any newline added from the userspace
1585         * echo $UUID > $TARGET/$HBA/$STORAGE_OBJECT/wwn/vpd_unit_serial
1586         */
1587        snprintf(buf, INQUIRY_VPD_SERIAL_LEN, "%s", page);
1588        snprintf(dev->t10_wwn.unit_serial, INQUIRY_VPD_SERIAL_LEN,
1589                        "%s", strstrip(buf));
1590        dev->dev_flags |= DF_EMULATED_VPD_UNIT_SERIAL;
1591
1592        pr_debug("Target_Core_ConfigFS: Set emulated VPD Unit Serial:"
1593                        " %s\n", dev->t10_wwn.unit_serial);
1594
1595        return count;
1596}
1597
1598/*
1599 * VPD page 0x83 Protocol Identifier
1600 */
1601static ssize_t target_wwn_vpd_protocol_identifier_show(struct config_item *item,
1602                char *page)
1603{
1604        struct t10_wwn *t10_wwn = to_t10_wwn(item);
1605        struct t10_vpd *vpd;
1606        unsigned char buf[VPD_TMP_BUF_SIZE] = { };
1607        ssize_t len = 0;
1608
1609        spin_lock(&t10_wwn->t10_vpd_lock);
1610        list_for_each_entry(vpd, &t10_wwn->t10_vpd_list, vpd_list) {
1611                if (!vpd->protocol_identifier_set)
1612                        continue;
1613
1614                transport_dump_vpd_proto_id(vpd, buf, VPD_TMP_BUF_SIZE);
1615
1616                if (len + strlen(buf) >= PAGE_SIZE)
1617                        break;
1618
1619                len += sprintf(page+len, "%s", buf);
1620        }
1621        spin_unlock(&t10_wwn->t10_vpd_lock);
1622
1623        return len;
1624}
1625
1626/*
1627 * Generic wrapper for dumping VPD identifiers by association.
1628 */
1629#define DEF_DEV_WWN_ASSOC_SHOW(_name, _assoc)                           \
1630static ssize_t target_wwn_##_name##_show(struct config_item *item,      \
1631                char *page)                                             \
1632{                                                                       \
1633        struct t10_wwn *t10_wwn = to_t10_wwn(item);                     \
1634        struct t10_vpd *vpd;                                            \
1635        unsigned char buf[VPD_TMP_BUF_SIZE];                            \
1636        ssize_t len = 0;                                                \
1637                                                                        \
1638        spin_lock(&t10_wwn->t10_vpd_lock);                              \
1639        list_for_each_entry(vpd, &t10_wwn->t10_vpd_list, vpd_list) {    \
1640                if (vpd->association != _assoc)                         \
1641                        continue;                                       \
1642                                                                        \
1643                memset(buf, 0, VPD_TMP_BUF_SIZE);                       \
1644                transport_dump_vpd_assoc(vpd, buf, VPD_TMP_BUF_SIZE);   \
1645                if (len + strlen(buf) >= PAGE_SIZE)                     \
1646                        break;                                          \
1647                len += sprintf(page+len, "%s", buf);                    \
1648                                                                        \
1649                memset(buf, 0, VPD_TMP_BUF_SIZE);                       \
1650                transport_dump_vpd_ident_type(vpd, buf, VPD_TMP_BUF_SIZE); \
1651                if (len + strlen(buf) >= PAGE_SIZE)                     \
1652                        break;                                          \
1653                len += sprintf(page+len, "%s", buf);                    \
1654                                                                        \
1655                memset(buf, 0, VPD_TMP_BUF_SIZE);                       \
1656                transport_dump_vpd_ident(vpd, buf, VPD_TMP_BUF_SIZE); \
1657                if (len + strlen(buf) >= PAGE_SIZE)                     \
1658                        break;                                          \
1659                len += sprintf(page+len, "%s", buf);                    \
1660        }                                                               \
1661        spin_unlock(&t10_wwn->t10_vpd_lock);                            \
1662                                                                        \
1663        return len;                                                     \
1664}
1665
1666/* VPD page 0x83 Association: Logical Unit */
1667DEF_DEV_WWN_ASSOC_SHOW(vpd_assoc_logical_unit, 0x00);
1668/* VPD page 0x83 Association: Target Port */
1669DEF_DEV_WWN_ASSOC_SHOW(vpd_assoc_target_port, 0x10);
1670/* VPD page 0x83 Association: SCSI Target Device */
1671DEF_DEV_WWN_ASSOC_SHOW(vpd_assoc_scsi_target_device, 0x20);
1672
1673CONFIGFS_ATTR(target_wwn_, vendor_id);
1674CONFIGFS_ATTR(target_wwn_, product_id);
1675CONFIGFS_ATTR(target_wwn_, revision);
1676CONFIGFS_ATTR(target_wwn_, company_id);
1677CONFIGFS_ATTR(target_wwn_, vpd_unit_serial);
1678CONFIGFS_ATTR_RO(target_wwn_, vpd_protocol_identifier);
1679CONFIGFS_ATTR_RO(target_wwn_, vpd_assoc_logical_unit);
1680CONFIGFS_ATTR_RO(target_wwn_, vpd_assoc_target_port);
1681CONFIGFS_ATTR_RO(target_wwn_, vpd_assoc_scsi_target_device);
1682
1683static struct configfs_attribute *target_core_dev_wwn_attrs[] = {
1684        &target_wwn_attr_vendor_id,
1685        &target_wwn_attr_product_id,
1686        &target_wwn_attr_revision,
1687        &target_wwn_attr_company_id,
1688        &target_wwn_attr_vpd_unit_serial,
1689        &target_wwn_attr_vpd_protocol_identifier,
1690        &target_wwn_attr_vpd_assoc_logical_unit,
1691        &target_wwn_attr_vpd_assoc_target_port,
1692        &target_wwn_attr_vpd_assoc_scsi_target_device,
1693        NULL,
1694};
1695
1696TB_CIT_SETUP(dev_wwn, NULL, NULL, target_core_dev_wwn_attrs);
1697
1698/*  End functions for struct config_item_type tb_dev_wwn_cit */
1699
1700/*  Start functions for struct config_item_type tb_dev_pr_cit */
1701
1702static struct se_device *pr_to_dev(struct config_item *item)
1703{
1704        return container_of(to_config_group(item), struct se_device,
1705                        dev_pr_group);
1706}
1707
1708static ssize_t target_core_dev_pr_show_spc3_res(struct se_device *dev,
1709                char *page)
1710{
1711        struct se_node_acl *se_nacl;
1712        struct t10_pr_registration *pr_reg;
1713        char i_buf[PR_REG_ISID_ID_LEN] = { };
1714
1715        pr_reg = dev->dev_pr_res_holder;
1716        if (!pr_reg)
1717                return sprintf(page, "No SPC-3 Reservation holder\n");
1718
1719        se_nacl = pr_reg->pr_reg_nacl;
1720        core_pr_dump_initiator_port(pr_reg, i_buf, PR_REG_ISID_ID_LEN);
1721
1722        return sprintf(page, "SPC-3 Reservation: %s Initiator: %s%s\n",
1723                se_nacl->se_tpg->se_tpg_tfo->fabric_name,
1724                se_nacl->initiatorname, i_buf);
1725}
1726
1727static ssize_t target_core_dev_pr_show_spc2_res(struct se_device *dev,
1728                char *page)
1729{
1730        struct se_session *sess = dev->reservation_holder;
1731        struct se_node_acl *se_nacl;
1732        ssize_t len;
1733
1734        if (sess) {
1735                se_nacl = sess->se_node_acl;
1736                len = sprintf(page,
1737                              "SPC-2 Reservation: %s Initiator: %s\n",
1738                              se_nacl->se_tpg->se_tpg_tfo->fabric_name,
1739                              se_nacl->initiatorname);
1740        } else {
1741                len = sprintf(page, "No SPC-2 Reservation holder\n");
1742        }
1743        return len;
1744}
1745
1746static ssize_t target_pr_res_holder_show(struct config_item *item, char *page)
1747{
1748        struct se_device *dev = pr_to_dev(item);
1749        int ret;
1750
1751        if (!dev->dev_attrib.emulate_pr)
1752                return sprintf(page, "SPC_RESERVATIONS_DISABLED\n");
1753
1754        if (dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR)
1755                return sprintf(page, "Passthrough\n");
1756
1757        spin_lock(&dev->dev_reservation_lock);
1758        if (dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS)
1759                ret = target_core_dev_pr_show_spc2_res(dev, page);
1760        else
1761                ret = target_core_dev_pr_show_spc3_res(dev, page);
1762        spin_unlock(&dev->dev_reservation_lock);
1763        return ret;
1764}
1765
1766static ssize_t target_pr_res_pr_all_tgt_pts_show(struct config_item *item,
1767                char *page)
1768{
1769        struct se_device *dev = pr_to_dev(item);
1770        ssize_t len = 0;
1771
1772        spin_lock(&dev->dev_reservation_lock);
1773        if (!dev->dev_pr_res_holder) {
1774                len = sprintf(page, "No SPC-3 Reservation holder\n");
1775        } else if (dev->dev_pr_res_holder->pr_reg_all_tg_pt) {
1776                len = sprintf(page, "SPC-3 Reservation: All Target"
1777                        " Ports registration\n");
1778        } else {
1779                len = sprintf(page, "SPC-3 Reservation: Single"
1780                        " Target Port registration\n");
1781        }
1782
1783        spin_unlock(&dev->dev_reservation_lock);
1784        return len;
1785}
1786
1787static ssize_t target_pr_res_pr_generation_show(struct config_item *item,
1788                char *page)
1789{
1790        return sprintf(page, "0x%08x\n", pr_to_dev(item)->t10_pr.pr_generation);
1791}
1792
1793
1794static ssize_t target_pr_res_pr_holder_tg_port_show(struct config_item *item,
1795                char *page)
1796{
1797        struct se_device *dev = pr_to_dev(item);
1798        struct se_node_acl *se_nacl;
1799        struct se_portal_group *se_tpg;
1800        struct t10_pr_registration *pr_reg;
1801        const struct target_core_fabric_ops *tfo;
1802        ssize_t len = 0;
1803
1804        spin_lock(&dev->dev_reservation_lock);
1805        pr_reg = dev->dev_pr_res_holder;
1806        if (!pr_reg) {
1807                len = sprintf(page, "No SPC-3 Reservation holder\n");
1808                goto out_unlock;
1809        }
1810
1811        se_nacl = pr_reg->pr_reg_nacl;
1812        se_tpg = se_nacl->se_tpg;
1813        tfo = se_tpg->se_tpg_tfo;
1814
1815        len += sprintf(page+len, "SPC-3 Reservation: %s"
1816                " Target Node Endpoint: %s\n", tfo->fabric_name,
1817                tfo->tpg_get_wwn(se_tpg));
1818        len += sprintf(page+len, "SPC-3 Reservation: Relative Port"
1819                " Identifier Tag: %hu %s Portal Group Tag: %hu"
1820                " %s Logical Unit: %llu\n", pr_reg->tg_pt_sep_rtpi,
1821                tfo->fabric_name, tfo->tpg_get_tag(se_tpg),
1822                tfo->fabric_name, pr_reg->pr_aptpl_target_lun);
1823
1824out_unlock:
1825        spin_unlock(&dev->dev_reservation_lock);
1826        return len;
1827}
1828
1829
1830static ssize_t target_pr_res_pr_registered_i_pts_show(struct config_item *item,
1831                char *page)
1832{
1833        struct se_device *dev = pr_to_dev(item);
1834        const struct target_core_fabric_ops *tfo;
1835        struct t10_pr_registration *pr_reg;
1836        unsigned char buf[384];
1837        char i_buf[PR_REG_ISID_ID_LEN];
1838        ssize_t len = 0;
1839        int reg_count = 0;
1840
1841        len += sprintf(page+len, "SPC-3 PR Registrations:\n");
1842
1843        spin_lock(&dev->t10_pr.registration_lock);
1844        list_for_each_entry(pr_reg, &dev->t10_pr.registration_list,
1845                        pr_reg_list) {
1846
1847                memset(buf, 0, 384);
1848                memset(i_buf, 0, PR_REG_ISID_ID_LEN);
1849                tfo = pr_reg->pr_reg_nacl->se_tpg->se_tpg_tfo;
1850                core_pr_dump_initiator_port(pr_reg, i_buf,
1851                                        PR_REG_ISID_ID_LEN);
1852                sprintf(buf, "%s Node: %s%s Key: 0x%016Lx PRgen: 0x%08x\n",
1853                        tfo->fabric_name,
1854                        pr_reg->pr_reg_nacl->initiatorname, i_buf, pr_reg->pr_res_key,
1855                        pr_reg->pr_res_generation);
1856
1857                if (len + strlen(buf) >= PAGE_SIZE)
1858                        break;
1859
1860                len += sprintf(page+len, "%s", buf);
1861                reg_count++;
1862        }
1863        spin_unlock(&dev->t10_pr.registration_lock);
1864
1865        if (!reg_count)
1866                len += sprintf(page+len, "None\n");
1867
1868        return len;
1869}
1870
1871static ssize_t target_pr_res_pr_type_show(struct config_item *item, char *page)
1872{
1873        struct se_device *dev = pr_to_dev(item);
1874        struct t10_pr_registration *pr_reg;
1875        ssize_t len = 0;
1876
1877        spin_lock(&dev->dev_reservation_lock);
1878        pr_reg = dev->dev_pr_res_holder;
1879        if (pr_reg) {
1880                len = sprintf(page, "SPC-3 Reservation Type: %s\n",
1881                        core_scsi3_pr_dump_type(pr_reg->pr_res_type));
1882        } else {
1883                len = sprintf(page, "No SPC-3 Reservation holder\n");
1884        }
1885
1886        spin_unlock(&dev->dev_reservation_lock);
1887        return len;
1888}
1889
1890static ssize_t target_pr_res_type_show(struct config_item *item, char *page)
1891{
1892        struct se_device *dev = pr_to_dev(item);
1893
1894        if (!dev->dev_attrib.emulate_pr)
1895                return sprintf(page, "SPC_RESERVATIONS_DISABLED\n");
1896        if (dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR)
1897                return sprintf(page, "SPC_PASSTHROUGH\n");
1898        if (dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS)
1899                return sprintf(page, "SPC2_RESERVATIONS\n");
1900
1901        return sprintf(page, "SPC3_PERSISTENT_RESERVATIONS\n");
1902}
1903
1904static ssize_t target_pr_res_aptpl_active_show(struct config_item *item,
1905                char *page)
1906{
1907        struct se_device *dev = pr_to_dev(item);
1908
1909        if (!dev->dev_attrib.emulate_pr ||
1910            (dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR))
1911                return 0;
1912
1913        return sprintf(page, "APTPL Bit Status: %s\n",
1914                (dev->t10_pr.pr_aptpl_active) ? "Activated" : "Disabled");
1915}
1916
1917static ssize_t target_pr_res_aptpl_metadata_show(struct config_item *item,
1918                char *page)
1919{
1920        struct se_device *dev = pr_to_dev(item);
1921
1922        if (!dev->dev_attrib.emulate_pr ||
1923            (dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR))
1924                return 0;
1925
1926        return sprintf(page, "Ready to process PR APTPL metadata..\n");
1927}
1928
1929enum {
1930        Opt_initiator_fabric, Opt_initiator_node, Opt_initiator_sid,
1931        Opt_sa_res_key, Opt_res_holder, Opt_res_type, Opt_res_scope,
1932        Opt_res_all_tg_pt, Opt_mapped_lun, Opt_target_fabric,
1933        Opt_target_node, Opt_tpgt, Opt_port_rtpi, Opt_target_lun, Opt_err
1934};
1935
1936static match_table_t tokens = {
1937        {Opt_initiator_fabric, "initiator_fabric=%s"},
1938        {Opt_initiator_node, "initiator_node=%s"},
1939        {Opt_initiator_sid, "initiator_sid=%s"},
1940        {Opt_sa_res_key, "sa_res_key=%s"},
1941        {Opt_res_holder, "res_holder=%d"},
1942        {Opt_res_type, "res_type=%d"},
1943        {Opt_res_scope, "res_scope=%d"},
1944        {Opt_res_all_tg_pt, "res_all_tg_pt=%d"},
1945        {Opt_mapped_lun, "mapped_lun=%u"},
1946        {Opt_target_fabric, "target_fabric=%s"},
1947        {Opt_target_node, "target_node=%s"},
1948        {Opt_tpgt, "tpgt=%d"},
1949        {Opt_port_rtpi, "port_rtpi=%d"},
1950        {Opt_target_lun, "target_lun=%u"},
1951        {Opt_err, NULL}
1952};
1953
1954static ssize_t target_pr_res_aptpl_metadata_store(struct config_item *item,
1955                const char *page, size_t count)
1956{
1957        struct se_device *dev = pr_to_dev(item);
1958        unsigned char *i_fabric = NULL, *i_port = NULL, *isid = NULL;
1959        unsigned char *t_fabric = NULL, *t_port = NULL;
1960        char *orig, *ptr, *opts;
1961        substring_t args[MAX_OPT_ARGS];
1962        unsigned long long tmp_ll;
1963        u64 sa_res_key = 0;
1964        u64 mapped_lun = 0, target_lun = 0;
1965        int ret = -1, res_holder = 0, all_tg_pt = 0, arg, token;
1966        u16 tpgt = 0;
1967        u8 type = 0;
1968
1969        if (!dev->dev_attrib.emulate_pr ||
1970            (dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR))
1971                return count;
1972        if (dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS)
1973                return count;
1974
1975        if (dev->export_count) {
1976                pr_debug("Unable to process APTPL metadata while"
1977                        " active fabric exports exist\n");
1978                return -EINVAL;
1979        }
1980
1981        opts = kstrdup(page, GFP_KERNEL);
1982        if (!opts)
1983                return -ENOMEM;
1984
1985        orig = opts;
1986        while ((ptr = strsep(&opts, ",\n")) != NULL) {
1987                if (!*ptr)
1988                        continue;
1989
1990                token = match_token(ptr, tokens, args);
1991                switch (token) {
1992                case Opt_initiator_fabric:
1993                        i_fabric = match_strdup(args);
1994                        if (!i_fabric) {
1995                                ret = -ENOMEM;
1996                                goto out;
1997                        }
1998                        break;
1999                case Opt_initiator_node:
2000                        i_port = match_strdup(args);
2001                        if (!i_port) {
2002                                ret = -ENOMEM;
2003                                goto out;
2004                        }
2005                        if (strlen(i_port) >= PR_APTPL_MAX_IPORT_LEN) {
2006                                pr_err("APTPL metadata initiator_node="
2007                                        " exceeds PR_APTPL_MAX_IPORT_LEN: %d\n",
2008                                        PR_APTPL_MAX_IPORT_LEN);
2009                                ret = -EINVAL;
2010                                break;
2011                        }
2012                        break;
2013                case Opt_initiator_sid:
2014                        isid = match_strdup(args);
2015                        if (!isid) {
2016                                ret = -ENOMEM;
2017                                goto out;
2018                        }
2019                        if (strlen(isid) >= PR_REG_ISID_LEN) {
2020                                pr_err("APTPL metadata initiator_isid"
2021                                        "= exceeds PR_REG_ISID_LEN: %d\n",
2022                                        PR_REG_ISID_LEN);
2023                                ret = -EINVAL;
2024                                break;
2025                        }
2026                        break;
2027                case Opt_sa_res_key:
2028                        ret = match_u64(args,  &tmp_ll);
2029                        if (ret < 0) {
2030                                pr_err("kstrtoull() failed for sa_res_key=\n");
2031                                goto out;
2032                        }
2033                        sa_res_key = (u64)tmp_ll;
2034                        break;
2035                /*
2036                 * PR APTPL Metadata for Reservation
2037                 */
2038                case Opt_res_holder:
2039                        ret = match_int(args, &arg);
2040                        if (ret)
2041                                goto out;
2042                        res_holder = arg;
2043                        break;
2044                case Opt_res_type:
2045                        ret = match_int(args, &arg);
2046                        if (ret)
2047                                goto out;
2048                        type = (u8)arg;
2049                        break;
2050                case Opt_res_scope:
2051                        ret = match_int(args, &arg);
2052                        if (ret)
2053                                goto out;
2054                        break;
2055                case Opt_res_all_tg_pt:
2056                        ret = match_int(args, &arg);
2057                        if (ret)
2058                                goto out;
2059                        all_tg_pt = (int)arg;
2060                        break;
2061                case Opt_mapped_lun:
2062                        ret = match_u64(args, &tmp_ll);
2063                        if (ret)
2064                                goto out;
2065                        mapped_lun = (u64)tmp_ll;
2066                        break;
2067                /*
2068                 * PR APTPL Metadata for Target Port
2069                 */
2070                case Opt_target_fabric:
2071                        t_fabric = match_strdup(args);
2072                        if (!t_fabric) {
2073                                ret = -ENOMEM;
2074                                goto out;
2075                        }
2076                        break;
2077                case Opt_target_node:
2078                        t_port = match_strdup(args);
2079                        if (!t_port) {
2080                                ret = -ENOMEM;
2081                                goto out;
2082                        }
2083                        if (strlen(t_port) >= PR_APTPL_MAX_TPORT_LEN) {
2084                                pr_err("APTPL metadata target_node="
2085                                        " exceeds PR_APTPL_MAX_TPORT_LEN: %d\n",
2086                                        PR_APTPL_MAX_TPORT_LEN);
2087                                ret = -EINVAL;
2088                                break;
2089                        }
2090                        break;
2091                case Opt_tpgt:
2092                        ret = match_int(args, &arg);
2093                        if (ret)
2094                                goto out;
2095                        tpgt = (u16)arg;
2096                        break;
2097                case Opt_port_rtpi:
2098                        ret = match_int(args, &arg);
2099                        if (ret)
2100                                goto out;
2101                        break;
2102                case Opt_target_lun:
2103                        ret = match_u64(args, &tmp_ll);
2104                        if (ret)
2105                                goto out;
2106                        target_lun = (u64)tmp_ll;
2107                        break;
2108                default:
2109                        break;
2110                }
2111        }
2112
2113        if (!i_port || !t_port || !sa_res_key) {
2114                pr_err("Illegal parameters for APTPL registration\n");
2115                ret = -EINVAL;
2116                goto out;
2117        }
2118
2119        if (res_holder && !(type)) {
2120                pr_err("Illegal PR type: 0x%02x for reservation"
2121                                " holder\n", type);
2122                ret = -EINVAL;
2123                goto out;
2124        }
2125
2126        ret = core_scsi3_alloc_aptpl_registration(&dev->t10_pr, sa_res_key,
2127                        i_port, isid, mapped_lun, t_port, tpgt, target_lun,
2128                        res_holder, all_tg_pt, type);
2129out:
2130        kfree(i_fabric);
2131        kfree(i_port);
2132        kfree(isid);
2133        kfree(t_fabric);
2134        kfree(t_port);
2135        kfree(orig);
2136        return (ret == 0) ? count : ret;
2137}
2138
2139
2140CONFIGFS_ATTR_RO(target_pr_, res_holder);
2141CONFIGFS_ATTR_RO(target_pr_, res_pr_all_tgt_pts);
2142CONFIGFS_ATTR_RO(target_pr_, res_pr_generation);
2143CONFIGFS_ATTR_RO(target_pr_, res_pr_holder_tg_port);
2144CONFIGFS_ATTR_RO(target_pr_, res_pr_registered_i_pts);
2145CONFIGFS_ATTR_RO(target_pr_, res_pr_type);
2146CONFIGFS_ATTR_RO(target_pr_, res_type);
2147CONFIGFS_ATTR_RO(target_pr_, res_aptpl_active);
2148CONFIGFS_ATTR(target_pr_, res_aptpl_metadata);
2149
2150static struct configfs_attribute *target_core_dev_pr_attrs[] = {
2151        &target_pr_attr_res_holder,
2152        &target_pr_attr_res_pr_all_tgt_pts,
2153        &target_pr_attr_res_pr_generation,
2154        &target_pr_attr_res_pr_holder_tg_port,
2155        &target_pr_attr_res_pr_registered_i_pts,
2156        &target_pr_attr_res_pr_type,
2157        &target_pr_attr_res_type,
2158        &target_pr_attr_res_aptpl_active,
2159        &target_pr_attr_res_aptpl_metadata,
2160        NULL,
2161};
2162
2163TB_CIT_SETUP(dev_pr, NULL, NULL, target_core_dev_pr_attrs);
2164
2165/*  End functions for struct config_item_type tb_dev_pr_cit */
2166
2167/*  Start functions for struct config_item_type tb_dev_cit */
2168
2169static inline struct se_device *to_device(struct config_item *item)
2170{
2171        return container_of(to_config_group(item), struct se_device, dev_group);
2172}
2173
2174static ssize_t target_dev_info_show(struct config_item *item, char *page)
2175{
2176        struct se_device *dev = to_device(item);
2177        int bl = 0;
2178        ssize_t read_bytes = 0;
2179
2180        transport_dump_dev_state(dev, page, &bl);
2181        read_bytes += bl;
2182        read_bytes += dev->transport->show_configfs_dev_params(dev,
2183                        page+read_bytes);
2184        return read_bytes;
2185}
2186
2187static ssize_t target_dev_control_store(struct config_item *item,
2188                const char *page, size_t count)
2189{
2190        struct se_device *dev = to_device(item);
2191
2192        return dev->transport->set_configfs_dev_params(dev, page, count);
2193}
2194
2195static ssize_t target_dev_alias_show(struct config_item *item, char *page)
2196{
2197        struct se_device *dev = to_device(item);
2198
2199        if (!(dev->dev_flags & DF_USING_ALIAS))
2200                return 0;
2201
2202        return snprintf(page, PAGE_SIZE, "%s\n", dev->dev_alias);
2203}
2204
2205static ssize_t target_dev_alias_store(struct config_item *item,
2206                const char *page, size_t count)
2207{
2208        struct se_device *dev = to_device(item);
2209        struct se_hba *hba = dev->se_hba;
2210        ssize_t read_bytes;
2211
2212        if (count > (SE_DEV_ALIAS_LEN-1)) {
2213                pr_err("alias count: %d exceeds"
2214                        " SE_DEV_ALIAS_LEN-1: %u\n", (int)count,
2215                        SE_DEV_ALIAS_LEN-1);
2216                return -EINVAL;
2217        }
2218
2219        read_bytes = snprintf(&dev->dev_alias[0], SE_DEV_ALIAS_LEN, "%s", page);
2220        if (!read_bytes)
2221                return -EINVAL;
2222        if (dev->dev_alias[read_bytes - 1] == '\n')
2223                dev->dev_alias[read_bytes - 1] = '\0';
2224
2225        dev->dev_flags |= DF_USING_ALIAS;
2226
2227        pr_debug("Target_Core_ConfigFS: %s/%s set alias: %s\n",
2228                config_item_name(&hba->hba_group.cg_item),
2229                config_item_name(&dev->dev_group.cg_item),
2230                dev->dev_alias);
2231
2232        return read_bytes;
2233}
2234
2235static ssize_t target_dev_udev_path_show(struct config_item *item, char *page)
2236{
2237        struct se_device *dev = to_device(item);
2238
2239        if (!(dev->dev_flags & DF_USING_UDEV_PATH))
2240                return 0;
2241
2242        return snprintf(page, PAGE_SIZE, "%s\n", dev->udev_path);
2243}
2244
2245static ssize_t target_dev_udev_path_store(struct config_item *item,
2246                const char *page, size_t count)
2247{
2248        struct se_device *dev = to_device(item);
2249        struct se_hba *hba = dev->se_hba;
2250        ssize_t read_bytes;
2251
2252        if (count > (SE_UDEV_PATH_LEN-1)) {
2253                pr_err("udev_path count: %d exceeds"
2254                        " SE_UDEV_PATH_LEN-1: %u\n", (int)count,
2255                        SE_UDEV_PATH_LEN-1);
2256                return -EINVAL;
2257        }
2258
2259        read_bytes = snprintf(&dev->udev_path[0], SE_UDEV_PATH_LEN,
2260                        "%s", page);
2261        if (!read_bytes)
2262                return -EINVAL;
2263        if (dev->udev_path[read_bytes - 1] == '\n')
2264                dev->udev_path[read_bytes - 1] = '\0';
2265
2266        dev->dev_flags |= DF_USING_UDEV_PATH;
2267
2268        pr_debug("Target_Core_ConfigFS: %s/%s set udev_path: %s\n",
2269                config_item_name(&hba->hba_group.cg_item),
2270                config_item_name(&dev->dev_group.cg_item),
2271                dev->udev_path);
2272
2273        return read_bytes;
2274}
2275
2276static ssize_t target_dev_enable_show(struct config_item *item, char *page)
2277{
2278        struct se_device *dev = to_device(item);
2279
2280        return snprintf(page, PAGE_SIZE, "%d\n", target_dev_configured(dev));
2281}
2282
2283static ssize_t target_dev_enable_store(struct config_item *item,
2284                const char *page, size_t count)
2285{
2286        struct se_device *dev = to_device(item);
2287        char *ptr;
2288        int ret;
2289
2290        ptr = strstr(page, "1");
2291        if (!ptr) {
2292                pr_err("For dev_enable ops, only valid value"
2293                                " is \"1\"\n");
2294                return -EINVAL;
2295        }
2296
2297        ret = target_configure_device(dev);
2298        if (ret)
2299                return ret;
2300        return count;
2301}
2302
2303static ssize_t target_dev_alua_lu_gp_show(struct config_item *item, char *page)
2304{
2305        struct se_device *dev = to_device(item);
2306        struct config_item *lu_ci;
2307        struct t10_alua_lu_gp *lu_gp;
2308        struct t10_alua_lu_gp_member *lu_gp_mem;
2309        ssize_t len = 0;
2310
2311        lu_gp_mem = dev->dev_alua_lu_gp_mem;
2312        if (!lu_gp_mem)
2313                return 0;
2314
2315        spin_lock(&lu_gp_mem->lu_gp_mem_lock);
2316        lu_gp = lu_gp_mem->lu_gp;
2317        if (lu_gp) {
2318                lu_ci = &lu_gp->lu_gp_group.cg_item;
2319                len += sprintf(page, "LU Group Alias: %s\nLU Group ID: %hu\n",
2320                        config_item_name(lu_ci), lu_gp->lu_gp_id);
2321        }
2322        spin_unlock(&lu_gp_mem->lu_gp_mem_lock);
2323
2324        return len;
2325}
2326
2327static ssize_t target_dev_alua_lu_gp_store(struct config_item *item,
2328                const char *page, size_t count)
2329{
2330        struct se_device *dev = to_device(item);
2331        struct se_hba *hba = dev->se_hba;
2332        struct t10_alua_lu_gp *lu_gp = NULL, *lu_gp_new = NULL;
2333        struct t10_alua_lu_gp_member *lu_gp_mem;
2334        unsigned char buf[LU_GROUP_NAME_BUF] = { };
2335        int move = 0;
2336
2337        lu_gp_mem = dev->dev_alua_lu_gp_mem;
2338        if (!lu_gp_mem)
2339                return count;
2340
2341        if (count > LU_GROUP_NAME_BUF) {
2342                pr_err("ALUA LU Group Alias too large!\n");
2343                return -EINVAL;
2344        }
2345        memcpy(buf, page, count);
2346        /*
2347         * Any ALUA logical unit alias besides "NULL" means we will be
2348         * making a new group association.
2349         */
2350        if (strcmp(strstrip(buf), "NULL")) {
2351                /*
2352                 * core_alua_get_lu_gp_by_name() will increment reference to
2353                 * struct t10_alua_lu_gp.  This reference is released with
2354                 * core_alua_get_lu_gp_by_name below().
2355                 */
2356                lu_gp_new = core_alua_get_lu_gp_by_name(strstrip(buf));
2357                if (!lu_gp_new)
2358                        return -ENODEV;
2359        }
2360
2361        spin_lock(&lu_gp_mem->lu_gp_mem_lock);
2362        lu_gp = lu_gp_mem->lu_gp;
2363        if (lu_gp) {
2364                /*
2365                 * Clearing an existing lu_gp association, and replacing
2366                 * with NULL
2367                 */
2368                if (!lu_gp_new) {
2369                        pr_debug("Target_Core_ConfigFS: Releasing %s/%s"
2370                                " from ALUA LU Group: core/alua/lu_gps/%s, ID:"
2371                                " %hu\n",
2372                                config_item_name(&hba->hba_group.cg_item),
2373                                config_item_name(&dev->dev_group.cg_item),
2374                                config_item_name(&lu_gp->lu_gp_group.cg_item),
2375                                lu_gp->lu_gp_id);
2376
2377                        __core_alua_drop_lu_gp_mem(lu_gp_mem, lu_gp);
2378                        spin_unlock(&lu_gp_mem->lu_gp_mem_lock);
2379
2380                        return count;
2381                }
2382                /*
2383                 * Removing existing association of lu_gp_mem with lu_gp
2384                 */
2385                __core_alua_drop_lu_gp_mem(lu_gp_mem, lu_gp);
2386                move = 1;
2387        }
2388        /*
2389         * Associate lu_gp_mem with lu_gp_new.
2390         */
2391        __core_alua_attach_lu_gp_mem(lu_gp_mem, lu_gp_new);
2392        spin_unlock(&lu_gp_mem->lu_gp_mem_lock);
2393
2394        pr_debug("Target_Core_ConfigFS: %s %s/%s to ALUA LU Group:"
2395                " core/alua/lu_gps/%s, ID: %hu\n",
2396                (move) ? "Moving" : "Adding",
2397                config_item_name(&hba->hba_group.cg_item),
2398                config_item_name(&dev->dev_group.cg_item),
2399                config_item_name(&lu_gp_new->lu_gp_group.cg_item),
2400                lu_gp_new->lu_gp_id);
2401
2402        core_alua_put_lu_gp_from_name(lu_gp_new);
2403        return count;
2404}
2405
2406static ssize_t target_dev_lba_map_show(struct config_item *item, char *page)
2407{
2408        struct se_device *dev = to_device(item);
2409        struct t10_alua_lba_map *map;
2410        struct t10_alua_lba_map_member *mem;
2411        char *b = page;
2412        int bl = 0;
2413        char state;
2414
2415        spin_lock(&dev->t10_alua.lba_map_lock);
2416        if (!list_empty(&dev->t10_alua.lba_map_list))
2417            bl += sprintf(b + bl, "%u %u\n",
2418                          dev->t10_alua.lba_map_segment_size,
2419                          dev->t10_alua.lba_map_segment_multiplier);
2420        list_for_each_entry(map, &dev->t10_alua.lba_map_list, lba_map_list) {
2421                bl += sprintf(b + bl, "%llu %llu",
2422                              map->lba_map_first_lba, map->lba_map_last_lba);
2423                list_for_each_entry(mem, &map->lba_map_mem_list,
2424                                    lba_map_mem_list) {
2425                        switch (mem->lba_map_mem_alua_state) {
2426                        case ALUA_ACCESS_STATE_ACTIVE_OPTIMIZED:
2427                                state = 'O';
2428                                break;
2429                        case ALUA_ACCESS_STATE_ACTIVE_NON_OPTIMIZED:
2430                                state = 'A';
2431                                break;
2432                        case ALUA_ACCESS_STATE_STANDBY:
2433                                state = 'S';
2434                                break;
2435                        case ALUA_ACCESS_STATE_UNAVAILABLE:
2436                                state = 'U';
2437                                break;
2438                        default:
2439                                state = '.';
2440                                break;
2441                        }
2442                        bl += sprintf(b + bl, " %d:%c",
2443                                      mem->lba_map_mem_alua_pg_id, state);
2444                }
2445                bl += sprintf(b + bl, "\n");
2446        }
2447        spin_unlock(&dev->t10_alua.lba_map_lock);
2448        return bl;
2449}
2450
2451static ssize_t target_dev_lba_map_store(struct config_item *item,
2452                const char *page, size_t count)
2453{
2454        struct se_device *dev = to_device(item);
2455        struct t10_alua_lba_map *lba_map = NULL;
2456        struct list_head lba_list;
2457        char *map_entries, *orig, *ptr;
2458        char state;
2459        int pg_num = -1, pg;
2460        int ret = 0, num = 0, pg_id, alua_state;
2461        unsigned long start_lba = -1, end_lba = -1;
2462        unsigned long segment_size = -1, segment_mult = -1;
2463
2464        orig = map_entries = kstrdup(page, GFP_KERNEL);
2465        if (!map_entries)
2466                return -ENOMEM;
2467
2468        INIT_LIST_HEAD(&lba_list);
2469        while ((ptr = strsep(&map_entries, "\n")) != NULL) {
2470                if (!*ptr)
2471                        continue;
2472
2473                if (num == 0) {
2474                        if (sscanf(ptr, "%lu %lu\n",
2475                                   &segment_size, &segment_mult) != 2) {
2476                                pr_err("Invalid line %d\n", num);
2477                                ret = -EINVAL;
2478                                break;
2479                        }
2480                        num++;
2481                        continue;
2482                }
2483                if (sscanf(ptr, "%lu %lu", &start_lba, &end_lba) != 2) {
2484                        pr_err("Invalid line %d\n", num);
2485                        ret = -EINVAL;
2486                        break;
2487                }
2488                ptr = strchr(ptr, ' ');
2489                if (!ptr) {
2490                        pr_err("Invalid line %d, missing end lba\n", num);
2491                        ret = -EINVAL;
2492                        break;
2493                }
2494                ptr++;
2495                ptr = strchr(ptr, ' ');
2496                if (!ptr) {
2497                        pr_err("Invalid line %d, missing state definitions\n",
2498                               num);
2499                        ret = -EINVAL;
2500                        break;
2501                }
2502                ptr++;
2503                lba_map = core_alua_allocate_lba_map(&lba_list,
2504                                                     start_lba, end_lba);
2505                if (IS_ERR(lba_map)) {
2506                        ret = PTR_ERR(lba_map);
2507                        break;
2508                }
2509                pg = 0;
2510                while (sscanf(ptr, "%d:%c", &pg_id, &state) == 2) {
2511                        switch (state) {
2512                        case 'O':
2513                                alua_state = ALUA_ACCESS_STATE_ACTIVE_OPTIMIZED;
2514                                break;
2515                        case 'A':
2516                                alua_state = ALUA_ACCESS_STATE_ACTIVE_NON_OPTIMIZED;
2517                                break;
2518                        case 'S':
2519                                alua_state = ALUA_ACCESS_STATE_STANDBY;
2520                                break;
2521                        case 'U':
2522                                alua_state = ALUA_ACCESS_STATE_UNAVAILABLE;
2523                                break;
2524                        default:
2525                                pr_err("Invalid ALUA state '%c'\n", state);
2526                                ret = -EINVAL;
2527                                goto out;
2528                        }
2529
2530                        ret = core_alua_allocate_lba_map_mem(lba_map,
2531                                                             pg_id, alua_state);
2532                        if (ret) {
2533                                pr_err("Invalid target descriptor %d:%c "
2534                                       "at line %d\n",
2535                                       pg_id, state, num);
2536                                break;
2537                        }
2538                        pg++;
2539                        ptr = strchr(ptr, ' ');
2540                        if (ptr)
2541                                ptr++;
2542                        else
2543                                break;
2544                }
2545                if (pg_num == -1)
2546                    pg_num = pg;
2547                else if (pg != pg_num) {
2548                        pr_err("Only %d from %d port groups definitions "
2549                               "at line %d\n", pg, pg_num, num);
2550                        ret = -EINVAL;
2551                        break;
2552                }
2553                num++;
2554        }
2555out:
2556        if (ret) {
2557                core_alua_free_lba_map(&lba_list);
2558                count = ret;
2559        } else
2560                core_alua_set_lba_map(dev, &lba_list,
2561                                      segment_size, segment_mult);
2562        kfree(orig);
2563        return count;
2564}
2565
2566CONFIGFS_ATTR_RO(target_dev_, info);
2567CONFIGFS_ATTR_WO(target_dev_, control);
2568CONFIGFS_ATTR(target_dev_, alias);
2569CONFIGFS_ATTR(target_dev_, udev_path);
2570CONFIGFS_ATTR(target_dev_, enable);
2571CONFIGFS_ATTR(target_dev_, alua_lu_gp);
2572CONFIGFS_ATTR(target_dev_, lba_map);
2573
2574static struct configfs_attribute *target_core_dev_attrs[] = {
2575        &target_dev_attr_info,
2576        &target_dev_attr_control,
2577        &target_dev_attr_alias,
2578        &target_dev_attr_udev_path,
2579        &target_dev_attr_enable,
2580        &target_dev_attr_alua_lu_gp,
2581        &target_dev_attr_lba_map,
2582        NULL,
2583};
2584
2585static void target_core_dev_release(struct config_item *item)
2586{
2587        struct config_group *dev_cg = to_config_group(item);
2588        struct se_device *dev =
2589                container_of(dev_cg, struct se_device, dev_group);
2590
2591        target_free_device(dev);
2592}
2593
2594/*
2595 * Used in target_core_fabric_configfs.c to verify valid se_device symlink
2596 * within target_fabric_port_link()
2597 */
2598struct configfs_item_operations target_core_dev_item_ops = {
2599        .release                = target_core_dev_release,
2600};
2601
2602TB_CIT_SETUP(dev, &target_core_dev_item_ops, NULL, target_core_dev_attrs);
2603
2604/* End functions for struct config_item_type tb_dev_cit */
2605
2606/* Start functions for struct config_item_type target_core_alua_lu_gp_cit */
2607
2608static inline struct t10_alua_lu_gp *to_lu_gp(struct config_item *item)
2609{
2610        return container_of(to_config_group(item), struct t10_alua_lu_gp,
2611                        lu_gp_group);
2612}
2613
2614static ssize_t target_lu_gp_lu_gp_id_show(struct config_item *item, char *page)
2615{
2616        struct t10_alua_lu_gp *lu_gp = to_lu_gp(item);
2617
2618        if (!lu_gp->lu_gp_valid_id)
2619                return 0;
2620        return sprintf(page, "%hu\n", lu_gp->lu_gp_id);
2621}
2622
2623static ssize_t target_lu_gp_lu_gp_id_store(struct config_item *item,
2624                const char *page, size_t count)
2625{
2626        struct t10_alua_lu_gp *lu_gp = to_lu_gp(item);
2627        struct config_group *alua_lu_gp_cg = &lu_gp->lu_gp_group;
2628        unsigned long lu_gp_id;
2629        int ret;
2630
2631        ret = kstrtoul(page, 0, &lu_gp_id);
2632        if (ret < 0) {
2633                pr_err("kstrtoul() returned %d for"
2634                        " lu_gp_id\n", ret);
2635                return ret;
2636        }
2637        if (lu_gp_id > 0x0000ffff) {
2638                pr_err("ALUA lu_gp_id: %lu exceeds maximum:"
2639                        " 0x0000ffff\n", lu_gp_id);
2640                return -EINVAL;
2641        }
2642
2643        ret = core_alua_set_lu_gp_id(lu_gp, (u16)lu_gp_id);
2644        if (ret < 0)
2645                return -EINVAL;
2646
2647        pr_debug("Target_Core_ConfigFS: Set ALUA Logical Unit"
2648                " Group: core/alua/lu_gps/%s to ID: %hu\n",
2649                config_item_name(&alua_lu_gp_cg->cg_item),
2650                lu_gp->lu_gp_id);
2651
2652        return count;
2653}
2654
2655static ssize_t target_lu_gp_members_show(struct config_item *item, char *page)
2656{
2657        struct t10_alua_lu_gp *lu_gp = to_lu_gp(item);
2658        struct se_device *dev;
2659        struct se_hba *hba;
2660        struct t10_alua_lu_gp_member *lu_gp_mem;
2661        ssize_t len = 0, cur_len;
2662        unsigned char buf[LU_GROUP_NAME_BUF] = { };
2663
2664        spin_lock(&lu_gp->lu_gp_lock);
2665        list_for_each_entry(lu_gp_mem, &lu_gp->lu_gp_mem_list, lu_gp_mem_list) {
2666                dev = lu_gp_mem->lu_gp_mem_dev;
2667                hba = dev->se_hba;
2668
2669                cur_len = snprintf(buf, LU_GROUP_NAME_BUF, "%s/%s\n",
2670                        config_item_name(&hba->hba_group.cg_item),
2671                        config_item_name(&dev->dev_group.cg_item));
2672                cur_len++; /* Extra byte for NULL terminator */
2673
2674                if ((cur_len + len) > PAGE_SIZE) {
2675                        pr_warn("Ran out of lu_gp_show_attr"
2676                                "_members buffer\n");
2677                        break;
2678                }
2679                memcpy(page+len, buf, cur_len);
2680                len += cur_len;
2681        }
2682        spin_unlock(&lu_gp->lu_gp_lock);
2683
2684        return len;
2685}
2686
2687CONFIGFS_ATTR(target_lu_gp_, lu_gp_id);
2688CONFIGFS_ATTR_RO(target_lu_gp_, members);
2689
2690static struct configfs_attribute *target_core_alua_lu_gp_attrs[] = {
2691        &target_lu_gp_attr_lu_gp_id,
2692        &target_lu_gp_attr_members,
2693        NULL,
2694};
2695
2696static void target_core_alua_lu_gp_release(struct config_item *item)
2697{
2698        struct t10_alua_lu_gp *lu_gp = container_of(to_config_group(item),
2699                        struct t10_alua_lu_gp, lu_gp_group);
2700
2701        core_alua_free_lu_gp(lu_gp);
2702}
2703
2704static struct configfs_item_operations target_core_alua_lu_gp_ops = {
2705        .release                = target_core_alua_lu_gp_release,
2706};
2707
2708static const struct config_item_type target_core_alua_lu_gp_cit = {
2709        .ct_item_ops            = &target_core_alua_lu_gp_ops,
2710        .ct_attrs               = target_core_alua_lu_gp_attrs,
2711        .ct_owner               = THIS_MODULE,
2712};
2713
2714/* End functions for struct config_item_type target_core_alua_lu_gp_cit */
2715
2716/* Start functions for struct config_item_type target_core_alua_lu_gps_cit */
2717
2718static struct config_group *target_core_alua_create_lu_gp(
2719        struct config_group *group,
2720        const char *name)
2721{
2722        struct t10_alua_lu_gp *lu_gp;
2723        struct config_group *alua_lu_gp_cg = NULL;
2724        struct config_item *alua_lu_gp_ci = NULL;
2725
2726        lu_gp = core_alua_allocate_lu_gp(name, 0);
2727        if (IS_ERR(lu_gp))
2728                return NULL;
2729
2730        alua_lu_gp_cg = &lu_gp->lu_gp_group;
2731        alua_lu_gp_ci = &alua_lu_gp_cg->cg_item;
2732
2733        config_group_init_type_name(alua_lu_gp_cg, name,
2734                        &target_core_alua_lu_gp_cit);
2735
2736        pr_debug("Target_Core_ConfigFS: Allocated ALUA Logical Unit"
2737                " Group: core/alua/lu_gps/%s\n",
2738                config_item_name(alua_lu_gp_ci));
2739
2740        return alua_lu_gp_cg;
2741
2742}
2743
2744static void target_core_alua_drop_lu_gp(
2745        struct config_group *group,
2746        struct config_item *item)
2747{
2748        struct t10_alua_lu_gp *lu_gp = container_of(to_config_group(item),
2749                        struct t10_alua_lu_gp, lu_gp_group);
2750
2751        pr_debug("Target_Core_ConfigFS: Releasing ALUA Logical Unit"
2752                " Group: core/alua/lu_gps/%s, ID: %hu\n",
2753                config_item_name(item), lu_gp->lu_gp_id);
2754        /*
2755         * core_alua_free_lu_gp() is called from target_core_alua_lu_gp_ops->release()
2756         * -> target_core_alua_lu_gp_release()
2757         */
2758        config_item_put(item);
2759}
2760
2761static struct configfs_group_operations target_core_alua_lu_gps_group_ops = {
2762        .make_group             = &target_core_alua_create_lu_gp,
2763        .drop_item              = &target_core_alua_drop_lu_gp,
2764};
2765
2766static const struct config_item_type target_core_alua_lu_gps_cit = {
2767        .ct_item_ops            = NULL,
2768        .ct_group_ops           = &target_core_alua_lu_gps_group_ops,
2769        .ct_owner               = THIS_MODULE,
2770};
2771
2772/* End functions for struct config_item_type target_core_alua_lu_gps_cit */
2773
2774/* Start functions for struct config_item_type target_core_alua_tg_pt_gp_cit */
2775
2776static inline struct t10_alua_tg_pt_gp *to_tg_pt_gp(struct config_item *item)
2777{
2778        return container_of(to_config_group(item), struct t10_alua_tg_pt_gp,
2779                        tg_pt_gp_group);
2780}
2781
2782static ssize_t target_tg_pt_gp_alua_access_state_show(struct config_item *item,
2783                char *page)
2784{
2785        return sprintf(page, "%d\n",
2786                       to_tg_pt_gp(item)->tg_pt_gp_alua_access_state);
2787}
2788
2789static ssize_t target_tg_pt_gp_alua_access_state_store(struct config_item *item,
2790                const char *page, size_t count)
2791{
2792        struct t10_alua_tg_pt_gp *tg_pt_gp = to_tg_pt_gp(item);
2793        struct se_device *dev = tg_pt_gp->tg_pt_gp_dev;
2794        unsigned long tmp;
2795        int new_state, ret;
2796
2797        if (!tg_pt_gp->tg_pt_gp_valid_id) {
2798                pr_err("Unable to do implicit ALUA on invalid tg_pt_gp ID\n");
2799                return -EINVAL;
2800        }
2801        if (!target_dev_configured(dev)) {
2802                pr_err("Unable to set alua_access_state while device is"
2803                       " not configured\n");
2804                return -ENODEV;
2805        }
2806
2807        ret = kstrtoul(page, 0, &tmp);
2808        if (ret < 0) {
2809                pr_err("Unable to extract new ALUA access state from"
2810                                " %s\n", page);
2811                return ret;
2812        }
2813        new_state = (int)tmp;
2814
2815        if (!(tg_pt_gp->tg_pt_gp_alua_access_type & TPGS_IMPLICIT_ALUA)) {
2816                pr_err("Unable to process implicit configfs ALUA"
2817                        " transition while TPGS_IMPLICIT_ALUA is disabled\n");
2818                return -EINVAL;
2819        }
2820        if (tg_pt_gp->tg_pt_gp_alua_access_type & TPGS_EXPLICIT_ALUA &&
2821            new_state == ALUA_ACCESS_STATE_LBA_DEPENDENT) {
2822                /* LBA DEPENDENT is only allowed with implicit ALUA */
2823                pr_err("Unable to process implicit configfs ALUA transition"
2824                       " while explicit ALUA management is enabled\n");
2825                return -EINVAL;
2826        }
2827
2828        ret = core_alua_do_port_transition(tg_pt_gp, dev,
2829                                        NULL, NULL, new_state, 0);
2830        return (!ret) ? count : -EINVAL;
2831}
2832
2833static ssize_t target_tg_pt_gp_alua_access_status_show(struct config_item *item,
2834                char *page)
2835{
2836        struct t10_alua_tg_pt_gp *tg_pt_gp = to_tg_pt_gp(item);
2837        return sprintf(page, "%s\n",
2838                core_alua_dump_status(tg_pt_gp->tg_pt_gp_alua_access_status));
2839}
2840
2841static ssize_t target_tg_pt_gp_alua_access_status_store(
2842                struct config_item *item, const char *page, size_t count)
2843{
2844        struct t10_alua_tg_pt_gp *tg_pt_gp = to_tg_pt_gp(item);
2845        unsigned long tmp;
2846        int new_status, ret;
2847
2848        if (!tg_pt_gp->tg_pt_gp_valid_id) {
2849                pr_err("Unable to set ALUA access status on invalid tg_pt_gp ID\n");
2850                return -EINVAL;
2851        }
2852
2853        ret = kstrtoul(page, 0, &tmp);
2854        if (ret < 0) {
2855                pr_err("Unable to extract new ALUA access status"
2856                                " from %s\n", page);
2857                return ret;
2858        }
2859        new_status = (int)tmp;
2860
2861        if ((new_status != ALUA_STATUS_NONE) &&
2862            (new_status != ALUA_STATUS_ALTERED_BY_EXPLICIT_STPG) &&
2863            (new_status != ALUA_STATUS_ALTERED_BY_IMPLICIT_ALUA)) {
2864                pr_err("Illegal ALUA access status: 0x%02x\n",
2865                                new_status);
2866                return -EINVAL;
2867        }
2868
2869        tg_pt_gp->tg_pt_gp_alua_access_status = new_status;
2870        return count;
2871}
2872
2873static ssize_t target_tg_pt_gp_alua_access_type_show(struct config_item *item,
2874                char *page)
2875{
2876        return core_alua_show_access_type(to_tg_pt_gp(item), page);
2877}
2878
2879static ssize_t target_tg_pt_gp_alua_access_type_store(struct config_item *item,
2880                const char *page, size_t count)
2881{
2882        return core_alua_store_access_type(to_tg_pt_gp(item), page, count);
2883}
2884
2885#define ALUA_SUPPORTED_STATE_ATTR(_name, _bit)                          \
2886static ssize_t target_tg_pt_gp_alua_support_##_name##_show(             \
2887                struct config_item *item, char *p)                      \
2888{                                                                       \
2889        struct t10_alua_tg_pt_gp *t = to_tg_pt_gp(item);                \
2890        return sprintf(p, "%d\n",                                       \
2891                !!(t->tg_pt_gp_alua_supported_states & _bit));          \
2892}                                                                       \
2893                                                                        \
2894static ssize_t target_tg_pt_gp_alua_support_##_name##_store(            \
2895                struct config_item *item, const char *p, size_t c)      \
2896{                                                                       \
2897        struct t10_alua_tg_pt_gp *t = to_tg_pt_gp(item);                \
2898        unsigned long tmp;                                              \
2899        int ret;                                                        \
2900                                                                        \
2901        if (!t->tg_pt_gp_valid_id) {                                    \
2902                pr_err("Unable to set " #_name " ALUA state on invalid tg_pt_gp ID\n"); \
2903                return -EINVAL;                                         \
2904        }                                                               \
2905                                                                        \
2906        ret = kstrtoul(p, 0, &tmp);                                     \
2907        if (ret < 0) {                                                  \
2908                pr_err("Invalid value '%s', must be '0' or '1'\n", p);  \
2909                return -EINVAL;                                         \
2910        }                                                               \
2911        if (tmp > 1) {                                                  \
2912                pr_err("Invalid value '%ld', must be '0' or '1'\n", tmp); \
2913                return -EINVAL;                                         \
2914        }                                                               \
2915        if (tmp)                                                        \
2916                t->tg_pt_gp_alua_supported_states |= _bit;              \
2917        else                                                            \
2918                t->tg_pt_gp_alua_supported_states &= ~_bit;             \
2919                                                                        \
2920        return c;                                                       \
2921}
2922
2923ALUA_SUPPORTED_STATE_ATTR(transitioning, ALUA_T_SUP);
2924ALUA_SUPPORTED_STATE_ATTR(offline, ALUA_O_SUP);
2925ALUA_SUPPORTED_STATE_ATTR(lba_dependent, ALUA_LBD_SUP);
2926ALUA_SUPPORTED_STATE_ATTR(unavailable, ALUA_U_SUP);
2927ALUA_SUPPORTED_STATE_ATTR(standby, ALUA_S_SUP);
2928ALUA_SUPPORTED_STATE_ATTR(active_optimized, ALUA_AO_SUP);
2929ALUA_SUPPORTED_STATE_ATTR(active_nonoptimized, ALUA_AN_SUP);
2930
2931static ssize_t target_tg_pt_gp_alua_write_metadata_show(
2932                struct config_item *item, char *page)
2933{
2934        return sprintf(page, "%d\n",
2935                to_tg_pt_gp(item)->tg_pt_gp_write_metadata);
2936}
2937
2938static ssize_t target_tg_pt_gp_alua_write_metadata_store(
2939                struct config_item *item, const char *page, size_t count)
2940{
2941        struct t10_alua_tg_pt_gp *tg_pt_gp = to_tg_pt_gp(item);
2942        unsigned long tmp;
2943        int ret;
2944
2945        ret = kstrtoul(page, 0, &tmp);
2946        if (ret < 0) {
2947                pr_err("Unable to extract alua_write_metadata\n");
2948                return ret;
2949        }
2950
2951        if ((tmp != 0) && (tmp != 1)) {
2952                pr_err("Illegal value for alua_write_metadata:"
2953                        " %lu\n", tmp);
2954                return -EINVAL;
2955        }
2956        tg_pt_gp->tg_pt_gp_write_metadata = (int)tmp;
2957
2958        return count;
2959}
2960
2961static ssize_t target_tg_pt_gp_nonop_delay_msecs_show(struct config_item *item,
2962                char *page)
2963{
2964        return core_alua_show_nonop_delay_msecs(to_tg_pt_gp(item), page);
2965}
2966
2967static ssize_t target_tg_pt_gp_nonop_delay_msecs_store(struct config_item *item,
2968                const char *page, size_t count)
2969{
2970        return core_alua_store_nonop_delay_msecs(to_tg_pt_gp(item), page,
2971                        count);
2972}
2973
2974static ssize_t target_tg_pt_gp_trans_delay_msecs_show(struct config_item *item,
2975                char *page)
2976{
2977        return core_alua_show_trans_delay_msecs(to_tg_pt_gp(item), page);
2978}
2979
2980static ssize_t target_tg_pt_gp_trans_delay_msecs_store(struct config_item *item,
2981                const char *page, size_t count)
2982{
2983        return core_alua_store_trans_delay_msecs(to_tg_pt_gp(item), page,
2984                        count);
2985}
2986
2987static ssize_t target_tg_pt_gp_implicit_trans_secs_show(
2988                struct config_item *item, char *page)
2989{
2990        return core_alua_show_implicit_trans_secs(to_tg_pt_gp(item), page);
2991}
2992
2993static ssize_t target_tg_pt_gp_implicit_trans_secs_store(
2994                struct config_item *item, const char *page, size_t count)
2995{
2996        return core_alua_store_implicit_trans_secs(to_tg_pt_gp(item), page,
2997                        count);
2998}
2999
3000static ssize_t target_tg_pt_gp_preferred_show(struct config_item *item,
3001                char *page)
3002{
3003        return core_alua_show_preferred_bit(to_tg_pt_gp(item), page);
3004}
3005
3006static ssize_t target_tg_pt_gp_preferred_store(struct config_item *item,
3007                const char *page, size_t count)
3008{
3009        return core_alua_store_preferred_bit(to_tg_pt_gp(item), page, count);
3010}
3011
3012static ssize_t target_tg_pt_gp_tg_pt_gp_id_show(struct config_item *item,
3013                char *page)
3014{
3015        struct t10_alua_tg_pt_gp *tg_pt_gp = to_tg_pt_gp(item);
3016
3017        if (!tg_pt_gp->tg_pt_gp_valid_id)
3018                return 0;
3019        return sprintf(page, "%hu\n", tg_pt_gp->tg_pt_gp_id);
3020}
3021
3022static ssize_t target_tg_pt_gp_tg_pt_gp_id_store(struct config_item *item,
3023                const char *page, size_t count)
3024{
3025        struct t10_alua_tg_pt_gp *tg_pt_gp = to_tg_pt_gp(item);
3026        struct config_group *alua_tg_pt_gp_cg = &tg_pt_gp->tg_pt_gp_group;
3027        unsigned long tg_pt_gp_id;
3028        int ret;
3029
3030        ret = kstrtoul(page, 0, &tg_pt_gp_id);
3031        if (ret < 0) {
3032                pr_err("ALUA tg_pt_gp_id: invalid value '%s' for tg_pt_gp_id\n",
3033                       page);
3034                return ret;
3035        }
3036        if (tg_pt_gp_id > 0x0000ffff) {
3037                pr_err("ALUA tg_pt_gp_id: %lu exceeds maximum: 0x0000ffff\n",
3038                       tg_pt_gp_id);
3039                return -EINVAL;
3040        }
3041
3042        ret = core_alua_set_tg_pt_gp_id(tg_pt_gp, (u16)tg_pt_gp_id);
3043        if (ret < 0)
3044                return -EINVAL;
3045
3046        pr_debug("Target_Core_ConfigFS: Set ALUA Target Port Group: "
3047                "core/alua/tg_pt_gps/%s to ID: %hu\n",
3048                config_item_name(&alua_tg_pt_gp_cg->cg_item),
3049                tg_pt_gp->tg_pt_gp_id);
3050
3051        return count;
3052}
3053
3054static ssize_t target_tg_pt_gp_members_show(struct config_item *item,
3055                char *page)
3056{
3057        struct t10_alua_tg_pt_gp *tg_pt_gp = to_tg_pt_gp(item);
3058        struct se_lun *lun;
3059        ssize_t len = 0, cur_len;
3060        unsigned char buf[TG_PT_GROUP_NAME_BUF] = { };
3061
3062        spin_lock(&tg_pt_gp->tg_pt_gp_lock);
3063        list_for_each_entry(lun, &tg_pt_gp->tg_pt_gp_lun_list,
3064                        lun_tg_pt_gp_link) {
3065                struct se_portal_group *tpg = lun->lun_tpg;
3066
3067                cur_len = snprintf(buf, TG_PT_GROUP_NAME_BUF, "%s/%s/tpgt_%hu"
3068                        "/%s\n", tpg->se_tpg_tfo->fabric_name,
3069                        tpg->se_tpg_tfo->tpg_get_wwn(tpg),
3070                        tpg->se_tpg_tfo->tpg_get_tag(tpg),
3071                        config_item_name(&lun->lun_group.cg_item));
3072                cur_len++; /* Extra byte for NULL terminator */
3073
3074                if ((cur_len + len) > PAGE_SIZE) {
3075                        pr_warn("Ran out of lu_gp_show_attr"
3076                                "_members buffer\n");
3077                        break;
3078                }
3079                memcpy(page+len, buf, cur_len);
3080                len += cur_len;
3081        }
3082        spin_unlock(&tg_pt_gp->tg_pt_gp_lock);
3083
3084        return len;
3085}
3086
3087CONFIGFS_ATTR(target_tg_pt_gp_, alua_access_state);
3088CONFIGFS_ATTR(target_tg_pt_gp_, alua_access_status);
3089CONFIGFS_ATTR(target_tg_pt_gp_, alua_access_type);
3090CONFIGFS_ATTR(target_tg_pt_gp_, alua_support_transitioning);
3091CONFIGFS_ATTR(target_tg_pt_gp_, alua_support_offline);
3092CONFIGFS_ATTR(target_tg_pt_gp_, alua_support_lba_dependent);
3093CONFIGFS_ATTR(target_tg_pt_gp_, alua_support_unavailable);
3094CONFIGFS_ATTR(target_tg_pt_gp_, alua_support_standby);
3095CONFIGFS_ATTR(target_tg_pt_gp_, alua_support_active_optimized);
3096CONFIGFS_ATTR(target_tg_pt_gp_, alua_support_active_nonoptimized);
3097CONFIGFS_ATTR(target_tg_pt_gp_, alua_write_metadata);
3098CONFIGFS_ATTR(target_tg_pt_gp_, nonop_delay_msecs);
3099CONFIGFS_ATTR(target_tg_pt_gp_, trans_delay_msecs);
3100CONFIGFS_ATTR(target_tg_pt_gp_, implicit_trans_secs);
3101CONFIGFS_ATTR(target_tg_pt_gp_, preferred);
3102CONFIGFS_ATTR(target_tg_pt_gp_, tg_pt_gp_id);
3103CONFIGFS_ATTR_RO(target_tg_pt_gp_, members);
3104
3105static struct configfs_attribute *target_core_alua_tg_pt_gp_attrs[] = {
3106        &target_tg_pt_gp_attr_alua_access_state,
3107        &target_tg_pt_gp_attr_alua_access_status,
3108        &target_tg_pt_gp_attr_alua_access_type,
3109        &target_tg_pt_gp_attr_alua_support_transitioning,
3110        &target_tg_pt_gp_attr_alua_support_offline,
3111        &target_tg_pt_gp_attr_alua_support_lba_dependent,
3112        &target_tg_pt_gp_attr_alua_support_unavailable,
3113        &target_tg_pt_gp_attr_alua_support_standby,
3114        &target_tg_pt_gp_attr_alua_support_active_nonoptimized,
3115        &target_tg_pt_gp_attr_alua_support_active_optimized,
3116        &target_tg_pt_gp_attr_alua_write_metadata,
3117        &target_tg_pt_gp_attr_nonop_delay_msecs,
3118        &target_tg_pt_gp_attr_trans_delay_msecs,
3119        &target_tg_pt_gp_attr_implicit_trans_secs,
3120        &target_tg_pt_gp_attr_preferred,
3121        &target_tg_pt_gp_attr_tg_pt_gp_id,
3122        &target_tg_pt_gp_attr_members,
3123        NULL,
3124};
3125
3126static void target_core_alua_tg_pt_gp_release(struct config_item *item)
3127{
3128        struct t10_alua_tg_pt_gp *tg_pt_gp = container_of(to_config_group(item),
3129                        struct t10_alua_tg_pt_gp, tg_pt_gp_group);
3130
3131        core_alua_free_tg_pt_gp(tg_pt_gp);
3132}
3133
3134static struct configfs_item_operations target_core_alua_tg_pt_gp_ops = {
3135        .release                = target_core_alua_tg_pt_gp_release,
3136};
3137
3138static const struct config_item_type target_core_alua_tg_pt_gp_cit = {
3139        .ct_item_ops            = &target_core_alua_tg_pt_gp_ops,
3140        .ct_attrs               = target_core_alua_tg_pt_gp_attrs,
3141        .ct_owner               = THIS_MODULE,
3142};
3143
3144/* End functions for struct config_item_type target_core_alua_tg_pt_gp_cit */
3145
3146/* Start functions for struct config_item_type tb_alua_tg_pt_gps_cit */
3147
3148static struct config_group *target_core_alua_create_tg_pt_gp(
3149        struct config_group *group,
3150        const char *name)
3151{
3152        struct t10_alua *alua = container_of(group, struct t10_alua,
3153                                        alua_tg_pt_gps_group);
3154        struct t10_alua_tg_pt_gp *tg_pt_gp;
3155        struct config_group *alua_tg_pt_gp_cg = NULL;
3156        struct config_item *alua_tg_pt_gp_ci = NULL;
3157
3158        tg_pt_gp = core_alua_allocate_tg_pt_gp(alua->t10_dev, name, 0);
3159        if (!tg_pt_gp)
3160                return NULL;
3161
3162        alua_tg_pt_gp_cg = &tg_pt_gp->tg_pt_gp_group;
3163        alua_tg_pt_gp_ci = &alua_tg_pt_gp_cg->cg_item;
3164
3165        config_group_init_type_name(alua_tg_pt_gp_cg, name,
3166                        &target_core_alua_tg_pt_gp_cit);
3167
3168        pr_debug("Target_Core_ConfigFS: Allocated ALUA Target Port"
3169                " Group: alua/tg_pt_gps/%s\n",
3170                config_item_name(alua_tg_pt_gp_ci));
3171
3172        return alua_tg_pt_gp_cg;
3173}
3174
3175static void target_core_alua_drop_tg_pt_gp(
3176        struct config_group *group,
3177        struct config_item *item)
3178{
3179        struct t10_alua_tg_pt_gp *tg_pt_gp = container_of(to_config_group(item),
3180                        struct t10_alua_tg_pt_gp, tg_pt_gp_group);
3181
3182        pr_debug("Target_Core_ConfigFS: Releasing ALUA Target Port"
3183                " Group: alua/tg_pt_gps/%s, ID: %hu\n",
3184                config_item_name(item), tg_pt_gp->tg_pt_gp_id);
3185        /*
3186         * core_alua_free_tg_pt_gp() is called from target_core_alua_tg_pt_gp_ops->release()
3187         * -> target_core_alua_tg_pt_gp_release().
3188         */
3189        config_item_put(item);
3190}
3191
3192static struct configfs_group_operations target_core_alua_tg_pt_gps_group_ops = {
3193        .make_group             = &target_core_alua_create_tg_pt_gp,
3194        .drop_item              = &target_core_alua_drop_tg_pt_gp,
3195};
3196
3197TB_CIT_SETUP(dev_alua_tg_pt_gps, NULL, &target_core_alua_tg_pt_gps_group_ops, NULL);
3198
3199/* End functions for struct config_item_type tb_alua_tg_pt_gps_cit */
3200
3201/* Start functions for struct config_item_type target_core_alua_cit */
3202
3203/*
3204 * target_core_alua_cit is a ConfigFS group that lives under
3205 * /sys/kernel/config/target/core/alua.  There are default groups
3206 * core/alua/lu_gps and core/alua/tg_pt_gps that are attached to
3207 * target_core_alua_cit in target_core_init_configfs() below.
3208 */
3209static const struct config_item_type target_core_alua_cit = {
3210        .ct_item_ops            = NULL,
3211        .ct_attrs               = NULL,
3212        .ct_owner               = THIS_MODULE,
3213};
3214
3215/* End functions for struct config_item_type target_core_alua_cit */
3216
3217/* Start functions for struct config_item_type tb_dev_stat_cit */
3218
3219static struct config_group *target_core_stat_mkdir(
3220        struct config_group *group,
3221        const char *name)
3222{
3223        return ERR_PTR(-ENOSYS);
3224}
3225
3226static void target_core_stat_rmdir(
3227        struct config_group *group,
3228        struct config_item *item)
3229{
3230        return;
3231}
3232
3233static struct configfs_group_operations target_core_stat_group_ops = {
3234        .make_group             = &target_core_stat_mkdir,
3235        .drop_item              = &target_core_stat_rmdir,
3236};
3237
3238TB_CIT_SETUP(dev_stat, NULL, &target_core_stat_group_ops, NULL);
3239
3240/* End functions for struct config_item_type tb_dev_stat_cit */
3241
3242/* Start functions for struct config_item_type target_core_hba_cit */
3243
3244static struct config_group *target_core_make_subdev(
3245        struct config_group *group,
3246        const char *name)
3247{
3248        struct t10_alua_tg_pt_gp *tg_pt_gp;
3249        struct config_item *hba_ci = &group->cg_item;
3250        struct se_hba *hba = item_to_hba(hba_ci);
3251        struct target_backend *tb = hba->backend;
3252        struct se_device *dev;
3253        int errno = -ENOMEM, ret;
3254
3255        ret = mutex_lock_interruptible(&hba->hba_access_mutex);
3256        if (ret)
3257                return ERR_PTR(ret);
3258
3259        dev = target_alloc_device(hba, name);
3260        if (!dev)
3261                goto out_unlock;
3262
3263        config_group_init_type_name(&dev->dev_group, name, &tb->tb_dev_cit);
3264
3265        config_group_init_type_name(&dev->dev_action_group, "action",
3266                        &tb->tb_dev_action_cit);
3267        configfs_add_default_group(&dev->dev_action_group, &dev->dev_group);
3268
3269        config_group_init_type_name(&dev->dev_attrib.da_group, "attrib",
3270                        &tb->tb_dev_attrib_cit);
3271        configfs_add_default_group(&dev->dev_attrib.da_group, &dev->dev_group);
3272
3273        config_group_init_type_name(&dev->dev_pr_group, "pr",
3274                        &tb->tb_dev_pr_cit);
3275        configfs_add_default_group(&dev->dev_pr_group, &dev->dev_group);
3276
3277        config_group_init_type_name(&dev->t10_wwn.t10_wwn_group, "wwn",
3278                        &tb->tb_dev_wwn_cit);
3279        configfs_add_default_group(&dev->t10_wwn.t10_wwn_group,
3280                        &dev->dev_group);
3281
3282        config_group_init_type_name(&dev->t10_alua.alua_tg_pt_gps_group,
3283                        "alua", &tb->tb_dev_alua_tg_pt_gps_cit);
3284        configfs_add_default_group(&dev->t10_alua.alua_tg_pt_gps_group,
3285                        &dev->dev_group);
3286
3287        config_group_init_type_name(&dev->dev_stat_grps.stat_group,
3288                        "statistics", &tb->tb_dev_stat_cit);
3289        configfs_add_default_group(&dev->dev_stat_grps.stat_group,
3290                        &dev->dev_group);
3291
3292        /*
3293         * Add core/$HBA/$DEV/alua/default_tg_pt_gp
3294         */
3295        tg_pt_gp = core_alua_allocate_tg_pt_gp(dev, "default_tg_pt_gp", 1);
3296        if (!tg_pt_gp)
3297                goto out_free_device;
3298        dev->t10_alua.default_tg_pt_gp = tg_pt_gp;
3299
3300        config_group_init_type_name(&tg_pt_gp->tg_pt_gp_group,
3301                        "default_tg_pt_gp", &target_core_alua_tg_pt_gp_cit);
3302        configfs_add_default_group(&tg_pt_gp->tg_pt_gp_group,
3303                        &dev->t10_alua.alua_tg_pt_gps_group);
3304
3305        /*
3306         * Add core/$HBA/$DEV/statistics/ default groups
3307         */
3308        target_stat_setup_dev_default_groups(dev);
3309
3310        mutex_unlock(&hba->hba_access_mutex);
3311        return &dev->dev_group;
3312
3313out_free_device:
3314        target_free_device(dev);
3315out_unlock:
3316        mutex_unlock(&hba->hba_access_mutex);
3317        return ERR_PTR(errno);
3318}
3319
3320static void target_core_drop_subdev(
3321        struct config_group *group,
3322        struct config_item *item)
3323{
3324        struct config_group *dev_cg = to_config_group(item);
3325        struct se_device *dev =
3326                container_of(dev_cg, struct se_device, dev_group);
3327        struct se_hba *hba;
3328
3329        hba = item_to_hba(&dev->se_hba->hba_group.cg_item);
3330
3331        mutex_lock(&hba->hba_access_mutex);
3332
3333        configfs_remove_default_groups(&dev->dev_stat_grps.stat_group);
3334        configfs_remove_default_groups(&dev->t10_alua.alua_tg_pt_gps_group);
3335
3336        /*
3337         * core_alua_free_tg_pt_gp() is called from ->default_tg_pt_gp
3338         * directly from target_core_alua_tg_pt_gp_release().
3339         */
3340        dev->t10_alua.default_tg_pt_gp = NULL;
3341
3342        configfs_remove_default_groups(dev_cg);
3343
3344        /*
3345         * se_dev is released from target_core_dev_item_ops->release()
3346         */
3347        config_item_put(item);
3348        mutex_unlock(&hba->hba_access_mutex);
3349}
3350
3351static struct configfs_group_operations target_core_hba_group_ops = {
3352        .make_group             = target_core_make_subdev,
3353        .drop_item              = target_core_drop_subdev,
3354};
3355
3356
3357static inline struct se_hba *to_hba(struct config_item *item)
3358{
3359        return container_of(to_config_group(item), struct se_hba, hba_group);
3360}
3361
3362static ssize_t target_hba_info_show(struct config_item *item, char *page)
3363{
3364        struct se_hba *hba = to_hba(item);
3365
3366        return sprintf(page, "HBA Index: %d plugin: %s version: %s\n",
3367                        hba->hba_id, hba->backend->ops->name,
3368                        TARGET_CORE_VERSION);
3369}
3370
3371static ssize_t target_hba_mode_show(struct config_item *item, char *page)
3372{
3373        struct se_hba *hba = to_hba(item);
3374        int hba_mode = 0;
3375
3376        if (hba->hba_flags & HBA_FLAGS_PSCSI_MODE)
3377                hba_mode = 1;
3378
3379        return sprintf(page, "%d\n", hba_mode);
3380}
3381
3382static ssize_t target_hba_mode_store(struct config_item *item,
3383                const char *page, size_t count)
3384{
3385        struct se_hba *hba = to_hba(item);
3386        unsigned long mode_flag;
3387        int ret;
3388
3389        if (hba->backend->ops->pmode_enable_hba == NULL)
3390                return -EINVAL;
3391
3392        ret = kstrtoul(page, 0, &mode_flag);
3393        if (ret < 0) {
3394                pr_err("Unable to extract hba mode flag: %d\n", ret);
3395                return ret;
3396        }
3397
3398        if (hba->dev_count) {
3399                pr_err("Unable to set hba_mode with active devices\n");
3400                return -EINVAL;
3401        }
3402
3403        ret = hba->backend->ops->pmode_enable_hba(hba, mode_flag);
3404        if (ret < 0)
3405                return -EINVAL;
3406        if (ret > 0)
3407                hba->hba_flags |= HBA_FLAGS_PSCSI_MODE;
3408        else if (ret == 0)
3409                hba->hba_flags &= ~HBA_FLAGS_PSCSI_MODE;
3410
3411        return count;
3412}
3413
3414CONFIGFS_ATTR_RO(target_, hba_info);
3415CONFIGFS_ATTR(target_, hba_mode);
3416
3417static void target_core_hba_release(struct config_item *item)
3418{
3419        struct se_hba *hba = container_of(to_config_group(item),
3420                                struct se_hba, hba_group);
3421        core_delete_hba(hba);
3422}
3423
3424static struct configfs_attribute *target_core_hba_attrs[] = {
3425        &target_attr_hba_info,
3426        &target_attr_hba_mode,
3427        NULL,
3428};
3429
3430static struct configfs_item_operations target_core_hba_item_ops = {
3431        .release                = target_core_hba_release,
3432};
3433
3434static const struct config_item_type target_core_hba_cit = {
3435        .ct_item_ops            = &target_core_hba_item_ops,
3436        .ct_group_ops           = &target_core_hba_group_ops,
3437        .ct_attrs               = target_core_hba_attrs,
3438        .ct_owner               = THIS_MODULE,
3439};
3440
3441static struct config_group *target_core_call_addhbatotarget(
3442        struct config_group *group,
3443        const char *name)
3444{
3445        char *se_plugin_str, *str, *str2;
3446        struct se_hba *hba;
3447        char buf[TARGET_CORE_NAME_MAX_LEN] = { };
3448        unsigned long plugin_dep_id = 0;
3449        int ret;
3450
3451        if (strlen(name) >= TARGET_CORE_NAME_MAX_LEN) {
3452                pr_err("Passed *name strlen(): %d exceeds"
3453                        " TARGET_CORE_NAME_MAX_LEN: %d\n", (int)strlen(name),
3454                        TARGET_CORE_NAME_MAX_LEN);
3455                return ERR_PTR(-ENAMETOOLONG);
3456        }
3457        snprintf(buf, TARGET_CORE_NAME_MAX_LEN, "%s", name);
3458
3459        str = strstr(buf, "_");
3460        if (!str) {
3461                pr_err("Unable to locate \"_\" for $SUBSYSTEM_PLUGIN_$HOST_ID\n");
3462                return ERR_PTR(-EINVAL);
3463        }
3464        se_plugin_str = buf;
3465        /*
3466         * Special case for subsystem plugins that have "_" in their names.
3467         * Namely rd_direct and rd_mcp..
3468         */
3469        str2 = strstr(str+1, "_");
3470        if (str2) {
3471                *str2 = '\0'; /* Terminate for *se_plugin_str */
3472                str2++; /* Skip to start of plugin dependent ID */
3473                str = str2;
3474        } else {
3475                *str = '\0'; /* Terminate for *se_plugin_str */
3476                str++; /* Skip to start of plugin dependent ID */
3477        }
3478
3479        ret = kstrtoul(str, 0, &plugin_dep_id);
3480        if (ret < 0) {
3481                pr_err("kstrtoul() returned %d for"
3482                                " plugin_dep_id\n", ret);
3483                return ERR_PTR(ret);
3484        }
3485        /*
3486         * Load up TCM subsystem plugins if they have not already been loaded.
3487         */
3488        transport_subsystem_check_init();
3489
3490        hba = core_alloc_hba(se_plugin_str, plugin_dep_id, 0);
3491        if (IS_ERR(hba))
3492                return ERR_CAST(hba);
3493
3494        config_group_init_type_name(&hba->hba_group, name,
3495                        &target_core_hba_cit);
3496
3497        return &hba->hba_group;
3498}
3499
3500static void target_core_call_delhbafromtarget(
3501        struct config_group *group,
3502        struct config_item *item)
3503{
3504        /*
3505         * core_delete_hba() is called from target_core_hba_item_ops->release()
3506         * -> target_core_hba_release()
3507         */
3508        config_item_put(item);
3509}
3510
3511static struct configfs_group_operations target_core_group_ops = {
3512        .make_group     = target_core_call_addhbatotarget,
3513        .drop_item      = target_core_call_delhbafromtarget,
3514};
3515
3516static const struct config_item_type target_core_cit = {
3517        .ct_item_ops    = NULL,
3518        .ct_group_ops   = &target_core_group_ops,
3519        .ct_attrs       = NULL,
3520        .ct_owner       = THIS_MODULE,
3521};
3522
3523/* Stop functions for struct config_item_type target_core_hba_cit */
3524
3525void target_setup_backend_cits(struct target_backend *tb)
3526{
3527        target_core_setup_dev_cit(tb);
3528        target_core_setup_dev_action_cit(tb);
3529        target_core_setup_dev_attrib_cit(tb);
3530        target_core_setup_dev_pr_cit(tb);
3531        target_core_setup_dev_wwn_cit(tb);
3532        target_core_setup_dev_alua_tg_pt_gps_cit(tb);
3533        target_core_setup_dev_stat_cit(tb);
3534}
3535
3536static void target_init_dbroot(void)
3537{
3538        struct file *fp;
3539
3540        snprintf(db_root_stage, DB_ROOT_LEN, DB_ROOT_PREFERRED);
3541        fp = filp_open(db_root_stage, O_RDONLY, 0);
3542        if (IS_ERR(fp)) {
3543                pr_err("db_root: cannot open: %s\n", db_root_stage);
3544                return;
3545        }
3546        if (!S_ISDIR(file_inode(fp)->i_mode)) {
3547                filp_close(fp, NULL);
3548                pr_err("db_root: not a valid directory: %s\n", db_root_stage);
3549                return;
3550        }
3551        filp_close(fp, NULL);
3552
3553        strncpy(db_root, db_root_stage, DB_ROOT_LEN);
3554        pr_debug("Target_Core_ConfigFS: db_root set to %s\n", db_root);
3555}
3556
3557static int __init target_core_init_configfs(void)
3558{
3559        struct configfs_subsystem *subsys = &target_core_fabrics;
3560        struct t10_alua_lu_gp *lu_gp;
3561        int ret;
3562
3563        pr_debug("TARGET_CORE[0]: Loading Generic Kernel Storage"
3564                " Engine: %s on %s/%s on "UTS_RELEASE"\n",
3565                TARGET_CORE_VERSION, utsname()->sysname, utsname()->machine);
3566
3567        config_group_init(&subsys->su_group);
3568        mutex_init(&subsys->su_mutex);
3569
3570        ret = init_se_kmem_caches();
3571        if (ret < 0)
3572                return ret;
3573        /*
3574         * Create $CONFIGFS/target/core default group for HBA <-> Storage Object
3575         * and ALUA Logical Unit Group and Target Port Group infrastructure.
3576         */
3577        config_group_init_type_name(&target_core_hbagroup, "core",
3578                        &target_core_cit);
3579        configfs_add_default_group(&target_core_hbagroup, &subsys->su_group);
3580
3581        /*
3582         * Create ALUA infrastructure under /sys/kernel/config/target/core/alua/
3583         */
3584        config_group_init_type_name(&alua_group, "alua", &target_core_alua_cit);
3585        configfs_add_default_group(&alua_group, &target_core_hbagroup);
3586
3587        /*
3588         * Add ALUA Logical Unit Group and Target Port Group ConfigFS
3589         * groups under /sys/kernel/config/target/core/alua/
3590         */
3591        config_group_init_type_name(&alua_lu_gps_group, "lu_gps",
3592                        &target_core_alua_lu_gps_cit);
3593        configfs_add_default_group(&alua_lu_gps_group, &alua_group);
3594
3595        /*
3596         * Add core/alua/lu_gps/default_lu_gp
3597         */
3598        lu_gp = core_alua_allocate_lu_gp("default_lu_gp", 1);
3599        if (IS_ERR(lu_gp)) {
3600                ret = -ENOMEM;
3601                goto out_global;
3602        }
3603
3604        config_group_init_type_name(&lu_gp->lu_gp_group, "default_lu_gp",
3605                                &target_core_alua_lu_gp_cit);
3606        configfs_add_default_group(&lu_gp->lu_gp_group, &alua_lu_gps_group);
3607
3608        default_lu_gp = lu_gp;
3609
3610        /*
3611         * Register the target_core_mod subsystem with configfs.
3612         */
3613        ret = configfs_register_subsystem(subsys);
3614        if (ret < 0) {
3615                pr_err("Error %d while registering subsystem %s\n",
3616                        ret, subsys->su_group.cg_item.ci_namebuf);
3617                goto out_global;
3618        }
3619        pr_debug("TARGET_CORE[0]: Initialized ConfigFS Fabric"
3620                " Infrastructure: "TARGET_CORE_VERSION" on %s/%s"
3621                " on "UTS_RELEASE"\n", utsname()->sysname, utsname()->machine);
3622        /*
3623         * Register built-in RAMDISK subsystem logic for virtual LUN 0
3624         */
3625        ret = rd_module_init();
3626        if (ret < 0)
3627                goto out;
3628
3629        ret = core_dev_setup_virtual_lun0();
3630        if (ret < 0)
3631                goto out;
3632
3633        ret = target_xcopy_setup_pt();
3634        if (ret < 0)
3635                goto out;
3636
3637        target_init_dbroot();
3638
3639        return 0;
3640
3641out:
3642        configfs_unregister_subsystem(subsys);
3643        core_dev_release_virtual_lun0();
3644        rd_module_exit();
3645out_global:
3646        if (default_lu_gp) {
3647                core_alua_free_lu_gp(default_lu_gp);
3648                default_lu_gp = NULL;
3649        }
3650        release_se_kmem_caches();
3651        return ret;
3652}
3653
3654static void __exit target_core_exit_configfs(void)
3655{
3656        configfs_remove_default_groups(&alua_lu_gps_group);
3657        configfs_remove_default_groups(&alua_group);
3658        configfs_remove_default_groups(&target_core_hbagroup);
3659
3660        /*
3661         * We expect subsys->su_group.default_groups to be released
3662         * by configfs subsystem provider logic..
3663         */
3664        configfs_unregister_subsystem(&target_core_fabrics);
3665
3666        core_alua_free_lu_gp(default_lu_gp);
3667        default_lu_gp = NULL;
3668
3669        pr_debug("TARGET_CORE[0]: Released ConfigFS Fabric"
3670                        " Infrastructure\n");
3671
3672        core_dev_release_virtual_lun0();
3673        rd_module_exit();
3674        target_xcopy_release_pt();
3675        release_se_kmem_caches();
3676}
3677
3678MODULE_DESCRIPTION("Target_Core_Mod/ConfigFS");
3679MODULE_AUTHOR("nab@Linux-iSCSI.org");
3680MODULE_LICENSE("GPL");
3681
3682module_init(target_core_init_configfs);
3683module_exit(target_core_exit_configfs);
3684