Merge tag '5.16-rc-part2-smb3-client-fixes' of git://git.samba.org/sfrench/cifs-2.6
[linux-2.6-microblaze.git] / drivers / target / target_core_fabric_configfs.c
index fc7edc0..0b65de9 100644 (file)
@@ -815,8 +815,76 @@ static struct configfs_item_operations target_fabric_tpg_base_item_ops = {
        .release                = target_fabric_tpg_release,
 };
 
-TF_CIT_SETUP_DRV(tpg_base, &target_fabric_tpg_base_item_ops, NULL);
+static ssize_t target_fabric_tpg_base_enable_show(struct config_item *item,
+                                                 char *page)
+{
+       return sysfs_emit(page, "%d\n", to_tpg(item)->enabled);
+}
+
+static ssize_t target_fabric_tpg_base_enable_store(struct config_item *item,
+                                                  const char *page,
+                                                  size_t count)
+{
+       struct se_portal_group *se_tpg = to_tpg(item);
+       int ret;
+       bool op;
+
+       ret = strtobool(page, &op);
+       if (ret)
+               return ret;
+
+       if (se_tpg->enabled == op)
+               return count;
+
+       ret = se_tpg->se_tpg_tfo->fabric_enable_tpg(se_tpg, op);
+       if (ret)
+               return ret;
+
+       se_tpg->enabled = op;
+
+       return count;
+}
+
+CONFIGFS_ATTR(target_fabric_tpg_base_, enable);
 
+static int
+target_fabric_setup_tpg_base_cit(struct target_fabric_configfs *tf)
+{
+       struct config_item_type *cit = &tf->tf_tpg_base_cit;
+       struct configfs_attribute **attrs = NULL;
+       size_t nr_attrs = 0;
+       int i = 0;
+
+       if (tf->tf_ops->tfc_tpg_base_attrs)
+               while (tf->tf_ops->tfc_tpg_base_attrs[nr_attrs] != NULL)
+                       nr_attrs++;
+
+       if (tf->tf_ops->fabric_enable_tpg)
+               nr_attrs++;
+
+       if (nr_attrs == 0)
+               goto done;
+
+       /* + 1 for final NULL in the array */
+       attrs = kcalloc(nr_attrs + 1, sizeof(*attrs), GFP_KERNEL);
+       if (!attrs)
+               return -ENOMEM;
+
+       if (tf->tf_ops->tfc_tpg_base_attrs)
+               for (; tf->tf_ops->tfc_tpg_base_attrs[i] != NULL; i++)
+                       attrs[i] = tf->tf_ops->tfc_tpg_base_attrs[i];
+
+       if (tf->tf_ops->fabric_enable_tpg)
+               attrs[i] = &target_fabric_tpg_base_attr_enable;
+
+done:
+       cit->ct_item_ops = &target_fabric_tpg_base_item_ops;
+       cit->ct_attrs = attrs;
+       cit->ct_owner = tf->tf_ops->module;
+       pr_debug("Setup generic tpg_base\n");
+
+       return 0;
+}
 /* End of tfc_tpg_base_cit */
 
 /* Start of tfc_tpg_cit */
@@ -1028,12 +1096,18 @@ TF_CIT_SETUP_DRV(discovery, NULL, NULL);
 
 int target_fabric_setup_cits(struct target_fabric_configfs *tf)
 {
+       int ret;
+
        target_fabric_setup_discovery_cit(tf);
        target_fabric_setup_wwn_cit(tf);
        target_fabric_setup_wwn_fabric_stats_cit(tf);
        target_fabric_setup_wwn_param_cit(tf);
        target_fabric_setup_tpg_cit(tf);
-       target_fabric_setup_tpg_base_cit(tf);
+
+       ret = target_fabric_setup_tpg_base_cit(tf);
+       if (ret)
+               return ret;
+
        target_fabric_setup_tpg_port_cit(tf);
        target_fabric_setup_tpg_port_stat_cit(tf);
        target_fabric_setup_tpg_lun_cit(tf);