target: Move dev_pr_cit to struct se_subsystem_api
[firefly-linux-kernel-4.4.55.git] / drivers / target / target_core_configfs.c
index 756def38c77af934a3e16ef3ae9219e67ceb06cc..49d51ba40fca145de3bd1caae59f46be8a74ad54 100644 (file)
 #include "target_core_rd.h"
 #include "target_core_xcopy.h"
 
+#define TB_CIT_SETUP(_name, _item_ops, _group_ops, _attrs)             \
+static void target_core_setup_##_name##_cit(struct se_subsystem_api *sa) \
+{                                                                      \
+       struct target_backend_cits *tbc = &sa->tb_cits;                 \
+       struct config_item_type *cit = &tbc->tb_##_name##_cit;          \
+                                                                       \
+       cit->ct_item_ops = _item_ops;                                   \
+       cit->ct_group_ops = _group_ops;                                 \
+       cit->ct_attrs = _attrs;                                         \
+       cit->ct_owner = sa->owner;                                      \
+       pr_debug("Setup generic %s\n", __stringify(_name));             \
+}
+
 extern struct t10_alua_lu_gp *default_lu_gp;
 
 static LIST_HEAD(g_tf_list);
@@ -126,48 +139,57 @@ static struct config_group *target_core_register_fabric(
 
        pr_debug("Target_Core_ConfigFS: REGISTER -> group: %p name:"
                        " %s\n", group, name);
-       /*
-        * Below are some hardcoded request_module() calls to automatically
-        * local fabric modules when the following is called:
-        *
-        * mkdir -p /sys/kernel/config/target/$MODULE_NAME
-        *
-        * Note that this does not limit which TCM fabric module can be
-        * registered, but simply provids auto loading logic for modules with
-        * mkdir(2) system calls with known TCM fabric modules.
-        */
-       if (!strncmp(name, "iscsi", 5)) {
+
+       tf = target_core_get_fabric(name);
+       if (!tf) {
+               pr_err("target_core_register_fabric() trying autoload for %s\n",
+                       name);
+
                /*
-                * Automatically load the LIO Target fabric module when the
-                * following is called:
+                * Below are some hardcoded request_module() calls to automatically
+                * local fabric modules when the following is called:
                 *
-                * mkdir -p $CONFIGFS/target/iscsi
-                */
-               ret = request_module("iscsi_target_mod");
-               if (ret < 0) {
-                       pr_err("request_module() failed for"
-                               " iscsi_target_mod.ko: %d\n", ret);
-                       return ERR_PTR(-EINVAL);
-               }
-       } else if (!strncmp(name, "loopback", 8)) {
-               /*
-                * Automatically load the tcm_loop fabric module when the
-                * following is called:
+                * mkdir -p /sys/kernel/config/target/$MODULE_NAME
                 *
-                * mkdir -p $CONFIGFS/target/loopback
+                * Note that this does not limit which TCM fabric module can be
+                * registered, but simply provids auto loading logic for modules with
+                * mkdir(2) system calls with known TCM fabric modules.
                 */
-               ret = request_module("tcm_loop");
-               if (ret < 0) {
-                       pr_err("request_module() failed for"
-                               " tcm_loop.ko: %d\n", ret);
-                       return ERR_PTR(-EINVAL);
+
+               if (!strncmp(name, "iscsi", 5)) {
+                       /*
+                        * Automatically load the LIO Target fabric module when the
+                        * following is called:
+                        *
+                        * mkdir -p $CONFIGFS/target/iscsi
+                        */
+                       ret = request_module("iscsi_target_mod");
+                       if (ret < 0) {
+                               pr_err("request_module() failed for"
+                                      " iscsi_target_mod.ko: %d\n", ret);
+                               return ERR_PTR(-EINVAL);
+                       }
+               } else if (!strncmp(name, "loopback", 8)) {
+                       /*
+                        * Automatically load the tcm_loop fabric module when the
+                        * following is called:
+                        *
+                        * mkdir -p $CONFIGFS/target/loopback
+                        */
+                       ret = request_module("tcm_loop");
+                       if (ret < 0) {
+                               pr_err("request_module() failed for"
+                                      " tcm_loop.ko: %d\n", ret);
+                               return ERR_PTR(-EINVAL);
+                       }
                }
+
+               tf = target_core_get_fabric(name);
        }
 
-       tf = target_core_get_fabric(name);
        if (!tf) {
                pr_err("target_core_get_fabric() failed for %s\n",
-                       name);
+                      name);
                return ERR_PTR(-EINVAL);
        }
        pr_debug("Target_Core_ConfigFS: REGISTER -> Located fabric:"
@@ -562,7 +584,7 @@ EXPORT_SYMBOL(target_fabric_configfs_deregister);
 // Stop functions called by external Target Fabrics Modules
 //############################################################################*/
 
-/* Start functions for struct config_item_type target_core_dev_attrib_cit */
+/* Start functions for struct config_item_type tb_dev_attrib_cit */
 
 #define DEF_DEV_ATTRIB_SHOW(_name)                                     \
 static ssize_t target_core_dev_show_attr_##_name(                      \
@@ -665,6 +687,9 @@ SE_DEV_ATTR(is_nonrot, S_IRUGO | S_IWUSR);
 DEF_DEV_ATTRIB(emulate_rest_reord);
 SE_DEV_ATTR(emulate_rest_reord, S_IRUGO | S_IWUSR);
 
+DEF_DEV_ATTRIB(force_pr_aptpl);
+SE_DEV_ATTR(force_pr_aptpl, S_IRUGO | S_IWUSR);
+
 DEF_DEV_ATTRIB_RO(hw_block_size);
 SE_DEV_ATTR_RO(hw_block_size);
 
@@ -719,6 +744,7 @@ static struct configfs_attribute *target_core_dev_attrib_attrs[] = {
        &target_core_dev_attrib_hw_pi_prot_type.attr,
        &target_core_dev_attrib_pi_prot_format.attr,
        &target_core_dev_attrib_enforce_pr_isids.attr,
+       &target_core_dev_attrib_force_pr_aptpl.attr,
        &target_core_dev_attrib_is_nonrot.attr,
        &target_core_dev_attrib_emulate_rest_reord.attr,
        &target_core_dev_attrib_hw_block_size.attr,
@@ -741,13 +767,10 @@ static struct configfs_item_operations target_core_dev_attrib_ops = {
        .store_attribute        = target_core_dev_attrib_attr_store,
 };
 
-static struct config_item_type target_core_dev_attrib_cit = {
-       .ct_item_ops            = &target_core_dev_attrib_ops,
-       .ct_attrs               = target_core_dev_attrib_attrs,
-       .ct_owner               = THIS_MODULE,
-};
+TB_CIT_SETUP(dev_attrib, &target_core_dev_attrib_ops, NULL,
+            target_core_dev_attrib_attrs);
 
-/* End functions for struct config_item_type target_core_dev_attrib_cit */
+/* End functions for struct config_item_type tb_dev_attrib_cit */
 
 /*  Start functions for struct config_item_type target_core_dev_wwn_cit */
 
@@ -988,7 +1011,7 @@ static struct config_item_type target_core_dev_wwn_cit = {
 
 /*  End functions for struct config_item_type target_core_dev_wwn_cit */
 
-/*  Start functions for struct config_item_type target_core_dev_pr_cit */
+/*  Start functions for struct config_item_type tb_dev_pr_cit */
 
 CONFIGFS_EATTR_STRUCT(target_core_dev_pr, se_device);
 #define SE_DEV_PR_ATTR(_name, _mode)                                   \
@@ -1263,7 +1286,7 @@ static ssize_t target_core_dev_pr_store_attr_res_aptpl_metadata(
 {
        unsigned char *i_fabric = NULL, *i_port = NULL, *isid = NULL;
        unsigned char *t_fabric = NULL, *t_port = NULL;
-       char *orig, *ptr, *arg_p, *opts;
+       char *orig, *ptr, *opts;
        substring_t args[MAX_OPT_ARGS];
        unsigned long long tmp_ll;
        u64 sa_res_key = 0;
@@ -1295,14 +1318,14 @@ static ssize_t target_core_dev_pr_store_attr_res_aptpl_metadata(
                token = match_token(ptr, tokens, args);
                switch (token) {
                case Opt_initiator_fabric:
-                       i_fabric = match_strdup(&args[0]);
+                       i_fabric = match_strdup(args);
                        if (!i_fabric) {
                                ret = -ENOMEM;
                                goto out;
                        }
                        break;
                case Opt_initiator_node:
-                       i_port = match_strdup(&args[0]);
+                       i_port = match_strdup(args);
                        if (!i_port) {
                                ret = -ENOMEM;
                                goto out;
@@ -1316,7 +1339,7 @@ static ssize_t target_core_dev_pr_store_attr_res_aptpl_metadata(
                        }
                        break;
                case Opt_initiator_sid:
-                       isid = match_strdup(&args[0]);
+                       isid = match_strdup(args);
                        if (!isid) {
                                ret = -ENOMEM;
                                goto out;
@@ -1330,15 +1353,9 @@ static ssize_t target_core_dev_pr_store_attr_res_aptpl_metadata(
                        }
                        break;
                case Opt_sa_res_key:
-                       arg_p = match_strdup(&args[0]);
-                       if (!arg_p) {
-                               ret = -ENOMEM;
-                               goto out;
-                       }
-                       ret = kstrtoull(arg_p, 0, &tmp_ll);
+                       ret = kstrtoull(args->from, 0, &tmp_ll);
                        if (ret < 0) {
-                               pr_err("kstrtoull() failed for"
-                                       " sa_res_key=\n");
+                               pr_err("kstrtoull() failed for sa_res_key=\n");
                                goto out;
                        }
                        sa_res_key = (u64)tmp_ll;
@@ -1370,14 +1387,14 @@ static ssize_t target_core_dev_pr_store_attr_res_aptpl_metadata(
                 * PR APTPL Metadata for Target Port
                 */
                case Opt_target_fabric:
-                       t_fabric = match_strdup(&args[0]);
+                       t_fabric = match_strdup(args);
                        if (!t_fabric) {
                                ret = -ENOMEM;
                                goto out;
                        }
                        break;
                case Opt_target_node:
-                       t_port = match_strdup(&args[0]);
+                       t_port = match_strdup(args);
                        if (!t_port) {
                                ret = -ENOMEM;
                                goto out;
@@ -1455,15 +1472,11 @@ static struct configfs_item_operations target_core_dev_pr_ops = {
        .store_attribute        = target_core_dev_pr_attr_store,
 };
 
-static struct config_item_type target_core_dev_pr_cit = {
-       .ct_item_ops            = &target_core_dev_pr_ops,
-       .ct_attrs               = target_core_dev_pr_attrs,
-       .ct_owner               = THIS_MODULE,
-};
+TB_CIT_SETUP(dev_pr, &target_core_dev_pr_ops, NULL, target_core_dev_pr_attrs);
 
-/*  End functions for struct config_item_type target_core_dev_pr_cit */
+/*  End functions for struct config_item_type tb_dev_pr_cit */
 
-/*  Start functions for struct config_item_type target_core_dev_cit */
+/*  Start functions for struct config_item_type tb_dev_cit */
 
 static ssize_t target_core_show_dev_info(void *p, char *page)
 {
@@ -1927,7 +1940,7 @@ static struct target_core_configfs_attribute target_core_attr_dev_lba_map = {
        .store  = target_core_store_dev_lba_map,
 };
 
-static struct configfs_attribute *lio_core_dev_attrs[] = {
+static struct configfs_attribute *target_core_dev_attrs[] = {
        &target_core_attr_dev_info.attr,
        &target_core_attr_dev_control.attr,
        &target_core_attr_dev_alias.attr,
@@ -1986,13 +1999,9 @@ static struct configfs_item_operations target_core_dev_item_ops = {
        .store_attribute        = target_core_dev_store,
 };
 
-static struct config_item_type target_core_dev_cit = {
-       .ct_item_ops            = &target_core_dev_item_ops,
-       .ct_attrs               = lio_core_dev_attrs,
-       .ct_owner               = THIS_MODULE,
-};
+TB_CIT_SETUP(dev, &target_core_dev_item_ops, NULL, target_core_dev_attrs);
 
-/* End functions for struct config_item_type target_core_dev_cit */
+/* End functions for struct config_item_type tb_dev_cit */
 
 /* Start functions for struct config_item_type target_core_alua_lu_gp_cit */
 
@@ -2808,11 +2817,11 @@ static struct config_group *target_core_make_subdev(
        if (!dev_cg->default_groups)
                goto out_free_device;
 
-       config_group_init_type_name(dev_cg, name, &target_core_dev_cit);
+       config_group_init_type_name(dev_cg, name, &t->tb_cits.tb_dev_cit);
        config_group_init_type_name(&dev->dev_attrib.da_group, "attrib",
-                       &target_core_dev_attrib_cit);
+                       &t->tb_cits.tb_dev_attrib_cit);
        config_group_init_type_name(&dev->dev_pr_group, "pr",
-                       &target_core_dev_pr_cit);
+                       &t->tb_cits.tb_dev_pr_cit);
        config_group_init_type_name(&dev->t10_wwn.t10_wwn_group, "wwn",
                        &target_core_dev_wwn_cit);
        config_group_init_type_name(&dev->t10_alua.alua_tg_pt_gps_group,
@@ -3112,6 +3121,14 @@ static struct config_item_type target_core_cit = {
 
 /* Stop functions for struct config_item_type target_core_hba_cit */
 
+void target_core_setup_sub_cits(struct se_subsystem_api *sa)
+{
+       target_core_setup_dev_cit(sa);
+       target_core_setup_dev_attrib_cit(sa);
+       target_core_setup_dev_pr_cit(sa);
+}
+EXPORT_SYMBOL(target_core_setup_sub_cits);
+
 static int __init target_core_init_configfs(void)
 {
        struct config_group *target_cg, *hba_cg = NULL, *alua_cg = NULL;