]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Merge remote-tracking branch 'target-updates/for-next'
authorStephen Rothwell <sfr@canb.auug.org.au>
Thu, 5 Nov 2015 04:14:30 +0000 (15:14 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Thu, 5 Nov 2015 04:14:33 +0000 (15:14 +1100)
58 files changed:
Documentation/filesystems/Makefile
Documentation/filesystems/configfs/Makefile [deleted file]
Documentation/filesystems/configfs/configfs.txt
Documentation/filesystems/configfs/configfs_example_explicit.c [deleted file]
Documentation/target/tcm_mod_builder.py
drivers/hwtracing/stm/policy.c
drivers/infiniband/ulp/srpt/ib_srpt.c
drivers/misc/spear13xx_pcie_gadget.c
drivers/net/netconsole.c
drivers/scsi/qla2xxx/tcm_qla2xxx.c
drivers/target/iscsi/iscsi_target_configfs.c
drivers/target/iscsi/iscsi_target_stat.c
drivers/target/loopback/tcm_loop.c
drivers/target/sbp/sbp_target.c
drivers/target/target_core_configfs.c
drivers/target/target_core_fabric_configfs.c
drivers/target/target_core_internal.h
drivers/target/target_core_stat.c
drivers/target/tcm_fc/tfc_cmd.c
drivers/target/tcm_fc/tfc_conf.c
drivers/target/tcm_fc/tfc_io.c
drivers/target/tcm_fc/tfc_sess.c
drivers/usb/gadget/configfs.c
drivers/usb/gadget/function/f_acm.c
drivers/usb/gadget/function/f_ecm.c
drivers/usb/gadget/function/f_eem.c
drivers/usb/gadget/function/f_hid.c
drivers/usb/gadget/function/f_loopback.c
drivers/usb/gadget/function/f_mass_storage.c
drivers/usb/gadget/function/f_midi.c
drivers/usb/gadget/function/f_ncm.c
drivers/usb/gadget/function/f_obex.c
drivers/usb/gadget/function/f_phonet.c
drivers/usb/gadget/function/f_printer.c
drivers/usb/gadget/function/f_rndis.c
drivers/usb/gadget/function/f_serial.c
drivers/usb/gadget/function/f_sourcesink.c
drivers/usb/gadget/function/f_subset.c
drivers/usb/gadget/function/f_uac1.c
drivers/usb/gadget/function/f_uac2.c
drivers/usb/gadget/function/u_ether_configfs.h
drivers/usb/gadget/function/uvc_configfs.c
drivers/usb/gadget/legacy/tcm_usb_gadget.c
drivers/vhost/scsi.c
drivers/xen/xen-scsiback.c
fs/configfs/file.c
fs/dlm/config.c
fs/ocfs2/cluster/heartbeat.c
fs/ocfs2/cluster/nodemanager.c
include/linux/configfs.h
include/linux/usb/gadget_configfs.h
include/target/configfs_macros.h [deleted file]
include/target/target_core_base.h
include/target/target_core_fabric_configfs.h [deleted file]
samples/Kconfig
samples/Makefile
samples/configfs/Makefile [new file with mode: 0644]
samples/configfs/configfs_sample.c [moved from Documentation/filesystems/configfs/configfs_example_macros.c with 74% similarity]

index 13483d192ebb9f80bf541eead154f28c1eb44c0f..883010ce5e35bcd88885b0a5eeff68e82676029f 100644 (file)
@@ -1,5 +1,3 @@
-subdir-y := configfs
-
 # List of programs to build
 hostprogs-y := dnotify_test
 
diff --git a/Documentation/filesystems/configfs/Makefile b/Documentation/filesystems/configfs/Makefile
deleted file mode 100644 (file)
index be7ec5e..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-ifneq ($(CONFIG_CONFIGFS_FS),)
-obj-m += configfs_example_explicit.o configfs_example_macros.o
-endif
index b40fec9d3f53b6402a4a21ba74f170c466d73300..af68efdbbfaddb0827b29f1fc4fb4b0eacc43b3a 100644 (file)
@@ -160,12 +160,6 @@ among other things.  For that, it needs a type.
 
        struct configfs_item_operations {
                void (*release)(struct config_item *);
-               ssize_t (*show_attribute)(struct config_item *,
-                                         struct configfs_attribute *,
-                                         char *);
-               ssize_t (*store_attribute)(struct config_item *,
-                                          struct configfs_attribute *,
-                                          const char *, size_t);
                int (*allow_link)(struct config_item *src,
                                  struct config_item *target);
                int (*drop_link)(struct config_item *src,
@@ -183,9 +177,7 @@ The most basic function of a config_item_type is to define what
 operations can be performed on a config_item.  All items that have been
 allocated dynamically will need to provide the ct_item_ops->release()
 method.  This method is called when the config_item's reference count
-reaches zero.  Items that wish to display an attribute need to provide
-the ct_item_ops->show_attribute() method.  Similarly, storing a new
-attribute value uses the store_attribute() method.
+reaches zero.
 
 [struct configfs_attribute]
 
@@ -193,6 +185,8 @@ attribute value uses the store_attribute() method.
                char                    *ca_name;
                struct module           *ca_owner;
                umode_t                  ca_mode;
+               ssize_t (*show)(struct config_item *, char *);
+               ssize_t (*store)(struct config_item *, const char *, size_t);
        };
 
 When a config_item wants an attribute to appear as a file in the item's
@@ -202,10 +196,10 @@ config_item_type->ct_attrs.  When the item appears in configfs, the
 attribute file will appear with the configfs_attribute->ca_name
 filename.  configfs_attribute->ca_mode specifies the file permissions.
 
-If an attribute is readable and the config_item provides a
-ct_item_ops->show_attribute() method, that method will be called
-whenever userspace asks for a read(2) on the attribute.  The converse
-will happen for write(2).
+If an attribute is readable and provides a ->show method, that method will
+be called whenever userspace asks for a read(2) on the attribute.  If an
+attribute is writable and provides a ->store  method, that method will be
+be called whenever userspace asks for a write(2) on the attribute.
 
 [struct config_group]
 
@@ -311,20 +305,10 @@ the subsystem must be ready for it.
 [An Example]
 
 The best example of these basic concepts is the simple_children
-subsystem/group and the simple_child item in configfs_example_explicit.c
-and configfs_example_macros.c.  It shows a trivial object displaying and
-storing an attribute, and a simple group creating and destroying these
-children.
-
-The only difference between configfs_example_explicit.c and
-configfs_example_macros.c is how the attributes of the childless item
-are defined.  The childless item has extended attributes, each with
-their own show()/store() operation.  This follows a convention commonly
-used in sysfs.  configfs_example_explicit.c creates these attributes
-by explicitly defining the structures involved.  Conversely
-configfs_example_macros.c uses some convenience macros from configfs.h
-to define the attributes.  These macros are similar to their sysfs
-counterparts.
+subsystem/group and the simple_child item in
+samples/configfs/configfs_sample.c. It shows a trivial object displaying
+and storing an attribute, and a simple group creating and destroying
+these children.
 
 [Hierarchy Navigation and the Subsystem Mutex]
 
diff --git a/Documentation/filesystems/configfs/configfs_example_explicit.c b/Documentation/filesystems/configfs/configfs_example_explicit.c
deleted file mode 100644 (file)
index 1420233..0000000
+++ /dev/null
@@ -1,483 +0,0 @@
-/*
- * vim: noexpandtab ts=8 sts=0 sw=8:
- *
- * configfs_example_explicit.c - This file is a demonstration module
- *      containing a number of configfs subsystems.  It explicitly defines
- *      each structure without using the helper macros defined in
- *      configfs.h.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 021110-1307, USA.
- *
- * Based on sysfs:
- *     sysfs is Copyright (C) 2001, 2002, 2003 Patrick Mochel
- *
- * configfs Copyright (C) 2005 Oracle.  All rights reserved.
- */
-
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/slab.h>
-
-#include <linux/configfs.h>
-
-
-
-/*
- * 01-childless
- *
- * This first example is a childless subsystem.  It cannot create
- * any config_items.  It just has attributes.
- *
- * Note that we are enclosing the configfs_subsystem inside a container.
- * This is not necessary if a subsystem has no attributes directly
- * on the subsystem.  See the next example, 02-simple-children, for
- * such a subsystem.
- */
-
-struct childless {
-       struct configfs_subsystem subsys;
-       int showme;
-       int storeme;
-};
-
-struct childless_attribute {
-       struct configfs_attribute attr;
-       ssize_t (*show)(struct childless *, char *);
-       ssize_t (*store)(struct childless *, const char *, size_t);
-};
-
-static inline struct childless *to_childless(struct config_item *item)
-{
-       return item ? container_of(to_configfs_subsystem(to_config_group(item)), struct childless, subsys) : NULL;
-}
-
-static ssize_t childless_showme_read(struct childless *childless,
-                                    char *page)
-{
-       ssize_t pos;
-
-       pos = sprintf(page, "%d\n", childless->showme);
-       childless->showme++;
-
-       return pos;
-}
-
-static ssize_t childless_storeme_read(struct childless *childless,
-                                     char *page)
-{
-       return sprintf(page, "%d\n", childless->storeme);
-}
-
-static ssize_t childless_storeme_write(struct childless *childless,
-                                      const char *page,
-                                      size_t count)
-{
-       unsigned long tmp;
-       char *p = (char *) page;
-
-       tmp = simple_strtoul(p, &p, 10);
-       if ((*p != '\0') && (*p != '\n'))
-               return -EINVAL;
-
-       if (tmp > INT_MAX)
-               return -ERANGE;
-
-       childless->storeme = tmp;
-
-       return count;
-}
-
-static ssize_t childless_description_read(struct childless *childless,
-                                         char *page)
-{
-       return sprintf(page,
-"[01-childless]\n"
-"\n"
-"The childless subsystem is the simplest possible subsystem in\n"
-"configfs.  It does not support the creation of child config_items.\n"
-"It only has a few attributes.  In fact, it isn't much different\n"
-"than a directory in /proc.\n");
-}
-
-static struct childless_attribute childless_attr_showme = {
-       .attr   = { .ca_owner = THIS_MODULE, .ca_name = "showme", .ca_mode = S_IRUGO },
-       .show   = childless_showme_read,
-};
-static struct childless_attribute childless_attr_storeme = {
-       .attr   = { .ca_owner = THIS_MODULE, .ca_name = "storeme", .ca_mode = S_IRUGO | S_IWUSR },
-       .show   = childless_storeme_read,
-       .store  = childless_storeme_write,
-};
-static struct childless_attribute childless_attr_description = {
-       .attr = { .ca_owner = THIS_MODULE, .ca_name = "description", .ca_mode = S_IRUGO },
-       .show = childless_description_read,
-};
-
-static struct configfs_attribute *childless_attrs[] = {
-       &childless_attr_showme.attr,
-       &childless_attr_storeme.attr,
-       &childless_attr_description.attr,
-       NULL,
-};
-
-static ssize_t childless_attr_show(struct config_item *item,
-                                  struct configfs_attribute *attr,
-                                  char *page)
-{
-       struct childless *childless = to_childless(item);
-       struct childless_attribute *childless_attr =
-               container_of(attr, struct childless_attribute, attr);
-       ssize_t ret = 0;
-
-       if (childless_attr->show)
-               ret = childless_attr->show(childless, page);
-       return ret;
-}
-
-static ssize_t childless_attr_store(struct config_item *item,
-                                   struct configfs_attribute *attr,
-                                   const char *page, size_t count)
-{
-       struct childless *childless = to_childless(item);
-       struct childless_attribute *childless_attr =
-               container_of(attr, struct childless_attribute, attr);
-       ssize_t ret = -EINVAL;
-
-       if (childless_attr->store)
-               ret = childless_attr->store(childless, page, count);
-       return ret;
-}
-
-static struct configfs_item_operations childless_item_ops = {
-       .show_attribute         = childless_attr_show,
-       .store_attribute        = childless_attr_store,
-};
-
-static struct config_item_type childless_type = {
-       .ct_item_ops    = &childless_item_ops,
-       .ct_attrs       = childless_attrs,
-       .ct_owner       = THIS_MODULE,
-};
-
-static struct childless childless_subsys = {
-       .subsys = {
-               .su_group = {
-                       .cg_item = {
-                               .ci_namebuf = "01-childless",
-                               .ci_type = &childless_type,
-                       },
-               },
-       },
-};
-
-
-/* ----------------------------------------------------------------- */
-
-/*
- * 02-simple-children
- *
- * This example merely has a simple one-attribute child.  Note that
- * there is no extra attribute structure, as the child's attribute is
- * known from the get-go.  Also, there is no container for the
- * subsystem, as it has no attributes of its own.
- */
-
-struct simple_child {
-       struct config_item item;
-       int storeme;
-};
-
-static inline struct simple_child *to_simple_child(struct config_item *item)
-{
-       return item ? container_of(item, struct simple_child, item) : NULL;
-}
-
-static struct configfs_attribute simple_child_attr_storeme = {
-       .ca_owner = THIS_MODULE,
-       .ca_name = "storeme",
-       .ca_mode = S_IRUGO | S_IWUSR,
-};
-
-static struct configfs_attribute *simple_child_attrs[] = {
-       &simple_child_attr_storeme,
-       NULL,
-};
-
-static ssize_t simple_child_attr_show(struct config_item *item,
-                                     struct configfs_attribute *attr,
-                                     char *page)
-{
-       ssize_t count;
-       struct simple_child *simple_child = to_simple_child(item);
-
-       count = sprintf(page, "%d\n", simple_child->storeme);
-
-       return count;
-}
-
-static ssize_t simple_child_attr_store(struct config_item *item,
-                                      struct configfs_attribute *attr,
-                                      const char *page, size_t count)
-{
-       struct simple_child *simple_child = to_simple_child(item);
-       unsigned long tmp;
-       char *p = (char *) page;
-
-       tmp = simple_strtoul(p, &p, 10);
-       if (!p || (*p && (*p != '\n')))
-               return -EINVAL;
-
-       if (tmp > INT_MAX)
-               return -ERANGE;
-
-       simple_child->storeme = tmp;
-
-       return count;
-}
-
-static void simple_child_release(struct config_item *item)
-{
-       kfree(to_simple_child(item));
-}
-
-static struct configfs_item_operations simple_child_item_ops = {
-       .release                = simple_child_release,
-       .show_attribute         = simple_child_attr_show,
-       .store_attribute        = simple_child_attr_store,
-};
-
-static struct config_item_type simple_child_type = {
-       .ct_item_ops    = &simple_child_item_ops,
-       .ct_attrs       = simple_child_attrs,
-       .ct_owner       = THIS_MODULE,
-};
-
-
-struct simple_children {
-       struct config_group group;
-};
-
-static inline struct simple_children *to_simple_children(struct config_item *item)
-{
-       return item ? container_of(to_config_group(item), struct simple_children, group) : NULL;
-}
-
-static struct config_item *simple_children_make_item(struct config_group *group, const char *name)
-{
-       struct simple_child *simple_child;
-
-       simple_child = kzalloc(sizeof(struct simple_child), GFP_KERNEL);
-       if (!simple_child)
-               return ERR_PTR(-ENOMEM);
-
-       config_item_init_type_name(&simple_child->item, name,
-                                  &simple_child_type);
-
-       simple_child->storeme = 0;
-
-       return &simple_child->item;
-}
-
-static struct configfs_attribute simple_children_attr_description = {
-       .ca_owner = THIS_MODULE,
-       .ca_name = "description",
-       .ca_mode = S_IRUGO,
-};
-
-static struct configfs_attribute *simple_children_attrs[] = {
-       &simple_children_attr_description,
-       NULL,
-};
-
-static ssize_t simple_children_attr_show(struct config_item *item,
-                                        struct configfs_attribute *attr,
-                                        char *page)
-{
-       return sprintf(page,
-"[02-simple-children]\n"
-"\n"
-"This subsystem allows the creation of child config_items.  These\n"
-"items have only one attribute that is readable and writeable.\n");
-}
-
-static void simple_children_release(struct config_item *item)
-{
-       kfree(to_simple_children(item));
-}
-
-static struct configfs_item_operations simple_children_item_ops = {
-       .release        = simple_children_release,
-       .show_attribute = simple_children_attr_show,
-};
-
-/*
- * Note that, since no extra work is required on ->drop_item(),
- * no ->drop_item() is provided.
- */
-static struct configfs_group_operations simple_children_group_ops = {
-       .make_item      = simple_children_make_item,
-};
-
-static struct config_item_type simple_children_type = {
-       .ct_item_ops    = &simple_children_item_ops,
-       .ct_group_ops   = &simple_children_group_ops,
-       .ct_attrs       = simple_children_attrs,
-       .ct_owner       = THIS_MODULE,
-};
-
-static struct configfs_subsystem simple_children_subsys = {
-       .su_group = {
-               .cg_item = {
-                       .ci_namebuf = "02-simple-children",
-                       .ci_type = &simple_children_type,
-               },
-       },
-};
-
-
-/* ----------------------------------------------------------------- */
-
-/*
- * 03-group-children
- *
- * This example reuses the simple_children group from above.  However,
- * the simple_children group is not the subsystem itself, it is a
- * child of the subsystem.  Creation of a group in the subsystem creates
- * a new simple_children group.  That group can then have simple_child
- * children of its own.
- */
-
-static struct config_group *group_children_make_group(struct config_group *group, const char *name)
-{
-       struct simple_children *simple_children;
-
-       simple_children = kzalloc(sizeof(struct simple_children),
-                                 GFP_KERNEL);
-       if (!simple_children)
-               return ERR_PTR(-ENOMEM);
-
-       config_group_init_type_name(&simple_children->group, name,
-                                   &simple_children_type);
-
-       return &simple_children->group;
-}
-
-static struct configfs_attribute group_children_attr_description = {
-       .ca_owner = THIS_MODULE,
-       .ca_name = "description",
-       .ca_mode = S_IRUGO,
-};
-
-static struct configfs_attribute *group_children_attrs[] = {
-       &group_children_attr_description,
-       NULL,
-};
-
-static ssize_t group_children_attr_show(struct config_item *item,
-                                       struct configfs_attribute *attr,
-                                       char *page)
-{
-       return sprintf(page,
-"[03-group-children]\n"
-"\n"
-"This subsystem allows the creation of child config_groups.  These\n"
-"groups are like the subsystem simple-children.\n");
-}
-
-static struct configfs_item_operations group_children_item_ops = {
-       .show_attribute = group_children_attr_show,
-};
-
-/*
- * Note that, since no extra work is required on ->drop_item(),
- * no ->drop_item() is provided.
- */
-static struct configfs_group_operations group_children_group_ops = {
-       .make_group     = group_children_make_group,
-};
-
-static struct config_item_type group_children_type = {
-       .ct_item_ops    = &group_children_item_ops,
-       .ct_group_ops   = &group_children_group_ops,
-       .ct_attrs       = group_children_attrs,
-       .ct_owner       = THIS_MODULE,
-};
-
-static struct configfs_subsystem group_children_subsys = {
-       .su_group = {
-               .cg_item = {
-                       .ci_namebuf = "03-group-children",
-                       .ci_type = &group_children_type,
-               },
-       },
-};
-
-/* ----------------------------------------------------------------- */
-
-/*
- * We're now done with our subsystem definitions.
- * For convenience in this module, here's a list of them all.  It
- * allows the init function to easily register them.  Most modules
- * will only have one subsystem, and will only call register_subsystem
- * on it directly.
- */
-static struct configfs_subsystem *example_subsys[] = {
-       &childless_subsys.subsys,
-       &simple_children_subsys,
-       &group_children_subsys,
-       NULL,
-};
-
-static int __init configfs_example_init(void)
-{
-       int ret;
-       int i;
-       struct configfs_subsystem *subsys;
-
-       for (i = 0; example_subsys[i]; i++) {
-               subsys = example_subsys[i];
-
-               config_group_init(&subsys->su_group);
-               mutex_init(&subsys->su_mutex);
-               ret = configfs_register_subsystem(subsys);
-               if (ret) {
-                       printk(KERN_ERR "Error %d while registering subsystem %s\n",
-                              ret,
-                              subsys->su_group.cg_item.ci_namebuf);
-                       goto out_unregister;
-               }
-       }
-
-       return 0;
-
-out_unregister:
-       for (i--; i >= 0; i--)
-               configfs_unregister_subsystem(example_subsys[i]);
-
-       return ret;
-}
-
-static void __exit configfs_example_exit(void)
-{
-       int i;
-
-       for (i = 0; example_subsys[i]; i++)
-               configfs_unregister_subsystem(example_subsys[i]);
-}
-
-module_init(configfs_example_init);
-module_exit(configfs_example_exit);
-MODULE_LICENSE("GPL");
index cda56df9b8a7ce591f3eb254cad1d423c0a856c5..7d370c9b1450c5fc5a2230d086026fa1c7d59ab7 100755 (executable)
@@ -203,8 +203,6 @@ def tcm_mod_build_configfs(proto_ident, fabric_mod_dir_var, fabric_mod_name):
        buf += "#include <scsi/scsi_proto.h>\n\n"
        buf += "#include <target/target_core_base.h>\n"
        buf += "#include <target/target_core_fabric.h>\n"
-       buf += "#include <target/target_core_fabric_configfs.h>\n"
-       buf += "#include <target/configfs_macros.h>\n\n"
        buf += "#include \"" + fabric_mod_name + "_base.h\"\n"
        buf += "#include \"" + fabric_mod_name + "_fabric.h\"\n\n"
 
@@ -283,19 +281,6 @@ def tcm_mod_build_configfs(proto_ident, fabric_mod_dir_var, fabric_mod_name):
        buf += "                                struct " + fabric_mod_name + "_" + fabric_mod_port + ", " + fabric_mod_port + "_wwn);\n"
        buf += "        kfree(" + fabric_mod_port + ");\n"
        buf += "}\n\n"
-       buf += "static ssize_t " + fabric_mod_name + "_wwn_show_attr_version(\n"
-       buf += "        struct target_fabric_configfs *tf,\n"
-       buf += "        char *page)\n"
-       buf += "{\n"
-       buf += "        return sprintf(page, \"" + fabric_mod_name.upper() + " fabric module %s on %s/%s\"\n"
-       buf += "                \"on \"UTS_RELEASE\"\\n\", " + fabric_mod_name.upper() + "_VERSION, utsname()->sysname,\n"
-       buf += "                utsname()->machine);\n"
-       buf += "}\n\n"
-       buf += "TF_WWN_ATTR_RO(" + fabric_mod_name + ", version);\n\n"
-       buf += "static struct configfs_attribute *" + fabric_mod_name + "_wwn_attrs[] = {\n"
-       buf += "        &" + fabric_mod_name + "_wwn_version.attr,\n"
-       buf += "        NULL,\n"
-       buf += "};\n\n"
 
        buf += "static const struct target_core_fabric_ops " + fabric_mod_name + "_ops = {\n"
        buf += "        .module                         = THIS_MODULE,\n"
@@ -328,8 +313,6 @@ def tcm_mod_build_configfs(proto_ident, fabric_mod_dir_var, fabric_mod_name):
        buf += "        .fabric_drop_wwn                = " + fabric_mod_name + "_drop_" + fabric_mod_port + ",\n"
        buf += "        .fabric_make_tpg                = " + fabric_mod_name + "_make_tpg,\n"
        buf += "        .fabric_drop_tpg                = " + fabric_mod_name + "_drop_tpg,\n"
-       buf += "\n"
-       buf += "        .tfc_wwn_attrs                  = " + fabric_mod_name + "_wwn_attrs,\n"
        buf += "};\n\n"
 
        buf += "static int __init " + fabric_mod_name + "_init(void)\n"
index 6498a9dbb7bd184802c6f270548c417b24e38e2d..11ab6d01adf63d1490c8474801d358ada4f657a8 100644 (file)
@@ -76,9 +76,10 @@ to_stp_policy_node(struct config_item *item)
                NULL;
 }
 
-static ssize_t stp_policy_node_masters_show(struct stp_policy_node *policy_node,
-                                           char *page)
+static ssize_t
+stp_policy_node_masters_show(struct config_item *item, char *page)
 {
+       struct stp_policy_node *policy_node = to_stp_policy_node(item);
        ssize_t count;
 
        count = sprintf(page, "%u %u\n", policy_node->first_master,
@@ -88,9 +89,10 @@ static ssize_t stp_policy_node_masters_show(struct stp_policy_node *policy_node,
 }
 
 static ssize_t
-stp_policy_node_masters_store(struct stp_policy_node *policy_node,
-                             const char *page, size_t count)
+stp_policy_node_masters_store(struct config_item *item, const char *page,
+                             size_t count)
 {
+       struct stp_policy_node *policy_node = to_stp_policy_node(item);
        unsigned int first, last;
        struct stm_device *stm;
        char *p = (char *)page;
@@ -123,8 +125,9 @@ unlock:
 }
 
 static ssize_t
-stp_policy_node_channels_show(struct stp_policy_node *policy_node, char *page)
+stp_policy_node_channels_show(struct config_item *item, char *page)
 {
+       struct stp_policy_node *policy_node = to_stp_policy_node(item);
        ssize_t count;
 
        count = sprintf(page, "%u %u\n", policy_node->first_channel,
@@ -134,9 +137,10 @@ stp_policy_node_channels_show(struct stp_policy_node *policy_node, char *page)
 }
 
 static ssize_t
-stp_policy_node_channels_store(struct stp_policy_node *policy_node,
-                              const char *page, size_t count)
+stp_policy_node_channels_store(struct config_item *item, const char *page,
+                              size_t count)
 {
+       struct stp_policy_node *policy_node = to_stp_policy_node(item);
        unsigned int first, last;
        struct stm_device *stm;
        char *p = (char *)page;
@@ -171,71 +175,16 @@ static void stp_policy_node_release(struct config_item *item)
        kfree(to_stp_policy_node(item));
 }
 
-struct stp_policy_node_attribute {
-       struct configfs_attribute       attr;
-       ssize_t (*show)(struct stp_policy_node *, char *);
-       ssize_t (*store)(struct stp_policy_node *, const char *, size_t);
-};
-
-static ssize_t stp_policy_node_attr_show(struct config_item *item,
-                                        struct configfs_attribute *attr,
-                                        char *page)
-{
-       struct stp_policy_node *policy_node = to_stp_policy_node(item);
-       struct stp_policy_node_attribute *pn_attr =
-               container_of(attr, struct stp_policy_node_attribute, attr);
-       ssize_t count = 0;
-
-       if (pn_attr->show)
-               count = pn_attr->show(policy_node, page);
-
-       return count;
-}
-
-static ssize_t stp_policy_node_attr_store(struct config_item *item,
-                                         struct configfs_attribute *attr,
-                                         const char *page, size_t len)
-{
-       struct stp_policy_node *policy_node = to_stp_policy_node(item);
-       struct stp_policy_node_attribute *pn_attr =
-               container_of(attr, struct stp_policy_node_attribute, attr);
-       ssize_t count = -EINVAL;
-
-       if (pn_attr->store)
-               count = pn_attr->store(policy_node, page, len);
-
-       return count;
-}
-
 static struct configfs_item_operations stp_policy_node_item_ops = {
        .release                = stp_policy_node_release,
-       .show_attribute         = stp_policy_node_attr_show,
-       .store_attribute        = stp_policy_node_attr_store,
 };
 
-static struct stp_policy_node_attribute stp_policy_node_attr_range = {
-       .attr   = {
-               .ca_owner = THIS_MODULE,
-               .ca_name = "masters",
-               .ca_mode = S_IRUGO | S_IWUSR,
-       },
-       .show   = stp_policy_node_masters_show,
-       .store  = stp_policy_node_masters_store,
-};
-
-static struct stp_policy_node_attribute stp_policy_node_attr_channels = {
-       .attr   = {
-               .ca_owner = THIS_MODULE,
-               .ca_name = "channels",
-               .ca_mode = S_IRUGO | S_IWUSR,
-       },
-       .show   = stp_policy_node_channels_show,
-       .store  = stp_policy_node_channels_store,
-};
+CONFIGFS_ATTR(stp_policy_node_, masters);
+CONFIGFS_ATTR(stp_policy_node_, channels);
 
 static struct configfs_attribute *stp_policy_node_attrs[] = {
-       &stp_policy_node_attr_range.attr,
-       &stp_policy_node_attr_channels.attr,
+       &stp_policy_node_attr_masters,
+       &stp_policy_node_attr_channels,
        NULL,
 };
 
@@ -298,20 +247,8 @@ static struct config_item_type stp_policy_node_type = {
 /*
  * Root group: policies.
  */
-static struct configfs_attribute stp_policy_attr_device = {
-       .ca_owner = THIS_MODULE,
-       .ca_name = "device",
-       .ca_mode = S_IRUGO,
-};
-
-static struct configfs_attribute *stp_policy_attrs[] = {
-       &stp_policy_attr_device,
-       NULL,
-};
-
-static ssize_t stp_policy_attr_show(struct config_item *item,
-                                   struct configfs_attribute *attr,
-                                   char *page)
+static ssize_t stp_policy_device_show(struct config_item *item,
+                                     char *page)
 {
        struct stp_policy *policy = to_stp_policy(item);
        ssize_t count;
@@ -324,6 +261,13 @@ static ssize_t stp_policy_attr_show(struct config_item *item,
        return count;
 }
 
+CONFIGFS_ATTR_RO(stp_policy_, device);
+
+static struct configfs_attribute *stp_policy_attrs[] = {
+       &stp_policy_attr_device,
+       NULL,
+};
+
 void stp_policy_unbind(struct stp_policy *policy)
 {
        struct stm_device *stm = policy->stm;
@@ -350,7 +294,6 @@ static void stp_policy_release(struct config_item *item)
 
 static struct configfs_item_operations stp_policy_item_ops = {
        .release                = stp_policy_release,
-       .show_attribute         = stp_policy_attr_show,
 };
 
 static struct configfs_group_operations stp_policy_group_ops = {
index 47c4022fda7680e3107710bb703e83fa61affc15..2e2fe818ca9f1acc42d74c8f4d0e0cfbaf810172 100644 (file)
@@ -43,9 +43,7 @@
 #include <linux/atomic.h>
 #include <scsi/scsi_proto.h>
 #include <scsi/scsi_tcq.h>
-#include <target/configfs_macros.h>
 #include <target/target_core_base.h>
-#include <target/target_core_fabric_configfs.h>
 #include <target/target_core_fabric.h>
 #include "ib_srpt.h"
 
@@ -3546,20 +3544,19 @@ static void srpt_cleanup_nodeacl(struct se_node_acl *se_nacl)
        spin_unlock_irq(&sport->port_acl_lock);
 }
 
-static ssize_t srpt_tpg_attrib_show_srp_max_rdma_size(
-       struct se_portal_group *se_tpg,
-       char *page)
+static ssize_t srpt_tpg_attrib_srp_max_rdma_size_show(struct config_item *item,
+               char *page)
 {
+       struct se_portal_group *se_tpg = attrib_to_tpg(item);
        struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
 
        return sprintf(page, "%u\n", sport->port_attrib.srp_max_rdma_size);
 }
 
-static ssize_t srpt_tpg_attrib_store_srp_max_rdma_size(
-       struct se_portal_group *se_tpg,
-       const char *page,
-       size_t count)
+static ssize_t srpt_tpg_attrib_srp_max_rdma_size_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = attrib_to_tpg(item);
        struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
        unsigned long val;
        int ret;
@@ -3584,22 +3581,19 @@ static ssize_t srpt_tpg_attrib_store_srp_max_rdma_size(
        return count;
 }
 
-TF_TPG_ATTRIB_ATTR(srpt, srp_max_rdma_size, S_IRUGO | S_IWUSR);
-
-static ssize_t srpt_tpg_attrib_show_srp_max_rsp_size(
-       struct se_portal_group *se_tpg,
-       char *page)
+static ssize_t srpt_tpg_attrib_srp_max_rsp_size_show(struct config_item *item,
+               char *page)
 {
+       struct se_portal_group *se_tpg = attrib_to_tpg(item);
        struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
 
        return sprintf(page, "%u\n", sport->port_attrib.srp_max_rsp_size);
 }
 
-static ssize_t srpt_tpg_attrib_store_srp_max_rsp_size(
-       struct se_portal_group *se_tpg,
-       const char *page,
-       size_t count)
+static ssize_t srpt_tpg_attrib_srp_max_rsp_size_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = attrib_to_tpg(item);
        struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
        unsigned long val;
        int ret;
@@ -3624,22 +3618,19 @@ static ssize_t srpt_tpg_attrib_store_srp_max_rsp_size(
        return count;
 }
 
-TF_TPG_ATTRIB_ATTR(srpt, srp_max_rsp_size, S_IRUGO | S_IWUSR);
-
-static ssize_t srpt_tpg_attrib_show_srp_sq_size(
-       struct se_portal_group *se_tpg,
-       char *page)
+static ssize_t srpt_tpg_attrib_srp_sq_size_show(struct config_item *item,
+               char *page)
 {
+       struct se_portal_group *se_tpg = attrib_to_tpg(item);
        struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
 
        return sprintf(page, "%u\n", sport->port_attrib.srp_sq_size);
 }
 
-static ssize_t srpt_tpg_attrib_store_srp_sq_size(
-       struct se_portal_group *se_tpg,
-       const char *page,
-       size_t count)
+static ssize_t srpt_tpg_attrib_srp_sq_size_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = attrib_to_tpg(item);
        struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
        unsigned long val;
        int ret;
@@ -3664,29 +3655,29 @@ static ssize_t srpt_tpg_attrib_store_srp_sq_size(
        return count;
 }
 
-TF_TPG_ATTRIB_ATTR(srpt, srp_sq_size, S_IRUGO | S_IWUSR);
+CONFIGFS_ATTR(srpt_tpg_attrib_,  srp_max_rdma_size);
+CONFIGFS_ATTR(srpt_tpg_attrib_,  srp_max_rsp_size);
+CONFIGFS_ATTR(srpt_tpg_attrib_,  srp_sq_size);
 
 static struct configfs_attribute *srpt_tpg_attrib_attrs[] = {
-       &srpt_tpg_attrib_srp_max_rdma_size.attr,
-       &srpt_tpg_attrib_srp_max_rsp_size.attr,
-       &srpt_tpg_attrib_srp_sq_size.attr,
+       &srpt_tpg_attrib_attr_srp_max_rdma_size,
+       &srpt_tpg_attrib_attr_srp_max_rsp_size,
+       &srpt_tpg_attrib_attr_srp_sq_size,
        NULL,
 };
 
-static ssize_t srpt_tpg_show_enable(
-       struct se_portal_group *se_tpg,
-       char *page)
+static ssize_t srpt_tpg_enable_show(struct config_item *item, char *page)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
 
        return snprintf(page, PAGE_SIZE, "%d\n", (sport->enabled) ? 1: 0);
 }
 
-static ssize_t srpt_tpg_store_enable(
-       struct se_portal_group *se_tpg,
-       const char *page,
-       size_t count)
+static ssize_t srpt_tpg_enable_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
        unsigned long tmp;
         int ret;
@@ -3709,10 +3700,10 @@ static ssize_t srpt_tpg_store_enable(
        return count;
 }
 
-TF_TPG_BASE_ATTR(srpt, enable, S_IRUGO | S_IWUSR);
+CONFIGFS_ATTR(srpt_tpg_, enable);
 
 static struct configfs_attribute *srpt_tpg_attrs[] = {
-       &srpt_tpg_enable.attr,
+       &srpt_tpg_attr_enable,
        NULL,
 };
 
@@ -3782,16 +3773,15 @@ static void srpt_drop_tport(struct se_wwn *wwn)
        pr_debug("drop_tport(%s\n", config_item_name(&sport->port_wwn.wwn_group.cg_item));
 }
 
-static ssize_t srpt_wwn_show_attr_version(struct target_fabric_configfs *tf,
-                                             char *buf)
+static ssize_t srpt_wwn_version_show(struct config_item *item, char *buf)
 {
        return scnprintf(buf, PAGE_SIZE, "%s\n", DRV_VERSION);
 }
 
-TF_WWN_ATTR_RO(srpt, version);
+CONFIGFS_ATTR_RO(srpt_wwn_, version);
 
 static struct configfs_attribute *srpt_wwn_attrs[] = {
-       &srpt_wwn_version.attr,
+       &srpt_wwn_attr_version,
        NULL,
 };
 
index b8374cdaf9c940ab202821bbaa76e6923f360c84..ee120dcbb3e6ba9b842859496d565129d66c1fd8 100644 (file)
@@ -220,11 +220,17 @@ static irqreturn_t spear_pcie_gadget_irq(int irq, void *dev_id)
 /*
  * configfs interfaces show/store functions
  */
-static ssize_t pcie_gadget_show_link(
-               struct spear_pcie_gadget_config *config,
-               char *buf)
+
+static struct pcie_gadget_target *to_target(struct config_item *item)
 {
-       struct pcie_app_reg __iomem *app_reg = config->va_app_base;
+       return item ?
+               container_of(to_configfs_subsystem(to_config_group(item)),
+                               struct pcie_gadget_target, subsys) : NULL;
+}
+
+static ssize_t pcie_gadget_link_show(struct config_item *item, char *buf)
+{
+       struct pcie_app_reg __iomem *app_reg = to_target(item)->va_app_base;
 
        if (readl(&app_reg->app_status_1) & ((u32)1 << XMLH_LINK_UP_ID))
                return sprintf(buf, "UP");
@@ -232,11 +238,10 @@ static ssize_t pcie_gadget_show_link(
                return sprintf(buf, "DOWN");
 }
 
-static ssize_t pcie_gadget_store_link(
-               struct spear_pcie_gadget_config *config,
+static ssize_t pcie_gadget_link_store(struct config_item *item,
                const char *buf, size_t count)
 {
-       struct pcie_app_reg __iomem *app_reg = config->va_app_base;
+       struct pcie_app_reg __iomem *app_reg = to_target(item)->va_app_base;
 
        if (sysfs_streq(buf, "UP"))
                writel(readl(&app_reg->app_ctrl_0) | (1 << APP_LTSSM_ENABLE_ID),
@@ -250,17 +255,15 @@ static ssize_t pcie_gadget_store_link(
        return count;
 }
 
-static ssize_t pcie_gadget_show_int_type(
-               struct spear_pcie_gadget_config *config,
-               char *buf)
+static ssize_t pcie_gadget_int_type_show(struct config_item *item, char *buf)
 {
-       return sprintf(buf, "%s", config->int_type);
+       return sprintf(buf, "%s", to_target(item)->int_type);
 }
 
-static ssize_t pcie_gadget_store_int_type(
-               struct spear_pcie_gadget_config *config,
+static ssize_t pcie_gadget_int_type_store(struct config_item *item,
                const char *buf, size_t count)
 {
+       struct spear_pcie_gadget_config *config = to_target(item)
        u32 cap, vec, flags;
        ulong vector;
 
@@ -288,11 +291,10 @@ static ssize_t pcie_gadget_store_int_type(
        return count;
 }
 
-static ssize_t pcie_gadget_show_no_of_msi(
-               struct spear_pcie_gadget_config *config,
-               char *buf)
+static ssize_t pcie_gadget_no_of_msi_show(struct config_item *item, char *buf)
 {
-       struct pcie_app_reg __iomem *app_reg = config->va_app_base;
+       struct spear_pcie_gadget_config *config = to_target(item)
+       struct pcie_app_reg __iomem *app_reg = to_target(item)->va_app_base;
        u32 cap, vec, flags;
        ulong vector;
 
@@ -313,13 +315,12 @@ static ssize_t pcie_gadget_show_no_of_msi(
        return sprintf(buf, "%lu", vector);
 }
 
-static ssize_t pcie_gadget_store_no_of_msi(
-               struct spear_pcie_gadget_config *config,
+static ssize_t pcie_gadget_no_of_msi_store(struct config_item *item,
                const char *buf, size_t count)
 {
        int ret;
 
-       ret = kstrtoul(buf, 0, &config->requested_msi);
+       ret = kstrtoul(buf, 0, &to_target(item)->requested_msi);
        if (ret)
                return ret;
 
@@ -329,11 +330,10 @@ static ssize_t pcie_gadget_store_no_of_msi(
        return count;
 }
 
-static ssize_t pcie_gadget_store_inta(
-               struct spear_pcie_gadget_config *config,
+static ssize_t pcie_gadget_inta_store(struct config_item *item,
                const char *buf, size_t count)
 {
-       struct pcie_app_reg __iomem *app_reg = config->va_app_base;
+       struct pcie_app_reg __iomem *app_reg = to_target(item)->va_app_base;
        ulong en;
        int ret;
 
@@ -351,10 +351,10 @@ static ssize_t pcie_gadget_store_inta(
        return count;
 }
 
-static ssize_t pcie_gadget_store_send_msi(
-               struct spear_pcie_gadget_config *config,
+static ssize_t pcie_gadget_send_msi_store(struct config_item *item,
                const char *buf, size_t count)
 {
+       struct spear_pcie_gadget_config *config = to_target(item)
        struct pcie_app_reg __iomem *app_reg = config->va_app_base;
        ulong vector;
        u32 ven_msi;
@@ -388,19 +388,16 @@ static ssize_t pcie_gadget_store_send_msi(
        return count;
 }
 
-static ssize_t pcie_gadget_show_vendor_id(
-               struct spear_pcie_gadget_config *config,
-               char *buf)
+static ssize_t pcie_gadget_vendor_id_show(struct config_item *item, char *buf)
 {
        u32 id;
 
-       spear_dbi_read_reg(config, PCI_VENDOR_ID, 2, &id);
+       spear_dbi_read_reg(to_target(item), PCI_VENDOR_ID, 2, &id);
 
        return sprintf(buf, "%x", id);
 }
 
-static ssize_t pcie_gadget_store_vendor_id(
-               struct spear_pcie_gadget_config *config,
+static ssize_t pcie_gadget_vendor_id_store(struct config_item *item,
                const char *buf, size_t count)
 {
        ulong id;
@@ -410,24 +407,21 @@ static ssize_t pcie_gadget_store_vendor_id(
        if (ret)
                return ret;
 
-       spear_dbi_write_reg(config, PCI_VENDOR_ID, 2, id);
+       spear_dbi_write_reg(to_target(item), PCI_VENDOR_ID, 2, id);
 
        return count;
 }
 
-static ssize_t pcie_gadget_show_device_id(
-               struct spear_pcie_gadget_config *config,
-               char *buf)
+static ssize_t pcie_gadget_device_id_show(struct config_item *item, char *buf)
 {
        u32 id;
 
-       spear_dbi_read_reg(config, PCI_DEVICE_ID, 2, &id);
+       spear_dbi_read_reg(to_target(item), PCI_DEVICE_ID, 2, &id);
 
        return sprintf(buf, "%x", id);
 }
 
-static ssize_t pcie_gadget_store_device_id(
-               struct spear_pcie_gadget_config *config,
+static ssize_t pcie_gadget_device_id_store(struct config_item *item,
                const char *buf, size_t count)
 {
        ulong id;
@@ -437,22 +431,20 @@ static ssize_t pcie_gadget_store_device_id(
        if (ret)
                return ret;
 
-       spear_dbi_write_reg(config, PCI_DEVICE_ID, 2, id);
+       spear_dbi_write_reg(to_target(item), PCI_DEVICE_ID, 2, id);
 
        return count;
 }
 
-static ssize_t pcie_gadget_show_bar0_size(
-               struct spear_pcie_gadget_config *config,
-               char *buf)
+static ssize_t pcie_gadget_bar0_size_show(struct config_item *item, char *buf)
 {
-       return sprintf(buf, "%lx", config->bar0_size);
+       return sprintf(buf, "%lx", to_target(item)->bar0_size);
 }
 
-static ssize_t pcie_gadget_store_bar0_size(
-               struct spear_pcie_gadget_config *config,
+static ssize_t pcie_gadget_bar0_size_store(struct config_item *item,
                const char *buf, size_t count)
 {
+       struct spear_pcie_gadget_config *config = to_target(item)
        ulong size;
        u32 pos, pos1;
        u32 no_of_bit = 0;
@@ -489,21 +481,20 @@ static ssize_t pcie_gadget_store_bar0_size(
        return count;
 }
 
-static ssize_t pcie_gadget_show_bar0_address(
-               struct spear_pcie_gadget_config *config,
+static ssize_t pcie_gadget_bar0_address_show(struct config_item *item,
                char *buf)
 {
-       struct pcie_app_reg __iomem *app_reg = config->va_app_base;
+       struct pcie_app_reg __iomem *app_reg = to_target(item)->va_app_base;
 
        u32 address = readl(&app_reg->pim0_mem_addr_start);
 
        return sprintf(buf, "%x", address);
 }
 
-static ssize_t pcie_gadget_store_bar0_address(
-               struct spear_pcie_gadget_config *config,
+static ssize_t pcie_gadget_bar0_address_store(struct config_item *item,
                const char *buf, size_t count)
 {
+       struct spear_pcie_gadget_config *config = to_target(item)
        struct pcie_app_reg __iomem *app_reg = config->va_app_base;
        ulong address;
        int ret;
@@ -524,15 +515,13 @@ static ssize_t pcie_gadget_store_bar0_address(
        return count;
 }
 
-static ssize_t pcie_gadget_show_bar0_rw_offset(
-               struct spear_pcie_gadget_config *config,
+static ssize_t pcie_gadget_bar0_rw_offset_show(struct config_item *item,
                char *buf)
 {
-       return sprintf(buf, "%lx", config->bar0_rw_offset);
+       return sprintf(buf, "%lx", to_target(item)->bar0_rw_offset);
 }
 
-static ssize_t pcie_gadget_store_bar0_rw_offset(
-               struct spear_pcie_gadget_config *config,
+static ssize_t pcie_gadget_bar0_rw_offset_store(struct config_item *item,
                const char *buf, size_t count)
 {
        ulong offset;
@@ -545,15 +534,14 @@ static ssize_t pcie_gadget_store_bar0_rw_offset(
        if (offset % 4)
                return -EINVAL;
 
-       config->bar0_rw_offset = offset;
+       to_target(item)->bar0_rw_offset = offset;
 
        return count;
 }
 
-static ssize_t pcie_gadget_show_bar0_data(
-               struct spear_pcie_gadget_config *config,
-               char *buf)
+static ssize_t pcie_gadget_bar0_data_show(struct config_item *item, char *buf)
 {
+       struct spear_pcie_gadget_config *config = to_target(item)
        ulong data;
 
        if (!config->va_bar0_address)
@@ -564,10 +552,10 @@ static ssize_t pcie_gadget_show_bar0_data(
        return sprintf(buf, "%lx", data);
 }
 
-static ssize_t pcie_gadget_store_bar0_data(
-               struct spear_pcie_gadget_config *config,
+static ssize_t pcie_gadget_bar0_data_store(struct config_item *item,
                const char *buf, size_t count)
 {
+       struct spear_pcie_gadget_config *config = to_target(item)
        ulong data;
        int ret;
 
@@ -583,97 +571,35 @@ static ssize_t pcie_gadget_store_bar0_data(
        return count;
 }
 
-/*
- * Attribute definitions.
- */
-
-#define PCIE_GADGET_TARGET_ATTR_RO(_name)                              \
-static struct pcie_gadget_target_attr pcie_gadget_target_##_name =     \
-       __CONFIGFS_ATTR(_name, S_IRUGO, pcie_gadget_show_##_name, NULL)
-
-#define PCIE_GADGET_TARGET_ATTR_WO(_name)                              \
-static struct pcie_gadget_target_attr pcie_gadget_target_##_name =     \
-       __CONFIGFS_ATTR(_name, S_IWUSR, NULL, pcie_gadget_store_##_name)
-
-#define PCIE_GADGET_TARGET_ATTR_RW(_name)                              \
-static struct pcie_gadget_target_attr pcie_gadget_target_##_name =     \
-       __CONFIGFS_ATTR(_name, S_IRUGO | S_IWUSR, pcie_gadget_show_##_name, \
-                       pcie_gadget_store_##_name)
-PCIE_GADGET_TARGET_ATTR_RW(link);
-PCIE_GADGET_TARGET_ATTR_RW(int_type);
-PCIE_GADGET_TARGET_ATTR_RW(no_of_msi);
-PCIE_GADGET_TARGET_ATTR_WO(inta);
-PCIE_GADGET_TARGET_ATTR_WO(send_msi);
-PCIE_GADGET_TARGET_ATTR_RW(vendor_id);
-PCIE_GADGET_TARGET_ATTR_RW(device_id);
-PCIE_GADGET_TARGET_ATTR_RW(bar0_size);
-PCIE_GADGET_TARGET_ATTR_RW(bar0_address);
-PCIE_GADGET_TARGET_ATTR_RW(bar0_rw_offset);
-PCIE_GADGET_TARGET_ATTR_RW(bar0_data);
+CONFIGFS_ATTR(pcie_gadget_, link);
+CONFIGFS_ATTR(pcie_gadget_, int_type);
+CONFIGFS_ATTR(pcie_gadget_, no_of_msi);
+CONFIGFS_ATTR_WO(pcie_gadget_, inta);
+CONFIGFS_ATTR_WO(pcie_gadget_, send_msi);
+CONFIGFS_ATTR(pcie_gadget_, vendor_id);
+CONFIGFS_ATTR(pcie_gadget_, device_id);
+CONFIGFS_ATTR(pcie_gadget_, bar0_size);
+CONFIGFS_ATTR(pcie_gadget_, bar0_address);
+CONFIGFS_ATTR(pcie_gadget_, bar0_rw_offset);
+CONFIGFS_ATTR(pcie_gadget_, bar0_data);
 
 static struct configfs_attribute *pcie_gadget_target_attrs[] = {
-       &pcie_gadget_target_link.attr,
-       &pcie_gadget_target_int_type.attr,
-       &pcie_gadget_target_no_of_msi.attr,
-       &pcie_gadget_target_inta.attr,
-       &pcie_gadget_target_send_msi.attr,
-       &pcie_gadget_target_vendor_id.attr,
-       &pcie_gadget_target_device_id.attr,
-       &pcie_gadget_target_bar0_size.attr,
-       &pcie_gadget_target_bar0_address.attr,
-       &pcie_gadget_target_bar0_rw_offset.attr,
-       &pcie_gadget_target_bar0_data.attr,
+       &pcie_gadget_attr_link,
+       &pcie_gadget_attr_int_type,
+       &pcie_gadget_attr_no_of_msi,
+       &pcie_gadget_attr_inta,
+       &pcie_gadget_attr_send_msi,
+       &pcie_gadget_attr_vendor_id,
+       &pcie_gadget_attr_device_id,
+       &pcie_gadget_attr_bar0_size,
+       &pcie_gadget_attr_bar0_address,
+       &pcie_gadget_attr_bar0_rw_offset,
+       &pcie_gadget_attr_bar0_data,
        NULL,
 };
 
-static struct pcie_gadget_target *to_target(struct config_item *item)
-{
-       return item ?
-               container_of(to_configfs_subsystem(to_config_group(item)),
-                               struct pcie_gadget_target, subsys) : NULL;
-}
-
-/*
- * Item operations and type for pcie_gadget_target.
- */
-
-static ssize_t pcie_gadget_target_attr_show(struct config_item *item,
-                                          struct configfs_attribute *attr,
-                                          char *buf)
-{
-       ssize_t ret = -EINVAL;
-       struct pcie_gadget_target *target = to_target(item);
-       struct pcie_gadget_target_attr *t_attr =
-               container_of(attr, struct pcie_gadget_target_attr, attr);
-
-       if (t_attr->show)
-               ret = t_attr->show(&target->config, buf);
-       return ret;
-}
-
-static ssize_t pcie_gadget_target_attr_store(struct config_item *item,
-                                       struct configfs_attribute *attr,
-                                       const char *buf,
-                                       size_t count)
-{
-       ssize_t ret = -EINVAL;
-       struct pcie_gadget_target *target = to_target(item);
-       struct pcie_gadget_target_attr *t_attr =
-               container_of(attr, struct pcie_gadget_target_attr, attr);
-
-       if (t_attr->store)
-               ret = t_attr->store(&target->config, buf, count);
-       return ret;
-}
-
-static struct configfs_item_operations pcie_gadget_target_item_ops = {
-       .show_attribute         = pcie_gadget_target_attr_show,
-       .store_attribute        = pcie_gadget_target_attr_store,
-};
-
 static struct config_item_type pcie_gadget_target_type = {
        .ct_attrs               = pcie_gadget_target_attrs,
-       .ct_item_ops            = &pcie_gadget_target_item_ops,
        .ct_owner               = THIS_MODULE,
 };
 
index 97f3acd447985851254d55b546bd625b113641de..06ee6395117f9df71a07d22326bc6c15c1e87f2e 100644 (file)
@@ -244,15 +244,6 @@ static void free_param_target(struct netconsole_target *nt)
  *                             <target>/...
  */
 
-struct netconsole_target_attr {
-       struct configfs_attribute       attr;
-       ssize_t                         (*show)(struct netconsole_target *nt,
-                                               char *buf);
-       ssize_t                         (*store)(struct netconsole_target *nt,
-                                                const char *buf,
-                                                size_t count);
-};
-
 static struct netconsole_target *to_target(struct config_item *item)
 {
        return item ?
@@ -264,58 +255,62 @@ static struct netconsole_target *to_target(struct config_item *item)
  * Attribute operations for netconsole_target.
  */
 
-static ssize_t show_enabled(struct netconsole_target *nt, char *buf)
+static ssize_t enabled_show(struct config_item *item, char *buf)
 {
-       return snprintf(buf, PAGE_SIZE, "%d\n", nt->enabled);
+       return snprintf(buf, PAGE_SIZE, "%d\n", to_target(item)->enabled);
 }
 
-static ssize_t show_extended(struct netconsole_target *nt, char *buf)
+static ssize_t extended_show(struct config_item *item, char *buf)
 {
-       return snprintf(buf, PAGE_SIZE, "%d\n", nt->extended);
+       return snprintf(buf, PAGE_SIZE, "%d\n", to_target(item)->extended);
 }
 
-static ssize_t show_dev_name(struct netconsole_target *nt, char *buf)
+static ssize_t dev_name_show(struct config_item *item, char *buf)
 {
-       return snprintf(buf, PAGE_SIZE, "%s\n", nt->np.dev_name);
+       return snprintf(buf, PAGE_SIZE, "%s\n", to_target(item)->np.dev_name);
 }
 
-static ssize_t show_local_port(struct netconsole_target *nt, char *buf)
+static ssize_t local_port_show(struct config_item *item, char *buf)
 {
-       return snprintf(buf, PAGE_SIZE, "%d\n", nt->np.local_port);
+       return snprintf(buf, PAGE_SIZE, "%d\n", to_target(item)->np.local_port);
 }
 
-static ssize_t show_remote_port(struct netconsole_target *nt, char *buf)
+static ssize_t remote_port_show(struct config_item *item, char *buf)
 {
-       return snprintf(buf, PAGE_SIZE, "%d\n", nt->np.remote_port);
+       return snprintf(buf, PAGE_SIZE, "%d\n", to_target(item)->np.remote_port);
 }
 
-static ssize_t show_local_ip(struct netconsole_target *nt, char *buf)
+static ssize_t local_ip_show(struct config_item *item, char *buf)
 {
+       struct netconsole_target *nt = to_target(item);
+
        if (nt->np.ipv6)
                return snprintf(buf, PAGE_SIZE, "%pI6c\n", &nt->np.local_ip.in6);
        else
                return snprintf(buf, PAGE_SIZE, "%pI4\n", &nt->np.local_ip);
 }
 
-static ssize_t show_remote_ip(struct netconsole_target *nt, char *buf)
+static ssize_t remote_ip_show(struct config_item *item, char *buf)
 {
+       struct netconsole_target *nt = to_target(item);
+
        if (nt->np.ipv6)
                return snprintf(buf, PAGE_SIZE, "%pI6c\n", &nt->np.remote_ip.in6);
        else
                return snprintf(buf, PAGE_SIZE, "%pI4\n", &nt->np.remote_ip);
 }
 
-static ssize_t show_local_mac(struct netconsole_target *nt, char *buf)
+static ssize_t local_mac_show(struct config_item *item, char *buf)
 {
-       struct net_device *dev = nt->np.dev;
+       struct net_device *dev = to_target(item)->np.dev;
        static const u8 bcast[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
 
        return snprintf(buf, PAGE_SIZE, "%pM\n", dev ? dev->dev_addr : bcast);
 }
 
-static ssize_t show_remote_mac(struct netconsole_target *nt, char *buf)
+static ssize_t remote_mac_show(struct config_item *item, char *buf)
 {
-       return snprintf(buf, PAGE_SIZE, "%pM\n", nt->np.remote_mac);
+       return snprintf(buf, PAGE_SIZE, "%pM\n", to_target(item)->np.remote_mac);
 }
 
 /*
@@ -325,23 +320,26 @@ static ssize_t show_remote_mac(struct netconsole_target *nt, char *buf)
  * would enable him to dynamically add new netpoll targets for new
  * network interfaces as and when they come up).
  */
-static ssize_t store_enabled(struct netconsole_target *nt,
-                            const char *buf,
-                            size_t count)
+static ssize_t enabled_store(struct config_item *item,
+               const char *buf, size_t count)
 {
+       struct netconsole_target *nt = to_target(item);
        unsigned long flags;
        int enabled;
        int err;
 
+       mutex_lock(&dynamic_netconsole_mutex);
        err = kstrtoint(buf, 10, &enabled);
        if (err < 0)
-               return err;
+               goto out_unlock;
+
+       err = -EINVAL;
        if (enabled < 0 || enabled > 1)
-               return -EINVAL;
+               goto out_unlock;
        if ((bool)enabled == nt->enabled) {
                pr_info("network logging has already %s\n",
                        nt->enabled ? "started" : "stopped");
-               return -EINVAL;
+               goto out_unlock;
        }
 
        if (enabled) {  /* true */
@@ -358,7 +356,7 @@ static ssize_t store_enabled(struct netconsole_target *nt,
 
                err = netpoll_setup(&nt->np);
                if (err)
-                       return err;
+                       goto out_unlock;
 
                pr_info("netconsole: network logging started\n");
        } else {        /* false */
@@ -374,42 +372,56 @@ static ssize_t store_enabled(struct netconsole_target *nt,
 
        nt->enabled = enabled;
 
+       mutex_unlock(&dynamic_netconsole_mutex);
        return strnlen(buf, count);
+out_unlock:
+       mutex_unlock(&dynamic_netconsole_mutex);
+       return err;
 }
 
-static ssize_t store_extended(struct netconsole_target *nt,
-                             const char *buf,
-                             size_t count)
+static ssize_t extended_store(struct config_item *item, const char *buf,
+               size_t count)
 {
+       struct netconsole_target *nt = to_target(item);
        int extended;
        int err;
 
+       mutex_lock(&dynamic_netconsole_mutex);
        if (nt->enabled) {
                pr_err("target (%s) is enabled, disable to update parameters\n",
                       config_item_name(&nt->item));
-               return -EINVAL;
+               err = -EINVAL;
+               goto out_unlock;
        }
 
        err = kstrtoint(buf, 10, &extended);
        if (err < 0)
-               return err;
-       if (extended < 0 || extended > 1)
-               return -EINVAL;
+               goto out_unlock;
+       if (extended < 0 || extended > 1) {
+               err = -EINVAL;
+               goto out_unlock;
+       }
 
        nt->extended = extended;
 
+       mutex_unlock(&dynamic_netconsole_mutex);
        return strnlen(buf, count);
+out_unlock:
+       mutex_unlock(&dynamic_netconsole_mutex);
+       return err;
 }
 
-static ssize_t store_dev_name(struct netconsole_target *nt,
-                             const char *buf,
-                             size_t count)
+static ssize_t dev_name_store(struct config_item *item, const char *buf,
+               size_t count)
 {
+       struct netconsole_target *nt = to_target(item);
        size_t len;
 
+       mutex_lock(&dynamic_netconsole_mutex);
        if (nt->enabled) {
                pr_err("target (%s) is enabled, disable to update parameters\n",
                       config_item_name(&nt->item));
+               mutex_unlock(&dynamic_netconsole_mutex);
                return -EINVAL;
        }
 
@@ -420,53 +432,66 @@ static ssize_t store_dev_name(struct netconsole_target *nt,
        if (nt->np.dev_name[len - 1] == '\n')
                nt->np.dev_name[len - 1] = '\0';
 
+       mutex_unlock(&dynamic_netconsole_mutex);
        return strnlen(buf, count);
 }
 
-static ssize_t store_local_port(struct netconsole_target *nt,
-                               const char *buf,
-                               size_t count)
+static ssize_t local_port_store(struct config_item *item, const char *buf,
+               size_t count)
 {
-       int rv;
+       struct netconsole_target *nt = to_target(item);
+       int rv = -EINVAL;
 
+       mutex_lock(&dynamic_netconsole_mutex);
        if (nt->enabled) {
                pr_err("target (%s) is enabled, disable to update parameters\n",
                       config_item_name(&nt->item));
-               return -EINVAL;
+               goto out_unlock;
        }
 
        rv = kstrtou16(buf, 10, &nt->np.local_port);
        if (rv < 0)
-               return rv;
+               goto out_unlock;
+       mutex_unlock(&dynamic_netconsole_mutex);
        return strnlen(buf, count);
+out_unlock:
+       mutex_unlock(&dynamic_netconsole_mutex);
+       return rv;
 }
 
-static ssize_t store_remote_port(struct netconsole_target *nt,
-                                const char *buf,
-                                size_t count)
+static ssize_t remote_port_store(struct config_item *item,
+               const char *buf, size_t count)
 {
-       int rv;
+       struct netconsole_target *nt = to_target(item);
+       int rv = -EINVAL;
 
+       mutex_lock(&dynamic_netconsole_mutex);
        if (nt->enabled) {
                pr_err("target (%s) is enabled, disable to update parameters\n",
                       config_item_name(&nt->item));
-               return -EINVAL;
+               goto out_unlock;
        }
 
        rv = kstrtou16(buf, 10, &nt->np.remote_port);
        if (rv < 0)
-               return rv;
+               goto out_unlock;
+       mutex_unlock(&dynamic_netconsole_mutex);
        return strnlen(buf, count);
+out_unlock:
+       mutex_unlock(&dynamic_netconsole_mutex);
+       return rv;
 }
 
-static ssize_t store_local_ip(struct netconsole_target *nt,
-                             const char *buf,
-                             size_t count)
+static ssize_t local_ip_store(struct config_item *item, const char *buf,
+               size_t count)
 {
+       struct netconsole_target *nt = to_target(item);
+
+       mutex_lock(&dynamic_netconsole_mutex);
        if (nt->enabled) {
                pr_err("target (%s) is enabled, disable to update parameters\n",
                       config_item_name(&nt->item));
-               return -EINVAL;
+               goto out_unlock;
        }
 
        if (strnchr(buf, count, ':')) {
@@ -474,29 +499,35 @@ static ssize_t store_local_ip(struct netconsole_target *nt,
                if (in6_pton(buf, count, nt->np.local_ip.in6.s6_addr, -1, &end) > 0) {
                        if (*end && *end != '\n') {
                                pr_err("invalid IPv6 address at: <%c>\n", *end);
-                               return -EINVAL;
+                               goto out_unlock;
                        }
                        nt->np.ipv6 = true;
                } else
-                       return -EINVAL;
+                       goto out_unlock;
        } else {
                if (!nt->np.ipv6) {
                        nt->np.local_ip.ip = in_aton(buf);
                } else
-                       return -EINVAL;
+                       goto out_unlock;
        }
 
+       mutex_unlock(&dynamic_netconsole_mutex);
        return strnlen(buf, count);
+out_unlock:
+       mutex_unlock(&dynamic_netconsole_mutex);
+       return -EINVAL;
 }
 
-static ssize_t store_remote_ip(struct netconsole_target *nt,
-                              const char *buf,
-                              size_t count)
+static ssize_t remote_ip_store(struct config_item *item, const char *buf,
+              size_t count)
 {
+       struct netconsole_target *nt = to_target(item);
+
+       mutex_lock(&dynamic_netconsole_mutex);
        if (nt->enabled) {
                pr_err("target (%s) is enabled, disable to update parameters\n",
                       config_item_name(&nt->item));
-               return -EINVAL;
+               goto out_unlock;
        }
 
        if (strnchr(buf, count, ':')) {
@@ -504,74 +535,71 @@ static ssize_t store_remote_ip(struct netconsole_target *nt,
                if (in6_pton(buf, count, nt->np.remote_ip.in6.s6_addr, -1, &end) > 0) {
                        if (*end && *end != '\n') {
                                pr_err("invalid IPv6 address at: <%c>\n", *end);
-                               return -EINVAL;
+                               goto out_unlock;
                        }
                        nt->np.ipv6 = true;
                } else
-                       return -EINVAL;
+                       goto out_unlock;
        } else {
                if (!nt->np.ipv6) {
                        nt->np.remote_ip.ip = in_aton(buf);
                } else
-                       return -EINVAL;
+                       goto out_unlock;
        }
 
+       mutex_unlock(&dynamic_netconsole_mutex);
        return strnlen(buf, count);
+out_unlock:
+       mutex_unlock(&dynamic_netconsole_mutex);
+       return -EINVAL;
 }
 
-static ssize_t store_remote_mac(struct netconsole_target *nt,
-                               const char *buf,
-                               size_t count)
+static ssize_t remote_mac_store(struct config_item *item, const char *buf,
+               size_t count)
 {
+       struct netconsole_target *nt = to_target(item);
        u8 remote_mac[ETH_ALEN];
 
+       mutex_lock(&dynamic_netconsole_mutex);
        if (nt->enabled) {
                pr_err("target (%s) is enabled, disable to update parameters\n",
                       config_item_name(&nt->item));
-               return -EINVAL;
+               goto out_unlock;
        }
 
        if (!mac_pton(buf, remote_mac))
-               return -EINVAL;
+               goto out_unlock;
        if (buf[3 * ETH_ALEN - 1] && buf[3 * ETH_ALEN - 1] != '\n')
-               return -EINVAL;
+               goto out_unlock;
        memcpy(nt->np.remote_mac, remote_mac, ETH_ALEN);
 
+       mutex_unlock(&dynamic_netconsole_mutex);
        return strnlen(buf, count);
+out_unlock:
+       mutex_unlock(&dynamic_netconsole_mutex);
+       return -EINVAL;
 }
 
-/*
- * Attribute definitions for netconsole_target.
- */
-
-#define NETCONSOLE_TARGET_ATTR_RO(_name)                               \
-static struct netconsole_target_attr netconsole_target_##_name =       \
-       __CONFIGFS_ATTR(_name, S_IRUGO, show_##_name, NULL)
-
-#define NETCONSOLE_TARGET_ATTR_RW(_name)                               \
-static struct netconsole_target_attr netconsole_target_##_name =       \
-       __CONFIGFS_ATTR(_name, S_IRUGO | S_IWUSR, show_##_name, store_##_name)
-
-NETCONSOLE_TARGET_ATTR_RW(enabled);
-NETCONSOLE_TARGET_ATTR_RW(extended);
-NETCONSOLE_TARGET_ATTR_RW(dev_name);
-NETCONSOLE_TARGET_ATTR_RW(local_port);
-NETCONSOLE_TARGET_ATTR_RW(remote_port);
-NETCONSOLE_TARGET_ATTR_RW(local_ip);
-NETCONSOLE_TARGET_ATTR_RW(remote_ip);
-NETCONSOLE_TARGET_ATTR_RO(local_mac);
-NETCONSOLE_TARGET_ATTR_RW(remote_mac);
+CONFIGFS_ATTR(, enabled);
+CONFIGFS_ATTR(, extended);
+CONFIGFS_ATTR(, dev_name);
+CONFIGFS_ATTR(, local_port);
+CONFIGFS_ATTR(, remote_port);
+CONFIGFS_ATTR(, local_ip);
+CONFIGFS_ATTR(, remote_ip);
+CONFIGFS_ATTR_RO(, local_mac);
+CONFIGFS_ATTR(, remote_mac);
 
 static struct configfs_attribute *netconsole_target_attrs[] = {
-       &netconsole_target_enabled.attr,
-       &netconsole_target_extended.attr,
-       &netconsole_target_dev_name.attr,
-       &netconsole_target_local_port.attr,
-       &netconsole_target_remote_port.attr,
-       &netconsole_target_local_ip.attr,
-       &netconsole_target_remote_ip.attr,
-       &netconsole_target_local_mac.attr,
-       &netconsole_target_remote_mac.attr,
+       &attr_enabled,
+       &attr_extended,
+       &attr_dev_name,
+       &attr_local_port,
+       &attr_remote_port,
+       &attr_local_ip,
+       &attr_remote_ip,
+       &attr_local_mac,
+       &attr_remote_mac,
        NULL,
 };
 
@@ -584,43 +612,8 @@ static void netconsole_target_release(struct config_item *item)
        kfree(to_target(item));
 }
 
-static ssize_t netconsole_target_attr_show(struct config_item *item,
-                                          struct configfs_attribute *attr,
-                                          char *buf)
-{
-       ssize_t ret = -EINVAL;
-       struct netconsole_target *nt = to_target(item);
-       struct netconsole_target_attr *na =
-               container_of(attr, struct netconsole_target_attr, attr);
-
-       if (na->show)
-               ret = na->show(nt, buf);
-
-       return ret;
-}
-
-static ssize_t netconsole_target_attr_store(struct config_item *item,
-                                           struct configfs_attribute *attr,
-                                           const char *buf,
-                                           size_t count)
-{
-       ssize_t ret = -EINVAL;
-       struct netconsole_target *nt = to_target(item);
-       struct netconsole_target_attr *na =
-               container_of(attr, struct netconsole_target_attr, attr);
-
-       mutex_lock(&dynamic_netconsole_mutex);
-       if (na->store)
-               ret = na->store(nt, buf, count);
-       mutex_unlock(&dynamic_netconsole_mutex);
-
-       return ret;
-}
-
 static struct configfs_item_operations netconsole_target_item_ops = {
        .release                = netconsole_target_release,
-       .show_attribute         = netconsole_target_attr_show,
-       .store_attribute        = netconsole_target_attr_store,
 };
 
 static struct config_item_type netconsole_target_type = {
index ac65cb7b48861b81dc1daa0ea531e506cb5752fa..3ba2e9564b9a78f000c234fa1be7bb05e24eaebd 100644 (file)
@@ -43,8 +43,6 @@
 #include <scsi/scsi_cmnd.h>
 #include <target/target_core_base.h>
 #include <target/target_core_fabric.h>
-#include <target/target_core_fabric_configfs.h>
-#include <target/configfs_macros.h>
 
 #include "qla_def.h"
 #include "qla_target.h"
@@ -729,23 +727,23 @@ static int tcm_qla2xxx_init_nodeacl(struct se_node_acl *se_nacl,
 
 #define DEF_QLA_TPG_ATTRIB(name)                                       \
                                                                        \
-static ssize_t tcm_qla2xxx_tpg_attrib_show_##name(                     \
-       struct se_portal_group *se_tpg,                                 \
-       char *page)                                                     \
+static ssize_t tcm_qla2xxx_tpg_attrib_##name##_show(                   \
+               struct config_item *item, char *page)                   \
 {                                                                      \
+       struct se_portal_group *se_tpg = attrib_to_tpg(item);           \
        struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg,              \
                        struct tcm_qla2xxx_tpg, se_tpg);                \
                                                                        \
        return sprintf(page, "%u\n", tpg->tpg_attrib.name);     \
 }                                                                      \
                                                                        \
-static ssize_t tcm_qla2xxx_tpg_attrib_store_##name(                    \
-       struct se_portal_group *se_tpg,                                 \
-       const char *page,                                               \
-       size_t count)                                                   \
+static ssize_t tcm_qla2xxx_tpg_attrib_##name##_store(                  \
+               struct config_item *item, const char *page, size_t count) \
 {                                                                      \
+       struct se_portal_group *se_tpg = attrib_to_tpg(item);           \
        struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg,              \
                        struct tcm_qla2xxx_tpg, se_tpg);                \
+       struct tcm_qla2xxx_tpg_attrib *a = &tpg->tpg_attrib;            \
        unsigned long val;                                              \
        int ret;                                                        \
                                                                        \
@@ -755,81 +753,39 @@ static ssize_t tcm_qla2xxx_tpg_attrib_store_##name(                       \
                                " ret: %d\n", ret);                     \
                return -EINVAL;                                         \
        }                                                               \
-       ret = tcm_qla2xxx_set_attrib_##name(tpg, val);                  \
-                                                                       \
-       return (!ret) ? count : -EINVAL;                                \
-}
-
-#define DEF_QLA_TPG_ATTR_BOOL(_name)                                   \
-                                                                       \
-static int tcm_qla2xxx_set_attrib_##_name(                             \
-       struct tcm_qla2xxx_tpg *tpg,                                    \
-       unsigned long val)                                              \
-{                                                                      \
-       struct tcm_qla2xxx_tpg_attrib *a = &tpg->tpg_attrib;            \
                                                                        \
        if ((val != 0) && (val != 1)) {                                 \
                pr_err("Illegal boolean value %lu\n", val);             \
                return -EINVAL;                                         \
        }                                                               \
                                                                        \
-       a->_name = val;                                                 \
-       return 0;                                                       \
-}
-
-#define QLA_TPG_ATTR(_name, _mode) \
-       TF_TPG_ATTRIB_ATTR(tcm_qla2xxx, _name, _mode);
+       a->name = val;                                                  \
+                                                                       \
+       return count;                                                   \
+}                                                                      \
+CONFIGFS_ATTR(tcm_qla2xxx_tpg_attrib_, name)
 
-/*
- * Define tcm_qla2xxx_tpg_attrib_s_generate_node_acls
- */
-DEF_QLA_TPG_ATTR_BOOL(generate_node_acls);
 DEF_QLA_TPG_ATTRIB(generate_node_acls);
-QLA_TPG_ATTR(generate_node_acls, S_IRUGO | S_IWUSR);
-
-/*
- Define tcm_qla2xxx_attrib_s_cache_dynamic_acls
- */
-DEF_QLA_TPG_ATTR_BOOL(cache_dynamic_acls);
 DEF_QLA_TPG_ATTRIB(cache_dynamic_acls);
-QLA_TPG_ATTR(cache_dynamic_acls, S_IRUGO | S_IWUSR);
-
-/*
- * Define tcm_qla2xxx_tpg_attrib_s_demo_mode_write_protect
- */
-DEF_QLA_TPG_ATTR_BOOL(demo_mode_write_protect);
 DEF_QLA_TPG_ATTRIB(demo_mode_write_protect);
-QLA_TPG_ATTR(demo_mode_write_protect, S_IRUGO | S_IWUSR);
-
-/*
- * Define tcm_qla2xxx_tpg_attrib_s_prod_mode_write_protect
- */
-DEF_QLA_TPG_ATTR_BOOL(prod_mode_write_protect);
 DEF_QLA_TPG_ATTRIB(prod_mode_write_protect);
-QLA_TPG_ATTR(prod_mode_write_protect, S_IRUGO | S_IWUSR);
-
-/*
- * Define tcm_qla2xxx_tpg_attrib_s_demo_mode_login_only
- */
-DEF_QLA_TPG_ATTR_BOOL(demo_mode_login_only);
 DEF_QLA_TPG_ATTRIB(demo_mode_login_only);
-QLA_TPG_ATTR(demo_mode_login_only, S_IRUGO | S_IWUSR);
 
 static struct configfs_attribute *tcm_qla2xxx_tpg_attrib_attrs[] = {
-       &tcm_qla2xxx_tpg_attrib_generate_node_acls.attr,
-       &tcm_qla2xxx_tpg_attrib_cache_dynamic_acls.attr,
-       &tcm_qla2xxx_tpg_attrib_demo_mode_write_protect.attr,
-       &tcm_qla2xxx_tpg_attrib_prod_mode_write_protect.attr,
-       &tcm_qla2xxx_tpg_attrib_demo_mode_login_only.attr,
+       &tcm_qla2xxx_tpg_attrib_attr_generate_node_acls,
+       &tcm_qla2xxx_tpg_attrib_attr_cache_dynamic_acls,
+       &tcm_qla2xxx_tpg_attrib_attr_demo_mode_write_protect,
+       &tcm_qla2xxx_tpg_attrib_attr_prod_mode_write_protect,
+       &tcm_qla2xxx_tpg_attrib_attr_demo_mode_login_only,
        NULL,
 };
 
 /* End items for tcm_qla2xxx_tpg_attrib_cit */
 
-static ssize_t tcm_qla2xxx_tpg_show_enable(
-       struct se_portal_group *se_tpg,
-       char *page)
+static ssize_t tcm_qla2xxx_tpg_enable_show(struct config_item *item,
+               char *page)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg,
                        struct tcm_qla2xxx_tpg, se_tpg);
 
@@ -865,11 +821,10 @@ static void tcm_qla2xxx_undepend_tpg(struct work_struct *work)
        complete(&base_tpg->tpg_base_comp);
 }
 
-static ssize_t tcm_qla2xxx_tpg_store_enable(
-       struct se_portal_group *se_tpg,
-       const char *page,
-       size_t count)
+static ssize_t tcm_qla2xxx_tpg_enable_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg,
                        struct tcm_qla2xxx_tpg, se_tpg);
        unsigned long op;
@@ -909,22 +864,16 @@ static ssize_t tcm_qla2xxx_tpg_store_enable(
        return count;
 }
 
-TF_TPG_BASE_ATTR(tcm_qla2xxx, enable, S_IRUGO | S_IWUSR);
-
-static ssize_t tcm_qla2xxx_tpg_show_dynamic_sessions(
-       struct se_portal_group *se_tpg,
-       char *page)
+static ssize_t tcm_qla2xxx_tpg_dynamic_sessions_show(struct config_item *item,
+               char *page)
 {
-       return target_show_dynamic_sessions(se_tpg, page);
+       return target_show_dynamic_sessions(to_tpg(item), page);
 }
 
-TF_TPG_BASE_ATTR_RO(tcm_qla2xxx, dynamic_sessions);
-
-static ssize_t tcm_qla2xxx_tpg_store_fabric_prot_type(
-       struct se_portal_group *se_tpg,
-       const char *page,
-       size_t count)
+static ssize_t tcm_qla2xxx_tpg_fabric_prot_type_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg,
                                struct tcm_qla2xxx_tpg, se_tpg);
        unsigned long val;
@@ -943,21 +892,24 @@ static ssize_t tcm_qla2xxx_tpg_store_fabric_prot_type(
        return count;
 }
 
-static ssize_t tcm_qla2xxx_tpg_show_fabric_prot_type(
-       struct se_portal_group *se_tpg,
-       char *page)
+static ssize_t tcm_qla2xxx_tpg_fabric_prot_type_show(struct config_item *item,
+               char *page)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg,
                                struct tcm_qla2xxx_tpg, se_tpg);
 
        return sprintf(page, "%d\n", tpg->tpg_attrib.fabric_prot_type);
 }
-TF_TPG_BASE_ATTR(tcm_qla2xxx, fabric_prot_type, S_IRUGO | S_IWUSR);
+
+CONFIGFS_ATTR_WO(tcm_qla2xxx_tpg_, enable);
+CONFIGFS_ATTR_RO(tcm_qla2xxx_tpg_, dynamic_sessions);
+CONFIGFS_ATTR(tcm_qla2xxx_tpg_, fabric_prot_type);
 
 static struct configfs_attribute *tcm_qla2xxx_tpg_attrs[] = {
-       &tcm_qla2xxx_tpg_enable.attr,
-       &tcm_qla2xxx_tpg_dynamic_sessions.attr,
-       &tcm_qla2xxx_tpg_fabric_prot_type.attr,
+       &tcm_qla2xxx_tpg_attr_enable,
+       &tcm_qla2xxx_tpg_attr_dynamic_sessions,
+       &tcm_qla2xxx_tpg_attr_fabric_prot_type,
        NULL,
 };
 
@@ -1030,18 +982,16 @@ static void tcm_qla2xxx_drop_tpg(struct se_portal_group *se_tpg)
        kfree(tpg);
 }
 
-static ssize_t tcm_qla2xxx_npiv_tpg_show_enable(
-       struct se_portal_group *se_tpg,
-       char *page)
+static ssize_t tcm_qla2xxx_npiv_tpg_enable_show(struct config_item *item,
+               char *page)
 {
-       return tcm_qla2xxx_tpg_show_enable(se_tpg, page);
+       return tcm_qla2xxx_tpg_enable_show(item, page);
 }
 
-static ssize_t tcm_qla2xxx_npiv_tpg_store_enable(
-       struct se_portal_group *se_tpg,
-       const char *page,
-       size_t count)
+static ssize_t tcm_qla2xxx_npiv_tpg_enable_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct se_wwn *se_wwn = se_tpg->se_tpg_wwn;
        struct tcm_qla2xxx_lport *lport = container_of(se_wwn,
                        struct tcm_qla2xxx_lport, lport_wwn);
@@ -1077,10 +1027,10 @@ static ssize_t tcm_qla2xxx_npiv_tpg_store_enable(
        return count;
 }
 
-TF_TPG_BASE_ATTR(tcm_qla2xxx_npiv, enable, S_IRUGO | S_IWUSR);
+CONFIGFS_ATTR(tcm_qla2xxx_npiv_tpg_, enable);
 
 static struct configfs_attribute *tcm_qla2xxx_npiv_tpg_attrs[] = {
-        &tcm_qla2xxx_npiv_tpg_enable.attr,
+        &tcm_qla2xxx_npiv_tpg_attr_enable,
         NULL,
 };
 
@@ -1783,9 +1733,8 @@ static void tcm_qla2xxx_npiv_drop_lport(struct se_wwn *wwn)
 }
 
 
-static ssize_t tcm_qla2xxx_wwn_show_attr_version(
-       struct target_fabric_configfs *tf,
-       char *page)
+static ssize_t tcm_qla2xxx_wwn_version_show(struct config_item *item,
+               char *page)
 {
        return sprintf(page,
            "TCM QLOGIC QLA2XXX NPIV capable fabric module %s on %s/%s on "
@@ -1793,10 +1742,10 @@ static ssize_t tcm_qla2xxx_wwn_show_attr_version(
            utsname()->machine);
 }
 
-TF_WWN_ATTR_RO(tcm_qla2xxx, version);
+CONFIGFS_ATTR_RO(tcm_qla2xxx_wwn_, version);
 
 static struct configfs_attribute *tcm_qla2xxx_wwn_attrs[] = {
-       &tcm_qla2xxx_wwn_version.attr,
+       &tcm_qla2xxx_wwn_attr_version,
        NULL,
 };
 
index c7461d770d3a8bff4ba0d4c64067654cf53512ca..255204cc43e6218ff7caa6725d7430f300a4d571 100644 (file)
@@ -23,8 +23,6 @@
 #include <linux/inet.h>
 #include <target/target_core_base.h>
 #include <target/target_core_fabric.h>
-#include <target/target_core_fabric_configfs.h>
-#include <target/configfs_macros.h>
 #include <target/iscsi/iscsi_transport.h>
 
 #include <target/iscsi/iscsi_target_core.h>
 #include "iscsi_target.h"
 #include <target/iscsi/iscsi_target_stat.h>
 
-struct lio_target_configfs_attribute {
-       struct configfs_attribute attr;
-       ssize_t (*show)(void *, char *);
-       ssize_t (*store)(void *, const char *, size_t);
-};
 
 /* Start items for lio_target_portal_cit */
 
-static ssize_t lio_target_np_show_sctp(
-       struct se_tpg_np *se_tpg_np,
-       char *page)
+static inline struct iscsi_tpg_np *to_iscsi_tpg_np(struct config_item *item)
+{
+       return container_of(to_tpg_np(item), struct iscsi_tpg_np, se_tpg_np);
+}
+
+static ssize_t lio_target_np_sctp_show(struct config_item *item, char *page)
 {
-       struct iscsi_tpg_np *tpg_np = container_of(se_tpg_np,
-                               struct iscsi_tpg_np, se_tpg_np);
+       struct iscsi_tpg_np *tpg_np = to_iscsi_tpg_np(item);
        struct iscsi_tpg_np *tpg_np_sctp;
        ssize_t rb;
 
@@ -63,15 +58,12 @@ static ssize_t lio_target_np_show_sctp(
        return rb;
 }
 
-static ssize_t lio_target_np_store_sctp(
-       struct se_tpg_np *se_tpg_np,
-       const char *page,
-       size_t count)
+static ssize_t lio_target_np_sctp_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct iscsi_tpg_np *tpg_np = to_iscsi_tpg_np(item);
        struct iscsi_np *np;
        struct iscsi_portal_group *tpg;
-       struct iscsi_tpg_np *tpg_np = container_of(se_tpg_np,
-                               struct iscsi_tpg_np, se_tpg_np);
        struct iscsi_tpg_np *tpg_np_sctp = NULL;
        u32 op;
        int ret;
@@ -119,14 +111,9 @@ out:
        return -EINVAL;
 }
 
-TF_NP_BASE_ATTR(lio_target, sctp, S_IRUGO | S_IWUSR);
-
-static ssize_t lio_target_np_show_iser(
-       struct se_tpg_np *se_tpg_np,
-       char *page)
+static ssize_t lio_target_np_iser_show(struct config_item *item, char *page)
 {
-       struct iscsi_tpg_np *tpg_np = container_of(se_tpg_np,
-                               struct iscsi_tpg_np, se_tpg_np);
+       struct iscsi_tpg_np *tpg_np = to_iscsi_tpg_np(item);
        struct iscsi_tpg_np *tpg_np_iser;
        ssize_t rb;
 
@@ -139,15 +126,12 @@ static ssize_t lio_target_np_show_iser(
        return rb;
 }
 
-static ssize_t lio_target_np_store_iser(
-       struct se_tpg_np *se_tpg_np,
-       const char *page,
-       size_t count)
+static ssize_t lio_target_np_iser_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct iscsi_tpg_np *tpg_np = to_iscsi_tpg_np(item);
        struct iscsi_np *np;
        struct iscsi_portal_group *tpg;
-       struct iscsi_tpg_np *tpg_np = container_of(se_tpg_np,
-                               struct iscsi_tpg_np, se_tpg_np);
        struct iscsi_tpg_np *tpg_np_iser = NULL;
        char *endptr;
        u32 op;
@@ -198,11 +182,12 @@ out:
        return rc;
 }
 
-TF_NP_BASE_ATTR(lio_target, iser, S_IRUGO | S_IWUSR);
+CONFIGFS_ATTR(lio_target_np_, sctp);
+CONFIGFS_ATTR(lio_target_np_, iser);
 
 static struct configfs_attribute *lio_target_portal_attrs[] = {
-       &lio_target_np_sctp.attr,
-       &lio_target_np_iser.attr,
+       &lio_target_np_attr_sctp,
+       &lio_target_np_attr_iser,
        NULL,
 };
 
@@ -360,22 +345,21 @@ out:
 
 /* Start items for lio_target_nacl_attrib_cit */
 
-#define DEF_NACL_ATTRIB(name)                                          \
-static ssize_t iscsi_nacl_attrib_show_##name(                          \
-       struct se_node_acl *se_nacl,                                    \
-       char *page)                                                     \
+#define ISCSI_NACL_ATTR(name)                                          \
+static ssize_t iscsi_nacl_attrib_##name##_show(struct config_item *item,\
+               char *page)                                             \
 {                                                                      \
+       struct se_node_acl *se_nacl = attrib_to_nacl(item);             \
        struct iscsi_node_acl *nacl = container_of(se_nacl, struct iscsi_node_acl, \
                                        se_node_acl);                   \
                                                                        \
        return sprintf(page, "%u\n", nacl->node_attrib.name);           \
 }                                                                      \
                                                                        \
-static ssize_t iscsi_nacl_attrib_store_##name(                         \
-       struct se_node_acl *se_nacl,                                    \
-       const char *page,                                               \
-       size_t count)                                                   \
+static ssize_t iscsi_nacl_attrib_##name##_store(struct config_item *item,\
+               const char *page, size_t count)                         \
 {                                                                      \
+       struct se_node_acl *se_nacl = attrib_to_nacl(item);             \
        struct iscsi_node_acl *nacl = container_of(se_nacl, struct iscsi_node_acl, \
                                        se_node_acl);                   \
        u32 val;                                                        \
@@ -389,59 +373,28 @@ static ssize_t iscsi_nacl_attrib_store_##name(                            \
                return ret;                                             \
                                                                        \
        return count;                                                   \
-}
+}                                                                      \
+                                                                       \
+CONFIGFS_ATTR(iscsi_nacl_attrib_, name)
 
-#define NACL_ATTR(_name, _mode) TF_NACL_ATTRIB_ATTR(iscsi, _name, _mode);
-/*
- * Define iscsi_node_attrib_s_dataout_timeout
- */
-DEF_NACL_ATTRIB(dataout_timeout);
-NACL_ATTR(dataout_timeout, S_IRUGO | S_IWUSR);
-/*
- * Define iscsi_node_attrib_s_dataout_timeout_retries
- */
-DEF_NACL_ATTRIB(dataout_timeout_retries);
-NACL_ATTR(dataout_timeout_retries, S_IRUGO | S_IWUSR);
-/*
- * Define iscsi_node_attrib_s_default_erl
- */
-DEF_NACL_ATTRIB(default_erl);
-NACL_ATTR(default_erl, S_IRUGO | S_IWUSR);
-/*
- * Define iscsi_node_attrib_s_nopin_timeout
- */
-DEF_NACL_ATTRIB(nopin_timeout);
-NACL_ATTR(nopin_timeout, S_IRUGO | S_IWUSR);
-/*
- * Define iscsi_node_attrib_s_nopin_response_timeout
- */
-DEF_NACL_ATTRIB(nopin_response_timeout);
-NACL_ATTR(nopin_response_timeout, S_IRUGO | S_IWUSR);
-/*
- * Define iscsi_node_attrib_s_random_datain_pdu_offsets
- */
-DEF_NACL_ATTRIB(random_datain_pdu_offsets);
-NACL_ATTR(random_datain_pdu_offsets, S_IRUGO | S_IWUSR);
-/*
- * Define iscsi_node_attrib_s_random_datain_seq_offsets
- */
-DEF_NACL_ATTRIB(random_datain_seq_offsets);
-NACL_ATTR(random_datain_seq_offsets, S_IRUGO | S_IWUSR);
-/*
- * Define iscsi_node_attrib_s_random_r2t_offsets
- */
-DEF_NACL_ATTRIB(random_r2t_offsets);
-NACL_ATTR(random_r2t_offsets, S_IRUGO | S_IWUSR);
+ISCSI_NACL_ATTR(dataout_timeout);
+ISCSI_NACL_ATTR(dataout_timeout_retries);
+ISCSI_NACL_ATTR(default_erl);
+ISCSI_NACL_ATTR(nopin_timeout);
+ISCSI_NACL_ATTR(nopin_response_timeout);
+ISCSI_NACL_ATTR(random_datain_pdu_offsets);
+ISCSI_NACL_ATTR(random_datain_seq_offsets);
+ISCSI_NACL_ATTR(random_r2t_offsets);
 
 static struct configfs_attribute *lio_target_nacl_attrib_attrs[] = {
-       &iscsi_nacl_attrib_dataout_timeout.attr,
-       &iscsi_nacl_attrib_dataout_timeout_retries.attr,
-       &iscsi_nacl_attrib_default_erl.attr,
-       &iscsi_nacl_attrib_nopin_timeout.attr,
-       &iscsi_nacl_attrib_nopin_response_timeout.attr,
-       &iscsi_nacl_attrib_random_datain_pdu_offsets.attr,
-       &iscsi_nacl_attrib_random_datain_seq_offsets.attr,
-       &iscsi_nacl_attrib_random_r2t_offsets.attr,
+       &iscsi_nacl_attrib_attr_dataout_timeout,
+       &iscsi_nacl_attrib_attr_dataout_timeout_retries,
+       &iscsi_nacl_attrib_attr_default_erl,
+       &iscsi_nacl_attrib_attr_nopin_timeout,
+       &iscsi_nacl_attrib_attr_nopin_response_timeout,
+       &iscsi_nacl_attrib_attr_random_datain_pdu_offsets,
+       &iscsi_nacl_attrib_attr_random_datain_seq_offsets,
+       &iscsi_nacl_attrib_attr_random_r2t_offsets,
        NULL,
 };
 
@@ -450,7 +403,7 @@ static struct configfs_attribute *lio_target_nacl_attrib_attrs[] = {
 /* Start items for lio_target_nacl_auth_cit */
 
 #define __DEF_NACL_AUTH_STR(prefix, name, flags)                       \
-static ssize_t __iscsi_##prefix##_show_##name(                         \
+static ssize_t __iscsi_##prefix##_##name##_show(                       \
        struct iscsi_node_acl *nacl,                                    \
        char *page)                                                     \
 {                                                                      \
@@ -461,7 +414,7 @@ static ssize_t __iscsi_##prefix##_show_##name(                              \
        return snprintf(page, PAGE_SIZE, "%s\n", auth->name);           \
 }                                                                      \
                                                                        \
-static ssize_t __iscsi_##prefix##_store_##name(                                \
+static ssize_t __iscsi_##prefix##_##name##_store(                      \
        struct iscsi_node_acl *nacl,                                    \
        const char *page,                                               \
        size_t count)                                                   \
@@ -487,8 +440,35 @@ static ssize_t __iscsi_##prefix##_store_##name(                            \
        return count;                                                   \
 }
 
+#define DEF_NACL_AUTH_STR(name, flags)                                 \
+       __DEF_NACL_AUTH_STR(nacl_auth, name, flags)                     \
+static ssize_t iscsi_nacl_auth_##name##_show(struct config_item *item, \
+               char *page)                                             \
+{                                                                      \
+       struct se_node_acl *nacl = auth_to_nacl(item);                  \
+       return __iscsi_nacl_auth_##name##_show(container_of(nacl,       \
+                       struct iscsi_node_acl, se_node_acl), page);     \
+}                                                                      \
+static ssize_t iscsi_nacl_auth_##name##_store(struct config_item *item,        \
+               const char *page, size_t count)                         \
+{                                                                      \
+       struct se_node_acl *nacl = auth_to_nacl(item);                  \
+       return __iscsi_nacl_auth_##name##_store(container_of(nacl,      \
+                       struct iscsi_node_acl, se_node_acl), page, count); \
+}                                                                      \
+                                                                       \
+CONFIGFS_ATTR(iscsi_nacl_auth_, name)
+
+/*
+ * One-way authentication userid
+ */
+DEF_NACL_AUTH_STR(userid, NAF_USERID_SET);
+DEF_NACL_AUTH_STR(password, NAF_PASSWORD_SET);
+DEF_NACL_AUTH_STR(userid_mutual, NAF_USERID_IN_SET);
+DEF_NACL_AUTH_STR(password_mutual, NAF_PASSWORD_IN_SET);
+
 #define __DEF_NACL_AUTH_INT(prefix, name)                              \
-static ssize_t __iscsi_##prefix##_show_##name(                         \
+static ssize_t __iscsi_##prefix##_##name##_show(                               \
        struct iscsi_node_acl *nacl,                                    \
        char *page)                                                     \
 {                                                                      \
@@ -500,69 +480,26 @@ static ssize_t __iscsi_##prefix##_show_##name(                            \
        return snprintf(page, PAGE_SIZE, "%d\n", auth->name);           \
 }
 
-#define DEF_NACL_AUTH_STR(name, flags)                                 \
-       __DEF_NACL_AUTH_STR(nacl_auth, name, flags)                     \
-static ssize_t iscsi_nacl_auth_show_##name(                            \
-       struct se_node_acl *nacl,                                       \
-       char *page)                                                     \
-{                                                                      \
-       return __iscsi_nacl_auth_show_##name(container_of(nacl,         \
-                       struct iscsi_node_acl, se_node_acl), page);             \
-}                                                                      \
-static ssize_t iscsi_nacl_auth_store_##name(                           \
-       struct se_node_acl *nacl,                                       \
-       const char *page,                                               \
-       size_t count)                                                   \
-{                                                                      \
-       return __iscsi_nacl_auth_store_##name(container_of(nacl,        \
-                       struct iscsi_node_acl, se_node_acl), page, count);      \
-}
-
 #define DEF_NACL_AUTH_INT(name)                                                \
        __DEF_NACL_AUTH_INT(nacl_auth, name)                            \
-static ssize_t iscsi_nacl_auth_show_##name(                            \
-       struct se_node_acl *nacl,                                       \
-       char *page)                                                     \
+static ssize_t iscsi_nacl_auth_##name##_show(struct config_item *item, \
+               char *page)                                             \
 {                                                                      \
-       return __iscsi_nacl_auth_show_##name(container_of(nacl,         \
-                       struct iscsi_node_acl, se_node_acl), page);             \
-}
-
-#define AUTH_ATTR(_name, _mode)        TF_NACL_AUTH_ATTR(iscsi, _name, _mode);
-#define AUTH_ATTR_RO(_name) TF_NACL_AUTH_ATTR_RO(iscsi, _name);
+       struct se_node_acl *nacl = auth_to_nacl(item);                  \
+       return __iscsi_nacl_auth_##name##_show(container_of(nacl,       \
+                       struct iscsi_node_acl, se_node_acl), page);     \
+}                                                                      \
+                                                                       \
+CONFIGFS_ATTR_RO(iscsi_nacl_auth_, name)
 
-/*
- * One-way authentication userid
- */
-DEF_NACL_AUTH_STR(userid, NAF_USERID_SET);
-AUTH_ATTR(userid, S_IRUGO | S_IWUSR);
-/*
- * One-way authentication password
- */
-DEF_NACL_AUTH_STR(password, NAF_PASSWORD_SET);
-AUTH_ATTR(password, S_IRUGO | S_IWUSR);
-/*
- * Enforce mutual authentication
- */
 DEF_NACL_AUTH_INT(authenticate_target);
-AUTH_ATTR_RO(authenticate_target);
-/*
- * Mutual authentication userid
- */
-DEF_NACL_AUTH_STR(userid_mutual, NAF_USERID_IN_SET);
-AUTH_ATTR(userid_mutual, S_IRUGO | S_IWUSR);
-/*
- * Mutual authentication password
- */
-DEF_NACL_AUTH_STR(password_mutual, NAF_PASSWORD_IN_SET);
-AUTH_ATTR(password_mutual, S_IRUGO | S_IWUSR);
 
 static struct configfs_attribute *lio_target_nacl_auth_attrs[] = {
-       &iscsi_nacl_auth_userid.attr,
-       &iscsi_nacl_auth_password.attr,
-       &iscsi_nacl_auth_authenticate_target.attr,
-       &iscsi_nacl_auth_userid_mutual.attr,
-       &iscsi_nacl_auth_password_mutual.attr,
+       &iscsi_nacl_auth_attr_userid,
+       &iscsi_nacl_auth_attr_password,
+       &iscsi_nacl_auth_attr_authenticate_target,
+       &iscsi_nacl_auth_attr_userid_mutual,
+       &iscsi_nacl_auth_attr_password_mutual,
        NULL,
 };
 
@@ -570,11 +507,11 @@ static struct configfs_attribute *lio_target_nacl_auth_attrs[] = {
 
 /* Start items for lio_target_nacl_param_cit */
 
-#define DEF_NACL_PARAM(name)                                           \
-static ssize_t iscsi_nacl_param_show_##name(                           \
-       struct se_node_acl *se_nacl,                                    \
-       char *page)                                                     \
+#define ISCSI_NACL_PARAM(name)                                         \
+static ssize_t iscsi_nacl_param_##name##_show(struct config_item *item,        \
+               char *page)                                             \
 {                                                                      \
+       struct se_node_acl *se_nacl = param_to_nacl(item);              \
        struct iscsi_session *sess;                                     \
        struct se_session *se_sess;                                     \
        ssize_t rb;                                                     \
@@ -592,55 +529,34 @@ static ssize_t iscsi_nacl_param_show_##name(                              \
        spin_unlock_bh(&se_nacl->nacl_sess_lock);                       \
                                                                        \
        return rb;                                                      \
-}
-
-#define NACL_PARAM_ATTR(_name) TF_NACL_PARAM_ATTR_RO(iscsi, _name);
-
-DEF_NACL_PARAM(MaxConnections);
-NACL_PARAM_ATTR(MaxConnections);
-
-DEF_NACL_PARAM(InitialR2T);
-NACL_PARAM_ATTR(InitialR2T);
-
-DEF_NACL_PARAM(ImmediateData);
-NACL_PARAM_ATTR(ImmediateData);
-
-DEF_NACL_PARAM(MaxBurstLength);
-NACL_PARAM_ATTR(MaxBurstLength);
-
-DEF_NACL_PARAM(FirstBurstLength);
-NACL_PARAM_ATTR(FirstBurstLength);
-
-DEF_NACL_PARAM(DefaultTime2Wait);
-NACL_PARAM_ATTR(DefaultTime2Wait);
-
-DEF_NACL_PARAM(DefaultTime2Retain);
-NACL_PARAM_ATTR(DefaultTime2Retain);
-
-DEF_NACL_PARAM(MaxOutstandingR2T);
-NACL_PARAM_ATTR(MaxOutstandingR2T);
-
-DEF_NACL_PARAM(DataPDUInOrder);
-NACL_PARAM_ATTR(DataPDUInOrder);
-
-DEF_NACL_PARAM(DataSequenceInOrder);
-NACL_PARAM_ATTR(DataSequenceInOrder);
-
-DEF_NACL_PARAM(ErrorRecoveryLevel);
-NACL_PARAM_ATTR(ErrorRecoveryLevel);
+}                                                                      \
+                                                                       \
+CONFIGFS_ATTR_RO(iscsi_nacl_param_, name)
+
+ISCSI_NACL_PARAM(MaxConnections);
+ISCSI_NACL_PARAM(InitialR2T);
+ISCSI_NACL_PARAM(ImmediateData);
+ISCSI_NACL_PARAM(MaxBurstLength);
+ISCSI_NACL_PARAM(FirstBurstLength);
+ISCSI_NACL_PARAM(DefaultTime2Wait);
+ISCSI_NACL_PARAM(DefaultTime2Retain);
+ISCSI_NACL_PARAM(MaxOutstandingR2T);
+ISCSI_NACL_PARAM(DataPDUInOrder);
+ISCSI_NACL_PARAM(DataSequenceInOrder);
+ISCSI_NACL_PARAM(ErrorRecoveryLevel);
 
 static struct configfs_attribute *lio_target_nacl_param_attrs[] = {
-       &iscsi_nacl_param_MaxConnections.attr,
-       &iscsi_nacl_param_InitialR2T.attr,
-       &iscsi_nacl_param_ImmediateData.attr,
-       &iscsi_nacl_param_MaxBurstLength.attr,
-       &iscsi_nacl_param_FirstBurstLength.attr,
-       &iscsi_nacl_param_DefaultTime2Wait.attr,
-       &iscsi_nacl_param_DefaultTime2Retain.attr,
-       &iscsi_nacl_param_MaxOutstandingR2T.attr,
-       &iscsi_nacl_param_DataPDUInOrder.attr,
-       &iscsi_nacl_param_DataSequenceInOrder.attr,
-       &iscsi_nacl_param_ErrorRecoveryLevel.attr,
+       &iscsi_nacl_param_attr_MaxConnections,
+       &iscsi_nacl_param_attr_InitialR2T,
+       &iscsi_nacl_param_attr_ImmediateData,
+       &iscsi_nacl_param_attr_MaxBurstLength,
+       &iscsi_nacl_param_attr_FirstBurstLength,
+       &iscsi_nacl_param_attr_DefaultTime2Wait,
+       &iscsi_nacl_param_attr_DefaultTime2Retain,
+       &iscsi_nacl_param_attr_MaxOutstandingR2T,
+       &iscsi_nacl_param_attr_DataPDUInOrder,
+       &iscsi_nacl_param_attr_DataSequenceInOrder,
+       &iscsi_nacl_param_attr_ErrorRecoveryLevel,
        NULL,
 };
 
@@ -648,10 +564,9 @@ static struct configfs_attribute *lio_target_nacl_param_attrs[] = {
 
 /* Start items for lio_target_acl_cit */
 
-static ssize_t lio_target_nacl_show_info(
-       struct se_node_acl *se_nacl,
-       char *page)
+static ssize_t lio_target_nacl_info_show(struct config_item *item, char *page)
 {
+       struct se_node_acl *se_nacl = acl_to_nacl(item);
        struct iscsi_session *sess;
        struct iscsi_conn *conn;
        struct se_session *se_sess;
@@ -766,20 +681,16 @@ static ssize_t lio_target_nacl_show_info(
        return rb;
 }
 
-TF_NACL_BASE_ATTR_RO(lio_target, info);
-
-static ssize_t lio_target_nacl_show_cmdsn_depth(
-       struct se_node_acl *se_nacl,
-       char *page)
+static ssize_t lio_target_nacl_cmdsn_depth_show(struct config_item *item,
+               char *page)
 {
-       return sprintf(page, "%u\n", se_nacl->queue_depth);
+       return sprintf(page, "%u\n", acl_to_nacl(item)->queue_depth);
 }
 
-static ssize_t lio_target_nacl_store_cmdsn_depth(
-       struct se_node_acl *se_nacl,
-       const char *page,
-       size_t count)
+static ssize_t lio_target_nacl_cmdsn_depth_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_node_acl *se_nacl = acl_to_nacl(item);
        struct se_portal_group *se_tpg = se_nacl->se_tpg;
        struct iscsi_portal_group *tpg = container_of(se_tpg,
                        struct iscsi_portal_group, tpg_se_tpg);
@@ -829,20 +740,15 @@ static ssize_t lio_target_nacl_store_cmdsn_depth(
        return (!ret) ? count : (ssize_t)ret;
 }
 
-TF_NACL_BASE_ATTR(lio_target, cmdsn_depth, S_IRUGO | S_IWUSR);
-
-static ssize_t lio_target_nacl_show_tag(
-       struct se_node_acl *se_nacl,
-       char *page)
+static ssize_t lio_target_nacl_tag_show(struct config_item *item, char *page)
 {
-       return snprintf(page, PAGE_SIZE, "%s", se_nacl->acl_tag);
+       return snprintf(page, PAGE_SIZE, "%s", acl_to_nacl(item)->acl_tag);
 }
 
-static ssize_t lio_target_nacl_store_tag(
-       struct se_node_acl *se_nacl,
-       const char *page,
-       size_t count)
+static ssize_t lio_target_nacl_tag_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_node_acl *se_nacl = acl_to_nacl(item);
        int ret;
 
        ret = core_tpg_set_initiator_node_tag(se_nacl->se_tpg, se_nacl, page);
@@ -852,12 +758,14 @@ static ssize_t lio_target_nacl_store_tag(
        return count;
 }
 
-TF_NACL_BASE_ATTR(lio_target, tag, S_IRUGO | S_IWUSR);
+CONFIGFS_ATTR_RO(lio_target_nacl_, info);
+CONFIGFS_ATTR(lio_target_nacl_, cmdsn_depth);
+CONFIGFS_ATTR(lio_target_nacl_, tag);
 
 static struct configfs_attribute *lio_target_initiator_attrs[] = {
-       &lio_target_nacl_info.attr,
-       &lio_target_nacl_cmdsn_depth.attr,
-       &lio_target_nacl_tag.attr,
+       &lio_target_nacl_attr_info,
+       &lio_target_nacl_attr_cmdsn_depth,
+       &lio_target_nacl_attr_tag,
        NULL,
 };
 
@@ -907,10 +815,10 @@ static void lio_target_cleanup_nodeacl( struct se_node_acl *se_nacl)
 
 #define DEF_TPG_ATTRIB(name)                                           \
                                                                        \
-static ssize_t iscsi_tpg_attrib_show_##name(                           \
-       struct se_portal_group *se_tpg,                         \
-       char *page)                                                     \
+static ssize_t iscsi_tpg_attrib_##name##_show(struct config_item *item,        \
+               char *page)                                             \
 {                                                                      \
+       struct se_portal_group *se_tpg = attrib_to_tpg(item);           \
        struct iscsi_portal_group *tpg = container_of(se_tpg,           \
                        struct iscsi_portal_group, tpg_se_tpg); \
        ssize_t rb;                                                     \
@@ -923,11 +831,10 @@ static ssize_t iscsi_tpg_attrib_show_##name(                              \
        return rb;                                                      \
 }                                                                      \
                                                                        \
-static ssize_t iscsi_tpg_attrib_store_##name(                          \
-       struct se_portal_group *se_tpg,                         \
-       const char *page,                                               \
-       size_t count)                                                   \
+static ssize_t iscsi_tpg_attrib_##name##_store(struct config_item *item,\
+               const char *page, size_t count)                         \
 {                                                                      \
+       struct se_portal_group *se_tpg = attrib_to_tpg(item);           \
        struct iscsi_portal_group *tpg = container_of(se_tpg,           \
                        struct iscsi_portal_group, tpg_se_tpg); \
        u32 val;                                                        \
@@ -948,90 +855,37 @@ static ssize_t iscsi_tpg_attrib_store_##name(                             \
 out:                                                                   \
        iscsit_put_tpg(tpg);                                            \
        return ret;                                                     \
-}
-
-#define TPG_ATTR(_name, _mode) TF_TPG_ATTRIB_ATTR(iscsi, _name, _mode);
+}                                                                      \
+CONFIGFS_ATTR(iscsi_tpg_attrib_, name)
 
-/*
- * Define iscsi_tpg_attrib_s_authentication
- */
 DEF_TPG_ATTRIB(authentication);
-TPG_ATTR(authentication, S_IRUGO | S_IWUSR);
-/*
- * Define iscsi_tpg_attrib_s_login_timeout
- */
 DEF_TPG_ATTRIB(login_timeout);
-TPG_ATTR(login_timeout, S_IRUGO | S_IWUSR);
-/*
- * Define iscsi_tpg_attrib_s_netif_timeout
- */
 DEF_TPG_ATTRIB(netif_timeout);
-TPG_ATTR(netif_timeout, S_IRUGO | S_IWUSR);
-/*
- * Define iscsi_tpg_attrib_s_generate_node_acls
- */
 DEF_TPG_ATTRIB(generate_node_acls);
-TPG_ATTR(generate_node_acls, S_IRUGO | S_IWUSR);
-/*
- * Define iscsi_tpg_attrib_s_default_cmdsn_depth
- */
 DEF_TPG_ATTRIB(default_cmdsn_depth);
-TPG_ATTR(default_cmdsn_depth, S_IRUGO | S_IWUSR);
-/*
- Define iscsi_tpg_attrib_s_cache_dynamic_acls
- */
 DEF_TPG_ATTRIB(cache_dynamic_acls);
-TPG_ATTR(cache_dynamic_acls, S_IRUGO | S_IWUSR);
-/*
- * Define iscsi_tpg_attrib_s_demo_mode_write_protect
- */
 DEF_TPG_ATTRIB(demo_mode_write_protect);
-TPG_ATTR(demo_mode_write_protect, S_IRUGO | S_IWUSR);
-/*
- * Define iscsi_tpg_attrib_s_prod_mode_write_protect
- */
 DEF_TPG_ATTRIB(prod_mode_write_protect);
-TPG_ATTR(prod_mode_write_protect, S_IRUGO | S_IWUSR);
-/*
- * Define iscsi_tpg_attrib_s_demo_mode_discovery,
- */
 DEF_TPG_ATTRIB(demo_mode_discovery);
-TPG_ATTR(demo_mode_discovery, S_IRUGO | S_IWUSR);
-/*
- * Define iscsi_tpg_attrib_s_default_erl
- */
 DEF_TPG_ATTRIB(default_erl);
-TPG_ATTR(default_erl, S_IRUGO | S_IWUSR);
-/*
- * Define iscsi_tpg_attrib_s_t10_pi
- */
 DEF_TPG_ATTRIB(t10_pi);
-TPG_ATTR(t10_pi, S_IRUGO | S_IWUSR);
-/*
- * Define iscsi_tpg_attrib_s_fabric_prot_type
- */
 DEF_TPG_ATTRIB(fabric_prot_type);
-TPG_ATTR(fabric_prot_type, S_IRUGO | S_IWUSR);
-/*
- * Define iscsi_tpg_attrib_s_tpg_enabled_sendtargets
- */
 DEF_TPG_ATTRIB(tpg_enabled_sendtargets);
-TPG_ATTR(tpg_enabled_sendtargets, S_IRUGO | S_IWUSR);
 
 static struct configfs_attribute *lio_target_tpg_attrib_attrs[] = {
-       &iscsi_tpg_attrib_authentication.attr,
-       &iscsi_tpg_attrib_login_timeout.attr,
-       &iscsi_tpg_attrib_netif_timeout.attr,
-       &iscsi_tpg_attrib_generate_node_acls.attr,
-       &iscsi_tpg_attrib_default_cmdsn_depth.attr,
-       &iscsi_tpg_attrib_cache_dynamic_acls.attr,
-       &iscsi_tpg_attrib_demo_mode_write_protect.attr,
-       &iscsi_tpg_attrib_prod_mode_write_protect.attr,
-       &iscsi_tpg_attrib_demo_mode_discovery.attr,
-       &iscsi_tpg_attrib_default_erl.attr,
-       &iscsi_tpg_attrib_t10_pi.attr,
-       &iscsi_tpg_attrib_fabric_prot_type.attr,
-       &iscsi_tpg_attrib_tpg_enabled_sendtargets.attr,
+       &iscsi_tpg_attrib_attr_authentication,
+       &iscsi_tpg_attrib_attr_login_timeout,
+       &iscsi_tpg_attrib_attr_netif_timeout,
+       &iscsi_tpg_attrib_attr_generate_node_acls,
+       &iscsi_tpg_attrib_attr_default_cmdsn_depth,
+       &iscsi_tpg_attrib_attr_cache_dynamic_acls,
+       &iscsi_tpg_attrib_attr_demo_mode_write_protect,
+       &iscsi_tpg_attrib_attr_prod_mode_write_protect,
+       &iscsi_tpg_attrib_attr_demo_mode_discovery,
+       &iscsi_tpg_attrib_attr_default_erl,
+       &iscsi_tpg_attrib_attr_t10_pi,
+       &iscsi_tpg_attrib_attr_fabric_prot_type,
+       &iscsi_tpg_attrib_attr_tpg_enabled_sendtargets,
        NULL,
 };
 
@@ -1040,9 +894,8 @@ static struct configfs_attribute *lio_target_tpg_attrib_attrs[] = {
 /* Start items for lio_target_tpg_auth_cit */
 
 #define __DEF_TPG_AUTH_STR(prefix, name, flags)                                        \
-static ssize_t __iscsi_##prefix##_show_##name(                                 \
-       struct se_portal_group *se_tpg,                                         \
-       char *page)                                                             \
+static ssize_t __iscsi_##prefix##_##name##_show(struct se_portal_group *se_tpg,        \
+               char *page)                                                     \
 {                                                                              \
        struct iscsi_portal_group *tpg = container_of(se_tpg,                   \
                                struct iscsi_portal_group, tpg_se_tpg);         \
@@ -1054,10 +907,8 @@ static ssize_t __iscsi_##prefix##_show_##name(                                    \
        return snprintf(page, PAGE_SIZE, "%s\n", auth->name);                   \
 }                                                                              \
                                                                                \
-static ssize_t __iscsi_##prefix##_store_##name(                                        \
-       struct se_portal_group *se_tpg,                                         \
-       const char *page,                                                       \
-       size_t count)                                                           \
+static ssize_t __iscsi_##prefix##_##name##_store(struct se_portal_group *se_tpg,\
+               const char *page, size_t count)                                 \
 {                                                                              \
        struct iscsi_portal_group *tpg = container_of(se_tpg,                   \
                                struct iscsi_portal_group, tpg_se_tpg);         \
@@ -1081,10 +932,31 @@ static ssize_t __iscsi_##prefix##_store_##name(                                  \
        return count;                                                           \
 }
 
+#define DEF_TPG_AUTH_STR(name, flags)                                          \
+       __DEF_TPG_AUTH_STR(tpg_auth, name, flags)                               \
+static ssize_t iscsi_tpg_auth_##name##_show(struct config_item *item,          \
+               char *page)                                                     \
+{                                                                              \
+       return __iscsi_tpg_auth_##name##_show(auth_to_tpg(item), page);         \
+}                                                                              \
+                                                                               \
+static ssize_t iscsi_tpg_auth_##name##_store(struct config_item *item,         \
+               const char *page, size_t count)                                 \
+{                                                                              \
+       return __iscsi_tpg_auth_##name##_store(auth_to_tpg(item), page, count); \
+}                                                                              \
+                                                                               \
+CONFIGFS_ATTR(iscsi_tpg_auth_, name);
+
+
+DEF_TPG_AUTH_STR(userid, NAF_USERID_SET);
+DEF_TPG_AUTH_STR(password, NAF_PASSWORD_SET);
+DEF_TPG_AUTH_STR(userid_mutual, NAF_USERID_IN_SET);
+DEF_TPG_AUTH_STR(password_mutual, NAF_PASSWORD_IN_SET);
+
 #define __DEF_TPG_AUTH_INT(prefix, name)                                       \
-static ssize_t __iscsi_##prefix##_show_##name(                                 \
-       struct se_portal_group *se_tpg,                                         \
-       char *page)                                                             \
+static ssize_t __iscsi_##prefix##_##name##_show(struct se_portal_group *se_tpg,        \
+               char *page)                                                             \
 {                                                                              \
        struct iscsi_portal_group *tpg = container_of(se_tpg,                   \
                                struct iscsi_portal_group, tpg_se_tpg);         \
@@ -1096,67 +968,23 @@ static ssize_t __iscsi_##prefix##_show_##name(                                   \
        return snprintf(page, PAGE_SIZE, "%d\n", auth->name);                   \
 }
 
-#define DEF_TPG_AUTH_STR(name, flags)                                          \
-       __DEF_TPG_AUTH_STR(tpg_auth, name, flags)                               \
-static ssize_t iscsi_tpg_auth_show_##name(                                     \
-       struct se_portal_group *se_tpg,                                         \
-       char *page)                                                             \
-{                                                                              \
-       return __iscsi_tpg_auth_show_##name(se_tpg, page);                      \
-}                                                                              \
-                                                                               \
-static ssize_t iscsi_tpg_auth_store_##name(                                    \
-       struct se_portal_group *se_tpg,                                         \
-       const char *page,                                                       \
-       size_t count)                                                           \
-{                                                                              \
-       return __iscsi_tpg_auth_store_##name(se_tpg, page, count);              \
-}
-
 #define DEF_TPG_AUTH_INT(name)                                                 \
        __DEF_TPG_AUTH_INT(tpg_auth, name)                                      \
-static ssize_t iscsi_tpg_auth_show_##name(                                     \
-       struct se_portal_group *se_tpg,                                         \
-       char *page)                                                             \
+static ssize_t iscsi_tpg_auth_##name##_show(struct config_item *item,          \
+               char *page) \
 {                                                                              \
-       return __iscsi_tpg_auth_show_##name(se_tpg, page);                      \
-}
-
-#define TPG_AUTH_ATTR(_name, _mode) TF_TPG_AUTH_ATTR(iscsi, _name, _mode);
-#define TPG_AUTH_ATTR_RO(_name) TF_TPG_AUTH_ATTR_RO(iscsi, _name);
+       return __iscsi_tpg_auth_##name##_show(auth_to_tpg(item), page);         \
+}                                                                              \
+CONFIGFS_ATTR_RO(iscsi_tpg_auth_, name);
 
-/*
- *  * One-way authentication userid
- *   */
-DEF_TPG_AUTH_STR(userid, NAF_USERID_SET);
-TPG_AUTH_ATTR(userid, S_IRUGO | S_IWUSR);
-/*
- *  * One-way authentication password
- *   */
-DEF_TPG_AUTH_STR(password, NAF_PASSWORD_SET);
-TPG_AUTH_ATTR(password, S_IRUGO | S_IWUSR);
-/*
- *  * Enforce mutual authentication
- *   */
 DEF_TPG_AUTH_INT(authenticate_target);
-TPG_AUTH_ATTR_RO(authenticate_target);
-/*
- *  * Mutual authentication userid
- *   */
-DEF_TPG_AUTH_STR(userid_mutual, NAF_USERID_IN_SET);
-TPG_AUTH_ATTR(userid_mutual, S_IRUGO | S_IWUSR);
-/*
- *  * Mutual authentication password
- *   */
-DEF_TPG_AUTH_STR(password_mutual, NAF_PASSWORD_IN_SET);
-TPG_AUTH_ATTR(password_mutual, S_IRUGO | S_IWUSR);
 
 static struct configfs_attribute *lio_target_tpg_auth_attrs[] = {
-       &iscsi_tpg_auth_userid.attr,
-       &iscsi_tpg_auth_password.attr,
-       &iscsi_tpg_auth_authenticate_target.attr,
-       &iscsi_tpg_auth_userid_mutual.attr,
-       &iscsi_tpg_auth_password_mutual.attr,
+       &iscsi_tpg_auth_attr_userid,
+       &iscsi_tpg_auth_attr_password,
+       &iscsi_tpg_auth_attr_authenticate_target,
+       &iscsi_tpg_auth_attr_userid_mutual,
+       &iscsi_tpg_auth_attr_password_mutual,
        NULL,
 };
 
@@ -1165,10 +993,10 @@ static struct configfs_attribute *lio_target_tpg_auth_attrs[] = {
 /* Start items for lio_target_tpg_param_cit */
 
 #define DEF_TPG_PARAM(name)                                            \
-static ssize_t iscsi_tpg_param_show_##name(                            \
-       struct se_portal_group *se_tpg,                                 \
-       char *page)                                                     \
+static ssize_t iscsi_tpg_param_##name##_show(struct config_item *item, \
+               char *page)                                             \
 {                                                                      \
+       struct se_portal_group *se_tpg = param_to_tpg(item);            \
        struct iscsi_portal_group *tpg = container_of(se_tpg,           \
                        struct iscsi_portal_group, tpg_se_tpg);         \
        struct iscsi_param *param;                                      \
@@ -1188,11 +1016,10 @@ static ssize_t iscsi_tpg_param_show_##name(                             \
        iscsit_put_tpg(tpg);                                            \
        return rb;                                                      \
 }                                                                      \
-static ssize_t iscsi_tpg_param_store_##name(                           \
-       struct se_portal_group *se_tpg,                         \
-       const char *page,                                               \
-       size_t count)                                                   \
+static ssize_t iscsi_tpg_param_##name##_store(struct config_item *item, \
+               const char *page, size_t count)                         \
 {                                                                      \
+       struct se_portal_group *se_tpg = param_to_tpg(item);            \
        struct iscsi_portal_group *tpg = container_of(se_tpg,           \
                        struct iscsi_portal_group, tpg_se_tpg);         \
        char *buf;                                                      \
@@ -1220,96 +1047,54 @@ static ssize_t iscsi_tpg_param_store_##name(                            \
 out:                                                                   \
        kfree(buf);                                                     \
        iscsit_put_tpg(tpg);                                            \
-       return -EINVAL;                                         \
-}
-
-#define TPG_PARAM_ATTR(_name, _mode) TF_TPG_PARAM_ATTR(iscsi, _name, _mode);
+       return -EINVAL;                                                 \
+}                                                                      \
+CONFIGFS_ATTR(iscsi_tpg_param_, name)
 
 DEF_TPG_PARAM(AuthMethod);
-TPG_PARAM_ATTR(AuthMethod, S_IRUGO | S_IWUSR);
-
 DEF_TPG_PARAM(HeaderDigest);
-TPG_PARAM_ATTR(HeaderDigest, S_IRUGO | S_IWUSR);
-
 DEF_TPG_PARAM(DataDigest);
-TPG_PARAM_ATTR(DataDigest, S_IRUGO | S_IWUSR);
-
 DEF_TPG_PARAM(MaxConnections);
-TPG_PARAM_ATTR(MaxConnections, S_IRUGO | S_IWUSR);
-
 DEF_TPG_PARAM(TargetAlias);
-TPG_PARAM_ATTR(TargetAlias, S_IRUGO | S_IWUSR);
-
 DEF_TPG_PARAM(InitialR2T);
-TPG_PARAM_ATTR(InitialR2T, S_IRUGO | S_IWUSR);
-
 DEF_TPG_PARAM(ImmediateData);
-TPG_PARAM_ATTR(ImmediateData, S_IRUGO | S_IWUSR);
-
 DEF_TPG_PARAM(MaxRecvDataSegmentLength);
-TPG_PARAM_ATTR(MaxRecvDataSegmentLength, S_IRUGO | S_IWUSR);
-
 DEF_TPG_PARAM(MaxXmitDataSegmentLength);
-TPG_PARAM_ATTR(MaxXmitDataSegmentLength, S_IRUGO | S_IWUSR);
-
 DEF_TPG_PARAM(MaxBurstLength);
-TPG_PARAM_ATTR(MaxBurstLength, S_IRUGO | S_IWUSR);
-
 DEF_TPG_PARAM(FirstBurstLength);
-TPG_PARAM_ATTR(FirstBurstLength, S_IRUGO | S_IWUSR);
-
 DEF_TPG_PARAM(DefaultTime2Wait);
-TPG_PARAM_ATTR(DefaultTime2Wait, S_IRUGO | S_IWUSR);
-
 DEF_TPG_PARAM(DefaultTime2Retain);
-TPG_PARAM_ATTR(DefaultTime2Retain, S_IRUGO | S_IWUSR);
-
 DEF_TPG_PARAM(MaxOutstandingR2T);
-TPG_PARAM_ATTR(MaxOutstandingR2T, S_IRUGO | S_IWUSR);
-
 DEF_TPG_PARAM(DataPDUInOrder);
-TPG_PARAM_ATTR(DataPDUInOrder, S_IRUGO | S_IWUSR);
-
 DEF_TPG_PARAM(DataSequenceInOrder);
-TPG_PARAM_ATTR(DataSequenceInOrder, S_IRUGO | S_IWUSR);
-
 DEF_TPG_PARAM(ErrorRecoveryLevel);
-TPG_PARAM_ATTR(ErrorRecoveryLevel, S_IRUGO | S_IWUSR);
-
 DEF_TPG_PARAM(IFMarker);
-TPG_PARAM_ATTR(IFMarker, S_IRUGO | S_IWUSR);
-
 DEF_TPG_PARAM(OFMarker);
-TPG_PARAM_ATTR(OFMarker, S_IRUGO | S_IWUSR);
-
 DEF_TPG_PARAM(IFMarkInt);
-TPG_PARAM_ATTR(IFMarkInt, S_IRUGO | S_IWUSR);
-
 DEF_TPG_PARAM(OFMarkInt);
-TPG_PARAM_ATTR(OFMarkInt, S_IRUGO | S_IWUSR);
 
 static struct configfs_attribute *lio_target_tpg_param_attrs[] = {
-       &iscsi_tpg_param_AuthMethod.attr,
-       &iscsi_tpg_param_HeaderDigest.attr,
-       &iscsi_tpg_param_DataDigest.attr,
-       &iscsi_tpg_param_MaxConnections.attr,
-       &iscsi_tpg_param_TargetAlias.attr,
-       &iscsi_tpg_param_InitialR2T.attr,
-       &iscsi_tpg_param_ImmediateData.attr,
-       &iscsi_tpg_param_MaxRecvDataSegmentLength.attr,
-       &iscsi_tpg_param_MaxXmitDataSegmentLength.attr,
-       &iscsi_tpg_param_MaxBurstLength.attr,
-       &iscsi_tpg_param_FirstBurstLength.attr,
-       &iscsi_tpg_param_DefaultTime2Wait.attr,
-       &iscsi_tpg_param_DefaultTime2Retain.attr,
-       &iscsi_tpg_param_MaxOutstandingR2T.attr,
-       &iscsi_tpg_param_DataPDUInOrder.attr,
-       &iscsi_tpg_param_DataSequenceInOrder.attr,
-       &iscsi_tpg_param_ErrorRecoveryLevel.attr,
-       &iscsi_tpg_param_IFMarker.attr,
-       &iscsi_tpg_param_OFMarker.attr,
-       &iscsi_tpg_param_IFMarkInt.attr,
-       &iscsi_tpg_param_OFMarkInt.attr,
+       &iscsi_tpg_param_attr_AuthMethod,
+       &iscsi_tpg_param_attr_HeaderDigest,
+       &iscsi_tpg_param_attr_DataDigest,
+       &iscsi_tpg_param_attr_MaxConnections,
+       &iscsi_tpg_param_attr_TargetAlias,
+       &iscsi_tpg_param_attr_InitialR2T,
+       &iscsi_tpg_param_attr_ImmediateData,
+       &iscsi_tpg_param_attr_MaxRecvDataSegmentLength,
+       &iscsi_tpg_param_attr_MaxXmitDataSegmentLength,
+       &iscsi_tpg_param_attr_MaxBurstLength,
+       &iscsi_tpg_param_attr_FirstBurstLength,
+       &iscsi_tpg_param_attr_DefaultTime2Wait,
+       &iscsi_tpg_param_attr_DefaultTime2Retain,
+       &iscsi_tpg_param_attr_MaxOutstandingR2T,
+       &iscsi_tpg_param_attr_DataPDUInOrder,
+       &iscsi_tpg_param_attr_DataSequenceInOrder,
+       &iscsi_tpg_param_attr_ErrorRecoveryLevel,
+       &iscsi_tpg_param_attr_IFMarker,
+       &iscsi_tpg_param_attr_OFMarker,
+       &iscsi_tpg_param_attr_IFMarkInt,
+       &iscsi_tpg_param_attr_OFMarkInt,
        NULL,
 };
 
@@ -1317,10 +1102,9 @@ static struct configfs_attribute *lio_target_tpg_param_attrs[] = {
 
 /* Start items for lio_target_tpg_cit */
 
-static ssize_t lio_target_tpg_show_enable(
-       struct se_portal_group *se_tpg,
-       char *page)
+static ssize_t lio_target_tpg_enable_show(struct config_item *item, char *page)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct iscsi_portal_group *tpg = container_of(se_tpg,
                        struct iscsi_portal_group, tpg_se_tpg);
        ssize_t len;
@@ -1333,11 +1117,10 @@ static ssize_t lio_target_tpg_show_enable(
        return len;
 }
 
-static ssize_t lio_target_tpg_store_enable(
-       struct se_portal_group *se_tpg,
-       const char *page,
-       size_t count)
+static ssize_t lio_target_tpg_enable_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct iscsi_portal_group *tpg = container_of(se_tpg,
                        struct iscsi_portal_group, tpg_se_tpg);
        u32 op;
@@ -1375,20 +1158,19 @@ out:
        return -EINVAL;
 }
 
-TF_TPG_BASE_ATTR(lio_target, enable, S_IRUGO | S_IWUSR);
 
-static ssize_t lio_target_tpg_show_dynamic_sessions(
-       struct se_portal_group *se_tpg,
-       char *page)
+static ssize_t lio_target_tpg_dynamic_sessions_show(struct config_item *item,
+               char *page)
 {
-       return target_show_dynamic_sessions(se_tpg, page);
+       return target_show_dynamic_sessions(to_tpg(item), page);
 }
 
-TF_TPG_BASE_ATTR_RO(lio_target, dynamic_sessions);
+CONFIGFS_ATTR(lio_target_tpg_, enable);
+CONFIGFS_ATTR_RO(lio_target_tpg_, dynamic_sessions);
 
 static struct configfs_attribute *lio_target_tpg_attrs[] = {
-       &lio_target_tpg_enable.attr,
-       &lio_target_tpg_dynamic_sessions.attr,
+       &lio_target_tpg_attr_enable,
+       &lio_target_tpg_attr_dynamic_sessions,
        NULL,
 };
 
@@ -1463,17 +1245,16 @@ static void lio_target_tiqn_deltpg(struct se_portal_group *se_tpg)
 
 /* Start LIO-Target TIQN struct contig_item lio_target_cit */
 
-static ssize_t lio_target_wwn_show_attr_lio_version(
-       struct target_fabric_configfs *tf,
-       char *page)
+static ssize_t lio_target_wwn_lio_version_show(struct config_item *item,
+               char *page)
 {
        return sprintf(page, "Datera Inc. iSCSI Target "ISCSIT_VERSION"\n");
 }
 
-TF_WWN_ATTR_RO(lio_target, lio_version);
+CONFIGFS_ATTR_RO(lio_target_wwn_, lio_version);
 
 static struct configfs_attribute *lio_target_wwn_attrs[] = {
-       &lio_target_wwn_lio_version.attr,
+       &lio_target_wwn_attr_lio_version,
        NULL,
 };
 
@@ -1552,77 +1333,47 @@ static void lio_target_call_coredeltiqn(
 
 #define DEF_DISC_AUTH_STR(name, flags)                                 \
        __DEF_NACL_AUTH_STR(disc, name, flags)                          \
-static ssize_t iscsi_disc_show_##name(                                 \
-       struct target_fabric_configfs *tf,                              \
-       char *page)                                                     \
+static ssize_t iscsi_disc_##name##_show(struct config_item *item, char *page) \
 {                                                                      \
-       return __iscsi_disc_show_##name(&iscsit_global->discovery_acl,  \
+       return __iscsi_disc_##name##_show(&iscsit_global->discovery_acl,\
                page);                                                  \
 }                                                                      \
-static ssize_t iscsi_disc_store_##name(                                        \
-       struct target_fabric_configfs *tf,                              \
-       const char *page,                                               \
-       size_t count)                                                   \
+static ssize_t iscsi_disc_##name##_store(struct config_item *item,     \
+               const char *page, size_t count)                         \
 {                                                                      \
-       return __iscsi_disc_store_##name(&iscsit_global->discovery_acl, \
+       return __iscsi_disc_##name##_store(&iscsit_global->discovery_acl,       \
                page, count);                                           \
-}
+                                                                       \
+}                                                                      \
+CONFIGFS_ATTR(iscsi_disc_, name)
+
+DEF_DISC_AUTH_STR(userid, NAF_USERID_SET);
+DEF_DISC_AUTH_STR(password, NAF_PASSWORD_SET);
+DEF_DISC_AUTH_STR(userid_mutual, NAF_USERID_IN_SET);
+DEF_DISC_AUTH_STR(password_mutual, NAF_PASSWORD_IN_SET);
 
 #define DEF_DISC_AUTH_INT(name)                                                \
        __DEF_NACL_AUTH_INT(disc, name)                                 \
-static ssize_t iscsi_disc_show_##name(                                 \
-       struct target_fabric_configfs *tf,                              \
-       char *page)                                                     \
+static ssize_t iscsi_disc_##name##_show(struct config_item *item, char *page) \
 {                                                                      \
-       return __iscsi_disc_show_##name(&iscsit_global->discovery_acl,  \
+       return __iscsi_disc_##name##_show(&iscsit_global->discovery_acl, \
                        page);                                          \
-}
-
-#define DISC_AUTH_ATTR(_name, _mode) TF_DISC_ATTR(iscsi, _name, _mode)
-#define DISC_AUTH_ATTR_RO(_name) TF_DISC_ATTR_RO(iscsi, _name)
+}                                                                      \
+CONFIGFS_ATTR_RO(iscsi_disc_, name)
 
-/*
- * One-way authentication userid
- */
-DEF_DISC_AUTH_STR(userid, NAF_USERID_SET);
-DISC_AUTH_ATTR(userid, S_IRUGO | S_IWUSR);
-/*
- * One-way authentication password
- */
-DEF_DISC_AUTH_STR(password, NAF_PASSWORD_SET);
-DISC_AUTH_ATTR(password, S_IRUGO | S_IWUSR);
-/*
- * Enforce mutual authentication
- */
 DEF_DISC_AUTH_INT(authenticate_target);
-DISC_AUTH_ATTR_RO(authenticate_target);
-/*
- * Mutual authentication userid
- */
-DEF_DISC_AUTH_STR(userid_mutual, NAF_USERID_IN_SET);
-DISC_AUTH_ATTR(userid_mutual, S_IRUGO | S_IWUSR);
-/*
- * Mutual authentication password
- */
-DEF_DISC_AUTH_STR(password_mutual, NAF_PASSWORD_IN_SET);
-DISC_AUTH_ATTR(password_mutual, S_IRUGO | S_IWUSR);
 
-/*
- * enforce_discovery_auth
- */
-static ssize_t iscsi_disc_show_enforce_discovery_auth(
-       struct target_fabric_configfs *tf,
-       char *page)
+
+static ssize_t iscsi_disc_enforce_discovery_auth_show(struct config_item *item,
+               char *page)
 {
        struct iscsi_node_auth *discovery_auth = &iscsit_global->discovery_acl.node_auth;
 
        return sprintf(page, "%d\n", discovery_auth->enforce_discovery_auth);
 }
 
-static ssize_t iscsi_disc_store_enforce_discovery_auth(
-       struct target_fabric_configfs *tf,
-       const char *page,
-       size_t count)
+static ssize_t iscsi_disc_enforce_discovery_auth_store(struct config_item *item,
+               const char *page, size_t count)
 {
        struct iscsi_param *param;
        struct iscsi_portal_group *discovery_tpg = iscsit_global->discovery_tpg;
@@ -1677,15 +1428,15 @@ static ssize_t iscsi_disc_store_enforce_discovery_auth(
        return count;
 }
 
-DISC_AUTH_ATTR(enforce_discovery_auth, S_IRUGO | S_IWUSR);
+CONFIGFS_ATTR(iscsi_disc_, enforce_discovery_auth);
 
 static struct configfs_attribute *lio_target_discovery_auth_attrs[] = {
-       &iscsi_disc_userid.attr,
-       &iscsi_disc_password.attr,
-       &iscsi_disc_authenticate_target.attr,
-       &iscsi_disc_userid_mutual.attr,
-       &iscsi_disc_password_mutual.attr,
-       &iscsi_disc_enforce_discovery_auth.attr,
+       &iscsi_disc_attr_userid,
+       &iscsi_disc_attr_password,
+       &iscsi_disc_attr_authenticate_target,
+       &iscsi_disc_attr_userid_mutual,
+       &iscsi_disc_attr_password_mutual,
+       &iscsi_disc_attr_enforce_discovery_auth,
        NULL,
 };
 
index 9dd94ff0b62c0e53e39dbd3685ce1e3dc272cb1b..411cb266a47d5c39bd7df5ec4b705bce68ef0ca2 100644 (file)
@@ -21,7 +21,6 @@
 #include <linux/export.h>
 #include <scsi/iscsi_proto.h>
 #include <target/target_core_base.h>
-#include <target/configfs_macros.h>
 
 #include <target/iscsi/iscsi_target_core.h>
 #include "iscsi_target_parameters.h"
 /*
  * Instance Attributes Table
  */
-CONFIGFS_EATTR_STRUCT(iscsi_stat_instance, iscsi_wwn_stat_grps);
-#define ISCSI_STAT_INSTANCE_ATTR(_name, _mode)                 \
-static struct iscsi_stat_instance_attribute                    \
-                       iscsi_stat_instance_##_name =           \
-       __CONFIGFS_EATTR(_name, _mode,                          \
-       iscsi_stat_instance_show_attr_##_name,                  \
-       iscsi_stat_instance_store_attr_##_name);
-
-#define ISCSI_STAT_INSTANCE_ATTR_RO(_name)                     \
-static struct iscsi_stat_instance_attribute                    \
-                       iscsi_stat_instance_##_name =           \
-       __CONFIGFS_EATTR_RO(_name,                              \
-       iscsi_stat_instance_show_attr_##_name);
-
-static ssize_t iscsi_stat_instance_show_attr_inst(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
-{
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                               struct iscsi_tiqn, tiqn_stat_grps);
+static struct iscsi_tiqn *iscsi_instance_tiqn(struct config_item *item)
+{
+       struct iscsi_wwn_stat_grps *igrps = container_of(to_config_group(item),
+                       struct iscsi_wwn_stat_grps, iscsi_instance_group);
+       return container_of(igrps, struct iscsi_tiqn, tiqn_stat_grps);
+}
 
-       return snprintf(page, PAGE_SIZE, "%u\n", tiqn->tiqn_index);
+static ssize_t iscsi_stat_instance_inst_show(struct config_item *item,
+               char *page)
+{
+       return snprintf(page, PAGE_SIZE, "%u\n",
+                       iscsi_instance_tiqn(item)->tiqn_index);
 }
-ISCSI_STAT_INSTANCE_ATTR_RO(inst);
 
-static ssize_t iscsi_stat_instance_show_attr_min_ver(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_instance_min_ver_show(struct config_item *item,
+               char *page)
 {
        return snprintf(page, PAGE_SIZE, "%u\n", ISCSI_DRAFT20_VERSION);
 }
-ISCSI_STAT_INSTANCE_ATTR_RO(min_ver);
 
-static ssize_t iscsi_stat_instance_show_attr_max_ver(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_instance_max_ver_show(struct config_item *item,
+               char *page)
 {
        return snprintf(page, PAGE_SIZE, "%u\n", ISCSI_DRAFT20_VERSION);
 }
-ISCSI_STAT_INSTANCE_ATTR_RO(max_ver);
 
-static ssize_t iscsi_stat_instance_show_attr_portals(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_instance_portals_show(struct config_item *item,
+               char *page)
 {
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                               struct iscsi_tiqn, tiqn_stat_grps);
-
-       return snprintf(page, PAGE_SIZE, "%u\n", tiqn->tiqn_num_tpg_nps);
+       return snprintf(page, PAGE_SIZE, "%u\n",
+                       iscsi_instance_tiqn(item)->tiqn_num_tpg_nps);
 }
-ISCSI_STAT_INSTANCE_ATTR_RO(portals);
 
-static ssize_t iscsi_stat_instance_show_attr_nodes(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_instance_nodes_show(struct config_item *item,
+               char *page)
 {
        return snprintf(page, PAGE_SIZE, "%u\n", ISCSI_INST_NUM_NODES);
 }
-ISCSI_STAT_INSTANCE_ATTR_RO(nodes);
 
-static ssize_t iscsi_stat_instance_show_attr_sessions(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_instance_sessions_show(struct config_item *item,
+               char *page)
 {
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                               struct iscsi_tiqn, tiqn_stat_grps);
-
-       return snprintf(page, PAGE_SIZE, "%u\n", tiqn->tiqn_nsessions);
+       return snprintf(page, PAGE_SIZE, "%u\n",
+               iscsi_instance_tiqn(item)->tiqn_nsessions);
 }
-ISCSI_STAT_INSTANCE_ATTR_RO(sessions);
 
-static ssize_t iscsi_stat_instance_show_attr_fail_sess(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_instance_fail_sess_show(struct config_item *item,
+               char *page)
 {
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                               struct iscsi_tiqn, tiqn_stat_grps);
+       struct iscsi_tiqn *tiqn = iscsi_instance_tiqn(item);
        struct iscsi_sess_err_stats *sess_err = &tiqn->sess_err_stats;
        u32 sess_err_count;
 
@@ -131,88 +110,84 @@ static ssize_t iscsi_stat_instance_show_attr_fail_sess(
 
        return snprintf(page, PAGE_SIZE, "%u\n", sess_err_count);
 }
-ISCSI_STAT_INSTANCE_ATTR_RO(fail_sess);
 
-static ssize_t iscsi_stat_instance_show_attr_fail_type(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_instance_fail_type_show(struct config_item *item,
+               char *page)
 {
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                               struct iscsi_tiqn, tiqn_stat_grps);
+       struct iscsi_tiqn *tiqn = iscsi_instance_tiqn(item);
        struct iscsi_sess_err_stats *sess_err = &tiqn->sess_err_stats;
 
        return snprintf(page, PAGE_SIZE, "%u\n",
                        sess_err->last_sess_failure_type);
 }
-ISCSI_STAT_INSTANCE_ATTR_RO(fail_type);
 
-static ssize_t iscsi_stat_instance_show_attr_fail_rem_name(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_instance_fail_rem_name_show(struct config_item *item,
+               char *page)
 {
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                               struct iscsi_tiqn, tiqn_stat_grps);
+       struct iscsi_tiqn *tiqn = iscsi_instance_tiqn(item);
        struct iscsi_sess_err_stats *sess_err = &tiqn->sess_err_stats;
 
        return snprintf(page, PAGE_SIZE, "%s\n",
                        sess_err->last_sess_fail_rem_name[0] ?
                        sess_err->last_sess_fail_rem_name : NONE);
 }
-ISCSI_STAT_INSTANCE_ATTR_RO(fail_rem_name);
 
-static ssize_t iscsi_stat_instance_show_attr_disc_time(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_instance_disc_time_show(struct config_item *item,
+               char *page)
 {
        return snprintf(page, PAGE_SIZE, "%u\n", ISCSI_DISCONTINUITY_TIME);
 }
-ISCSI_STAT_INSTANCE_ATTR_RO(disc_time);
 
-static ssize_t iscsi_stat_instance_show_attr_description(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_instance_description_show(struct config_item *item,
+               char *page)
 {
        return snprintf(page, PAGE_SIZE, "%s\n", ISCSI_INST_DESCR);
 }
-ISCSI_STAT_INSTANCE_ATTR_RO(description);
 
-static ssize_t iscsi_stat_instance_show_attr_vendor(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_instance_vendor_show(struct config_item *item,
+               char *page)
 {
        return snprintf(page, PAGE_SIZE, "Datera, Inc. iSCSI-Target\n");
 }
-ISCSI_STAT_INSTANCE_ATTR_RO(vendor);
 
-static ssize_t iscsi_stat_instance_show_attr_version(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_instance_version_show(struct config_item *item,
+               char *page)
 {
        return snprintf(page, PAGE_SIZE, "%s\n", ISCSIT_VERSION);
 }
-ISCSI_STAT_INSTANCE_ATTR_RO(version);
 
-CONFIGFS_EATTR_OPS(iscsi_stat_instance, iscsi_wwn_stat_grps,
-               iscsi_instance_group);
+CONFIGFS_ATTR_RO(iscsi_stat_instance_, inst);
+CONFIGFS_ATTR_RO(iscsi_stat_instance_, min_ver);
+CONFIGFS_ATTR_RO(iscsi_stat_instance_, max_ver);
+CONFIGFS_ATTR_RO(iscsi_stat_instance_, portals);
+CONFIGFS_ATTR_RO(iscsi_stat_instance_, nodes);
+CONFIGFS_ATTR_RO(iscsi_stat_instance_, sessions);
+CONFIGFS_ATTR_RO(iscsi_stat_instance_, fail_sess);
+CONFIGFS_ATTR_RO(iscsi_stat_instance_, fail_type);
+CONFIGFS_ATTR_RO(iscsi_stat_instance_, fail_rem_name);
+CONFIGFS_ATTR_RO(iscsi_stat_instance_, disc_time);
+CONFIGFS_ATTR_RO(iscsi_stat_instance_, description);
+CONFIGFS_ATTR_RO(iscsi_stat_instance_, vendor);
+CONFIGFS_ATTR_RO(iscsi_stat_instance_, version);
 
 static struct configfs_attribute *iscsi_stat_instance_attrs[] = {
-       &iscsi_stat_instance_inst.attr,
-       &iscsi_stat_instance_min_ver.attr,
-       &iscsi_stat_instance_max_ver.attr,
-       &iscsi_stat_instance_portals.attr,
-       &iscsi_stat_instance_nodes.attr,
-       &iscsi_stat_instance_sessions.attr,
-       &iscsi_stat_instance_fail_sess.attr,
-       &iscsi_stat_instance_fail_type.attr,
-       &iscsi_stat_instance_fail_rem_name.attr,
-       &iscsi_stat_instance_disc_time.attr,
-       &iscsi_stat_instance_description.attr,
-       &iscsi_stat_instance_vendor.attr,
-       &iscsi_stat_instance_version.attr,
+       &iscsi_stat_instance_attr_inst,
+       &iscsi_stat_instance_attr_min_ver,
+       &iscsi_stat_instance_attr_max_ver,
+       &iscsi_stat_instance_attr_portals,
+       &iscsi_stat_instance_attr_nodes,
+       &iscsi_stat_instance_attr_sessions,
+       &iscsi_stat_instance_attr_fail_sess,
+       &iscsi_stat_instance_attr_fail_type,
+       &iscsi_stat_instance_attr_fail_rem_name,
+       &iscsi_stat_instance_attr_disc_time,
+       &iscsi_stat_instance_attr_description,
+       &iscsi_stat_instance_attr_vendor,
+       &iscsi_stat_instance_attr_version,
        NULL,
 };
 
-static struct configfs_item_operations iscsi_stat_instance_item_ops = {
-       .show_attribute         = iscsi_stat_instance_attr_show,
-       .store_attribute        = iscsi_stat_instance_attr_store,
-};
-
 struct config_item_type iscsi_stat_instance_cit = {
-       .ct_item_ops            = &iscsi_stat_instance_item_ops,
        .ct_attrs               = iscsi_stat_instance_attrs,
        .ct_owner               = THIS_MODULE,
 };
@@ -220,81 +195,61 @@ struct config_item_type iscsi_stat_instance_cit = {
 /*
  * Instance Session Failure Stats Table
  */
-CONFIGFS_EATTR_STRUCT(iscsi_stat_sess_err, iscsi_wwn_stat_grps);
-#define ISCSI_STAT_SESS_ERR_ATTR(_name, _mode)                 \
-static struct iscsi_stat_sess_err_attribute                    \
-                       iscsi_stat_sess_err_##_name =           \
-       __CONFIGFS_EATTR(_name, _mode,                          \
-       iscsi_stat_sess_err_show_attr_##_name,                  \
-       iscsi_stat_sess_err_store_attr_##_name);
-
-#define ISCSI_STAT_SESS_ERR_ATTR_RO(_name)                     \
-static struct iscsi_stat_sess_err_attribute                    \
-                       iscsi_stat_sess_err_##_name =           \
-       __CONFIGFS_EATTR_RO(_name,                              \
-       iscsi_stat_sess_err_show_attr_##_name);
-
-static ssize_t iscsi_stat_sess_err_show_attr_inst(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
-{
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                               struct iscsi_tiqn, tiqn_stat_grps);
+static struct iscsi_tiqn *iscsi_sess_err_tiqn(struct config_item *item)
+{
+       struct iscsi_wwn_stat_grps *igrps = container_of(to_config_group(item),
+                       struct iscsi_wwn_stat_grps, iscsi_sess_err_group);
+       return container_of(igrps, struct iscsi_tiqn, tiqn_stat_grps);
+}
 
-       return snprintf(page, PAGE_SIZE, "%u\n", tiqn->tiqn_index);
+static ssize_t iscsi_stat_sess_err_inst_show(struct config_item *item,
+               char *page)
+{
+       return snprintf(page, PAGE_SIZE, "%u\n",
+               iscsi_sess_err_tiqn(item)->tiqn_index);
 }
-ISCSI_STAT_SESS_ERR_ATTR_RO(inst);
 
-static ssize_t iscsi_stat_sess_err_show_attr_digest_errors(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_sess_err_digest_errors_show(struct config_item *item,
+               char *page)
 {
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                               struct iscsi_tiqn, tiqn_stat_grps);
+       struct iscsi_tiqn *tiqn = iscsi_sess_err_tiqn(item);
        struct iscsi_sess_err_stats *sess_err = &tiqn->sess_err_stats;
 
        return snprintf(page, PAGE_SIZE, "%u\n", sess_err->digest_errors);
 }
-ISCSI_STAT_SESS_ERR_ATTR_RO(digest_errors);
 
-static ssize_t iscsi_stat_sess_err_show_attr_cxn_errors(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_sess_err_cxn_errors_show(struct config_item *item,
+               char *page)
 {
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                               struct iscsi_tiqn, tiqn_stat_grps);
+       struct iscsi_tiqn *tiqn = iscsi_sess_err_tiqn(item);
        struct iscsi_sess_err_stats *sess_err = &tiqn->sess_err_stats;
 
        return snprintf(page, PAGE_SIZE, "%u\n", sess_err->cxn_timeout_errors);
 }
-ISCSI_STAT_SESS_ERR_ATTR_RO(cxn_errors);
 
-static ssize_t iscsi_stat_sess_err_show_attr_format_errors(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_sess_err_format_errors_show(struct config_item *item,
+               char *page)
 {
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                               struct iscsi_tiqn, tiqn_stat_grps);
+       struct iscsi_tiqn *tiqn = iscsi_sess_err_tiqn(item);
        struct iscsi_sess_err_stats *sess_err = &tiqn->sess_err_stats;
 
        return snprintf(page, PAGE_SIZE, "%u\n", sess_err->pdu_format_errors);
 }
-ISCSI_STAT_SESS_ERR_ATTR_RO(format_errors);
 
-CONFIGFS_EATTR_OPS(iscsi_stat_sess_err, iscsi_wwn_stat_grps,
-               iscsi_sess_err_group);
+CONFIGFS_ATTR_RO(iscsi_stat_sess_err_, inst);
+CONFIGFS_ATTR_RO(iscsi_stat_sess_err_, digest_errors);
+CONFIGFS_ATTR_RO(iscsi_stat_sess_err_, cxn_errors);
+CONFIGFS_ATTR_RO(iscsi_stat_sess_err_, format_errors);
 
 static struct configfs_attribute *iscsi_stat_sess_err_attrs[] = {
-       &iscsi_stat_sess_err_inst.attr,
-       &iscsi_stat_sess_err_digest_errors.attr,
-       &iscsi_stat_sess_err_cxn_errors.attr,
-       &iscsi_stat_sess_err_format_errors.attr,
+       &iscsi_stat_sess_err_attr_inst,
+       &iscsi_stat_sess_err_attr_digest_errors,
+       &iscsi_stat_sess_err_attr_cxn_errors,
+       &iscsi_stat_sess_err_attr_format_errors,
        NULL,
 };
 
-static struct configfs_item_operations iscsi_stat_sess_err_item_ops = {
-       .show_attribute         = iscsi_stat_sess_err_attr_show,
-       .store_attribute        = iscsi_stat_sess_err_attr_store,
-};
-
 struct config_item_type iscsi_stat_sess_err_cit = {
-       .ct_item_ops            = &iscsi_stat_sess_err_item_ops,
        .ct_attrs               = iscsi_stat_sess_err_attrs,
        .ct_owner               = THIS_MODULE,
 };
@@ -302,42 +257,30 @@ struct config_item_type iscsi_stat_sess_err_cit = {
 /*
  * Target Attributes Table
  */
-CONFIGFS_EATTR_STRUCT(iscsi_stat_tgt_attr, iscsi_wwn_stat_grps);
-#define ISCSI_STAT_TGT_ATTR(_name, _mode)                      \
-static struct iscsi_stat_tgt_attr_attribute                    \
-                       iscsi_stat_tgt_attr_##_name =           \
-       __CONFIGFS_EATTR(_name, _mode,                          \
-       iscsi_stat_tgt-attr_show_attr_##_name,                  \
-       iscsi_stat_tgt_attr_store_attr_##_name);
-
-#define ISCSI_STAT_TGT_ATTR_RO(_name)                          \
-static struct iscsi_stat_tgt_attr_attribute                    \
-                       iscsi_stat_tgt_attr_##_name =           \
-       __CONFIGFS_EATTR_RO(_name,                              \
-       iscsi_stat_tgt_attr_show_attr_##_name);
-
-static ssize_t iscsi_stat_tgt_attr_show_attr_inst(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
-{
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                               struct iscsi_tiqn, tiqn_stat_grps);
+static struct iscsi_tiqn *iscsi_tgt_attr_tiqn(struct config_item *item)
+{
+       struct iscsi_wwn_stat_grps *igrps = container_of(to_config_group(item),
+                       struct iscsi_wwn_stat_grps, iscsi_tgt_attr_group);
+       return container_of(igrps, struct iscsi_tiqn, tiqn_stat_grps);
+}
 
-       return snprintf(page, PAGE_SIZE, "%u\n", tiqn->tiqn_index);
+static ssize_t iscsi_stat_tgt_attr_inst_show(struct config_item *item,
+               char *page)
+{
+       return snprintf(page, PAGE_SIZE, "%u\n",
+                       iscsi_tgt_attr_tiqn(item)->tiqn_index);
 }
-ISCSI_STAT_TGT_ATTR_RO(inst);
 
-static ssize_t iscsi_stat_tgt_attr_show_attr_indx(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_tgt_attr_indx_show(struct config_item *item,
+               char *page)
 {
        return snprintf(page, PAGE_SIZE, "%u\n", ISCSI_NODE_INDEX);
 }
-ISCSI_STAT_TGT_ATTR_RO(indx);
 
-static ssize_t iscsi_stat_tgt_attr_show_attr_login_fails(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_tgt_attr_login_fails_show(struct config_item *item,
+               char *page)
 {
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                               struct iscsi_tiqn, tiqn_stat_grps);
+       struct iscsi_tiqn *tiqn = iscsi_tgt_attr_tiqn(item);
        struct iscsi_login_stats *lstat = &tiqn->login_stats;
        u32 fail_count;
 
@@ -349,13 +292,11 @@ static ssize_t iscsi_stat_tgt_attr_show_attr_login_fails(
 
        return snprintf(page, PAGE_SIZE, "%u\n", fail_count);
 }
-ISCSI_STAT_TGT_ATTR_RO(login_fails);
 
-static ssize_t iscsi_stat_tgt_attr_show_attr_last_fail_time(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_tgt_attr_last_fail_time_show(struct config_item *item,
+               char *page)
 {
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                               struct iscsi_tiqn, tiqn_stat_grps);
+       struct iscsi_tiqn *tiqn = iscsi_tgt_attr_tiqn(item);
        struct iscsi_login_stats *lstat = &tiqn->login_stats;
        u32 last_fail_time;
 
@@ -367,13 +308,11 @@ static ssize_t iscsi_stat_tgt_attr_show_attr_last_fail_time(
 
        return snprintf(page, PAGE_SIZE, "%u\n", last_fail_time);
 }
-ISCSI_STAT_TGT_ATTR_RO(last_fail_time);
 
-static ssize_t iscsi_stat_tgt_attr_show_attr_last_fail_type(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_tgt_attr_last_fail_type_show(struct config_item *item,
+               char *page)
 {
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                               struct iscsi_tiqn, tiqn_stat_grps);
+       struct iscsi_tiqn *tiqn = iscsi_tgt_attr_tiqn(item);
        struct iscsi_login_stats *lstat = &tiqn->login_stats;
        u32 last_fail_type;
 
@@ -383,13 +322,11 @@ static ssize_t iscsi_stat_tgt_attr_show_attr_last_fail_type(
 
        return snprintf(page, PAGE_SIZE, "%u\n", last_fail_type);
 }
-ISCSI_STAT_TGT_ATTR_RO(last_fail_type);
 
-static ssize_t iscsi_stat_tgt_attr_show_attr_fail_intr_name(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_tgt_attr_fail_intr_name_show(struct config_item *item,
+               char *page)
 {
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                               struct iscsi_tiqn, tiqn_stat_grps);
+       struct iscsi_tiqn *tiqn = iscsi_tgt_attr_tiqn(item);
        struct iscsi_login_stats *lstat = &tiqn->login_stats;
        unsigned char buf[224];
 
@@ -400,13 +337,11 @@ static ssize_t iscsi_stat_tgt_attr_show_attr_fail_intr_name(
 
        return snprintf(page, PAGE_SIZE, "%s\n", buf);
 }
-ISCSI_STAT_TGT_ATTR_RO(fail_intr_name);
 
-static ssize_t iscsi_stat_tgt_attr_show_attr_fail_intr_addr_type(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_tgt_attr_fail_intr_addr_type_show(struct config_item *item,
+               char *page)
 {
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                       struct iscsi_tiqn, tiqn_stat_grps);
+       struct iscsi_tiqn *tiqn = iscsi_tgt_attr_tiqn(item);
        struct iscsi_login_stats *lstat = &tiqn->login_stats;
        int ret;
 
@@ -419,13 +354,11 @@ static ssize_t iscsi_stat_tgt_attr_show_attr_fail_intr_addr_type(
 
        return ret;
 }
-ISCSI_STAT_TGT_ATTR_RO(fail_intr_addr_type);
 
-static ssize_t iscsi_stat_tgt_attr_show_attr_fail_intr_addr(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_tgt_attr_fail_intr_addr_show(struct config_item *item,
+               char *page)
 {
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                       struct iscsi_tiqn, tiqn_stat_grps);
+       struct iscsi_tiqn *tiqn = iscsi_tgt_attr_tiqn(item);
        struct iscsi_login_stats *lstat = &tiqn->login_stats;
        int ret;
 
@@ -435,30 +368,29 @@ static ssize_t iscsi_stat_tgt_attr_show_attr_fail_intr_addr(
 
        return ret;
 }
-ISCSI_STAT_TGT_ATTR_RO(fail_intr_addr);
 
-CONFIGFS_EATTR_OPS(iscsi_stat_tgt_attr, iscsi_wwn_stat_grps,
-               iscsi_tgt_attr_group);
+CONFIGFS_ATTR_RO(iscsi_stat_tgt_attr_, inst);
+CONFIGFS_ATTR_RO(iscsi_stat_tgt_attr_, indx);
+CONFIGFS_ATTR_RO(iscsi_stat_tgt_attr_, login_fails);
+CONFIGFS_ATTR_RO(iscsi_stat_tgt_attr_, last_fail_time);
+CONFIGFS_ATTR_RO(iscsi_stat_tgt_attr_, last_fail_type);
+CONFIGFS_ATTR_RO(iscsi_stat_tgt_attr_, fail_intr_name);
+CONFIGFS_ATTR_RO(iscsi_stat_tgt_attr_, fail_intr_addr_type);
+CONFIGFS_ATTR_RO(iscsi_stat_tgt_attr_, fail_intr_addr);
 
 static struct configfs_attribute *iscsi_stat_tgt_attr_attrs[] = {
-       &iscsi_stat_tgt_attr_inst.attr,
-       &iscsi_stat_tgt_attr_indx.attr,
-       &iscsi_stat_tgt_attr_login_fails.attr,
-       &iscsi_stat_tgt_attr_last_fail_time.attr,
-       &iscsi_stat_tgt_attr_last_fail_type.attr,
-       &iscsi_stat_tgt_attr_fail_intr_name.attr,
-       &iscsi_stat_tgt_attr_fail_intr_addr_type.attr,
-       &iscsi_stat_tgt_attr_fail_intr_addr.attr,
+       &iscsi_stat_tgt_attr_attr_inst,
+       &iscsi_stat_tgt_attr_attr_indx,
+       &iscsi_stat_tgt_attr_attr_login_fails,
+       &iscsi_stat_tgt_attr_attr_last_fail_time,
+       &iscsi_stat_tgt_attr_attr_last_fail_type,
+       &iscsi_stat_tgt_attr_attr_fail_intr_name,
+       &iscsi_stat_tgt_attr_attr_fail_intr_addr_type,
+       &iscsi_stat_tgt_attr_attr_fail_intr_addr,
        NULL,
 };
 
-static struct configfs_item_operations iscsi_stat_tgt_attr_item_ops = {
-       .show_attribute         = iscsi_stat_tgt_attr_attr_show,
-       .store_attribute        = iscsi_stat_tgt_attr_attr_store,
-};
-
 struct config_item_type iscsi_stat_tgt_attr_cit = {
-       .ct_item_ops            = &iscsi_stat_tgt_attr_item_ops,
        .ct_attrs               = iscsi_stat_tgt_attr_attrs,
        .ct_owner               = THIS_MODULE,
 };
@@ -466,42 +398,29 @@ struct config_item_type iscsi_stat_tgt_attr_cit = {
 /*
  * Target Login Stats Table
  */
-CONFIGFS_EATTR_STRUCT(iscsi_stat_login, iscsi_wwn_stat_grps);
-#define ISCSI_STAT_LOGIN(_name, _mode)                         \
-static struct iscsi_stat_login_attribute                       \
-                       iscsi_stat_login_##_name =              \
-       __CONFIGFS_EATTR(_name, _mode,                          \
-       iscsi_stat_login_show_attr_##_name,                     \
-       iscsi_stat_login_store_attr_##_name);
-
-#define ISCSI_STAT_LOGIN_RO(_name)                             \
-static struct iscsi_stat_login_attribute                       \
-                       iscsi_stat_login_##_name =              \
-       __CONFIGFS_EATTR_RO(_name,                              \
-       iscsi_stat_login_show_attr_##_name);
-
-static ssize_t iscsi_stat_login_show_attr_inst(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
-{
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                               struct iscsi_tiqn, tiqn_stat_grps);
+static struct iscsi_tiqn *iscsi_login_stat_tiqn(struct config_item *item)
+{
+       struct iscsi_wwn_stat_grps *igrps = container_of(to_config_group(item),
+                       struct iscsi_wwn_stat_grps, iscsi_login_stats_group);
+       return container_of(igrps, struct iscsi_tiqn, tiqn_stat_grps);
+}
 
-       return snprintf(page, PAGE_SIZE, "%u\n", tiqn->tiqn_index);
+static ssize_t iscsi_stat_login_inst_show(struct config_item *item, char *page)
+{
+       return snprintf(page, PAGE_SIZE, "%u\n",
+               iscsi_login_stat_tiqn(item)->tiqn_index);
 }
-ISCSI_STAT_LOGIN_RO(inst);
 
-static ssize_t iscsi_stat_login_show_attr_indx(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_login_indx_show(struct config_item *item,
+               char *page)
 {
        return snprintf(page, PAGE_SIZE, "%u\n", ISCSI_NODE_INDEX);
 }
-ISCSI_STAT_LOGIN_RO(indx);
 
-static ssize_t iscsi_stat_login_show_attr_accepts(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_login_accepts_show(struct config_item *item,
+               char *page)
 {
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                               struct iscsi_tiqn, tiqn_stat_grps);
+       struct iscsi_tiqn *tiqn = iscsi_login_stat_tiqn(item);
        struct iscsi_login_stats *lstat = &tiqn->login_stats;
        ssize_t ret;
 
@@ -511,13 +430,11 @@ static ssize_t iscsi_stat_login_show_attr_accepts(
 
        return ret;
 }
-ISCSI_STAT_LOGIN_RO(accepts);
 
-static ssize_t iscsi_stat_login_show_attr_other_fails(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_login_other_fails_show(struct config_item *item,
+               char *page)
 {
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                               struct iscsi_tiqn, tiqn_stat_grps);
+       struct iscsi_tiqn *tiqn = iscsi_login_stat_tiqn(item);
        struct iscsi_login_stats *lstat = &tiqn->login_stats;
        ssize_t ret;
 
@@ -527,13 +444,11 @@ static ssize_t iscsi_stat_login_show_attr_other_fails(
 
        return ret;
 }
-ISCSI_STAT_LOGIN_RO(other_fails);
 
-static ssize_t iscsi_stat_login_show_attr_redirects(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_login_redirects_show(struct config_item *item,
+               char *page)
 {
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                               struct iscsi_tiqn, tiqn_stat_grps);
+       struct iscsi_tiqn *tiqn = iscsi_login_stat_tiqn(item);
        struct iscsi_login_stats *lstat = &tiqn->login_stats;
        ssize_t ret;
 
@@ -543,13 +458,11 @@ static ssize_t iscsi_stat_login_show_attr_redirects(
 
        return ret;
 }
-ISCSI_STAT_LOGIN_RO(redirects);
 
-static ssize_t iscsi_stat_login_show_attr_authorize_fails(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_login_authorize_fails_show(struct config_item *item,
+               char *page)
 {
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                               struct iscsi_tiqn, tiqn_stat_grps);
+       struct iscsi_tiqn *tiqn = iscsi_login_stat_tiqn(item);
        struct iscsi_login_stats *lstat = &tiqn->login_stats;
        ssize_t ret;
 
@@ -559,13 +472,11 @@ static ssize_t iscsi_stat_login_show_attr_authorize_fails(
 
        return ret;
 }
-ISCSI_STAT_LOGIN_RO(authorize_fails);
 
-static ssize_t iscsi_stat_login_show_attr_authenticate_fails(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_login_authenticate_fails_show(
+               struct config_item *item, char *page)
 {
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                               struct iscsi_tiqn, tiqn_stat_grps);
+       struct iscsi_tiqn *tiqn = iscsi_login_stat_tiqn(item);
        struct iscsi_login_stats *lstat = &tiqn->login_stats;
        ssize_t ret;
 
@@ -575,13 +486,11 @@ static ssize_t iscsi_stat_login_show_attr_authenticate_fails(
 
        return ret;
 }
-ISCSI_STAT_LOGIN_RO(authenticate_fails);
 
-static ssize_t iscsi_stat_login_show_attr_negotiate_fails(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_login_negotiate_fails_show(struct config_item *item,
+               char *page)
 {
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                               struct iscsi_tiqn, tiqn_stat_grps);
+       struct iscsi_tiqn *tiqn = iscsi_login_stat_tiqn(item);
        struct iscsi_login_stats *lstat = &tiqn->login_stats;
        ssize_t ret;
 
@@ -591,30 +500,29 @@ static ssize_t iscsi_stat_login_show_attr_negotiate_fails(
 
        return ret;
 }
-ISCSI_STAT_LOGIN_RO(negotiate_fails);
 
-CONFIGFS_EATTR_OPS(iscsi_stat_login, iscsi_wwn_stat_grps,
-               iscsi_login_stats_group);
+CONFIGFS_ATTR_RO(iscsi_stat_login_, inst);
+CONFIGFS_ATTR_RO(iscsi_stat_login_, indx);
+CONFIGFS_ATTR_RO(iscsi_stat_login_, accepts);
+CONFIGFS_ATTR_RO(iscsi_stat_login_, other_fails);
+CONFIGFS_ATTR_RO(iscsi_stat_login_, redirects);
+CONFIGFS_ATTR_RO(iscsi_stat_login_, authorize_fails);
+CONFIGFS_ATTR_RO(iscsi_stat_login_, authenticate_fails);
+CONFIGFS_ATTR_RO(iscsi_stat_login_, negotiate_fails);
 
 static struct configfs_attribute *iscsi_stat_login_stats_attrs[] = {
-       &iscsi_stat_login_inst.attr,
-       &iscsi_stat_login_indx.attr,
-       &iscsi_stat_login_accepts.attr,
-       &iscsi_stat_login_other_fails.attr,
-       &iscsi_stat_login_redirects.attr,
-       &iscsi_stat_login_authorize_fails.attr,
-       &iscsi_stat_login_authenticate_fails.attr,
-       &iscsi_stat_login_negotiate_fails.attr,
+       &iscsi_stat_login_attr_inst,
+       &iscsi_stat_login_attr_indx,
+       &iscsi_stat_login_attr_accepts,
+       &iscsi_stat_login_attr_other_fails,
+       &iscsi_stat_login_attr_redirects,
+       &iscsi_stat_login_attr_authorize_fails,
+       &iscsi_stat_login_attr_authenticate_fails,
+       &iscsi_stat_login_attr_negotiate_fails,
        NULL,
 };
 
-static struct configfs_item_operations iscsi_stat_login_stats_item_ops = {
-       .show_attribute         = iscsi_stat_login_attr_show,
-       .store_attribute        = iscsi_stat_login_attr_store,
-};
-
 struct config_item_type iscsi_stat_login_cit = {
-       .ct_item_ops            = &iscsi_stat_login_stats_item_ops,
        .ct_attrs               = iscsi_stat_login_stats_attrs,
        .ct_owner               = THIS_MODULE,
 };
@@ -622,78 +530,56 @@ struct config_item_type iscsi_stat_login_cit = {
 /*
  * Target Logout Stats Table
  */
-
-CONFIGFS_EATTR_STRUCT(iscsi_stat_logout, iscsi_wwn_stat_grps);
-#define ISCSI_STAT_LOGOUT(_name, _mode)                                \
-static struct iscsi_stat_logout_attribute                      \
-                       iscsi_stat_logout_##_name =             \
-       __CONFIGFS_EATTR(_name, _mode,                          \
-       iscsi_stat_logout_show_attr_##_name,                    \
-       iscsi_stat_logout_store_attr_##_name);
-
-#define ISCSI_STAT_LOGOUT_RO(_name)                            \
-static struct iscsi_stat_logout_attribute                      \
-                       iscsi_stat_logout_##_name =             \
-       __CONFIGFS_EATTR_RO(_name,                              \
-       iscsi_stat_logout_show_attr_##_name);
-
-static ssize_t iscsi_stat_logout_show_attr_inst(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static struct iscsi_tiqn *iscsi_logout_stat_tiqn(struct config_item *item)
 {
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                       struct iscsi_tiqn, tiqn_stat_grps);
+       struct iscsi_wwn_stat_grps *igrps = container_of(to_config_group(item),
+                       struct iscsi_wwn_stat_grps, iscsi_logout_stats_group);
+       return container_of(igrps, struct iscsi_tiqn, tiqn_stat_grps);
+}
 
-       return snprintf(page, PAGE_SIZE, "%u\n", tiqn->tiqn_index);
+static ssize_t iscsi_stat_logout_inst_show(struct config_item *item, char *page)
+{
+       return snprintf(page, PAGE_SIZE, "%u\n",
+               iscsi_logout_stat_tiqn(item)->tiqn_index);
 }
-ISCSI_STAT_LOGOUT_RO(inst);
 
-static ssize_t iscsi_stat_logout_show_attr_indx(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_logout_indx_show(struct config_item *item, char *page)
 {
        return snprintf(page, PAGE_SIZE, "%u\n", ISCSI_NODE_INDEX);
 }
-ISCSI_STAT_LOGOUT_RO(indx);
 
-static ssize_t iscsi_stat_logout_show_attr_normal_logouts(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_logout_normal_logouts_show(struct config_item *item,
+               char *page)
 {
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                       struct iscsi_tiqn, tiqn_stat_grps);
+       struct iscsi_tiqn *tiqn = iscsi_logout_stat_tiqn(item);
        struct iscsi_logout_stats *lstats = &tiqn->logout_stats;
 
        return snprintf(page, PAGE_SIZE, "%u\n", lstats->normal_logouts);
 }
-ISCSI_STAT_LOGOUT_RO(normal_logouts);
 
-static ssize_t iscsi_stat_logout_show_attr_abnormal_logouts(
-       struct iscsi_wwn_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_logout_abnormal_logouts_show(struct config_item *item,
+               char *page)
 {
-       struct iscsi_tiqn *tiqn = container_of(igrps,
-                       struct iscsi_tiqn, tiqn_stat_grps);
+       struct iscsi_tiqn *tiqn = iscsi_logout_stat_tiqn(item);
        struct iscsi_logout_stats *lstats = &tiqn->logout_stats;
 
        return snprintf(page, PAGE_SIZE, "%u\n", lstats->abnormal_logouts);
 }
-ISCSI_STAT_LOGOUT_RO(abnormal_logouts);
 
-CONFIGFS_EATTR_OPS(iscsi_stat_logout, iscsi_wwn_stat_grps,
-               iscsi_logout_stats_group);
+CONFIGFS_ATTR_RO(iscsi_stat_logout_, inst);
+CONFIGFS_ATTR_RO(iscsi_stat_logout_, indx);
+CONFIGFS_ATTR_RO(iscsi_stat_logout_, normal_logouts);
+CONFIGFS_ATTR_RO(iscsi_stat_logout_, abnormal_logouts);
 
 static struct configfs_attribute *iscsi_stat_logout_stats_attrs[] = {
-       &iscsi_stat_logout_inst.attr,
-       &iscsi_stat_logout_indx.attr,
-       &iscsi_stat_logout_normal_logouts.attr,
-       &iscsi_stat_logout_abnormal_logouts.attr,
+       &iscsi_stat_logout_attr_inst,
+       &iscsi_stat_logout_attr_indx,
+       &iscsi_stat_logout_attr_normal_logouts,
+       &iscsi_stat_logout_attr_abnormal_logouts,
        NULL,
 };
 
-static struct configfs_item_operations iscsi_stat_logout_stats_item_ops = {
-       .show_attribute         = iscsi_stat_logout_attr_show,
-       .store_attribute        = iscsi_stat_logout_attr_store,
-};
-
 struct config_item_type iscsi_stat_logout_cit = {
-       .ct_item_ops            = &iscsi_stat_logout_stats_item_ops,
        .ct_attrs               = iscsi_stat_logout_stats_attrs,
        .ct_owner               = THIS_MODULE,
 };
@@ -701,39 +587,26 @@ struct config_item_type iscsi_stat_logout_cit = {
 /*
  * Session Stats Table
  */
+static struct iscsi_node_acl *iscsi_stat_nacl(struct config_item *item)
+{
+       struct iscsi_node_stat_grps *igrps = container_of(to_config_group(item),
+                       struct iscsi_node_stat_grps, iscsi_sess_stats_group);
+       return container_of(igrps, struct iscsi_node_acl, node_stat_grps);
+}
 
-CONFIGFS_EATTR_STRUCT(iscsi_stat_sess, iscsi_node_stat_grps);
-#define ISCSI_STAT_SESS(_name, _mode)                          \
-static struct iscsi_stat_sess_attribute                                \
-                       iscsi_stat_sess_##_name =               \
-       __CONFIGFS_EATTR(_name, _mode,                          \
-       iscsi_stat_sess_show_attr_##_name,                      \
-       iscsi_stat_sess_store_attr_##_name);
-
-#define ISCSI_STAT_SESS_RO(_name)                              \
-static struct iscsi_stat_sess_attribute                                \
-                       iscsi_stat_sess_##_name =               \
-       __CONFIGFS_EATTR_RO(_name,                              \
-       iscsi_stat_sess_show_attr_##_name);
-
-static ssize_t iscsi_stat_sess_show_attr_inst(
-       struct iscsi_node_stat_grps *igrps, char *page)
-{
-       struct iscsi_node_acl *acl = container_of(igrps,
-                       struct iscsi_node_acl, node_stat_grps);
+static ssize_t iscsi_stat_sess_inst_show(struct config_item *item, char *page)
+{
+       struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
        struct se_wwn *wwn = acl->se_node_acl.se_tpg->se_tpg_wwn;
        struct iscsi_tiqn *tiqn = container_of(wwn,
                        struct iscsi_tiqn, tiqn_wwn);
 
        return snprintf(page, PAGE_SIZE, "%u\n", tiqn->tiqn_index);
 }
-ISCSI_STAT_SESS_RO(inst);
 
-static ssize_t iscsi_stat_sess_show_attr_node(
-       struct iscsi_node_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_sess_node_show(struct config_item *item, char *page)
 {
-       struct iscsi_node_acl *acl = container_of(igrps,
-                       struct iscsi_node_acl, node_stat_grps);
+       struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
        struct se_node_acl *se_nacl = &acl->se_node_acl;
        struct iscsi_session *sess;
        struct se_session *se_sess;
@@ -751,13 +624,10 @@ static ssize_t iscsi_stat_sess_show_attr_node(
 
        return ret;
 }
-ISCSI_STAT_SESS_RO(node);
 
-static ssize_t iscsi_stat_sess_show_attr_indx(
-       struct iscsi_node_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_sess_indx_show(struct config_item *item, char *page)
 {
-       struct iscsi_node_acl *acl = container_of(igrps,
-                       struct iscsi_node_acl, node_stat_grps);
+       struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
        struct se_node_acl *se_nacl = &acl->se_node_acl;
        struct iscsi_session *sess;
        struct se_session *se_sess;
@@ -775,13 +645,11 @@ static ssize_t iscsi_stat_sess_show_attr_indx(
 
        return ret;
 }
-ISCSI_STAT_SESS_RO(indx);
 
-static ssize_t iscsi_stat_sess_show_attr_cmd_pdus(
-       struct iscsi_node_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_sess_cmd_pdus_show(struct config_item *item,
+               char *page)
 {
-       struct iscsi_node_acl *acl = container_of(igrps,
-                       struct iscsi_node_acl, node_stat_grps);
+       struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
        struct se_node_acl *se_nacl = &acl->se_node_acl;
        struct iscsi_session *sess;
        struct se_session *se_sess;
@@ -799,13 +667,11 @@ static ssize_t iscsi_stat_sess_show_attr_cmd_pdus(
 
        return ret;
 }
-ISCSI_STAT_SESS_RO(cmd_pdus);
 
-static ssize_t iscsi_stat_sess_show_attr_rsp_pdus(
-       struct iscsi_node_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_sess_rsp_pdus_show(struct config_item *item,
+               char *page)
 {
-       struct iscsi_node_acl *acl = container_of(igrps,
-                       struct iscsi_node_acl, node_stat_grps);
+       struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
        struct se_node_acl *se_nacl = &acl->se_node_acl;
        struct iscsi_session *sess;
        struct se_session *se_sess;
@@ -823,13 +689,11 @@ static ssize_t iscsi_stat_sess_show_attr_rsp_pdus(
 
        return ret;
 }
-ISCSI_STAT_SESS_RO(rsp_pdus);
 
-static ssize_t iscsi_stat_sess_show_attr_txdata_octs(
-       struct iscsi_node_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_sess_txdata_octs_show(struct config_item *item,
+               char *page)
 {
-       struct iscsi_node_acl *acl = container_of(igrps,
-                       struct iscsi_node_acl, node_stat_grps);
+       struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
        struct se_node_acl *se_nacl = &acl->se_node_acl;
        struct iscsi_session *sess;
        struct se_session *se_sess;
@@ -847,13 +711,11 @@ static ssize_t iscsi_stat_sess_show_attr_txdata_octs(
 
        return ret;
 }
-ISCSI_STAT_SESS_RO(txdata_octs);
 
-static ssize_t iscsi_stat_sess_show_attr_rxdata_octs(
-       struct iscsi_node_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_sess_rxdata_octs_show(struct config_item *item,
+               char *page)
 {
-       struct iscsi_node_acl *acl = container_of(igrps,
-                       struct iscsi_node_acl, node_stat_grps);
+       struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
        struct se_node_acl *se_nacl = &acl->se_node_acl;
        struct iscsi_session *sess;
        struct se_session *se_sess;
@@ -871,13 +733,11 @@ static ssize_t iscsi_stat_sess_show_attr_rxdata_octs(
 
        return ret;
 }
-ISCSI_STAT_SESS_RO(rxdata_octs);
 
-static ssize_t iscsi_stat_sess_show_attr_conn_digest_errors(
-       struct iscsi_node_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_sess_conn_digest_errors_show(struct config_item *item,
+               char *page)
 {
-       struct iscsi_node_acl *acl = container_of(igrps,
-                       struct iscsi_node_acl, node_stat_grps);
+       struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
        struct se_node_acl *se_nacl = &acl->se_node_acl;
        struct iscsi_session *sess;
        struct se_session *se_sess;
@@ -895,13 +755,11 @@ static ssize_t iscsi_stat_sess_show_attr_conn_digest_errors(
 
        return ret;
 }
-ISCSI_STAT_SESS_RO(conn_digest_errors);
 
-static ssize_t iscsi_stat_sess_show_attr_conn_timeout_errors(
-       struct iscsi_node_stat_grps *igrps, char *page)
+static ssize_t iscsi_stat_sess_conn_timeout_errors_show(
+               struct config_item *item, char *page)
 {
-       struct iscsi_node_acl *acl = container_of(igrps,
-                       struct iscsi_node_acl, node_stat_grps);
+       struct iscsi_node_acl *acl = iscsi_stat_nacl(item);
        struct se_node_acl *se_nacl = &acl->se_node_acl;
        struct iscsi_session *sess;
        struct se_session *se_sess;
@@ -919,31 +777,31 @@ static ssize_t iscsi_stat_sess_show_attr_conn_timeout_errors(
 
        return ret;
 }
-ISCSI_STAT_SESS_RO(conn_timeout_errors);
 
-CONFIGFS_EATTR_OPS(iscsi_stat_sess, iscsi_node_stat_grps,
-               iscsi_sess_stats_group);
+CONFIGFS_ATTR_RO(iscsi_stat_sess_, inst);
+CONFIGFS_ATTR_RO(iscsi_stat_sess_, node);
+CONFIGFS_ATTR_RO(iscsi_stat_sess_, indx);
+CONFIGFS_ATTR_RO(iscsi_stat_sess_, cmd_pdus);
+CONFIGFS_ATTR_RO(iscsi_stat_sess_, rsp_pdus);
+CONFIGFS_ATTR_RO(iscsi_stat_sess_, txdata_octs);
+CONFIGFS_ATTR_RO(iscsi_stat_sess_, rxdata_octs);
+CONFIGFS_ATTR_RO(iscsi_stat_sess_, conn_digest_errors);
+CONFIGFS_ATTR_RO(iscsi_stat_sess_, conn_timeout_errors);
 
 static struct configfs_attribute *iscsi_stat_sess_stats_attrs[] = {
-       &iscsi_stat_sess_inst.attr,
-       &iscsi_stat_sess_node.attr,
-       &iscsi_stat_sess_indx.attr,
-       &iscsi_stat_sess_cmd_pdus.attr,
-       &iscsi_stat_sess_rsp_pdus.attr,
-       &iscsi_stat_sess_txdata_octs.attr,
-       &iscsi_stat_sess_rxdata_octs.attr,
-       &iscsi_stat_sess_conn_digest_errors.attr,
-       &iscsi_stat_sess_conn_timeout_errors.attr,
+       &iscsi_stat_sess_attr_inst,
+       &iscsi_stat_sess_attr_node,
+       &iscsi_stat_sess_attr_indx,
+       &iscsi_stat_sess_attr_cmd_pdus,
+       &iscsi_stat_sess_attr_rsp_pdus,
+       &iscsi_stat_sess_attr_txdata_octs,
+       &iscsi_stat_sess_attr_rxdata_octs,
+       &iscsi_stat_sess_attr_conn_digest_errors,
+       &iscsi_stat_sess_attr_conn_timeout_errors,
        NULL,
 };
 
-static struct configfs_item_operations iscsi_stat_sess_stats_item_ops = {
-       .show_attribute         = iscsi_stat_sess_attr_show,
-       .store_attribute        = iscsi_stat_sess_attr_store,
-};
-
 struct config_item_type iscsi_stat_sess_cit = {
-       .ct_item_ops            = &iscsi_stat_sess_stats_item_ops,
        .ct_attrs               = iscsi_stat_sess_stats_attrs,
        .ct_owner               = THIS_MODULE,
 };
index 5bc85ffed7204f21871a31d7346b93885b437cf8..999b6eba52e8b4b86ae2d0a61192502392988705 100644 (file)
@@ -34,7 +34,6 @@
 
 #include <target/target_core_base.h>
 #include <target/target_core_fabric.h>
-#include <target/target_core_fabric_configfs.h>
 
 #include "tcm_loop.h"
 
@@ -763,21 +762,20 @@ static void tcm_loop_port_unlink(
 
 /* End items for tcm_loop_port_cit */
 
-static ssize_t tcm_loop_tpg_attrib_show_fabric_prot_type(
-       struct se_portal_group *se_tpg,
-       char *page)
+static ssize_t tcm_loop_tpg_attrib_fabric_prot_type_show(
+               struct config_item *item, char *page)
 {
+       struct se_portal_group *se_tpg = attrib_to_tpg(item);
        struct tcm_loop_tpg *tl_tpg = container_of(se_tpg, struct tcm_loop_tpg,
                                                   tl_se_tpg);
 
        return sprintf(page, "%d\n", tl_tpg->tl_fabric_prot_type);
 }
 
-static ssize_t tcm_loop_tpg_attrib_store_fabric_prot_type(
-       struct se_portal_group *se_tpg,
-       const char *page,
-       size_t count)
+static ssize_t tcm_loop_tpg_attrib_fabric_prot_type_store(
+               struct config_item *item, const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = attrib_to_tpg(item);
        struct tcm_loop_tpg *tl_tpg = container_of(se_tpg, struct tcm_loop_tpg,
                                                   tl_se_tpg);
        unsigned long val;
@@ -796,10 +794,10 @@ static ssize_t tcm_loop_tpg_attrib_store_fabric_prot_type(
        return count;
 }
 
-TF_TPG_ATTRIB_ATTR(tcm_loop, fabric_prot_type, S_IRUGO | S_IWUSR);
+CONFIGFS_ATTR(tcm_loop_tpg_attrib_, fabric_prot_type);
 
 static struct configfs_attribute *tcm_loop_tpg_attrib_attrs[] = {
-       &tcm_loop_tpg_attrib_fabric_prot_type.attr,
+       &tcm_loop_tpg_attrib_attr_fabric_prot_type,
        NULL,
 };
 
@@ -894,10 +892,9 @@ static int tcm_loop_drop_nexus(
 
 /* End items for tcm_loop_nexus_cit */
 
-static ssize_t tcm_loop_tpg_show_nexus(
-       struct se_portal_group *se_tpg,
-       char *page)
+static ssize_t tcm_loop_tpg_nexus_show(struct config_item *item, char *page)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct tcm_loop_tpg *tl_tpg = container_of(se_tpg,
                        struct tcm_loop_tpg, tl_se_tpg);
        struct tcm_loop_nexus *tl_nexus;
@@ -913,11 +910,10 @@ static ssize_t tcm_loop_tpg_show_nexus(
        return ret;
 }
 
-static ssize_t tcm_loop_tpg_store_nexus(
-       struct se_portal_group *se_tpg,
-       const char *page,
-       size_t count)
+static ssize_t tcm_loop_tpg_nexus_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct tcm_loop_tpg *tl_tpg = container_of(se_tpg,
                        struct tcm_loop_tpg, tl_se_tpg);
        struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba;
@@ -992,12 +988,10 @@ check_newline:
        return count;
 }
 
-TF_TPG_BASE_ATTR(tcm_loop, nexus, S_IRUGO | S_IWUSR);
-
-static ssize_t tcm_loop_tpg_show_transport_status(
-       struct se_portal_group *se_tpg,
-       char *page)
+static ssize_t tcm_loop_tpg_transport_status_show(struct config_item *item,
+               char *page)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct tcm_loop_tpg *tl_tpg = container_of(se_tpg,
                        struct tcm_loop_tpg, tl_se_tpg);
        const char *status = NULL;
@@ -1020,11 +1014,10 @@ static ssize_t tcm_loop_tpg_show_transport_status(
        return ret;
 }
 
-static ssize_t tcm_loop_tpg_store_transport_status(
-       struct se_portal_group *se_tpg,
-       const char *page,
-       size_t count)
+static ssize_t tcm_loop_tpg_transport_status_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct tcm_loop_tpg *tl_tpg = container_of(se_tpg,
                        struct tcm_loop_tpg, tl_se_tpg);
 
@@ -1044,11 +1037,12 @@ static ssize_t tcm_loop_tpg_store_transport_status(
        return -EINVAL;
 }
 
-TF_TPG_BASE_ATTR(tcm_loop, transport_status, S_IRUGO | S_IWUSR);
+CONFIGFS_ATTR(tcm_loop_tpg_, nexus);
+CONFIGFS_ATTR(tcm_loop_tpg_, transport_status);
 
 static struct configfs_attribute *tcm_loop_tpg_attrs[] = {
-       &tcm_loop_tpg_nexus.attr,
-       &tcm_loop_tpg_transport_status.attr,
+       &tcm_loop_tpg_attr_nexus,
+       &tcm_loop_tpg_attr_transport_status,
        NULL,
 };
 
@@ -1216,17 +1210,15 @@ static void tcm_loop_drop_scsi_hba(
 }
 
 /* Start items for tcm_loop_cit */
-static ssize_t tcm_loop_wwn_show_attr_version(
-       struct target_fabric_configfs *tf,
-       char *page)
+static ssize_t tcm_loop_wwn_version_show(struct config_item *item, char *page)
 {
        return sprintf(page, "TCM Loopback Fabric module %s\n", TCM_LOOP_VERSION);
 }
 
-TF_WWN_ATTR_RO(tcm_loop, version);
+CONFIGFS_ATTR_RO(tcm_loop_wwn_, version);
 
 static struct configfs_attribute *tcm_loop_wwn_attrs[] = {
-       &tcm_loop_wwn_version.attr,
+       &tcm_loop_wwn_attr_version,
        NULL,
 };
 
index 0edf320fb68547a4f4c6d0b8d46687727d47c557..35f7d31b29d2eb05c13985e4ab45df0df41669e6 100644 (file)
@@ -35,8 +35,6 @@
 #include <target/target_core_base.h>
 #include <target/target_core_backend.h>
 #include <target/target_core_fabric.h>
-#include <target/target_core_fabric_configfs.h>
-#include <target/configfs_macros.h>
 #include <asm/unaligned.h>
 
 #include "sbp_target.h"
@@ -2111,24 +2109,21 @@ static void sbp_drop_tport(struct se_wwn *wwn)
        kfree(tport);
 }
 
-static ssize_t sbp_wwn_show_attr_version(
-               struct target_fabric_configfs *tf,
-               char *page)
+static ssize_t sbp_wwn_version_show(struct config_item *item, char *page)
 {
        return sprintf(page, "FireWire SBP fabric module %s\n", SBP_VERSION);
 }
 
-TF_WWN_ATTR_RO(sbp, version);
+CONFIGFS_ATTR_RO(sbp_wwn_, version);
 
 static struct configfs_attribute *sbp_wwn_attrs[] = {
-       &sbp_wwn_version.attr,
+       &sbp_wwn_attr_version,
        NULL,
 };
 
-static ssize_t sbp_tpg_show_directory_id(
-               struct se_portal_group *se_tpg,
-               char *page)
+static ssize_t sbp_tpg_directory_id_show(struct config_item *item, char *page)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct sbp_tpg *tpg = container_of(se_tpg, struct sbp_tpg, se_tpg);
        struct sbp_tport *tport = tpg->tport;
 
@@ -2138,11 +2133,10 @@ static ssize_t sbp_tpg_show_directory_id(
                return sprintf(page, "%06x\n", tport->directory_id);
 }
 
-static ssize_t sbp_tpg_store_directory_id(
-               struct se_portal_group *se_tpg,
-               const char *page,
-               size_t count)
+static ssize_t sbp_tpg_directory_id_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct sbp_tpg *tpg = container_of(se_tpg, struct sbp_tpg, se_tpg);
        struct sbp_tport *tport = tpg->tport;
        unsigned long val;
@@ -2166,20 +2160,18 @@ static ssize_t sbp_tpg_store_directory_id(
        return count;
 }
 
-static ssize_t sbp_tpg_show_enable(
-               struct se_portal_group *se_tpg,
-               char *page)
+static ssize_t sbp_tpg_enable_show(struct config_item *item, char *page)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct sbp_tpg *tpg = container_of(se_tpg, struct sbp_tpg, se_tpg);
        struct sbp_tport *tport = tpg->tport;
        return sprintf(page, "%d\n", tport->enable);
 }
 
-static ssize_t sbp_tpg_store_enable(
-               struct se_portal_group *se_tpg,
-               const char *page,
-               size_t count)
+static ssize_t sbp_tpg_enable_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct sbp_tpg *tpg = container_of(se_tpg, struct sbp_tpg, se_tpg);
        struct sbp_tport *tport = tpg->tport;
        unsigned long val;
@@ -2219,29 +2211,28 @@ static ssize_t sbp_tpg_store_enable(
        return count;
 }
 
-TF_TPG_BASE_ATTR(sbp, directory_id, S_IRUGO | S_IWUSR);
-TF_TPG_BASE_ATTR(sbp, enable, S_IRUGO | S_IWUSR);
+CONFIGFS_ATTR(sbp_tpg_, directory_id);
+CONFIGFS_ATTR(sbp_tpg_, enable);
 
 static struct configfs_attribute *sbp_tpg_base_attrs[] = {
-       &sbp_tpg_directory_id.attr,
-       &sbp_tpg_enable.attr,
+       &sbp_tpg_attr_directory_id,
+       &sbp_tpg_attr_enable,
        NULL,
 };
 
-static ssize_t sbp_tpg_attrib_show_mgt_orb_timeout(
-               struct se_portal_group *se_tpg,
+static ssize_t sbp_tpg_attrib_mgt_orb_timeout_show(struct config_item *item,
                char *page)
 {
+       struct se_portal_group *se_tpg = attrib_to_tpg(item);
        struct sbp_tpg *tpg = container_of(se_tpg, struct sbp_tpg, se_tpg);
        struct sbp_tport *tport = tpg->tport;
        return sprintf(page, "%d\n", tport->mgt_orb_timeout);
 }
 
-static ssize_t sbp_tpg_attrib_store_mgt_orb_timeout(
-               struct se_portal_group *se_tpg,
-               const char *page,
-               size_t count)
+static ssize_t sbp_tpg_attrib_mgt_orb_timeout_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = attrib_to_tpg(item);
        struct sbp_tpg *tpg = container_of(se_tpg, struct sbp_tpg, se_tpg);
        struct sbp_tport *tport = tpg->tport;
        unsigned long val;
@@ -2264,20 +2255,19 @@ static ssize_t sbp_tpg_attrib_store_mgt_orb_timeout(
        return count;
 }
 
-static ssize_t sbp_tpg_attrib_show_max_reconnect_timeout(
-               struct se_portal_group *se_tpg,
+static ssize_t sbp_tpg_attrib_max_reconnect_timeout_show(struct config_item *item,
                char *page)
 {
+       struct se_portal_group *se_tpg = attrib_to_tpg(item);
        struct sbp_tpg *tpg = container_of(se_tpg, struct sbp_tpg, se_tpg);
        struct sbp_tport *tport = tpg->tport;
        return sprintf(page, "%d\n", tport->max_reconnect_timeout);
 }
 
-static ssize_t sbp_tpg_attrib_store_max_reconnect_timeout(
-               struct se_portal_group *se_tpg,
-               const char *page,
-               size_t count)
+static ssize_t sbp_tpg_attrib_max_reconnect_timeout_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = attrib_to_tpg(item);
        struct sbp_tpg *tpg = container_of(se_tpg, struct sbp_tpg, se_tpg);
        struct sbp_tport *tport = tpg->tport;
        unsigned long val;
@@ -2300,20 +2290,19 @@ static ssize_t sbp_tpg_attrib_store_max_reconnect_timeout(
        return count;
 }
 
-static ssize_t sbp_tpg_attrib_show_max_logins_per_lun(
-               struct se_portal_group *se_tpg,
+static ssize_t sbp_tpg_attrib_max_logins_per_lun_show(struct config_item *item,
                char *page)
 {
+       struct se_portal_group *se_tpg = attrib_to_tpg(item);
        struct sbp_tpg *tpg = container_of(se_tpg, struct sbp_tpg, se_tpg);
        struct sbp_tport *tport = tpg->tport;
        return sprintf(page, "%d\n", tport->max_logins_per_lun);
 }
 
-static ssize_t sbp_tpg_attrib_store_max_logins_per_lun(
-               struct se_portal_group *se_tpg,
-               const char *page,
-               size_t count)
+static ssize_t sbp_tpg_attrib_max_logins_per_lun_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = attrib_to_tpg(item);
        struct sbp_tpg *tpg = container_of(se_tpg, struct sbp_tpg, se_tpg);
        struct sbp_tport *tport = tpg->tport;
        unsigned long val;
@@ -2330,14 +2319,14 @@ static ssize_t sbp_tpg_attrib_store_max_logins_per_lun(
        return count;
 }
 
-TF_TPG_ATTRIB_ATTR(sbp, mgt_orb_timeout, S_IRUGO | S_IWUSR);
-TF_TPG_ATTRIB_ATTR(sbp, max_reconnect_timeout, S_IRUGO | S_IWUSR);
-TF_TPG_ATTRIB_ATTR(sbp, max_logins_per_lun, S_IRUGO | S_IWUSR);
+CONFIGFS_ATTR(sbp_tpg_attrib_, mgt_orb_timeout);
+CONFIGFS_ATTR(sbp_tpg_attrib_, max_reconnect_timeout);
+CONFIGFS_ATTR(sbp_tpg_attrib_, max_logins_per_lun);
 
 static struct configfs_attribute *sbp_tpg_attrib_attrs[] = {
-       &sbp_tpg_attrib_mgt_orb_timeout.attr,
-       &sbp_tpg_attrib_max_reconnect_timeout.attr,
-       &sbp_tpg_attrib_max_logins_per_lun.attr,
+       &sbp_tpg_attrib_attr_mgt_orb_timeout,
+       &sbp_tpg_attrib_attr_max_reconnect_timeout,
+       &sbp_tpg_attrib_attr_max_logins_per_lun,
        NULL,
 };
 
index 860e840461778271191ba4ee8f1a4011dba5e78c..b9b9ffde4c7a870e32a623ad5aacbf289c07ebef 100644 (file)
@@ -40,8 +40,6 @@
 #include <target/target_core_base.h>
 #include <target/target_core_backend.h>
 #include <target/target_core_fabric.h>
-#include <target/target_core_fabric_configfs.h>
-#include <target/configfs_macros.h>
 
 #include "target_core_internal.h"
 #include "target_core_alua.h"
@@ -78,12 +76,6 @@ extern struct t10_alua_lu_gp *default_lu_gp;
 static LIST_HEAD(g_tf_list);
 static DEFINE_MUTEX(g_tf_lock);
 
-struct target_core_configfs_attribute {
-       struct configfs_attribute attr;
-       ssize_t (*show)(void *, char *);
-       ssize_t (*store)(void *, const char *, size_t);
-};
-
 static struct config_group target_core_hbagroup;
 static struct config_group alua_group;
 static struct config_group alua_lu_gps_group;
@@ -97,24 +89,15 @@ item_to_hba(struct config_item *item)
 /*
  * Attributes for /sys/kernel/config/target/
  */
-static ssize_t target_core_attr_show(struct config_item *item,
-                                     struct configfs_attribute *attr,
-                                     char *page)
+static ssize_t target_core_item_version_show(struct config_item *item,
+               char *page)
 {
        return sprintf(page, "Target Engine Core ConfigFS Infrastructure %s"
                " on %s/%s on "UTS_RELEASE"\n", TARGET_CORE_VERSION,
                utsname()->sysname, utsname()->machine);
 }
 
-static struct configfs_item_operations target_core_fabric_item_ops = {
-       .show_attribute = target_core_attr_show,
-};
-
-static struct configfs_attribute target_core_item_attr_version = {
-       .ca_owner       = THIS_MODULE,
-       .ca_name        = "version",
-       .ca_mode        = S_IRUGO,
-};
+CONFIGFS_ATTR_RO(target_core_item_, version);
 
 static struct target_fabric_configfs *target_core_get_fabric(
        const char *name)
@@ -273,7 +256,6 @@ static struct configfs_attribute *target_core_fabric_item_attrs[] = {
  * Provides Fabrics Groups and Item Attributes for /sys/kernel/config/target/
  */
 static struct config_item_type target_core_fabrics_item = {
-       .ct_item_ops    = &target_core_fabric_item_ops,
        .ct_group_ops   = &target_core_fabric_group_ops,
        .ct_attrs       = target_core_fabric_item_attrs,
        .ct_owner       = THIS_MODULE,
@@ -476,47 +458,54 @@ EXPORT_SYMBOL(target_unregister_template);
 // Stop functions called by external Target Fabrics Modules
 //############################################################################*/
 
+static inline struct se_dev_attrib *to_attrib(struct config_item *item)
+{
+       return container_of(to_config_group(item), struct se_dev_attrib,
+                       da_group);
+}
+
 /* Start functions for struct config_item_type tb_dev_attrib_cit */
-#define DEF_TB_DEV_ATTRIB_SHOW(_name)                                  \
-static ssize_t show_##_name(struct se_dev_attrib *da, char *page)      \
+#define DEF_CONFIGFS_ATTRIB_SHOW(_name)                                        \
+static ssize_t _name##_show(struct config_item *item, char *page)      \
 {                                                                      \
-       return snprintf(page, PAGE_SIZE, "%u\n", da->_name);            \
-}
-
-DEF_TB_DEV_ATTRIB_SHOW(emulate_model_alias);
-DEF_TB_DEV_ATTRIB_SHOW(emulate_dpo);
-DEF_TB_DEV_ATTRIB_SHOW(emulate_fua_write);
-DEF_TB_DEV_ATTRIB_SHOW(emulate_fua_read);
-DEF_TB_DEV_ATTRIB_SHOW(emulate_write_cache);
-DEF_TB_DEV_ATTRIB_SHOW(emulate_ua_intlck_ctrl);
-DEF_TB_DEV_ATTRIB_SHOW(emulate_tas);
-DEF_TB_DEV_ATTRIB_SHOW(emulate_tpu);
-DEF_TB_DEV_ATTRIB_SHOW(emulate_tpws);
-DEF_TB_DEV_ATTRIB_SHOW(emulate_caw);
-DEF_TB_DEV_ATTRIB_SHOW(emulate_3pc);
-DEF_TB_DEV_ATTRIB_SHOW(pi_prot_type);
-DEF_TB_DEV_ATTRIB_SHOW(hw_pi_prot_type);
-DEF_TB_DEV_ATTRIB_SHOW(pi_prot_format);
-DEF_TB_DEV_ATTRIB_SHOW(enforce_pr_isids);
-DEF_TB_DEV_ATTRIB_SHOW(is_nonrot);
-DEF_TB_DEV_ATTRIB_SHOW(emulate_rest_reord);
-DEF_TB_DEV_ATTRIB_SHOW(force_pr_aptpl);
-DEF_TB_DEV_ATTRIB_SHOW(hw_block_size);
-DEF_TB_DEV_ATTRIB_SHOW(block_size);
-DEF_TB_DEV_ATTRIB_SHOW(hw_max_sectors);
-DEF_TB_DEV_ATTRIB_SHOW(optimal_sectors);
-DEF_TB_DEV_ATTRIB_SHOW(hw_queue_depth);
-DEF_TB_DEV_ATTRIB_SHOW(queue_depth);
-DEF_TB_DEV_ATTRIB_SHOW(max_unmap_lba_count);
-DEF_TB_DEV_ATTRIB_SHOW(max_unmap_block_desc_count);
-DEF_TB_DEV_ATTRIB_SHOW(unmap_granularity);
-DEF_TB_DEV_ATTRIB_SHOW(unmap_granularity_alignment);
-DEF_TB_DEV_ATTRIB_SHOW(max_write_same_len);
-
-#define DEF_TB_DEV_ATTRIB_STORE_U32(_name)                             \
-static ssize_t store_##_name(struct se_dev_attrib *da, const char *page,\
+       return snprintf(page, PAGE_SIZE, "%u\n", to_attrib(item)->_name); \
+}
+
+DEF_CONFIGFS_ATTRIB_SHOW(emulate_model_alias);
+DEF_CONFIGFS_ATTRIB_SHOW(emulate_dpo);
+DEF_CONFIGFS_ATTRIB_SHOW(emulate_fua_write);
+DEF_CONFIGFS_ATTRIB_SHOW(emulate_fua_read);
+DEF_CONFIGFS_ATTRIB_SHOW(emulate_write_cache);
+DEF_CONFIGFS_ATTRIB_SHOW(emulate_ua_intlck_ctrl);
+DEF_CONFIGFS_ATTRIB_SHOW(emulate_tas);
+DEF_CONFIGFS_ATTRIB_SHOW(emulate_tpu);
+DEF_CONFIGFS_ATTRIB_SHOW(emulate_tpws);
+DEF_CONFIGFS_ATTRIB_SHOW(emulate_caw);
+DEF_CONFIGFS_ATTRIB_SHOW(emulate_3pc);
+DEF_CONFIGFS_ATTRIB_SHOW(pi_prot_type);
+DEF_CONFIGFS_ATTRIB_SHOW(hw_pi_prot_type);
+DEF_CONFIGFS_ATTRIB_SHOW(pi_prot_format);
+DEF_CONFIGFS_ATTRIB_SHOW(enforce_pr_isids);
+DEF_CONFIGFS_ATTRIB_SHOW(is_nonrot);
+DEF_CONFIGFS_ATTRIB_SHOW(emulate_rest_reord);
+DEF_CONFIGFS_ATTRIB_SHOW(force_pr_aptpl);
+DEF_CONFIGFS_ATTRIB_SHOW(hw_block_size);
+DEF_CONFIGFS_ATTRIB_SHOW(block_size);
+DEF_CONFIGFS_ATTRIB_SHOW(hw_max_sectors);
+DEF_CONFIGFS_ATTRIB_SHOW(optimal_sectors);
+DEF_CONFIGFS_ATTRIB_SHOW(hw_queue_depth);
+DEF_CONFIGFS_ATTRIB_SHOW(queue_depth);
+DEF_CONFIGFS_ATTRIB_SHOW(max_unmap_lba_count);
+DEF_CONFIGFS_ATTRIB_SHOW(max_unmap_block_desc_count);
+DEF_CONFIGFS_ATTRIB_SHOW(unmap_granularity);
+DEF_CONFIGFS_ATTRIB_SHOW(unmap_granularity_alignment);
+DEF_CONFIGFS_ATTRIB_SHOW(max_write_same_len);
+
+#define DEF_CONFIGFS_ATTRIB_STORE_U32(_name)                           \
+static ssize_t _name##_store(struct config_item *item, const char *page,\
                size_t count)                                           \
 {                                                                      \
+       struct se_dev_attrib *da = to_attrib(item);                     \
        u32 val;                                                        \
        int ret;                                                        \
                                                                        \
@@ -527,16 +516,17 @@ static ssize_t store_##_name(struct se_dev_attrib *da, const char *page,\
        return count;                                                   \
 }
 
-DEF_TB_DEV_ATTRIB_STORE_U32(max_unmap_lba_count);
-DEF_TB_DEV_ATTRIB_STORE_U32(max_unmap_block_desc_count);
-DEF_TB_DEV_ATTRIB_STORE_U32(unmap_granularity);
-DEF_TB_DEV_ATTRIB_STORE_U32(unmap_granularity_alignment);
-DEF_TB_DEV_ATTRIB_STORE_U32(max_write_same_len);
+DEF_CONFIGFS_ATTRIB_STORE_U32(max_unmap_lba_count);
+DEF_CONFIGFS_ATTRIB_STORE_U32(max_unmap_block_desc_count);
+DEF_CONFIGFS_ATTRIB_STORE_U32(unmap_granularity);
+DEF_CONFIGFS_ATTRIB_STORE_U32(unmap_granularity_alignment);
+DEF_CONFIGFS_ATTRIB_STORE_U32(max_write_same_len);
 
-#define DEF_TB_DEV_ATTRIB_STORE_BOOL(_name)                            \
-static ssize_t store_##_name(struct se_dev_attrib *da, const char *page,\
+#define DEF_CONFIGFS_ATTRIB_STORE_BOOL(_name)                          \
+static ssize_t _name##_store(struct config_item *item, const char *page,       \
                size_t count)                                           \
 {                                                                      \
+       struct se_dev_attrib *da = to_attrib(item);                     \
        bool flag;                                                      \
        int ret;                                                        \
                                                                        \
@@ -547,14 +537,14 @@ static ssize_t store_##_name(struct se_dev_attrib *da, const char *page,\
        return count;                                                   \
 }
 
-DEF_TB_DEV_ATTRIB_STORE_BOOL(emulate_fua_write);
-DEF_TB_DEV_ATTRIB_STORE_BOOL(emulate_caw);
-DEF_TB_DEV_ATTRIB_STORE_BOOL(emulate_3pc);
-DEF_TB_DEV_ATTRIB_STORE_BOOL(enforce_pr_isids);
-DEF_TB_DEV_ATTRIB_STORE_BOOL(is_nonrot);
+DEF_CONFIGFS_ATTRIB_STORE_BOOL(emulate_fua_write);
+DEF_CONFIGFS_ATTRIB_STORE_BOOL(emulate_caw);
+DEF_CONFIGFS_ATTRIB_STORE_BOOL(emulate_3pc);
+DEF_CONFIGFS_ATTRIB_STORE_BOOL(enforce_pr_isids);
+DEF_CONFIGFS_ATTRIB_STORE_BOOL(is_nonrot);
 
-#define DEF_TB_DEV_ATTRIB_STORE_STUB(_name)                            \
-static ssize_t store_##_name(struct se_dev_attrib *da, const char *page,\
+#define DEF_CONFIGFS_ATTRIB_STORE_STUB(_name)                          \
+static ssize_t _name##_store(struct config_item *item, const char *page,\
                size_t count)                                           \
 {                                                                      \
        printk_once(KERN_WARNING                                        \
@@ -562,8 +552,8 @@ static ssize_t store_##_name(struct se_dev_attrib *da, const char *page,\
        return count;                                                   \
 }
 
-DEF_TB_DEV_ATTRIB_STORE_STUB(emulate_dpo);
-DEF_TB_DEV_ATTRIB_STORE_STUB(emulate_fua_read);
+DEF_CONFIGFS_ATTRIB_STORE_STUB(emulate_dpo);
+DEF_CONFIGFS_ATTRIB_STORE_STUB(emulate_fua_read);
 
 static void dev_set_t10_wwn_model_alias(struct se_device *dev)
 {
@@ -578,9 +568,10 @@ static void dev_set_t10_wwn_model_alias(struct se_device *dev)
        snprintf(&dev->t10_wwn.model[0], 16, "%s", configname);
 }
 
-static ssize_t store_emulate_model_alias(struct se_dev_attrib *da,
+static ssize_t emulate_model_alias_store(struct config_item *item,
                const char *page, size_t count)
 {
+       struct se_dev_attrib *da = to_attrib(item);
        struct se_device *dev = da->da_dev;
        bool flag;
        int ret;
@@ -606,9 +597,10 @@ static ssize_t store_emulate_model_alias(struct se_dev_attrib *da,
        return count;
 }
 
-static ssize_t store_emulate_write_cache(struct se_dev_attrib *da,
+static ssize_t emulate_write_cache_store(struct config_item *item,
                const char *page, size_t count)
 {
+       struct se_dev_attrib *da = to_attrib(item);
        bool flag;
        int ret;
 
@@ -627,9 +619,10 @@ static ssize_t store_emulate_write_cache(struct se_dev_attrib *da,
        return count;
 }
 
-static ssize_t store_emulate_ua_intlck_ctrl(struct se_dev_attrib *da,
+static ssize_t emulate_ua_intlck_ctrl_store(struct config_item *item,
                const char *page, size_t count)
 {
+       struct se_dev_attrib *da = to_attrib(item);
        u32 val;
        int ret;
 
@@ -654,9 +647,10 @@ static ssize_t store_emulate_ua_intlck_ctrl(struct se_dev_attrib *da,
        return count;
 }
 
-static ssize_t store_emulate_tas(struct se_dev_attrib *da,
+static ssize_t emulate_tas_store(struct config_item *item,
                const char *page, size_t count)
 {
+       struct se_dev_attrib *da = to_attrib(item);
        bool flag;
        int ret;
 
@@ -677,9 +671,10 @@ static ssize_t store_emulate_tas(struct se_dev_attrib *da,
        return count;
 }
 
-static ssize_t store_emulate_tpu(struct se_dev_attrib *da,
+static ssize_t emulate_tpu_store(struct config_item *item,
                const char *page, size_t count)
 {
+       struct se_dev_attrib *da = to_attrib(item);
        bool flag;
        int ret;
 
@@ -702,9 +697,10 @@ static ssize_t store_emulate_tpu(struct se_dev_attrib *da,
        return count;
 }
 
-static ssize_t store_emulate_tpws(struct se_dev_attrib *da,
+static ssize_t emulate_tpws_store(struct config_item *item,
                const char *page, size_t count)
 {
+       struct se_dev_attrib *da = to_attrib(item);
        bool flag;
        int ret;
 
@@ -727,9 +723,10 @@ static ssize_t store_emulate_tpws(struct se_dev_attrib *da,
        return count;
 }
 
-static ssize_t store_pi_prot_type(struct se_dev_attrib *da,
+static ssize_t pi_prot_type_store(struct config_item *item,
                const char *page, size_t count)
 {
+       struct se_dev_attrib *da = to_attrib(item);
        int old_prot = da->pi_prot_type, ret;
        struct se_device *dev = da->da_dev;
        u32 flag;
@@ -787,9 +784,10 @@ static ssize_t store_pi_prot_type(struct se_dev_attrib *da,
        return count;
 }
 
-static ssize_t store_pi_prot_format(struct se_dev_attrib *da,
+static ssize_t pi_prot_format_store(struct config_item *item,
                const char *page, size_t count)
 {
+       struct se_dev_attrib *da = to_attrib(item);
        struct se_device *dev = da->da_dev;
        bool flag;
        int ret;
@@ -824,9 +822,10 @@ static ssize_t store_pi_prot_format(struct se_dev_attrib *da,
        return count;
 }
 
-static ssize_t store_force_pr_aptpl(struct se_dev_attrib *da,
+static ssize_t force_pr_aptpl_store(struct config_item *item,
                const char *page, size_t count)
 {
+       struct se_dev_attrib *da = to_attrib(item);
        bool flag;
        int ret;
 
@@ -845,9 +844,10 @@ static ssize_t store_force_pr_aptpl(struct se_dev_attrib *da,
        return count;
 }
 
-static ssize_t store_emulate_rest_reord(struct se_dev_attrib *da,
+static ssize_t emulate_rest_reord_store(struct config_item *item,
                const char *page, size_t count)
 {
+       struct se_dev_attrib *da = to_attrib(item);
        bool flag;
        int ret;
 
@@ -869,9 +869,10 @@ static ssize_t store_emulate_rest_reord(struct se_dev_attrib *da,
 /*
  * Note, this can only be called on unexported SE Device Object.
  */
-static ssize_t store_queue_depth(struct se_dev_attrib *da,
+static ssize_t queue_depth_store(struct config_item *item,
                const char *page, size_t count)
 {
+       struct se_dev_attrib *da = to_attrib(item);
        struct se_device *dev = da->da_dev;
        u32 val;
        int ret;
@@ -905,9 +906,10 @@ static ssize_t store_queue_depth(struct se_dev_attrib *da,
        return count;
 }
 
-static ssize_t store_optimal_sectors(struct se_dev_attrib *da,
+static ssize_t optimal_sectors_store(struct config_item *item,
                const char *page, size_t count)
 {
+       struct se_dev_attrib *da = to_attrib(item);
        u32 val;
        int ret;
 
@@ -934,9 +936,10 @@ static ssize_t store_optimal_sectors(struct se_dev_attrib *da,
        return count;
 }
 
-static ssize_t store_block_size(struct se_dev_attrib *da,
+static ssize_t block_size_store(struct config_item *item,
                const char *page, size_t count)
 {
+       struct se_dev_attrib *da = to_attrib(item);
        u32 val;
        int ret;
 
@@ -967,50 +970,35 @@ static ssize_t store_block_size(struct se_dev_attrib *da,
        return count;
 }
 
-CONFIGFS_EATTR_STRUCT(target_backend_dev_attrib, se_dev_attrib);
-#define TB_DEV_ATTR(_backend, _name, _mode)                            \
-static struct target_backend_dev_attrib_attribute _backend##_dev_attrib_##_name = \
-       __CONFIGFS_EATTR(_name, _mode,                                  \
-       show_##_name,                                                   \
-       store_##_name);
-
-#define TB_DEV_ATTR_RO(_backend, _name)                                        \
-static struct target_backend_dev_attrib_attribute _backend##_dev_attrib_##_name = \
-       __CONFIGFS_EATTR_RO(_name,                                      \
-       show_##_name);
-
-TB_DEV_ATTR(target_core, emulate_model_alias, S_IRUGO | S_IWUSR);
-TB_DEV_ATTR(target_core, emulate_dpo, S_IRUGO | S_IWUSR);
-TB_DEV_ATTR(target_core, emulate_fua_write, S_IRUGO | S_IWUSR);
-TB_DEV_ATTR(target_core, emulate_fua_read, S_IRUGO | S_IWUSR);
-TB_DEV_ATTR(target_core, emulate_write_cache, S_IRUGO | S_IWUSR);
-TB_DEV_ATTR(target_core, emulate_ua_intlck_ctrl, S_IRUGO | S_IWUSR);
-TB_DEV_ATTR(target_core, emulate_tas, S_IRUGO | S_IWUSR);
-TB_DEV_ATTR(target_core, emulate_tpu, S_IRUGO | S_IWUSR);
-TB_DEV_ATTR(target_core, emulate_tpws, S_IRUGO | S_IWUSR);
-TB_DEV_ATTR(target_core, emulate_caw, S_IRUGO | S_IWUSR);
-TB_DEV_ATTR(target_core, emulate_3pc, S_IRUGO | S_IWUSR);
-TB_DEV_ATTR(target_core, pi_prot_type, S_IRUGO | S_IWUSR);
-TB_DEV_ATTR_RO(target_core, hw_pi_prot_type);
-TB_DEV_ATTR(target_core, pi_prot_format, S_IRUGO | S_IWUSR);
-TB_DEV_ATTR(target_core, enforce_pr_isids, S_IRUGO | S_IWUSR);
-TB_DEV_ATTR(target_core, is_nonrot, S_IRUGO | S_IWUSR);
-TB_DEV_ATTR(target_core, emulate_rest_reord, S_IRUGO | S_IWUSR);
-TB_DEV_ATTR(target_core, force_pr_aptpl, S_IRUGO | S_IWUSR)
-TB_DEV_ATTR_RO(target_core, hw_block_size);
-TB_DEV_ATTR(target_core, block_size, S_IRUGO | S_IWUSR)
-TB_DEV_ATTR_RO(target_core, hw_max_sectors);
-TB_DEV_ATTR(target_core, optimal_sectors, S_IRUGO | S_IWUSR);
-TB_DEV_ATTR_RO(target_core, hw_queue_depth);
-TB_DEV_ATTR(target_core, queue_depth, S_IRUGO | S_IWUSR);
-TB_DEV_ATTR(target_core, max_unmap_lba_count, S_IRUGO | S_IWUSR);
-TB_DEV_ATTR(target_core, max_unmap_block_desc_count, S_IRUGO | S_IWUSR);
-TB_DEV_ATTR(target_core, unmap_granularity, S_IRUGO | S_IWUSR);
-TB_DEV_ATTR(target_core, unmap_granularity_alignment, S_IRUGO | S_IWUSR);
-TB_DEV_ATTR(target_core, max_write_same_len, S_IRUGO | S_IWUSR);
-
-CONFIGFS_EATTR_STRUCT(target_core_dev_attrib, se_dev_attrib);
-CONFIGFS_EATTR_OPS(target_core_dev_attrib, se_dev_attrib, da_group);
+CONFIGFS_ATTR(, emulate_model_alias);
+CONFIGFS_ATTR(, emulate_dpo);
+CONFIGFS_ATTR(, emulate_fua_write);
+CONFIGFS_ATTR(, emulate_fua_read);
+CONFIGFS_ATTR(, emulate_write_cache);
+CONFIGFS_ATTR(, emulate_ua_intlck_ctrl);
+CONFIGFS_ATTR(, emulate_tas);
+CONFIGFS_ATTR(, emulate_tpu);
+CONFIGFS_ATTR(, emulate_tpws);
+CONFIGFS_ATTR(, emulate_caw);
+CONFIGFS_ATTR(, emulate_3pc);
+CONFIGFS_ATTR(, pi_prot_type);
+CONFIGFS_ATTR_RO(, hw_pi_prot_type);
+CONFIGFS_ATTR(, pi_prot_format);
+CONFIGFS_ATTR(, enforce_pr_isids);
+CONFIGFS_ATTR(, is_nonrot);
+CONFIGFS_ATTR(, emulate_rest_reord);
+CONFIGFS_ATTR(, force_pr_aptpl);
+CONFIGFS_ATTR_RO(, hw_block_size);
+CONFIGFS_ATTR(, block_size);
+CONFIGFS_ATTR_RO(, hw_max_sectors);
+CONFIGFS_ATTR(, optimal_sectors);
+CONFIGFS_ATTR_RO(, hw_queue_depth);
+CONFIGFS_ATTR(, queue_depth);
+CONFIGFS_ATTR(, max_unmap_lba_count);
+CONFIGFS_ATTR(, max_unmap_block_desc_count);
+CONFIGFS_ATTR(, unmap_granularity);
+CONFIGFS_ATTR(, unmap_granularity_alignment);
+CONFIGFS_ATTR(, max_write_same_len);
 
 /*
  * dev_attrib attributes for devices using the target core SBC/SPC
@@ -1018,100 +1006,78 @@ CONFIGFS_EATTR_OPS(target_core_dev_attrib, se_dev_attrib, da_group);
  * these.
  */
 struct configfs_attribute *sbc_attrib_attrs[] = {
-       &target_core_dev_attrib_emulate_model_alias.attr,
-       &target_core_dev_attrib_emulate_dpo.attr,
-       &target_core_dev_attrib_emulate_fua_write.attr,
-       &target_core_dev_attrib_emulate_fua_read.attr,
-       &target_core_dev_attrib_emulate_write_cache.attr,
-       &target_core_dev_attrib_emulate_ua_intlck_ctrl.attr,
-       &target_core_dev_attrib_emulate_tas.attr,
-       &target_core_dev_attrib_emulate_tpu.attr,
-       &target_core_dev_attrib_emulate_tpws.attr,
-       &target_core_dev_attrib_emulate_caw.attr,
-       &target_core_dev_attrib_emulate_3pc.attr,
-       &target_core_dev_attrib_pi_prot_type.attr,
-       &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_is_nonrot.attr,
-       &target_core_dev_attrib_emulate_rest_reord.attr,
-       &target_core_dev_attrib_force_pr_aptpl.attr,
-       &target_core_dev_attrib_hw_block_size.attr,
-       &target_core_dev_attrib_block_size.attr,
-       &target_core_dev_attrib_hw_max_sectors.attr,
-       &target_core_dev_attrib_optimal_sectors.attr,
-       &target_core_dev_attrib_hw_queue_depth.attr,
-       &target_core_dev_attrib_queue_depth.attr,
-       &target_core_dev_attrib_max_unmap_lba_count.attr,
-       &target_core_dev_attrib_max_unmap_block_desc_count.attr,
-       &target_core_dev_attrib_unmap_granularity.attr,
-       &target_core_dev_attrib_unmap_granularity_alignment.attr,
-       &target_core_dev_attrib_max_write_same_len.attr,
+       &attr_emulate_model_alias,
+       &attr_emulate_dpo,
+       &attr_emulate_fua_write,
+       &attr_emulate_fua_read,
+       &attr_emulate_write_cache,
+       &attr_emulate_ua_intlck_ctrl,
+       &attr_emulate_tas,
+       &attr_emulate_tpu,
+       &attr_emulate_tpws,
+       &attr_emulate_caw,
+       &attr_emulate_3pc,
+       &attr_pi_prot_type,
+       &attr_hw_pi_prot_type,
+       &attr_pi_prot_format,
+       &attr_enforce_pr_isids,
+       &attr_is_nonrot,
+       &attr_emulate_rest_reord,
+       &attr_force_pr_aptpl,
+       &attr_hw_block_size,
+       &attr_block_size,
+       &attr_hw_max_sectors,
+       &attr_optimal_sectors,
+       &attr_hw_queue_depth,
+       &attr_queue_depth,
+       &attr_max_unmap_lba_count,
+       &attr_max_unmap_block_desc_count,
+       &attr_unmap_granularity,
+       &attr_unmap_granularity_alignment,
+       &attr_max_write_same_len,
        NULL,
 };
 EXPORT_SYMBOL(sbc_attrib_attrs);
 
-TB_DEV_ATTR_RO(target_pt, hw_pi_prot_type);
-TB_DEV_ATTR_RO(target_pt, hw_block_size);
-TB_DEV_ATTR_RO(target_pt, hw_max_sectors);
-TB_DEV_ATTR_RO(target_pt, hw_queue_depth);
-
 /*
  * Minimal dev_attrib attributes for devices passing through CDBs.
  * In this case we only provide a few read-only attributes for
  * backwards compatibility.
  */
 struct configfs_attribute *passthrough_attrib_attrs[] = {
-       &target_pt_dev_attrib_hw_pi_prot_type.attr,
-       &target_pt_dev_attrib_hw_block_size.attr,
-       &target_pt_dev_attrib_hw_max_sectors.attr,
-       &target_pt_dev_attrib_hw_queue_depth.attr,
+       &attr_hw_pi_prot_type,
+       &attr_hw_block_size,
+       &attr_hw_max_sectors,
+       &attr_hw_queue_depth,
        NULL,
 };
 EXPORT_SYMBOL(passthrough_attrib_attrs);
 
-static struct configfs_item_operations target_core_dev_attrib_ops = {
-       .show_attribute         = target_core_dev_attrib_attr_show,
-       .store_attribute        = target_core_dev_attrib_attr_store,
-};
-
-TB_CIT_SETUP_DRV(dev_attrib, &target_core_dev_attrib_ops, NULL);
+TB_CIT_SETUP_DRV(dev_attrib, NULL, NULL);
 
 /* End functions for struct config_item_type tb_dev_attrib_cit */
 
 /*  Start functions for struct config_item_type tb_dev_wwn_cit */
 
-CONFIGFS_EATTR_STRUCT(target_core_dev_wwn, t10_wwn);
-#define SE_DEV_WWN_ATTR(_name, _mode)                                  \
-static struct target_core_dev_wwn_attribute target_core_dev_wwn_##_name = \
-               __CONFIGFS_EATTR(_name, _mode,                          \
-               target_core_dev_wwn_show_attr_##_name,                  \
-               target_core_dev_wwn_store_attr_##_name);
-
-#define SE_DEV_WWN_ATTR_RO(_name);                                     \
-do {                                                                   \
-       static struct target_core_dev_wwn_attribute                     \
-                       target_core_dev_wwn_##_name =                   \
-               __CONFIGFS_EATTR_RO(_name,                              \
-               target_core_dev_wwn_show_attr_##_name);                 \
-} while (0);
+static struct t10_wwn *to_t10_wwn(struct config_item *item)
+{
+       return container_of(to_config_group(item), struct t10_wwn, t10_wwn_group);
+}
 
 /*
  * VPD page 0x80 Unit serial
  */
-static ssize_t target_core_dev_wwn_show_attr_vpd_unit_serial(
-       struct t10_wwn *t10_wwn,
-       char *page)
+static ssize_t target_wwn_vpd_unit_serial_show(struct config_item *item,
+               char *page)
 {
        return sprintf(page, "T10 VPD Unit Serial Number: %s\n",
-               &t10_wwn->unit_serial[0]);
+               &to_t10_wwn(item)->unit_serial[0]);
 }
 
-static ssize_t target_core_dev_wwn_store_attr_vpd_unit_serial(
-       struct t10_wwn *t10_wwn,
-       const char *page,
-       size_t count)
+static ssize_t target_wwn_vpd_unit_serial_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct t10_wwn *t10_wwn = to_t10_wwn(item);
        struct se_device *dev = t10_wwn->t10_dev;
        unsigned char buf[INQUIRY_VPD_SERIAL_LEN];
 
@@ -1167,15 +1133,13 @@ static ssize_t target_core_dev_wwn_store_attr_vpd_unit_serial(
        return count;
 }
 
-SE_DEV_WWN_ATTR(vpd_unit_serial, S_IRUGO | S_IWUSR);
-
 /*
  * VPD page 0x83 Protocol Identifier
  */
-static ssize_t target_core_dev_wwn_show_attr_vpd_protocol_identifier(
-       struct t10_wwn *t10_wwn,
-       char *page)
+static ssize_t target_wwn_vpd_protocol_identifier_show(struct config_item *item,
+               char *page)
 {
+       struct t10_wwn *t10_wwn = to_t10_wwn(item);
        struct t10_vpd *vpd;
        unsigned char buf[VPD_TMP_BUF_SIZE];
        ssize_t len = 0;
@@ -1199,25 +1163,15 @@ static ssize_t target_core_dev_wwn_show_attr_vpd_protocol_identifier(
        return len;
 }
 
-static ssize_t target_core_dev_wwn_store_attr_vpd_protocol_identifier(
-       struct t10_wwn *t10_wwn,
-       const char *page,
-       size_t count)
-{
-       return -ENOSYS;
-}
-
-SE_DEV_WWN_ATTR(vpd_protocol_identifier, S_IRUGO | S_IWUSR);
-
 /*
  * Generic wrapper for dumping VPD identifiers by association.
  */
 #define DEF_DEV_WWN_ASSOC_SHOW(_name, _assoc)                          \
-static ssize_t target_core_dev_wwn_show_attr_##_name(                  \
-       struct t10_wwn *t10_wwn,                                        \
-       char *page)                                                     \
+static ssize_t target_wwn_##_name##_show(struct config_item *item,     \
+               char *page)                                             \
 {                                                                      \
-       struct t10_vpd *vpd;                                                    \
+       struct t10_wwn *t10_wwn = to_t10_wwn(item);                     \
+       struct t10_vpd *vpd;                                            \
        unsigned char buf[VPD_TMP_BUF_SIZE];                            \
        ssize_t len = 0;                                                \
                                                                        \
@@ -1249,84 +1203,39 @@ static ssize_t target_core_dev_wwn_show_attr_##_name(                   \
        return len;                                                     \
 }
 
-/*
- * VPD page 0x83 Association: Logical Unit
- */
+/* VPD page 0x83 Association: Logical Unit */
 DEF_DEV_WWN_ASSOC_SHOW(vpd_assoc_logical_unit, 0x00);
-
-static ssize_t target_core_dev_wwn_store_attr_vpd_assoc_logical_unit(
-       struct t10_wwn *t10_wwn,
-       const char *page,
-       size_t count)
-{
-       return -ENOSYS;
-}
-
-SE_DEV_WWN_ATTR(vpd_assoc_logical_unit, S_IRUGO | S_IWUSR);
-
-/*
- * VPD page 0x83 Association: Target Port
- */
+/* VPD page 0x83 Association: Target Port */
 DEF_DEV_WWN_ASSOC_SHOW(vpd_assoc_target_port, 0x10);
-
-static ssize_t target_core_dev_wwn_store_attr_vpd_assoc_target_port(
-       struct t10_wwn *t10_wwn,
-       const char *page,
-       size_t count)
-{
-       return -ENOSYS;
-}
-
-SE_DEV_WWN_ATTR(vpd_assoc_target_port, S_IRUGO | S_IWUSR);
-
-/*
- * VPD page 0x83 Association: SCSI Target Device
- */
+/* VPD page 0x83 Association: SCSI Target Device */
 DEF_DEV_WWN_ASSOC_SHOW(vpd_assoc_scsi_target_device, 0x20);
 
-static ssize_t target_core_dev_wwn_store_attr_vpd_assoc_scsi_target_device(
-       struct t10_wwn *t10_wwn,
-       const char *page,
-       size_t count)
-{
-       return -ENOSYS;
-}
-
-SE_DEV_WWN_ATTR(vpd_assoc_scsi_target_device, S_IRUGO | S_IWUSR);
-
-CONFIGFS_EATTR_OPS(target_core_dev_wwn, t10_wwn, t10_wwn_group);
+CONFIGFS_ATTR(target_wwn_, vpd_unit_serial);
+CONFIGFS_ATTR_RO(target_wwn_, vpd_protocol_identifier);
+CONFIGFS_ATTR_RO(target_wwn_, vpd_assoc_logical_unit);
+CONFIGFS_ATTR_RO(target_wwn_, vpd_assoc_target_port);
+CONFIGFS_ATTR_RO(target_wwn_, vpd_assoc_scsi_target_device);
 
 static struct configfs_attribute *target_core_dev_wwn_attrs[] = {
-       &target_core_dev_wwn_vpd_unit_serial.attr,
-       &target_core_dev_wwn_vpd_protocol_identifier.attr,
-       &target_core_dev_wwn_vpd_assoc_logical_unit.attr,
-       &target_core_dev_wwn_vpd_assoc_target_port.attr,
-       &target_core_dev_wwn_vpd_assoc_scsi_target_device.attr,
+       &target_wwn_attr_vpd_unit_serial,
+       &target_wwn_attr_vpd_protocol_identifier,
+       &target_wwn_attr_vpd_assoc_logical_unit,
+       &target_wwn_attr_vpd_assoc_target_port,
+       &target_wwn_attr_vpd_assoc_scsi_target_device,
        NULL,
 };
 
-static struct configfs_item_operations target_core_dev_wwn_ops = {
-       .show_attribute         = target_core_dev_wwn_attr_show,
-       .store_attribute        = target_core_dev_wwn_attr_store,
-};
-
-TB_CIT_SETUP(dev_wwn, &target_core_dev_wwn_ops, NULL, target_core_dev_wwn_attrs);
+TB_CIT_SETUP(dev_wwn, NULL, NULL, target_core_dev_wwn_attrs);
 
 /*  End functions for struct config_item_type tb_dev_wwn_cit */
 
 /*  Start functions for struct config_item_type tb_dev_pr_cit */
 
-CONFIGFS_EATTR_STRUCT(target_core_dev_pr, se_device);
-#define SE_DEV_PR_ATTR(_name, _mode)                                   \
-static struct target_core_dev_pr_attribute target_core_dev_pr_##_name = \
-       __CONFIGFS_EATTR(_name, _mode,                                  \
-       target_core_dev_pr_show_attr_##_name,                           \
-       target_core_dev_pr_store_attr_##_name);
-
-#define SE_DEV_PR_ATTR_RO(_name);                                      \
-static struct target_core_dev_pr_attribute target_core_dev_pr_##_name =        \
-       __CONFIGFS_EATTR_RO(_name,                                      \
-       target_core_dev_pr_show_attr_##_name);
+static struct se_device *pr_to_dev(struct config_item *item)
+{
+       return container_of(to_config_group(item), struct se_device,
+                       dev_pr_group);
+}
 
 static ssize_t target_core_dev_pr_show_spc3_res(struct se_device *dev,
                char *page)
@@ -1367,9 +1276,9 @@ static ssize_t target_core_dev_pr_show_spc2_res(struct se_device *dev,
        return len;
 }
 
-static ssize_t target_core_dev_pr_show_attr_res_holder(struct se_device *dev,
-               char *page)
+static ssize_t target_pr_res_holder_show(struct config_item *item, char *page)
 {
+       struct se_device *dev = pr_to_dev(item);
        int ret;
 
        if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH)
@@ -1384,11 +1293,10 @@ static ssize_t target_core_dev_pr_show_attr_res_holder(struct se_device *dev,
        return ret;
 }
 
-SE_DEV_PR_ATTR_RO(res_holder);
-
-static ssize_t target_core_dev_pr_show_attr_res_pr_all_tgt_pts(
-               struct se_device *dev, char *page)
+static ssize_t target_pr_res_pr_all_tgt_pts_show(struct config_item *item,
+               char *page)
 {
+       struct se_device *dev = pr_to_dev(item);
        ssize_t len = 0;
 
        spin_lock(&dev->dev_reservation_lock);
@@ -1406,22 +1314,17 @@ static ssize_t target_core_dev_pr_show_attr_res_pr_all_tgt_pts(
        return len;
 }
 
-SE_DEV_PR_ATTR_RO(res_pr_all_tgt_pts);
-
-static ssize_t target_core_dev_pr_show_attr_res_pr_generation(
-               struct se_device *dev, char *page)
+static ssize_t target_pr_res_pr_generation_show(struct config_item *item,
+               char *page)
 {
-       return sprintf(page, "0x%08x\n", dev->t10_pr.pr_generation);
+       return sprintf(page, "0x%08x\n", pr_to_dev(item)->t10_pr.pr_generation);
 }
 
-SE_DEV_PR_ATTR_RO(res_pr_generation);
 
-/*
- * res_pr_holder_tg_port
- */
-static ssize_t target_core_dev_pr_show_attr_res_pr_holder_tg_port(
-               struct se_device *dev, char *page)
+static ssize_t target_pr_res_pr_holder_tg_port_show(struct config_item *item,
+               char *page)
 {
+       struct se_device *dev = pr_to_dev(item);
        struct se_node_acl *se_nacl;
        struct se_portal_group *se_tpg;
        struct t10_pr_registration *pr_reg;
@@ -1453,11 +1356,11 @@ out_unlock:
        return len;
 }
 
-SE_DEV_PR_ATTR_RO(res_pr_holder_tg_port);
 
-static ssize_t target_core_dev_pr_show_attr_res_pr_registered_i_pts(
-               struct se_device *dev, char *page)
+static ssize_t target_pr_res_pr_registered_i_pts_show(struct config_item *item,
+               char *page)
 {
+       struct se_device *dev = pr_to_dev(item);
        const struct target_core_fabric_ops *tfo;
        struct t10_pr_registration *pr_reg;
        unsigned char buf[384];
@@ -1495,11 +1398,9 @@ static ssize_t target_core_dev_pr_show_attr_res_pr_registered_i_pts(
        return len;
 }
 
-SE_DEV_PR_ATTR_RO(res_pr_registered_i_pts);
-
-static ssize_t target_core_dev_pr_show_attr_res_pr_type(
-               struct se_device *dev, char *page)
+static ssize_t target_pr_res_pr_type_show(struct config_item *item, char *page)
 {
+       struct se_device *dev = pr_to_dev(item);
        struct t10_pr_registration *pr_reg;
        ssize_t len = 0;
 
@@ -1516,11 +1417,10 @@ static ssize_t target_core_dev_pr_show_attr_res_pr_type(
        return len;
 }
 
-SE_DEV_PR_ATTR_RO(res_pr_type);
-
-static ssize_t target_core_dev_pr_show_attr_res_type(
-               struct se_device *dev, char *page)
+static ssize_t target_pr_res_type_show(struct config_item *item, char *page)
 {
+       struct se_device *dev = pr_to_dev(item);
+
        if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH)
                return sprintf(page, "SPC_PASSTHROUGH\n");
        else if (dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS)
@@ -1529,11 +1429,11 @@ static ssize_t target_core_dev_pr_show_attr_res_type(
                return sprintf(page, "SPC3_PERSISTENT_RESERVATIONS\n");
 }
 
-SE_DEV_PR_ATTR_RO(res_type);
-
-static ssize_t target_core_dev_pr_show_attr_res_aptpl_active(
-               struct se_device *dev, char *page)
+static ssize_t target_pr_res_aptpl_active_show(struct config_item *item,
+               char *page)
 {
+       struct se_device *dev = pr_to_dev(item);
+
        if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH)
                return 0;
 
@@ -1541,14 +1441,11 @@ static ssize_t target_core_dev_pr_show_attr_res_aptpl_active(
                (dev->t10_pr.pr_aptpl_active) ? "Activated" : "Disabled");
 }
 
-SE_DEV_PR_ATTR_RO(res_aptpl_active);
-
-/*
- * res_aptpl_metadata
- */
-static ssize_t target_core_dev_pr_show_attr_res_aptpl_metadata(
-               struct se_device *dev, char *page)
+static ssize_t target_pr_res_aptpl_metadata_show(struct config_item *item,
+               char *page)
 {
+       struct se_device *dev = pr_to_dev(item);
+
        if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH)
                return 0;
 
@@ -1580,11 +1477,10 @@ static match_table_t tokens = {
        {Opt_err, NULL}
 };
 
-static ssize_t target_core_dev_pr_store_attr_res_aptpl_metadata(
-       struct se_device *dev,
-       const char *page,
-       size_t count)
+static ssize_t target_pr_res_aptpl_metadata_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_device *dev = pr_to_dev(item);
        unsigned char *i_fabric = NULL, *i_port = NULL, *isid = NULL;
        unsigned char *t_fabric = NULL, *t_port = NULL;
        char *orig, *ptr, *opts;
@@ -1765,37 +1661,44 @@ out:
        return (ret == 0) ? count : ret;
 }
 
-SE_DEV_PR_ATTR(res_aptpl_metadata, S_IRUGO | S_IWUSR);
 
-CONFIGFS_EATTR_OPS(target_core_dev_pr, se_device, dev_pr_group);
+CONFIGFS_ATTR_RO(target_pr_, res_holder);
+CONFIGFS_ATTR_RO(target_pr_, res_pr_all_tgt_pts);
+CONFIGFS_ATTR_RO(target_pr_, res_pr_generation);
+CONFIGFS_ATTR_RO(target_pr_, res_pr_holder_tg_port);
+CONFIGFS_ATTR_RO(target_pr_, res_pr_registered_i_pts);
+CONFIGFS_ATTR_RO(target_pr_, res_pr_type);
+CONFIGFS_ATTR_RO(target_pr_, res_type);
+CONFIGFS_ATTR_RO(target_pr_, res_aptpl_active);
+CONFIGFS_ATTR(target_pr_, res_aptpl_metadata);
 
 static struct configfs_attribute *target_core_dev_pr_attrs[] = {
-       &target_core_dev_pr_res_holder.attr,
-       &target_core_dev_pr_res_pr_all_tgt_pts.attr,
-       &target_core_dev_pr_res_pr_generation.attr,
-       &target_core_dev_pr_res_pr_holder_tg_port.attr,
-       &target_core_dev_pr_res_pr_registered_i_pts.attr,
-       &target_core_dev_pr_res_pr_type.attr,
-       &target_core_dev_pr_res_type.attr,
-       &target_core_dev_pr_res_aptpl_active.attr,
-       &target_core_dev_pr_res_aptpl_metadata.attr,
+       &target_pr_attr_res_holder,
+       &target_pr_attr_res_pr_all_tgt_pts,
+       &target_pr_attr_res_pr_generation,
+       &target_pr_attr_res_pr_holder_tg_port,
+       &target_pr_attr_res_pr_registered_i_pts,
+       &target_pr_attr_res_pr_type,
+       &target_pr_attr_res_type,
+       &target_pr_attr_res_aptpl_active,
+       &target_pr_attr_res_aptpl_metadata,
        NULL,
 };
 
-static struct configfs_item_operations target_core_dev_pr_ops = {
-       .show_attribute         = target_core_dev_pr_attr_show,
-       .store_attribute        = target_core_dev_pr_attr_store,
-};
-
-TB_CIT_SETUP(dev_pr, &target_core_dev_pr_ops, NULL, target_core_dev_pr_attrs);
+TB_CIT_SETUP(dev_pr, NULL, NULL, target_core_dev_pr_attrs);
 
 /*  End functions for struct config_item_type tb_dev_pr_cit */
 
 /*  Start functions for struct config_item_type tb_dev_cit */
 
-static ssize_t target_core_show_dev_info(void *p, char *page)
+static inline struct se_device *to_device(struct config_item *item)
+{
+       return container_of(to_config_group(item), struct se_device, dev_group);
+}
+
+static ssize_t target_dev_info_show(struct config_item *item, char *page)
 {
-       struct se_device *dev = p;
+       struct se_device *dev = to_device(item);
        int bl = 0;
        ssize_t read_bytes = 0;
 
@@ -1806,35 +1709,17 @@ static ssize_t target_core_show_dev_info(void *p, char *page)
        return read_bytes;
 }
 
-static struct target_core_configfs_attribute target_core_attr_dev_info = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                   .ca_name = "info",
-                   .ca_mode = S_IRUGO },
-       .show   = target_core_show_dev_info,
-       .store  = NULL,
-};
-
-static ssize_t target_core_store_dev_control(
-       void *p,
-       const char *page,
-       size_t count)
+static ssize_t target_dev_control_store(struct config_item *item,
+               const char *page, size_t count)
 {
-       struct se_device *dev = p;
+       struct se_device *dev = to_device(item);
 
        return dev->transport->set_configfs_dev_params(dev, page, count);
 }
 
-static struct target_core_configfs_attribute target_core_attr_dev_control = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                   .ca_name = "control",
-                   .ca_mode = S_IWUSR },
-       .show   = NULL,
-       .store  = target_core_store_dev_control,
-};
-
-static ssize_t target_core_show_dev_alias(void *p, char *page)
+static ssize_t target_dev_alias_show(struct config_item *item, char *page)
 {
-       struct se_device *dev = p;
+       struct se_device *dev = to_device(item);
 
        if (!(dev->dev_flags & DF_USING_ALIAS))
                return 0;
@@ -1842,12 +1727,10 @@ static ssize_t target_core_show_dev_alias(void *p, char *page)
        return snprintf(page, PAGE_SIZE, "%s\n", dev->dev_alias);
 }
 
-static ssize_t target_core_store_dev_alias(
-       void *p,
-       const char *page,
-       size_t count)
+static ssize_t target_dev_alias_store(struct config_item *item,
+               const char *page, size_t count)
 {
-       struct se_device *dev = p;
+       struct se_device *dev = to_device(item);
        struct se_hba *hba = dev->se_hba;
        ssize_t read_bytes;
 
@@ -1874,17 +1757,9 @@ static ssize_t target_core_store_dev_alias(
        return read_bytes;
 }
 
-static struct target_core_configfs_attribute target_core_attr_dev_alias = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                   .ca_name = "alias",
-                   .ca_mode =  S_IRUGO | S_IWUSR },
-       .show   = target_core_show_dev_alias,
-       .store  = target_core_store_dev_alias,
-};
-
-static ssize_t target_core_show_dev_udev_path(void *p, char *page)
+static ssize_t target_dev_udev_path_show(struct config_item *item, char *page)
 {
-       struct se_device *dev = p;
+       struct se_device *dev = to_device(item);
 
        if (!(dev->dev_flags & DF_USING_UDEV_PATH))
                return 0;
@@ -1892,12 +1767,10 @@ static ssize_t target_core_show_dev_udev_path(void *p, char *page)
        return snprintf(page, PAGE_SIZE, "%s\n", dev->udev_path);
 }
 
-static ssize_t target_core_store_dev_udev_path(
-       void *p,
-       const char *page,
-       size_t count)
+static ssize_t target_dev_udev_path_store(struct config_item *item,
+               const char *page, size_t count)
 {
-       struct se_device *dev = p;
+       struct se_device *dev = to_device(item);
        struct se_hba *hba = dev->se_hba;
        ssize_t read_bytes;
 
@@ -1925,27 +1798,17 @@ static ssize_t target_core_store_dev_udev_path(
        return read_bytes;
 }
 
-static struct target_core_configfs_attribute target_core_attr_dev_udev_path = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                   .ca_name = "udev_path",
-                   .ca_mode =  S_IRUGO | S_IWUSR },
-       .show   = target_core_show_dev_udev_path,
-       .store  = target_core_store_dev_udev_path,
-};
-
-static ssize_t target_core_show_dev_enable(void *p, char *page)
+static ssize_t target_dev_enable_show(struct config_item *item, char *page)
 {
-       struct se_device *dev = p;
+       struct se_device *dev = to_device(item);
 
        return snprintf(page, PAGE_SIZE, "%d\n", !!(dev->dev_flags & DF_CONFIGURED));
 }
 
-static ssize_t target_core_store_dev_enable(
-       void *p,
-       const char *page,
-       size_t count)
+static ssize_t target_dev_enable_store(struct config_item *item,
+               const char *page, size_t count)
 {
-       struct se_device *dev = p;
+       struct se_device *dev = to_device(item);
        char *ptr;
        int ret;
 
@@ -1962,17 +1825,9 @@ static ssize_t target_core_store_dev_enable(
        return count;
 }
 
-static struct target_core_configfs_attribute target_core_attr_dev_enable = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                   .ca_name = "enable",
-                   .ca_mode =  S_IRUGO | S_IWUSR },
-       .show   = target_core_show_dev_enable,
-       .store  = target_core_store_dev_enable,
-};
-
-static ssize_t target_core_show_alua_lu_gp(void *p, char *page)
+static ssize_t target_dev_alua_lu_gp_show(struct config_item *item, char *page)
 {
-       struct se_device *dev = p;
+       struct se_device *dev = to_device(item);
        struct config_item *lu_ci;
        struct t10_alua_lu_gp *lu_gp;
        struct t10_alua_lu_gp_member *lu_gp_mem;
@@ -1994,12 +1849,10 @@ static ssize_t target_core_show_alua_lu_gp(void *p, char *page)
        return len;
 }
 
-static ssize_t target_core_store_alua_lu_gp(
-       void *p,
-       const char *page,
-       size_t count)
+static ssize_t target_dev_alua_lu_gp_store(struct config_item *item,
+               const char *page, size_t count)
 {
-       struct se_device *dev = p;
+       struct se_device *dev = to_device(item);
        struct se_hba *hba = dev->se_hba;
        struct t10_alua_lu_gp *lu_gp = NULL, *lu_gp_new = NULL;
        struct t10_alua_lu_gp_member *lu_gp_mem;
@@ -2076,17 +1929,9 @@ static ssize_t target_core_store_alua_lu_gp(
        return count;
 }
 
-static struct target_core_configfs_attribute target_core_attr_dev_alua_lu_gp = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                   .ca_name = "alua_lu_gp",
-                   .ca_mode = S_IRUGO | S_IWUSR },
-       .show   = target_core_show_alua_lu_gp,
-       .store  = target_core_store_alua_lu_gp,
-};
-
-static ssize_t target_core_show_dev_lba_map(void *p, char *page)
+static ssize_t target_dev_lba_map_show(struct config_item *item, char *page)
 {
-       struct se_device *dev = p;
+       struct se_device *dev = to_device(item);
        struct t10_alua_lba_map *map;
        struct t10_alua_lba_map_member *mem;
        char *b = page;
@@ -2129,12 +1974,10 @@ static ssize_t target_core_show_dev_lba_map(void *p, char *page)
        return bl;
 }
 
-static ssize_t target_core_store_dev_lba_map(
-       void *p,
-       const char *page,
-       size_t count)
+static ssize_t target_dev_lba_map_store(struct config_item *item,
+               const char *page, size_t count)
 {
-       struct se_device *dev = p;
+       struct se_device *dev = to_device(item);
        struct t10_alua_lba_map *lba_map = NULL;
        struct list_head lba_list;
        char *map_entries, *ptr;
@@ -2246,22 +2089,22 @@ out:
        return count;
 }
 
-static struct target_core_configfs_attribute target_core_attr_dev_lba_map = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                   .ca_name = "lba_map",
-                   .ca_mode = S_IRUGO | S_IWUSR },
-       .show   = target_core_show_dev_lba_map,
-       .store  = target_core_store_dev_lba_map,
-};
+CONFIGFS_ATTR_RO(target_dev_, info);
+CONFIGFS_ATTR_WO(target_dev_, control);
+CONFIGFS_ATTR(target_dev_, alias);
+CONFIGFS_ATTR(target_dev_, udev_path);
+CONFIGFS_ATTR(target_dev_, enable);
+CONFIGFS_ATTR(target_dev_, alua_lu_gp);
+CONFIGFS_ATTR(target_dev_, lba_map);
 
 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,
-       &target_core_attr_dev_udev_path.attr,
-       &target_core_attr_dev_enable.attr,
-       &target_core_attr_dev_alua_lu_gp.attr,
-       &target_core_attr_dev_lba_map.attr,
+       &target_dev_attr_info,
+       &target_dev_attr_control,
+       &target_dev_attr_alias,
+       &target_dev_attr_udev_path,
+       &target_dev_attr_enable,
+       &target_dev_attr_alua_lu_gp,
+       &target_dev_attr_lba_map,
        NULL,
 };
 
@@ -2275,42 +2118,8 @@ static void target_core_dev_release(struct config_item *item)
        target_free_device(dev);
 }
 
-static ssize_t target_core_dev_show(struct config_item *item,
-                                    struct configfs_attribute *attr,
-                                    char *page)
-{
-       struct config_group *dev_cg = to_config_group(item);
-       struct se_device *dev =
-               container_of(dev_cg, struct se_device, dev_group);
-       struct target_core_configfs_attribute *tc_attr = container_of(
-                       attr, struct target_core_configfs_attribute, attr);
-
-       if (!tc_attr->show)
-               return -EINVAL;
-
-       return tc_attr->show(dev, page);
-}
-
-static ssize_t target_core_dev_store(struct config_item *item,
-                                     struct configfs_attribute *attr,
-                                     const char *page, size_t count)
-{
-       struct config_group *dev_cg = to_config_group(item);
-       struct se_device *dev =
-               container_of(dev_cg, struct se_device, dev_group);
-       struct target_core_configfs_attribute *tc_attr = container_of(
-                       attr, struct target_core_configfs_attribute, attr);
-
-       if (!tc_attr->store)
-               return -EINVAL;
-
-       return tc_attr->store(dev, page, count);
-}
-
 static struct configfs_item_operations target_core_dev_item_ops = {
        .release                = target_core_dev_release,
-       .show_attribute         = target_core_dev_show,
-       .store_attribute        = target_core_dev_store,
 };
 
 TB_CIT_SETUP(dev, &target_core_dev_item_ops, NULL, target_core_dev_attrs);
@@ -2319,38 +2128,25 @@ TB_CIT_SETUP(dev, &target_core_dev_item_ops, NULL, target_core_dev_attrs);
 
 /* Start functions for struct config_item_type target_core_alua_lu_gp_cit */
 
-CONFIGFS_EATTR_STRUCT(target_core_alua_lu_gp, t10_alua_lu_gp);
-#define SE_DEV_ALUA_LU_ATTR(_name, _mode)                              \
-static struct target_core_alua_lu_gp_attribute                         \
-                       target_core_alua_lu_gp_##_name =                \
-       __CONFIGFS_EATTR(_name, _mode,                                  \
-       target_core_alua_lu_gp_show_attr_##_name,                       \
-       target_core_alua_lu_gp_store_attr_##_name);
-
-#define SE_DEV_ALUA_LU_ATTR_RO(_name)                                  \
-static struct target_core_alua_lu_gp_attribute                         \
-                       target_core_alua_lu_gp_##_name =                \
-       __CONFIGFS_EATTR_RO(_name,                                      \
-       target_core_alua_lu_gp_show_attr_##_name);
+static inline struct t10_alua_lu_gp *to_lu_gp(struct config_item *item)
+{
+       return container_of(to_config_group(item), struct t10_alua_lu_gp,
+                       lu_gp_group);
+}
 
-/*
- * lu_gp_id
- */
-static ssize_t target_core_alua_lu_gp_show_attr_lu_gp_id(
-       struct t10_alua_lu_gp *lu_gp,
-       char *page)
+static ssize_t target_lu_gp_lu_gp_id_show(struct config_item *item, char *page)
 {
+       struct t10_alua_lu_gp *lu_gp = to_lu_gp(item);
+
        if (!lu_gp->lu_gp_valid_id)
                return 0;
-
        return sprintf(page, "%hu\n", lu_gp->lu_gp_id);
 }
 
-static ssize_t target_core_alua_lu_gp_store_attr_lu_gp_id(
-       struct t10_alua_lu_gp *lu_gp,
-       const char *page,
-       size_t count)
+static ssize_t target_lu_gp_lu_gp_id_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct t10_alua_lu_gp *lu_gp = to_lu_gp(item);
        struct config_group *alua_lu_gp_cg = &lu_gp->lu_gp_group;
        unsigned long lu_gp_id;
        int ret;
@@ -2379,15 +2175,9 @@ static ssize_t target_core_alua_lu_gp_store_attr_lu_gp_id(
        return count;
 }
 
-SE_DEV_ALUA_LU_ATTR(lu_gp_id, S_IRUGO | S_IWUSR);
-
-/*
- * members
- */
-static ssize_t target_core_alua_lu_gp_show_attr_members(
-       struct t10_alua_lu_gp *lu_gp,
-       char *page)
+static ssize_t target_lu_gp_members_show(struct config_item *item, char *page)
 {
+       struct t10_alua_lu_gp *lu_gp = to_lu_gp(item);
        struct se_device *dev;
        struct se_hba *hba;
        struct t10_alua_lu_gp_member *lu_gp_mem;
@@ -2419,13 +2209,12 @@ static ssize_t target_core_alua_lu_gp_show_attr_members(
        return len;
 }
 
-SE_DEV_ALUA_LU_ATTR_RO(members);
-
-CONFIGFS_EATTR_OPS(target_core_alua_lu_gp, t10_alua_lu_gp, lu_gp_group);
+CONFIGFS_ATTR(target_lu_gp_, lu_gp_id);
+CONFIGFS_ATTR_RO(target_lu_gp_, members);
 
 static struct configfs_attribute *target_core_alua_lu_gp_attrs[] = {
-       &target_core_alua_lu_gp_lu_gp_id.attr,
-       &target_core_alua_lu_gp_members.attr,
+       &target_lu_gp_attr_lu_gp_id,
+       &target_lu_gp_attr_members,
        NULL,
 };
 
@@ -2439,8 +2228,6 @@ static void target_core_alua_lu_gp_release(struct config_item *item)
 
 static struct configfs_item_operations target_core_alua_lu_gp_ops = {
        .release                = target_core_alua_lu_gp_release,
-       .show_attribute         = target_core_alua_lu_gp_attr_show,
-       .store_attribute        = target_core_alua_lu_gp_attr_store,
 };
 
 static struct config_item_type target_core_alua_lu_gp_cit = {
@@ -2511,36 +2298,23 @@ static struct config_item_type target_core_alua_lu_gps_cit = {
 
 /* Start functions for struct config_item_type target_core_alua_tg_pt_gp_cit */
 
-CONFIGFS_EATTR_STRUCT(target_core_alua_tg_pt_gp, t10_alua_tg_pt_gp);
-#define SE_DEV_ALUA_TG_PT_ATTR(_name, _mode)                           \
-static struct target_core_alua_tg_pt_gp_attribute                      \
-                       target_core_alua_tg_pt_gp_##_name =             \
-       __CONFIGFS_EATTR(_name, _mode,                                  \
-       target_core_alua_tg_pt_gp_show_attr_##_name,                    \
-       target_core_alua_tg_pt_gp_store_attr_##_name);
-
-#define SE_DEV_ALUA_TG_PT_ATTR_RO(_name)                               \
-static struct target_core_alua_tg_pt_gp_attribute                      \
-                       target_core_alua_tg_pt_gp_##_name =             \
-       __CONFIGFS_EATTR_RO(_name,                                      \
-       target_core_alua_tg_pt_gp_show_attr_##_name);
+static inline struct t10_alua_tg_pt_gp *to_tg_pt_gp(struct config_item *item)
+{
+       return container_of(to_config_group(item), struct t10_alua_tg_pt_gp,
+                       tg_pt_gp_group);
+}
 
-/*
- * alua_access_state
- */
-static ssize_t target_core_alua_tg_pt_gp_show_attr_alua_access_state(
-       struct t10_alua_tg_pt_gp *tg_pt_gp,
-       char *page)
+static ssize_t target_tg_pt_gp_alua_access_state_show(struct config_item *item,
+               char *page)
 {
        return sprintf(page, "%d\n",
-               atomic_read(&tg_pt_gp->tg_pt_gp_alua_access_state));
+               atomic_read(&to_tg_pt_gp(item)->tg_pt_gp_alua_access_state));
 }
 
-static ssize_t target_core_alua_tg_pt_gp_store_attr_alua_access_state(
-       struct t10_alua_tg_pt_gp *tg_pt_gp,
-       const char *page,
-       size_t count)
+static ssize_t target_tg_pt_gp_alua_access_state_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct t10_alua_tg_pt_gp *tg_pt_gp = to_tg_pt_gp(item);
        struct se_device *dev = tg_pt_gp->tg_pt_gp_dev;
        unsigned long tmp;
        int new_state, ret;
@@ -2582,24 +2356,18 @@ static ssize_t target_core_alua_tg_pt_gp_store_attr_alua_access_state(
        return (!ret) ? count : -EINVAL;
 }
 
-SE_DEV_ALUA_TG_PT_ATTR(alua_access_state, S_IRUGO | S_IWUSR);
-
-/*
- * alua_access_status
- */
-static ssize_t target_core_alua_tg_pt_gp_show_attr_alua_access_status(
-       struct t10_alua_tg_pt_gp *tg_pt_gp,
-       char *page)
+static ssize_t target_tg_pt_gp_alua_access_status_show(struct config_item *item,
+               char *page)
 {
+       struct t10_alua_tg_pt_gp *tg_pt_gp = to_tg_pt_gp(item);
        return sprintf(page, "%s\n",
                core_alua_dump_status(tg_pt_gp->tg_pt_gp_alua_access_status));
 }
 
-static ssize_t target_core_alua_tg_pt_gp_store_attr_alua_access_status(
-       struct t10_alua_tg_pt_gp *tg_pt_gp,
-       const char *page,
-       size_t count)
+static ssize_t target_tg_pt_gp_alua_access_status_store(
+               struct config_item *item, const char *page, size_t count)
 {
+       struct t10_alua_tg_pt_gp *tg_pt_gp = to_tg_pt_gp(item);
        unsigned long tmp;
        int new_status, ret;
 
@@ -2630,43 +2398,31 @@ static ssize_t target_core_alua_tg_pt_gp_store_attr_alua_access_status(
        return count;
 }
 
-SE_DEV_ALUA_TG_PT_ATTR(alua_access_status, S_IRUGO | S_IWUSR);
-
-/*
- * alua_access_type
- */
-static ssize_t target_core_alua_tg_pt_gp_show_attr_alua_access_type(
-       struct t10_alua_tg_pt_gp *tg_pt_gp,
-       char *page)
+static ssize_t target_tg_pt_gp_alua_access_type_show(struct config_item *item,
+               char *page)
 {
-       return core_alua_show_access_type(tg_pt_gp, page);
+       return core_alua_show_access_type(to_tg_pt_gp(item), page);
 }
 
-static ssize_t target_core_alua_tg_pt_gp_store_attr_alua_access_type(
-       struct t10_alua_tg_pt_gp *tg_pt_gp,
-       const char *page,
-       size_t count)
+static ssize_t target_tg_pt_gp_alua_access_type_store(struct config_item *item,
+               const char *page, size_t count)
 {
-       return core_alua_store_access_type(tg_pt_gp, page, count);
+       return core_alua_store_access_type(to_tg_pt_gp(item), page, count);
 }
 
-SE_DEV_ALUA_TG_PT_ATTR(alua_access_type, S_IRUGO | S_IWUSR);
-
-/*
- * alua_supported_states
- */
-
-#define SE_DEV_ALUA_SUPPORT_STATE_SHOW(_name, _var, _bit)              \
-static ssize_t target_core_alua_tg_pt_gp_show_attr_alua_support_##_name( \
-       struct t10_alua_tg_pt_gp *t, char *p)                           \
+#define ALUA_SUPPORTED_STATE_ATTR(_name, _bit)                         \
+static ssize_t target_tg_pt_gp_alua_support_##_name##_show(            \
+               struct config_item *item, char *p)                      \
 {                                                                      \
-       return sprintf(p, "%d\n", !!(t->_var & _bit));                  \
-}
-
-#define SE_DEV_ALUA_SUPPORT_STATE_STORE(_name, _var, _bit)             \
-static ssize_t target_core_alua_tg_pt_gp_store_attr_alua_support_##_name(\
-       struct t10_alua_tg_pt_gp *t, const char *p, size_t c)           \
+       struct t10_alua_tg_pt_gp *t = to_tg_pt_gp(item);                \
+       return sprintf(p, "%d\n",                                       \
+               !!(t->tg_pt_gp_alua_supported_states & _bit));          \
+}                                                                      \
+                                                                       \
+static ssize_t target_tg_pt_gp_alua_support_##_name##_store(           \
+               struct config_item *item, const char *p, size_t c)      \
 {                                                                      \
+       struct t10_alua_tg_pt_gp *t = to_tg_pt_gp(item);                \
        unsigned long tmp;                                              \
        int ret;                                                        \
                                                                        \
@@ -2687,70 +2443,32 @@ static ssize_t target_core_alua_tg_pt_gp_store_attr_alua_support_##_name(\
                return -EINVAL;                                         \
        }                                                               \
        if (tmp)                                                        \
-               t->_var |= _bit;                                        \
+               t->tg_pt_gp_alua_supported_states |= _bit;              \
        else                                                            \
-               t->_var &= ~_bit;                                       \
+               t->tg_pt_gp_alua_supported_states &= ~_bit;             \
                                                                        \
        return c;                                                       \
 }
 
-SE_DEV_ALUA_SUPPORT_STATE_SHOW(transitioning,
-                              tg_pt_gp_alua_supported_states, ALUA_T_SUP);
-SE_DEV_ALUA_SUPPORT_STATE_STORE(transitioning,
-                               tg_pt_gp_alua_supported_states, ALUA_T_SUP);
-SE_DEV_ALUA_TG_PT_ATTR(alua_support_transitioning, S_IRUGO | S_IWUSR);
-
-SE_DEV_ALUA_SUPPORT_STATE_SHOW(offline,
-                              tg_pt_gp_alua_supported_states, ALUA_O_SUP);
-SE_DEV_ALUA_SUPPORT_STATE_STORE(offline,
-                               tg_pt_gp_alua_supported_states, ALUA_O_SUP);
-SE_DEV_ALUA_TG_PT_ATTR(alua_support_offline, S_IRUGO | S_IWUSR);
-
-SE_DEV_ALUA_SUPPORT_STATE_SHOW(lba_dependent,
-                              tg_pt_gp_alua_supported_states, ALUA_LBD_SUP);
-SE_DEV_ALUA_SUPPORT_STATE_STORE(lba_dependent,
-                               tg_pt_gp_alua_supported_states, ALUA_LBD_SUP);
-SE_DEV_ALUA_TG_PT_ATTR(alua_support_lba_dependent, S_IRUGO);
-
-SE_DEV_ALUA_SUPPORT_STATE_SHOW(unavailable,
-                              tg_pt_gp_alua_supported_states, ALUA_U_SUP);
-SE_DEV_ALUA_SUPPORT_STATE_STORE(unavailable,
-                               tg_pt_gp_alua_supported_states, ALUA_U_SUP);
-SE_DEV_ALUA_TG_PT_ATTR(alua_support_unavailable, S_IRUGO | S_IWUSR);
-
-SE_DEV_ALUA_SUPPORT_STATE_SHOW(standby,
-                              tg_pt_gp_alua_supported_states, ALUA_S_SUP);
-SE_DEV_ALUA_SUPPORT_STATE_STORE(standby,
-                               tg_pt_gp_alua_supported_states, ALUA_S_SUP);
-SE_DEV_ALUA_TG_PT_ATTR(alua_support_standby, S_IRUGO | S_IWUSR);
-
-SE_DEV_ALUA_SUPPORT_STATE_SHOW(active_optimized,
-                              tg_pt_gp_alua_supported_states, ALUA_AO_SUP);
-SE_DEV_ALUA_SUPPORT_STATE_STORE(active_optimized,
-                               tg_pt_gp_alua_supported_states, ALUA_AO_SUP);
-SE_DEV_ALUA_TG_PT_ATTR(alua_support_active_optimized, S_IRUGO | S_IWUSR);
-
-SE_DEV_ALUA_SUPPORT_STATE_SHOW(active_nonoptimized,
-                              tg_pt_gp_alua_supported_states, ALUA_AN_SUP);
-SE_DEV_ALUA_SUPPORT_STATE_STORE(active_nonoptimized,
-                               tg_pt_gp_alua_supported_states, ALUA_AN_SUP);
-SE_DEV_ALUA_TG_PT_ATTR(alua_support_active_nonoptimized, S_IRUGO | S_IWUSR);
+ALUA_SUPPORTED_STATE_ATTR(transitioning, ALUA_T_SUP);
+ALUA_SUPPORTED_STATE_ATTR(offline, ALUA_O_SUP);
+ALUA_SUPPORTED_STATE_ATTR(lba_dependent, ALUA_LBD_SUP);
+ALUA_SUPPORTED_STATE_ATTR(unavailable, ALUA_U_SUP);
+ALUA_SUPPORTED_STATE_ATTR(standby, ALUA_S_SUP);
+ALUA_SUPPORTED_STATE_ATTR(active_optimized, ALUA_AO_SUP);
+ALUA_SUPPORTED_STATE_ATTR(active_nonoptimized, ALUA_AN_SUP);
 
-/*
- * alua_write_metadata
- */
-static ssize_t target_core_alua_tg_pt_gp_show_attr_alua_write_metadata(
-       struct t10_alua_tg_pt_gp *tg_pt_gp,
-       char *page)
+static ssize_t target_tg_pt_gp_alua_write_metadata_show(
+               struct config_item *item, char *page)
 {
-       return sprintf(page, "%d\n", tg_pt_gp->tg_pt_gp_write_metadata);
+       return sprintf(page, "%d\n",
+               to_tg_pt_gp(item)->tg_pt_gp_write_metadata);
 }
 
-static ssize_t target_core_alua_tg_pt_gp_store_attr_alua_write_metadata(
-       struct t10_alua_tg_pt_gp *tg_pt_gp,
-       const char *page,
-       size_t count)
+static ssize_t target_tg_pt_gp_alua_write_metadata_store(
+               struct config_item *item, const char *page, size_t count)
 {
+       struct t10_alua_tg_pt_gp *tg_pt_gp = to_tg_pt_gp(item);
        unsigned long tmp;
        int ret;
 
@@ -2770,110 +2488,71 @@ static ssize_t target_core_alua_tg_pt_gp_store_attr_alua_write_metadata(
        return count;
 }
 
-SE_DEV_ALUA_TG_PT_ATTR(alua_write_metadata, S_IRUGO | S_IWUSR);
-
-
-
-/*
- * nonop_delay_msecs
- */
-static ssize_t target_core_alua_tg_pt_gp_show_attr_nonop_delay_msecs(
-       struct t10_alua_tg_pt_gp *tg_pt_gp,
-       char *page)
+static ssize_t target_tg_pt_gp_nonop_delay_msecs_show(struct config_item *item,
+               char *page)
 {
-       return core_alua_show_nonop_delay_msecs(tg_pt_gp, page);
-
+       return core_alua_show_nonop_delay_msecs(to_tg_pt_gp(item), page);
 }
 
-static ssize_t target_core_alua_tg_pt_gp_store_attr_nonop_delay_msecs(
-       struct t10_alua_tg_pt_gp *tg_pt_gp,
-       const char *page,
-       size_t count)
+static ssize_t target_tg_pt_gp_nonop_delay_msecs_store(struct config_item *item,
+               const char *page, size_t count)
 {
-       return core_alua_store_nonop_delay_msecs(tg_pt_gp, page, count);
+       return core_alua_store_nonop_delay_msecs(to_tg_pt_gp(item), page,
+                       count);
 }
 
-SE_DEV_ALUA_TG_PT_ATTR(nonop_delay_msecs, S_IRUGO | S_IWUSR);
-
-/*
- * trans_delay_msecs
- */
-static ssize_t target_core_alua_tg_pt_gp_show_attr_trans_delay_msecs(
-       struct t10_alua_tg_pt_gp *tg_pt_gp,
-       char *page)
+static ssize_t target_tg_pt_gp_trans_delay_msecs_show(struct config_item *item,
+               char *page)
 {
-       return core_alua_show_trans_delay_msecs(tg_pt_gp, page);
+       return core_alua_show_trans_delay_msecs(to_tg_pt_gp(item), page);
 }
 
-static ssize_t target_core_alua_tg_pt_gp_store_attr_trans_delay_msecs(
-       struct t10_alua_tg_pt_gp *tg_pt_gp,
-       const char *page,
-       size_t count)
+static ssize_t target_tg_pt_gp_trans_delay_msecs_store(struct config_item *item,
+               const char *page, size_t count)
 {
-       return core_alua_store_trans_delay_msecs(tg_pt_gp, page, count);
+       return core_alua_store_trans_delay_msecs(to_tg_pt_gp(item), page,
+                       count);
 }
 
-SE_DEV_ALUA_TG_PT_ATTR(trans_delay_msecs, S_IRUGO | S_IWUSR);
-
-/*
- * implicit_trans_secs
- */
-static ssize_t target_core_alua_tg_pt_gp_show_attr_implicit_trans_secs(
-       struct t10_alua_tg_pt_gp *tg_pt_gp,
-       char *page)
+static ssize_t target_tg_pt_gp_implicit_trans_secs_show(
+               struct config_item *item, char *page)
 {
-       return core_alua_show_implicit_trans_secs(tg_pt_gp, page);
+       return core_alua_show_implicit_trans_secs(to_tg_pt_gp(item), page);
 }
 
-static ssize_t target_core_alua_tg_pt_gp_store_attr_implicit_trans_secs(
-       struct t10_alua_tg_pt_gp *tg_pt_gp,
-       const char *page,
-       size_t count)
+static ssize_t target_tg_pt_gp_implicit_trans_secs_store(
+               struct config_item *item, const char *page, size_t count)
 {
-       return core_alua_store_implicit_trans_secs(tg_pt_gp, page, count);
+       return core_alua_store_implicit_trans_secs(to_tg_pt_gp(item), page,
+                       count);
 }
 
-SE_DEV_ALUA_TG_PT_ATTR(implicit_trans_secs, S_IRUGO | S_IWUSR);
-
-/*
- * preferred
- */
-
-static ssize_t target_core_alua_tg_pt_gp_show_attr_preferred(
-       struct t10_alua_tg_pt_gp *tg_pt_gp,
-       char *page)
+static ssize_t target_tg_pt_gp_preferred_show(struct config_item *item,
+               char *page)
 {
-       return core_alua_show_preferred_bit(tg_pt_gp, page);
+       return core_alua_show_preferred_bit(to_tg_pt_gp(item), page);
 }
 
-static ssize_t target_core_alua_tg_pt_gp_store_attr_preferred(
-       struct t10_alua_tg_pt_gp *tg_pt_gp,
-       const char *page,
-       size_t count)
+static ssize_t target_tg_pt_gp_preferred_store(struct config_item *item,
+               const char *page, size_t count)
 {
-       return core_alua_store_preferred_bit(tg_pt_gp, page, count);
+       return core_alua_store_preferred_bit(to_tg_pt_gp(item), page, count);
 }
 
-SE_DEV_ALUA_TG_PT_ATTR(preferred, S_IRUGO | S_IWUSR);
-
-/*
- * tg_pt_gp_id
- */
-static ssize_t target_core_alua_tg_pt_gp_show_attr_tg_pt_gp_id(
-       struct t10_alua_tg_pt_gp *tg_pt_gp,
-       char *page)
+static ssize_t target_tg_pt_gp_tg_pt_gp_id_show(struct config_item *item,
+               char *page)
 {
+       struct t10_alua_tg_pt_gp *tg_pt_gp = to_tg_pt_gp(item);
+
        if (!tg_pt_gp->tg_pt_gp_valid_id)
                return 0;
-
        return sprintf(page, "%hu\n", tg_pt_gp->tg_pt_gp_id);
 }
 
-static ssize_t target_core_alua_tg_pt_gp_store_attr_tg_pt_gp_id(
-       struct t10_alua_tg_pt_gp *tg_pt_gp,
-       const char *page,
-       size_t count)
+static ssize_t target_tg_pt_gp_tg_pt_gp_id_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct t10_alua_tg_pt_gp *tg_pt_gp = to_tg_pt_gp(item);
        struct config_group *alua_tg_pt_gp_cg = &tg_pt_gp->tg_pt_gp_group;
        unsigned long tg_pt_gp_id;
        int ret;
@@ -2902,15 +2581,10 @@ static ssize_t target_core_alua_tg_pt_gp_store_attr_tg_pt_gp_id(
        return count;
 }
 
-SE_DEV_ALUA_TG_PT_ATTR(tg_pt_gp_id, S_IRUGO | S_IWUSR);
-
-/*
- * members
- */
-static ssize_t target_core_alua_tg_pt_gp_show_attr_members(
-       struct t10_alua_tg_pt_gp *tg_pt_gp,
-       char *page)
+static ssize_t target_tg_pt_gp_members_show(struct config_item *item,
+               char *page)
 {
+       struct t10_alua_tg_pt_gp *tg_pt_gp = to_tg_pt_gp(item);
        struct se_lun *lun;
        ssize_t len = 0, cur_len;
        unsigned char buf[TG_PT_GROUP_NAME_BUF];
@@ -2942,29 +2616,42 @@ static ssize_t target_core_alua_tg_pt_gp_show_attr_members(
        return len;
 }
 
-SE_DEV_ALUA_TG_PT_ATTR_RO(members);
-
-CONFIGFS_EATTR_OPS(target_core_alua_tg_pt_gp, t10_alua_tg_pt_gp,
-                       tg_pt_gp_group);
+CONFIGFS_ATTR(target_tg_pt_gp_, alua_access_state);
+CONFIGFS_ATTR(target_tg_pt_gp_, alua_access_status);
+CONFIGFS_ATTR(target_tg_pt_gp_, alua_access_type);
+CONFIGFS_ATTR(target_tg_pt_gp_, alua_support_transitioning);
+CONFIGFS_ATTR(target_tg_pt_gp_, alua_support_offline);
+CONFIGFS_ATTR(target_tg_pt_gp_, alua_support_lba_dependent);
+CONFIGFS_ATTR(target_tg_pt_gp_, alua_support_unavailable);
+CONFIGFS_ATTR(target_tg_pt_gp_, alua_support_standby);
+CONFIGFS_ATTR(target_tg_pt_gp_, alua_support_active_optimized);
+CONFIGFS_ATTR(target_tg_pt_gp_, alua_support_active_nonoptimized);
+CONFIGFS_ATTR(target_tg_pt_gp_, alua_write_metadata);
+CONFIGFS_ATTR(target_tg_pt_gp_, nonop_delay_msecs);
+CONFIGFS_ATTR(target_tg_pt_gp_, trans_delay_msecs);
+CONFIGFS_ATTR(target_tg_pt_gp_, implicit_trans_secs);
+CONFIGFS_ATTR(target_tg_pt_gp_, preferred);
+CONFIGFS_ATTR(target_tg_pt_gp_, tg_pt_gp_id);
+CONFIGFS_ATTR_RO(target_tg_pt_gp_, members);
 
 static struct configfs_attribute *target_core_alua_tg_pt_gp_attrs[] = {
-       &target_core_alua_tg_pt_gp_alua_access_state.attr,
-       &target_core_alua_tg_pt_gp_alua_access_status.attr,
-       &target_core_alua_tg_pt_gp_alua_access_type.attr,
-       &target_core_alua_tg_pt_gp_alua_support_transitioning.attr,
-       &target_core_alua_tg_pt_gp_alua_support_offline.attr,
-       &target_core_alua_tg_pt_gp_alua_support_lba_dependent.attr,
-       &target_core_alua_tg_pt_gp_alua_support_unavailable.attr,
-       &target_core_alua_tg_pt_gp_alua_support_standby.attr,
-       &target_core_alua_tg_pt_gp_alua_support_active_nonoptimized.attr,
-       &target_core_alua_tg_pt_gp_alua_support_active_optimized.attr,
-       &target_core_alua_tg_pt_gp_alua_write_metadata.attr,
-       &target_core_alua_tg_pt_gp_nonop_delay_msecs.attr,
-       &target_core_alua_tg_pt_gp_trans_delay_msecs.attr,
-       &target_core_alua_tg_pt_gp_implicit_trans_secs.attr,
-       &target_core_alua_tg_pt_gp_preferred.attr,
-       &target_core_alua_tg_pt_gp_tg_pt_gp_id.attr,
-       &target_core_alua_tg_pt_gp_members.attr,
+       &target_tg_pt_gp_attr_alua_access_state,
+       &target_tg_pt_gp_attr_alua_access_status,
+       &target_tg_pt_gp_attr_alua_access_type,
+       &target_tg_pt_gp_attr_alua_support_transitioning,
+       &target_tg_pt_gp_attr_alua_support_offline,
+       &target_tg_pt_gp_attr_alua_support_lba_dependent,
+       &target_tg_pt_gp_attr_alua_support_unavailable,
+       &target_tg_pt_gp_attr_alua_support_standby,
+       &target_tg_pt_gp_attr_alua_support_active_nonoptimized,
+       &target_tg_pt_gp_attr_alua_support_active_optimized,
+       &target_tg_pt_gp_attr_alua_write_metadata,
+       &target_tg_pt_gp_attr_nonop_delay_msecs,
+       &target_tg_pt_gp_attr_trans_delay_msecs,
+       &target_tg_pt_gp_attr_implicit_trans_secs,
+       &target_tg_pt_gp_attr_preferred,
+       &target_tg_pt_gp_attr_tg_pt_gp_id,
+       &target_tg_pt_gp_attr_members,
        NULL,
 };
 
@@ -2978,8 +2665,6 @@ static void target_core_alua_tg_pt_gp_release(struct config_item *item)
 
 static struct configfs_item_operations target_core_alua_tg_pt_gp_ops = {
        .release                = target_core_alua_tg_pt_gp_release,
-       .show_attribute         = target_core_alua_tg_pt_gp_attr_show,
-       .store_attribute        = target_core_alua_tg_pt_gp_attr_store,
 };
 
 static struct config_item_type target_core_alua_tg_pt_gp_cit = {
@@ -3237,34 +2922,24 @@ static struct configfs_group_operations target_core_hba_group_ops = {
        .drop_item              = target_core_drop_subdev,
 };
 
-CONFIGFS_EATTR_STRUCT(target_core_hba, se_hba);
-#define SE_HBA_ATTR(_name, _mode)                              \
-static struct target_core_hba_attribute                                \
-               target_core_hba_##_name =                       \
-               __CONFIGFS_EATTR(_name, _mode,                  \
-               target_core_hba_show_attr_##_name,              \
-               target_core_hba_store_attr_##_name);
 
-#define SE_HBA_ATTR_RO(_name)                                  \
-static struct target_core_hba_attribute                                \
-               target_core_hba_##_name =                       \
-               __CONFIGFS_EATTR_RO(_name,                      \
-               target_core_hba_show_attr_##_name);
+static inline struct se_hba *to_hba(struct config_item *item)
+{
+       return container_of(to_config_group(item), struct se_hba, hba_group);
+}
 
-static ssize_t target_core_hba_show_attr_hba_info(
-       struct se_hba *hba,
-       char *page)
+static ssize_t target_hba_info_show(struct config_item *item, char *page)
 {
+       struct se_hba *hba = to_hba(item);
+
        return sprintf(page, "HBA Index: %d plugin: %s version: %s\n",
                        hba->hba_id, hba->backend->ops->name,
                        TARGET_CORE_VERSION);
 }
 
-SE_HBA_ATTR_RO(hba_info);
-
-static ssize_t target_core_hba_show_attr_hba_mode(struct se_hba *hba,
-                               char *page)
+static ssize_t target_hba_mode_show(struct config_item *item, char *page)
 {
+       struct se_hba *hba = to_hba(item);
        int hba_mode = 0;
 
        if (hba->hba_flags & HBA_FLAGS_PSCSI_MODE)
@@ -3273,9 +2948,10 @@ static ssize_t target_core_hba_show_attr_hba_mode(struct se_hba *hba,
        return sprintf(page, "%d\n", hba_mode);
 }
 
-static ssize_t target_core_hba_store_attr_hba_mode(struct se_hba *hba,
-                               const char *page, size_t count)
+static ssize_t target_hba_mode_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_hba *hba = to_hba(item);
        unsigned long mode_flag;
        int ret;
 
@@ -3304,9 +2980,8 @@ static ssize_t target_core_hba_store_attr_hba_mode(struct se_hba *hba,
        return count;
 }
 
-SE_HBA_ATTR(hba_mode, S_IRUGO | S_IWUSR);
-
-CONFIGFS_EATTR_OPS(target_core_hba, se_hba, hba_group);
+CONFIGFS_ATTR_RO(target_, hba_info);
+CONFIGFS_ATTR(target_, hba_mode);
 
 static void target_core_hba_release(struct config_item *item)
 {
@@ -3316,15 +2991,13 @@ static void target_core_hba_release(struct config_item *item)
 }
 
 static struct configfs_attribute *target_core_hba_attrs[] = {
-       &target_core_hba_hba_info.attr,
-       &target_core_hba_hba_mode.attr,
+       &target_attr_hba_info,
+       &target_attr_hba_mode,
        NULL,
 };
 
 static struct configfs_item_operations target_core_hba_item_ops = {
        .release                = target_core_hba_release,
-       .show_attribute         = target_core_hba_attr_show,
-       .store_attribute        = target_core_hba_attr_store,
 };
 
 static struct config_item_type target_core_hba_cit = {
index be42429468e2505833f0578eea2cf5a81a4f9ee0..f916d18ccb487c0910ec79ec3f0d8dda232a7b30 100644 (file)
@@ -35,8 +35,6 @@
 
 #include <target/target_core_base.h>
 #include <target/target_core_fabric.h>
-#include <target/target_core_fabric_configfs.h>
-#include <target/configfs_macros.h>
 
 #include "target_core_internal.h"
 #include "target_core_alua.h"
@@ -152,17 +150,16 @@ static int target_fabric_mappedlun_unlink(
        return core_dev_del_initiator_node_lun_acl(lun, lacl);
 }
 
-CONFIGFS_EATTR_STRUCT(target_fabric_mappedlun, se_lun_acl);
-#define TCM_MAPPEDLUN_ATTR(_name, _mode)                               \
-static struct target_fabric_mappedlun_attribute target_fabric_mappedlun_##_name = \
-       __CONFIGFS_EATTR(_name, _mode,                                  \
-       target_fabric_mappedlun_show_##_name,                           \
-       target_fabric_mappedlun_store_##_name);
+static struct se_lun_acl *item_to_lun_acl(struct config_item *item)
+{
+       return container_of(to_config_group(item), struct se_lun_acl,
+                       se_lun_group);
+}
 
-static ssize_t target_fabric_mappedlun_show_write_protect(
-       struct se_lun_acl *lacl,
-       char *page)
+static ssize_t target_fabric_mappedlun_write_protect_show(
+               struct config_item *item, char *page)
 {
+       struct se_lun_acl *lacl = item_to_lun_acl(item);
        struct se_node_acl *se_nacl = lacl->se_lun_nacl;
        struct se_dev_entry *deve;
        ssize_t len = 0;
@@ -178,11 +175,10 @@ static ssize_t target_fabric_mappedlun_show_write_protect(
        return len;
 }
 
-static ssize_t target_fabric_mappedlun_store_write_protect(
-       struct se_lun_acl *lacl,
-       const char *page,
-       size_t count)
+static ssize_t target_fabric_mappedlun_write_protect_store(
+               struct config_item *item, const char *page, size_t count)
 {
+       struct se_lun_acl *lacl = item_to_lun_acl(item);
        struct se_node_acl *se_nacl = lacl->se_lun_nacl;
        struct se_portal_group *se_tpg = se_nacl->se_tpg;
        unsigned long op;
@@ -209,9 +205,12 @@ static ssize_t target_fabric_mappedlun_store_write_protect(
 
 }
 
-TCM_MAPPEDLUN_ATTR(write_protect, S_IRUGO | S_IWUSR);
+CONFIGFS_ATTR(target_fabric_mappedlun_, write_protect);
 
-CONFIGFS_EATTR_OPS(target_fabric_mappedlun, se_lun_acl, se_lun_group);
+static struct configfs_attribute *target_fabric_mappedlun_attrs[] = {
+       &target_fabric_mappedlun_attr_write_protect,
+       NULL,
+};
 
 static void target_fabric_mappedlun_release(struct config_item *item)
 {
@@ -222,15 +221,8 @@ static void target_fabric_mappedlun_release(struct config_item *item)
        core_dev_free_initiator_node_lun_acl(se_tpg, lacl);
 }
 
-static struct configfs_attribute *target_fabric_mappedlun_attrs[] = {
-       &target_fabric_mappedlun_write_protect.attr,
-       NULL,
-};
-
 static struct configfs_item_operations target_fabric_mappedlun_item_ops = {
        .release                = target_fabric_mappedlun_release,
-       .show_attribute         = target_fabric_mappedlun_attr_show,
-       .store_attribute        = target_fabric_mappedlun_attr_store,
        .allow_link             = target_fabric_mappedlun_link,
        .drop_link              = target_fabric_mappedlun_unlink,
 };
@@ -266,49 +258,12 @@ TF_CIT_SETUP(tpg_mappedlun_stat, NULL, &target_fabric_mappedlun_stat_group_ops,
 
 /* End of tfc_tpg_mappedlun_port_cit */
 
-/* Start of tfc_tpg_nacl_attrib_cit */
-
-CONFIGFS_EATTR_OPS(target_fabric_nacl_attrib, se_node_acl, acl_attrib_group);
-
-static struct configfs_item_operations target_fabric_nacl_attrib_item_ops = {
-       .show_attribute         = target_fabric_nacl_attrib_attr_show,
-       .store_attribute        = target_fabric_nacl_attrib_attr_store,
-};
-
-TF_CIT_SETUP_DRV(tpg_nacl_attrib, &target_fabric_nacl_attrib_item_ops, NULL);
-
-/* End of tfc_tpg_nacl_attrib_cit */
-
-/* Start of tfc_tpg_nacl_auth_cit */
-
-CONFIGFS_EATTR_OPS(target_fabric_nacl_auth, se_node_acl, acl_auth_group);
-
-static struct configfs_item_operations target_fabric_nacl_auth_item_ops = {
-       .show_attribute         = target_fabric_nacl_auth_attr_show,
-       .store_attribute        = target_fabric_nacl_auth_attr_store,
-};
-
-TF_CIT_SETUP_DRV(tpg_nacl_auth, &target_fabric_nacl_auth_item_ops, NULL);
-
-/* End of tfc_tpg_nacl_auth_cit */
-
-/* Start of tfc_tpg_nacl_param_cit */
-
-CONFIGFS_EATTR_OPS(target_fabric_nacl_param, se_node_acl, acl_param_group);
-
-static struct configfs_item_operations target_fabric_nacl_param_item_ops = {
-       .show_attribute         = target_fabric_nacl_param_attr_show,
-       .store_attribute        = target_fabric_nacl_param_attr_store,
-};
-
-TF_CIT_SETUP_DRV(tpg_nacl_param, &target_fabric_nacl_param_item_ops, NULL);
-
-/* End of tfc_tpg_nacl_param_cit */
+TF_CIT_SETUP_DRV(tpg_nacl_attrib, NULL, NULL);
+TF_CIT_SETUP_DRV(tpg_nacl_auth, NULL, NULL);
+TF_CIT_SETUP_DRV(tpg_nacl_param, NULL, NULL);
 
 /* Start of tfc_tpg_nacl_base_cit */
 
-CONFIGFS_EATTR_OPS(target_fabric_nacl_base, se_node_acl, acl_group);
-
 static struct config_group *target_fabric_make_mappedlun(
        struct config_group *group,
        const char *name)
@@ -438,8 +393,6 @@ static void target_fabric_nacl_base_release(struct config_item *item)
 
 static struct configfs_item_operations target_fabric_nacl_base_item_ops = {
        .release                = target_fabric_nacl_base_release,
-       .show_attribute         = target_fabric_nacl_base_attr_show,
-       .store_attribute        = target_fabric_nacl_base_attr_store,
 };
 
 static struct configfs_group_operations target_fabric_nacl_base_group_ops = {
@@ -540,8 +493,6 @@ TF_CIT_SETUP(tpg_nacl, NULL, &target_fabric_nacl_group_ops, NULL);
 
 /* Start of tfc_tpg_np_base_cit */
 
-CONFIGFS_EATTR_OPS(target_fabric_np_base, se_tpg_np, tpg_np_group);
-
 static void target_fabric_np_base_release(struct config_item *item)
 {
        struct se_tpg_np *se_tpg_np = container_of(to_config_group(item),
@@ -554,8 +505,6 @@ static void target_fabric_np_base_release(struct config_item *item)
 
 static struct configfs_item_operations target_fabric_np_base_item_ops = {
        .release                = target_fabric_np_base_release,
-       .show_attribute         = target_fabric_np_base_attr_show,
-       .store_attribute        = target_fabric_np_base_attr_store,
 };
 
 TF_CIT_SETUP_DRV(tpg_np_base, &target_fabric_np_base_item_ops, NULL);
@@ -610,132 +559,113 @@ TF_CIT_SETUP(tpg_np, NULL, &target_fabric_np_group_ops, NULL);
 
 /* Start of tfc_tpg_port_cit */
 
-CONFIGFS_EATTR_STRUCT(target_fabric_port, se_lun);
-#define TCM_PORT_ATTR(_name, _mode)                                    \
-static struct target_fabric_port_attribute target_fabric_port_##_name =        \
-       __CONFIGFS_EATTR(_name, _mode,                                  \
-       target_fabric_port_show_attr_##_name,                           \
-       target_fabric_port_store_attr_##_name);
-
-#define TCM_PORT_ATTOR_RO(_name)                                       \
-       __CONFIGFS_EATTR_RO(_name,                                      \
-       target_fabric_port_show_attr_##_name);
+static struct se_lun *item_to_lun(struct config_item *item)
+{
+       return container_of(to_config_group(item), struct se_lun,
+                       lun_group);
+}
 
-/*
- * alua_tg_pt_gp
- */
-static ssize_t target_fabric_port_show_attr_alua_tg_pt_gp(
-       struct se_lun *lun,
-       char *page)
+static ssize_t target_fabric_port_alua_tg_pt_gp_show(struct config_item *item,
+               char *page)
 {
+       struct se_lun *lun = item_to_lun(item);
+
        if (!lun || !lun->lun_se_dev)
                return -ENODEV;
 
        return core_alua_show_tg_pt_gp_info(lun, page);
 }
 
-static ssize_t target_fabric_port_store_attr_alua_tg_pt_gp(
-       struct se_lun *lun,
-       const char *page,
-       size_t count)
+static ssize_t target_fabric_port_alua_tg_pt_gp_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_lun *lun = item_to_lun(item);
+
        if (!lun || !lun->lun_se_dev)
                return -ENODEV;
 
        return core_alua_store_tg_pt_gp_info(lun, page, count);
 }
 
-TCM_PORT_ATTR(alua_tg_pt_gp, S_IRUGO | S_IWUSR);
-
-/*
- * alua_tg_pt_offline
- */
-static ssize_t target_fabric_port_show_attr_alua_tg_pt_offline(
-       struct se_lun *lun,
-       char *page)
+static ssize_t target_fabric_port_alua_tg_pt_offline_show(
+               struct config_item *item, char *page)
 {
+       struct se_lun *lun = item_to_lun(item);
+
        if (!lun || !lun->lun_se_dev)
                return -ENODEV;
 
        return core_alua_show_offline_bit(lun, page);
 }
 
-static ssize_t target_fabric_port_store_attr_alua_tg_pt_offline(
-       struct se_lun *lun,
-       const char *page,
-       size_t count)
+static ssize_t target_fabric_port_alua_tg_pt_offline_store(
+               struct config_item *item, const char *page, size_t count)
 {
+       struct se_lun *lun = item_to_lun(item);
+
        if (!lun || !lun->lun_se_dev)
                return -ENODEV;
 
        return core_alua_store_offline_bit(lun, page, count);
 }
 
-TCM_PORT_ATTR(alua_tg_pt_offline, S_IRUGO | S_IWUSR);
-
-/*
- * alua_tg_pt_status
- */
-static ssize_t target_fabric_port_show_attr_alua_tg_pt_status(
-       struct se_lun *lun,
-       char *page)
+static ssize_t target_fabric_port_alua_tg_pt_status_show(
+               struct config_item *item, char *page)
 {
+       struct se_lun *lun = item_to_lun(item);
+
        if (!lun || !lun->lun_se_dev)
                return -ENODEV;
 
        return core_alua_show_secondary_status(lun, page);
 }
 
-static ssize_t target_fabric_port_store_attr_alua_tg_pt_status(
-       struct se_lun *lun,
-       const char *page,
-       size_t count)
+static ssize_t target_fabric_port_alua_tg_pt_status_store(
+               struct config_item *item, const char *page, size_t count)
 {
+       struct se_lun *lun = item_to_lun(item);
+
        if (!lun || !lun->lun_se_dev)
                return -ENODEV;
 
        return core_alua_store_secondary_status(lun, page, count);
 }
 
-TCM_PORT_ATTR(alua_tg_pt_status, S_IRUGO | S_IWUSR);
-
-/*
- * alua_tg_pt_write_md
- */
-static ssize_t target_fabric_port_show_attr_alua_tg_pt_write_md(
-       struct se_lun *lun,
-       char *page)
+static ssize_t target_fabric_port_alua_tg_pt_write_md_show(
+               struct config_item *item, char *page)
 {
+       struct se_lun *lun = item_to_lun(item);
+
        if (!lun || !lun->lun_se_dev)
                return -ENODEV;
 
        return core_alua_show_secondary_write_metadata(lun, page);
 }
 
-static ssize_t target_fabric_port_store_attr_alua_tg_pt_write_md(
-       struct se_lun *lun,
-       const char *page,
-       size_t count)
+static ssize_t target_fabric_port_alua_tg_pt_write_md_store(
+               struct config_item *item, const char *page, size_t count)
 {
+       struct se_lun *lun = item_to_lun(item);
+
        if (!lun || !lun->lun_se_dev)
                return -ENODEV;
 
        return core_alua_store_secondary_write_metadata(lun, page, count);
 }
 
-TCM_PORT_ATTR(alua_tg_pt_write_md, S_IRUGO | S_IWUSR);
-
+CONFIGFS_ATTR(target_fabric_port_, alua_tg_pt_gp);
+CONFIGFS_ATTR(target_fabric_port_, alua_tg_pt_offline);
+CONFIGFS_ATTR(target_fabric_port_, alua_tg_pt_status);
+CONFIGFS_ATTR(target_fabric_port_, alua_tg_pt_write_md);
 
 static struct configfs_attribute *target_fabric_port_attrs[] = {
-       &target_fabric_port_alua_tg_pt_gp.attr,
-       &target_fabric_port_alua_tg_pt_offline.attr,
-       &target_fabric_port_alua_tg_pt_status.attr,
-       &target_fabric_port_alua_tg_pt_write_md.attr,
+       &target_fabric_port_attr_alua_tg_pt_gp,
+       &target_fabric_port_attr_alua_tg_pt_offline,
+       &target_fabric_port_attr_alua_tg_pt_status,
+       &target_fabric_port_attr_alua_tg_pt_write_md,
        NULL,
 };
 
-CONFIGFS_EATTR_OPS(target_fabric_port, se_lun, lun_group);
-
 static int target_fabric_port_link(
        struct config_item *lun_ci,
        struct config_item *se_dev_ci)
@@ -821,8 +751,6 @@ static void target_fabric_port_release(struct config_item *item)
 }
 
 static struct configfs_item_operations target_fabric_port_item_ops = {
-       .show_attribute         = target_fabric_port_attr_show,
-       .store_attribute        = target_fabric_port_attr_store,
        .release                = target_fabric_port_release,
        .allow_link             = target_fabric_port_link,
        .drop_link              = target_fabric_port_unlink,
@@ -952,50 +880,11 @@ TF_CIT_SETUP(tpg_lun, NULL, &target_fabric_lun_group_ops, NULL);
 
 /* End of tfc_tpg_lun_cit */
 
-/* Start of tfc_tpg_attrib_cit */
-
-CONFIGFS_EATTR_OPS(target_fabric_tpg_attrib, se_portal_group, tpg_attrib_group);
-
-static struct configfs_item_operations target_fabric_tpg_attrib_item_ops = {
-       .show_attribute         = target_fabric_tpg_attrib_attr_show,
-       .store_attribute        = target_fabric_tpg_attrib_attr_store,
-};
-
-TF_CIT_SETUP_DRV(tpg_attrib, &target_fabric_tpg_attrib_item_ops, NULL);
-
-/* End of tfc_tpg_attrib_cit */
-
-/* Start of tfc_tpg_auth_cit */
-
-CONFIGFS_EATTR_OPS(target_fabric_tpg_auth, se_portal_group, tpg_auth_group);
-
-static struct configfs_item_operations target_fabric_tpg_auth_item_ops = {
-       .show_attribute         = target_fabric_tpg_auth_attr_show,
-       .store_attribute        = target_fabric_tpg_auth_attr_store,
-};
-
-TF_CIT_SETUP_DRV(tpg_auth, &target_fabric_tpg_auth_item_ops, NULL);
-
-/* End of tfc_tpg_attrib_cit */
-
-/* Start of tfc_tpg_param_cit */
-
-CONFIGFS_EATTR_OPS(target_fabric_tpg_param, se_portal_group, tpg_param_group);
-
-static struct configfs_item_operations target_fabric_tpg_param_item_ops = {
-       .show_attribute         = target_fabric_tpg_param_attr_show,
-       .store_attribute        = target_fabric_tpg_param_attr_store,
-};
-
-TF_CIT_SETUP_DRV(tpg_param, &target_fabric_tpg_param_item_ops, NULL);
-
-/* End of tfc_tpg_param_cit */
+TF_CIT_SETUP_DRV(tpg_attrib, NULL, NULL);
+TF_CIT_SETUP_DRV(tpg_auth, NULL, NULL);
+TF_CIT_SETUP_DRV(tpg_param, NULL, NULL);
 
 /* Start of tfc_tpg_base_cit */
-/*
- * For use with TF_TPG_ATTR() and TF_TPG_ATTR_RO()
- */
-CONFIGFS_EATTR_OPS(target_fabric_tpg, se_portal_group, tpg_group);
 
 static void target_fabric_tpg_release(struct config_item *item)
 {
@@ -1009,8 +898,6 @@ static void target_fabric_tpg_release(struct config_item *item)
 
 static struct configfs_item_operations target_fabric_tpg_base_item_ops = {
        .release                = target_fabric_tpg_release,
-       .show_attribute         = target_fabric_tpg_attr_show,
-       .store_attribute        = target_fabric_tpg_attr_store,
 };
 
 TF_CIT_SETUP_DRV(tpg_base, &target_fabric_tpg_base_item_ops, NULL);
@@ -1176,33 +1063,9 @@ static struct configfs_group_operations target_fabric_wwn_group_ops = {
        .make_group     = target_fabric_make_wwn,
        .drop_item      = target_fabric_drop_wwn,
 };
-/*
- * For use with TF_WWN_ATTR() and TF_WWN_ATTR_RO()
- */
-CONFIGFS_EATTR_OPS(target_fabric_wwn, target_fabric_configfs, tf_group);
-
-static struct configfs_item_operations target_fabric_wwn_item_ops = {
-       .show_attribute         = target_fabric_wwn_attr_show,
-       .store_attribute        = target_fabric_wwn_attr_store,
-};
-
-TF_CIT_SETUP_DRV(wwn, &target_fabric_wwn_item_ops, &target_fabric_wwn_group_ops);
-
-/* End of tfc_wwn_cit */
-
-/* Start of tfc_discovery_cit */
-
-CONFIGFS_EATTR_OPS(target_fabric_discovery, target_fabric_configfs,
-               tf_disc_group);
-
-static struct configfs_item_operations target_fabric_discovery_item_ops = {
-       .show_attribute         = target_fabric_discovery_attr_show,
-       .store_attribute        = target_fabric_discovery_attr_store,
-};
-
-TF_CIT_SETUP_DRV(discovery, &target_fabric_discovery_item_ops, NULL);
 
-/* End of tfc_discovery_cit */
+TF_CIT_SETUP_DRV(wwn, NULL, &target_fabric_wwn_group_ops);
+TF_CIT_SETUP_DRV(discovery, NULL, NULL);
 
 int target_fabric_setup_cits(struct target_fabric_configfs *tf)
 {
index 99c24acfe6761797fc9788f4f233d1c8c94a0e1d..dae0750c2032bd87430ab99609d475a615e691db 100644 (file)
@@ -87,6 +87,9 @@ void  target_free_device(struct se_device *);
 /* target_core_configfs.c */
 void   target_setup_backend_cits(struct target_backend *);
 
+/* target_core_fabric_configfs.c */
+int    target_fabric_setup_cits(struct target_fabric_configfs *);
+
 /* target_core_fabric_lib.c */
 int    target_get_pr_transport_id_len(struct se_node_acl *nacl,
                struct t10_pr_registration *pr_reg, int *format_code);
index 20ed5d2e151a6f50211273967e2cc107ba2b5bce..273c72b2b83dc016b2a317b778a8c391eebcb9c8 100644 (file)
@@ -37,7 +37,6 @@
 #include <target/target_core_base.h>
 #include <target/target_core_backend.h>
 #include <target/target_core_fabric.h>
-#include <target/configfs_macros.h>
 
 #include "target_core_internal.h"
 
  * SCSI Device Table
  */
 
-CONFIGFS_EATTR_STRUCT(target_stat_scsi_dev, se_dev_stat_grps);
-#define DEV_STAT_SCSI_DEV_ATTR(_name, _mode)                           \
-static struct target_stat_scsi_dev_attribute                           \
-                       target_stat_scsi_dev_##_name =                  \
-       __CONFIGFS_EATTR(_name, _mode,                                  \
-       target_stat_scsi_dev_show_attr_##_name,                         \
-       target_stat_scsi_dev_store_attr_##_name);
-
-#define DEV_STAT_SCSI_DEV_ATTR_RO(_name)                               \
-static struct target_stat_scsi_dev_attribute                           \
-                       target_stat_scsi_dev_##_name =                  \
-       __CONFIGFS_EATTR_RO(_name,                                      \
-       target_stat_scsi_dev_show_attr_##_name);
+static struct se_device *to_stat_dev(struct config_item *item)
+{
+       struct se_dev_stat_grps *sgrps = container_of(to_config_group(item),
+                       struct se_dev_stat_grps, scsi_dev_group);
+       return container_of(sgrps, struct se_device, dev_stat_grps);
+}
 
-static ssize_t target_stat_scsi_dev_show_attr_inst(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_inst_show(struct config_item *item, char *page)
 {
-       struct se_device *dev =
-               container_of(sgrps, struct se_device, dev_stat_grps);
-       struct se_hba *hba = dev->se_hba;
+       struct se_hba *hba = to_stat_dev(item)->se_hba;
 
        return snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
 }
-DEV_STAT_SCSI_DEV_ATTR_RO(inst);
 
-static ssize_t target_stat_scsi_dev_show_attr_indx(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_indx_show(struct config_item *item, char *page)
 {
-       struct se_device *dev =
-               container_of(sgrps, struct se_device, dev_stat_grps);
-
-       return snprintf(page, PAGE_SIZE, "%u\n", dev->dev_index);
+       return snprintf(page, PAGE_SIZE, "%u\n", to_stat_dev(item)->dev_index);
 }
-DEV_STAT_SCSI_DEV_ATTR_RO(indx);
 
-static ssize_t target_stat_scsi_dev_show_attr_role(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_role_show(struct config_item *item, char *page)
 {
        return snprintf(page, PAGE_SIZE, "Target\n");
 }
-DEV_STAT_SCSI_DEV_ATTR_RO(role);
 
-static ssize_t target_stat_scsi_dev_show_attr_ports(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_ports_show(struct config_item *item, char *page)
 {
-       struct se_device *dev =
-               container_of(sgrps, struct se_device, dev_stat_grps);
-
-       return snprintf(page, PAGE_SIZE, "%u\n", dev->export_count);
+       return snprintf(page, PAGE_SIZE, "%u\n", to_stat_dev(item)->export_count);
 }
-DEV_STAT_SCSI_DEV_ATTR_RO(ports);
 
-CONFIGFS_EATTR_OPS(target_stat_scsi_dev, se_dev_stat_grps, scsi_dev_group);
+CONFIGFS_ATTR_RO(target_stat_, inst);
+CONFIGFS_ATTR_RO(target_stat_, indx);
+CONFIGFS_ATTR_RO(target_stat_, role);
+CONFIGFS_ATTR_RO(target_stat_, ports);
 
 static struct configfs_attribute *target_stat_scsi_dev_attrs[] = {
-       &target_stat_scsi_dev_inst.attr,
-       &target_stat_scsi_dev_indx.attr,
-       &target_stat_scsi_dev_role.attr,
-       &target_stat_scsi_dev_ports.attr,
+       &target_stat_attr_inst,
+       &target_stat_attr_indx,
+       &target_stat_attr_role,
+       &target_stat_attr_ports,
        NULL,
 };
 
-static struct configfs_item_operations target_stat_scsi_dev_attrib_ops = {
-       .show_attribute         = target_stat_scsi_dev_attr_show,
-       .store_attribute        = target_stat_scsi_dev_attr_store,
-};
-
 static struct config_item_type target_stat_scsi_dev_cit = {
-       .ct_item_ops            = &target_stat_scsi_dev_attrib_ops,
        .ct_attrs               = target_stat_scsi_dev_attrs,
        .ct_owner               = THIS_MODULE,
 };
@@ -131,109 +104,78 @@ static struct config_item_type target_stat_scsi_dev_cit = {
 /*
  * SCSI Target Device Table
  */
+static struct se_device *to_stat_tgt_dev(struct config_item *item)
+{
+       struct se_dev_stat_grps *sgrps = container_of(to_config_group(item),
+                       struct se_dev_stat_grps, scsi_tgt_dev_group);
+       return container_of(sgrps, struct se_device, dev_stat_grps);
+}
 
-CONFIGFS_EATTR_STRUCT(target_stat_scsi_tgt_dev, se_dev_stat_grps);
-#define DEV_STAT_SCSI_TGT_DEV_ATTR(_name, _mode)                       \
-static struct target_stat_scsi_tgt_dev_attribute                       \
-                       target_stat_scsi_tgt_dev_##_name =              \
-       __CONFIGFS_EATTR(_name, _mode,                                  \
-       target_stat_scsi_tgt_dev_show_attr_##_name,                     \
-       target_stat_scsi_tgt_dev_store_attr_##_name);
-
-#define DEV_STAT_SCSI_TGT_DEV_ATTR_RO(_name)                           \
-static struct target_stat_scsi_tgt_dev_attribute                       \
-                       target_stat_scsi_tgt_dev_##_name =              \
-       __CONFIGFS_EATTR_RO(_name,                                      \
-       target_stat_scsi_tgt_dev_show_attr_##_name);
-
-static ssize_t target_stat_scsi_tgt_dev_show_attr_inst(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_tgt_inst_show(struct config_item *item, char *page)
 {
-       struct se_device *dev =
-               container_of(sgrps, struct se_device, dev_stat_grps);
-       struct se_hba *hba = dev->se_hba;
+       struct se_hba *hba = to_stat_tgt_dev(item)->se_hba;
 
        return snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
 }
-DEV_STAT_SCSI_TGT_DEV_ATTR_RO(inst);
 
-static ssize_t target_stat_scsi_tgt_dev_show_attr_indx(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_tgt_indx_show(struct config_item *item, char *page)
 {
-       struct se_device *dev =
-               container_of(sgrps, struct se_device, dev_stat_grps);
-
-       return snprintf(page, PAGE_SIZE, "%u\n", dev->dev_index);
+       return snprintf(page, PAGE_SIZE, "%u\n", to_stat_tgt_dev(item)->dev_index);
 }
-DEV_STAT_SCSI_TGT_DEV_ATTR_RO(indx);
 
-static ssize_t target_stat_scsi_tgt_dev_show_attr_num_lus(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_tgt_num_lus_show(struct config_item *item,
+               char *page)
 {
        return snprintf(page, PAGE_SIZE, "%u\n", LU_COUNT);
 }
-DEV_STAT_SCSI_TGT_DEV_ATTR_RO(num_lus);
 
-static ssize_t target_stat_scsi_tgt_dev_show_attr_status(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_tgt_status_show(struct config_item *item,
+               char *page)
 {
-       struct se_device *dev =
-               container_of(sgrps, struct se_device, dev_stat_grps);
-
-       if (dev->export_count)
+       if (to_stat_tgt_dev(item)->export_count)
                return snprintf(page, PAGE_SIZE, "activated");
        else
                return snprintf(page, PAGE_SIZE, "deactivated");
 }
-DEV_STAT_SCSI_TGT_DEV_ATTR_RO(status);
 
-static ssize_t target_stat_scsi_tgt_dev_show_attr_non_access_lus(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_tgt_non_access_lus_show(struct config_item *item,
+               char *page)
 {
-       struct se_device *dev =
-               container_of(sgrps, struct se_device, dev_stat_grps);
        int non_accessible_lus;
 
-       if (dev->export_count)
+       if (to_stat_tgt_dev(item)->export_count)
                non_accessible_lus = 0;
        else
                non_accessible_lus = 1;
 
        return snprintf(page, PAGE_SIZE, "%u\n", non_accessible_lus);
 }
-DEV_STAT_SCSI_TGT_DEV_ATTR_RO(non_access_lus);
 
-static ssize_t target_stat_scsi_tgt_dev_show_attr_resets(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_tgt_resets_show(struct config_item *item,
+               char *page)
 {
-       struct se_device *dev =
-               container_of(sgrps, struct se_device, dev_stat_grps);
-
        return snprintf(page, PAGE_SIZE, "%lu\n",
-                       atomic_long_read(&dev->num_resets));
+                       atomic_long_read(&to_stat_tgt_dev(item)->num_resets));
 }
-DEV_STAT_SCSI_TGT_DEV_ATTR_RO(resets);
 
-
-CONFIGFS_EATTR_OPS(target_stat_scsi_tgt_dev, se_dev_stat_grps, scsi_tgt_dev_group);
+CONFIGFS_ATTR_RO(target_stat_tgt_, inst);
+CONFIGFS_ATTR_RO(target_stat_tgt_, indx);
+CONFIGFS_ATTR_RO(target_stat_tgt_, num_lus);
+CONFIGFS_ATTR_RO(target_stat_tgt_, status);
+CONFIGFS_ATTR_RO(target_stat_tgt_, non_access_lus);
+CONFIGFS_ATTR_RO(target_stat_tgt_, resets);
 
 static struct configfs_attribute *target_stat_scsi_tgt_dev_attrs[] = {
-       &target_stat_scsi_tgt_dev_inst.attr,
-       &target_stat_scsi_tgt_dev_indx.attr,
-       &target_stat_scsi_tgt_dev_num_lus.attr,
-       &target_stat_scsi_tgt_dev_status.attr,
-       &target_stat_scsi_tgt_dev_non_access_lus.attr,
-       &target_stat_scsi_tgt_dev_resets.attr,
+       &target_stat_tgt_attr_inst,
+       &target_stat_tgt_attr_indx,
+       &target_stat_tgt_attr_num_lus,
+       &target_stat_tgt_attr_status,
+       &target_stat_tgt_attr_non_access_lus,
+       &target_stat_tgt_attr_resets,
        NULL,
 };
 
-static struct configfs_item_operations target_stat_scsi_tgt_dev_attrib_ops = {
-       .show_attribute         = target_stat_scsi_tgt_dev_attr_show,
-       .store_attribute        = target_stat_scsi_tgt_dev_attr_store,
-};
-
 static struct config_item_type target_stat_scsi_tgt_dev_cit = {
-       .ct_item_ops            = &target_stat_scsi_tgt_dev_attrib_ops,
        .ct_attrs               = target_stat_scsi_tgt_dev_attrs,
        .ct_owner               = THIS_MODULE,
 };
@@ -242,72 +184,50 @@ static struct config_item_type target_stat_scsi_tgt_dev_cit = {
  * SCSI Logical Unit Table
  */
 
-CONFIGFS_EATTR_STRUCT(target_stat_scsi_lu, se_dev_stat_grps);
-#define DEV_STAT_SCSI_LU_ATTR(_name, _mode)                            \
-static struct target_stat_scsi_lu_attribute target_stat_scsi_lu_##_name = \
-       __CONFIGFS_EATTR(_name, _mode,                                  \
-       target_stat_scsi_lu_show_attr_##_name,                          \
-       target_stat_scsi_lu_store_attr_##_name);
-
-#define DEV_STAT_SCSI_LU_ATTR_RO(_name)                                        \
-static struct target_stat_scsi_lu_attribute target_stat_scsi_lu_##_name = \
-       __CONFIGFS_EATTR_RO(_name,                                      \
-       target_stat_scsi_lu_show_attr_##_name);
+static struct se_device *to_stat_lu_dev(struct config_item *item)
+{
+       struct se_dev_stat_grps *sgrps = container_of(to_config_group(item),
+                       struct se_dev_stat_grps, scsi_lu_group);
+       return container_of(sgrps, struct se_device, dev_stat_grps);
+}
 
-static ssize_t target_stat_scsi_lu_show_attr_inst(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_lu_inst_show(struct config_item *item, char *page)
 {
-       struct se_device *dev =
-               container_of(sgrps, struct se_device, dev_stat_grps);
-       struct se_hba *hba = dev->se_hba;
+       struct se_hba *hba = to_stat_lu_dev(item)->se_hba;
 
        return snprintf(page, PAGE_SIZE, "%u\n", hba->hba_index);
 }
-DEV_STAT_SCSI_LU_ATTR_RO(inst);
 
-static ssize_t target_stat_scsi_lu_show_attr_dev(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_lu_dev_show(struct config_item *item, char *page)
 {
-       struct se_device *dev =
-               container_of(sgrps, struct se_device, dev_stat_grps);
-
-       return snprintf(page, PAGE_SIZE, "%u\n", dev->dev_index);
+       return snprintf(page, PAGE_SIZE, "%u\n",
+                       to_stat_lu_dev(item)->dev_index);
 }
-DEV_STAT_SCSI_LU_ATTR_RO(dev);
 
-static ssize_t target_stat_scsi_lu_show_attr_indx(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_lu_indx_show(struct config_item *item, char *page)
 {
        return snprintf(page, PAGE_SIZE, "%u\n", SCSI_LU_INDEX);
 }
-DEV_STAT_SCSI_LU_ATTR_RO(indx);
 
-static ssize_t target_stat_scsi_lu_show_attr_lun(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_lu_lun_show(struct config_item *item, char *page)
 {
        /* FIXME: scsiLuDefaultLun */
        return snprintf(page, PAGE_SIZE, "%llu\n", (unsigned long long)0);
 }
-DEV_STAT_SCSI_LU_ATTR_RO(lun);
 
-static ssize_t target_stat_scsi_lu_show_attr_lu_name(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_lu_lu_name_show(struct config_item *item, char *page)
 {
-       struct se_device *dev =
-               container_of(sgrps, struct se_device, dev_stat_grps);
+       struct se_device *dev = to_stat_lu_dev(item);
 
        /* scsiLuWwnName */
        return snprintf(page, PAGE_SIZE, "%s\n",
                        (strlen(dev->t10_wwn.unit_serial)) ?
                        dev->t10_wwn.unit_serial : "None");
 }
-DEV_STAT_SCSI_LU_ATTR_RO(lu_name);
 
-static ssize_t target_stat_scsi_lu_show_attr_vend(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_lu_vend_show(struct config_item *item, char *page)
 {
-       struct se_device *dev =
-               container_of(sgrps, struct se_device, dev_stat_grps);
+       struct se_device *dev = to_stat_lu_dev(item);
        int i;
        char str[sizeof(dev->t10_wwn.vendor)+1];
 
@@ -318,13 +238,10 @@ static ssize_t target_stat_scsi_lu_show_attr_vend(
        str[i] = '\0';
        return snprintf(page, PAGE_SIZE, "%s\n", str);
 }
-DEV_STAT_SCSI_LU_ATTR_RO(vend);
 
-static ssize_t target_stat_scsi_lu_show_attr_prod(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_lu_prod_show(struct config_item *item, char *page)
 {
-       struct se_device *dev =
-               container_of(sgrps, struct se_device, dev_stat_grps);
+       struct se_device *dev = to_stat_lu_dev(item);
        int i;
        char str[sizeof(dev->t10_wwn.model)+1];
 
@@ -335,13 +252,10 @@ static ssize_t target_stat_scsi_lu_show_attr_prod(
        str[i] = '\0';
        return snprintf(page, PAGE_SIZE, "%s\n", str);
 }
-DEV_STAT_SCSI_LU_ATTR_RO(prod);
 
-static ssize_t target_stat_scsi_lu_show_attr_rev(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_lu_rev_show(struct config_item *item, char *page)
 {
-       struct se_device *dev =
-               container_of(sgrps, struct se_device, dev_stat_grps);
+       struct se_device *dev = to_stat_lu_dev(item);
        int i;
        char str[sizeof(dev->t10_wwn.revision)+1];
 
@@ -352,146 +266,137 @@ static ssize_t target_stat_scsi_lu_show_attr_rev(
        str[i] = '\0';
        return snprintf(page, PAGE_SIZE, "%s\n", str);
 }
-DEV_STAT_SCSI_LU_ATTR_RO(rev);
 
-static ssize_t target_stat_scsi_lu_show_attr_dev_type(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_lu_dev_type_show(struct config_item *item, char *page)
 {
-       struct se_device *dev =
-               container_of(sgrps, struct se_device, dev_stat_grps);
+       struct se_device *dev = to_stat_lu_dev(item);
 
        /* scsiLuPeripheralType */
        return snprintf(page, PAGE_SIZE, "%u\n",
                        dev->transport->get_device_type(dev));
 }
-DEV_STAT_SCSI_LU_ATTR_RO(dev_type);
 
-static ssize_t target_stat_scsi_lu_show_attr_status(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_lu_status_show(struct config_item *item, char *page)
 {
-       struct se_device *dev =
-               container_of(sgrps, struct se_device, dev_stat_grps);
+       struct se_device *dev = to_stat_lu_dev(item);
 
        /* scsiLuStatus */
        return snprintf(page, PAGE_SIZE, "%s\n",
                (dev->export_count) ? "available" : "notavailable");
 }
-DEV_STAT_SCSI_LU_ATTR_RO(status);
 
-static ssize_t target_stat_scsi_lu_show_attr_state_bit(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_lu_state_bit_show(struct config_item *item,
+               char *page)
 {
        /* scsiLuState */
        return snprintf(page, PAGE_SIZE, "exposed\n");
 }
-DEV_STAT_SCSI_LU_ATTR_RO(state_bit);
 
-static ssize_t target_stat_scsi_lu_show_attr_num_cmds(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_lu_num_cmds_show(struct config_item *item,
+               char *page)
 {
-       struct se_device *dev =
-               container_of(sgrps, struct se_device, dev_stat_grps);
+       struct se_device *dev = to_stat_lu_dev(item);
 
        /* scsiLuNumCommands */
        return snprintf(page, PAGE_SIZE, "%lu\n",
                        atomic_long_read(&dev->num_cmds));
 }
-DEV_STAT_SCSI_LU_ATTR_RO(num_cmds);
 
-static ssize_t target_stat_scsi_lu_show_attr_read_mbytes(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_lu_read_mbytes_show(struct config_item *item,
+               char *page)
 {
-       struct se_device *dev =
-               container_of(sgrps, struct se_device, dev_stat_grps);
+       struct se_device *dev = to_stat_lu_dev(item);
 
        /* scsiLuReadMegaBytes */
        return snprintf(page, PAGE_SIZE, "%lu\n",
                        atomic_long_read(&dev->read_bytes) >> 20);
 }
-DEV_STAT_SCSI_LU_ATTR_RO(read_mbytes);
 
-static ssize_t target_stat_scsi_lu_show_attr_write_mbytes(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_lu_write_mbytes_show(struct config_item *item,
+               char *page)
 {
-       struct se_device *dev =
-               container_of(sgrps, struct se_device, dev_stat_grps);
+       struct se_device *dev = to_stat_lu_dev(item);
 
        /* scsiLuWrittenMegaBytes */
        return snprintf(page, PAGE_SIZE, "%lu\n",
                        atomic_long_read(&dev->write_bytes) >> 20);
 }
-DEV_STAT_SCSI_LU_ATTR_RO(write_mbytes);
 
-static ssize_t target_stat_scsi_lu_show_attr_resets(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_lu_resets_show(struct config_item *item, char *page)
 {
-       struct se_device *dev =
-               container_of(sgrps, struct se_device, dev_stat_grps);
+       struct se_device *dev = to_stat_lu_dev(item);
 
        /* scsiLuInResets */
-       return snprintf(page, PAGE_SIZE, "%lu\n", atomic_long_read(&dev->num_resets));
+       return snprintf(page, PAGE_SIZE, "%lu\n",
+               atomic_long_read(&dev->num_resets));
 }
-DEV_STAT_SCSI_LU_ATTR_RO(resets);
 
-static ssize_t target_stat_scsi_lu_show_attr_full_stat(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_lu_full_stat_show(struct config_item *item,
+               char *page)
 {
        /* FIXME: scsiLuOutTaskSetFullStatus */
        return snprintf(page, PAGE_SIZE, "%u\n", 0);
 }
-DEV_STAT_SCSI_LU_ATTR_RO(full_stat);
 
-static ssize_t target_stat_scsi_lu_show_attr_hs_num_cmds(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_lu_hs_num_cmds_show(struct config_item *item,
+               char *page)
 {
        /* FIXME: scsiLuHSInCommands */
        return snprintf(page, PAGE_SIZE, "%u\n", 0);
 }
-DEV_STAT_SCSI_LU_ATTR_RO(hs_num_cmds);
 
-static ssize_t target_stat_scsi_lu_show_attr_creation_time(
-       struct se_dev_stat_grps *sgrps, char *page)
+static ssize_t target_stat_lu_creation_time_show(struct config_item *item,
+               char *page)
 {
-       struct se_device *dev =
-               container_of(sgrps, struct se_device, dev_stat_grps);
+       struct se_device *dev = to_stat_lu_dev(item);
 
        /* scsiLuCreationTime */
        return snprintf(page, PAGE_SIZE, "%u\n", (u32)(((u32)dev->creation_time -
                                INITIAL_JIFFIES) * 100 / HZ));
 }
-DEV_STAT_SCSI_LU_ATTR_RO(creation_time);
 
-CONFIGFS_EATTR_OPS(target_stat_scsi_lu, se_dev_stat_grps, scsi_lu_group);
+CONFIGFS_ATTR_RO(target_stat_lu_, inst);
+CONFIGFS_ATTR_RO(target_stat_lu_, dev);
+CONFIGFS_ATTR_RO(target_stat_lu_, indx);
+CONFIGFS_ATTR_RO(target_stat_lu_, lun);
+CONFIGFS_ATTR_RO(target_stat_lu_, lu_name);
+CONFIGFS_ATTR_RO(target_stat_lu_, vend);
+CONFIGFS_ATTR_RO(target_stat_lu_, prod);
+CONFIGFS_ATTR_RO(target_stat_lu_, rev);
+CONFIGFS_ATTR_RO(target_stat_lu_, dev_type);
+CONFIGFS_ATTR_RO(target_stat_lu_, status);
+CONFIGFS_ATTR_RO(target_stat_lu_, state_bit);
+CONFIGFS_ATTR_RO(target_stat_lu_, num_cmds);
+CONFIGFS_ATTR_RO(target_stat_lu_, read_mbytes);
+CONFIGFS_ATTR_RO(target_stat_lu_, write_mbytes);
+CONFIGFS_ATTR_RO(target_stat_lu_, resets);
+CONFIGFS_ATTR_RO(target_stat_lu_, full_stat);
+CONFIGFS_ATTR_RO(target_stat_lu_, hs_num_cmds);
+CONFIGFS_ATTR_RO(target_stat_lu_, creation_time);
 
 static struct configfs_attribute *target_stat_scsi_lu_attrs[] = {
-       &target_stat_scsi_lu_inst.attr,
-       &target_stat_scsi_lu_dev.attr,
-       &target_stat_scsi_lu_indx.attr,
-       &target_stat_scsi_lu_lun.attr,
-       &target_stat_scsi_lu_lu_name.attr,
-       &target_stat_scsi_lu_vend.attr,
-       &target_stat_scsi_lu_prod.attr,
-       &target_stat_scsi_lu_rev.attr,
-       &target_stat_scsi_lu_dev_type.attr,
-       &target_stat_scsi_lu_status.attr,
-       &target_stat_scsi_lu_state_bit.attr,
-       &target_stat_scsi_lu_num_cmds.attr,
-       &target_stat_scsi_lu_read_mbytes.attr,
-       &target_stat_scsi_lu_write_mbytes.attr,
-       &target_stat_scsi_lu_resets.attr,
-       &target_stat_scsi_lu_full_stat.attr,
-       &target_stat_scsi_lu_hs_num_cmds.attr,
-       &target_stat_scsi_lu_creation_time.attr,
+       &target_stat_lu_attr_inst,
+       &target_stat_lu_attr_dev,
+       &target_stat_lu_attr_indx,
+       &target_stat_lu_attr_lun,
+       &target_stat_lu_attr_lu_name,
+       &target_stat_lu_attr_vend,
+       &target_stat_lu_attr_prod,
+       &target_stat_lu_attr_rev,
+       &target_stat_lu_attr_dev_type,
+       &target_stat_lu_attr_status,
+       &target_stat_lu_attr_state_bit,
+       &target_stat_lu_attr_num_cmds,
+       &target_stat_lu_attr_read_mbytes,
+       &target_stat_lu_attr_write_mbytes,
+       &target_stat_lu_attr_resets,
+       &target_stat_lu_attr_full_stat,
+       &target_stat_lu_attr_hs_num_cmds,
+       &target_stat_lu_attr_creation_time,
        NULL,
 };
 
-static struct configfs_item_operations target_stat_scsi_lu_attrib_ops = {
-       .show_attribute         = target_stat_scsi_lu_attr_show,
-       .store_attribute        = target_stat_scsi_lu_attr_store,
-};
-
 static struct config_item_type target_stat_scsi_lu_cit = {
-       .ct_item_ops            = &target_stat_scsi_lu_attrib_ops,
        .ct_attrs               = target_stat_scsi_lu_attrs,
        .ct_owner               = THIS_MODULE,
 };
@@ -521,24 +426,16 @@ void target_stat_setup_dev_default_groups(struct se_device *dev)
  * SCSI Port Table
  */
 
-CONFIGFS_EATTR_STRUCT(target_stat_scsi_port, se_port_stat_grps);
-#define DEV_STAT_SCSI_PORT_ATTR(_name, _mode)                          \
-static struct target_stat_scsi_port_attribute                          \
-                       target_stat_scsi_port_##_name =                 \
-       __CONFIGFS_EATTR(_name, _mode,                                  \
-       target_stat_scsi_port_show_attr_##_name,                        \
-       target_stat_scsi_port_store_attr_##_name);
-
-#define DEV_STAT_SCSI_PORT_ATTR_RO(_name)                              \
-static struct target_stat_scsi_port_attribute                          \
-                       target_stat_scsi_port_##_name =                 \
-       __CONFIGFS_EATTR_RO(_name,                                      \
-       target_stat_scsi_port_show_attr_##_name);
+static struct se_lun *to_stat_port(struct config_item *item)
+{
+       struct se_port_stat_grps *pgrps = container_of(to_config_group(item),
+                       struct se_port_stat_grps, scsi_port_group);
+       return container_of(pgrps, struct se_lun, port_stat_grps);
+}
 
-static ssize_t target_stat_scsi_port_show_attr_inst(
-       struct se_port_stat_grps *pgrps, char *page)
+static ssize_t target_stat_port_inst_show(struct config_item *item, char *page)
 {
-       struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
+       struct se_lun *lun = to_stat_port(item);
        struct se_device *dev;
        ssize_t ret = -ENODEV;
 
@@ -549,12 +446,10 @@ static ssize_t target_stat_scsi_port_show_attr_inst(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_PORT_ATTR_RO(inst);
 
-static ssize_t target_stat_scsi_port_show_attr_dev(
-       struct se_port_stat_grps *pgrps, char *page)
+static ssize_t target_stat_port_dev_show(struct config_item *item, char *page)
 {
-       struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
+       struct se_lun *lun = to_stat_port(item);
        struct se_device *dev;
        ssize_t ret = -ENODEV;
 
@@ -565,12 +460,10 @@ static ssize_t target_stat_scsi_port_show_attr_dev(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_PORT_ATTR_RO(dev);
 
-static ssize_t target_stat_scsi_port_show_attr_indx(
-       struct se_port_stat_grps *pgrps, char *page)
+static ssize_t target_stat_port_indx_show(struct config_item *item, char *page)
 {
-       struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
+       struct se_lun *lun = to_stat_port(item);
        struct se_device *dev;
        ssize_t ret = -ENODEV;
 
@@ -581,12 +474,10 @@ static ssize_t target_stat_scsi_port_show_attr_indx(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_PORT_ATTR_RO(indx);
 
-static ssize_t target_stat_scsi_port_show_attr_role(
-       struct se_port_stat_grps *pgrps, char *page)
+static ssize_t target_stat_port_role_show(struct config_item *item, char *page)
 {
-       struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
+       struct se_lun *lun = to_stat_port(item);
        struct se_device *dev;
        ssize_t ret = -ENODEV;
 
@@ -597,12 +488,11 @@ static ssize_t target_stat_scsi_port_show_attr_role(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_PORT_ATTR_RO(role);
 
-static ssize_t target_stat_scsi_port_show_attr_busy_count(
-       struct se_port_stat_grps *pgrps, char *page)
+static ssize_t target_stat_port_busy_count_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
+       struct se_lun *lun = to_stat_port(item);
        struct se_device *dev;
        ssize_t ret = -ENODEV;
 
@@ -615,26 +505,23 @@ static ssize_t target_stat_scsi_port_show_attr_busy_count(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_PORT_ATTR_RO(busy_count);
 
-CONFIGFS_EATTR_OPS(target_stat_scsi_port, se_port_stat_grps, scsi_port_group);
+CONFIGFS_ATTR_RO(target_stat_port_, inst);
+CONFIGFS_ATTR_RO(target_stat_port_, dev);
+CONFIGFS_ATTR_RO(target_stat_port_, indx);
+CONFIGFS_ATTR_RO(target_stat_port_, role);
+CONFIGFS_ATTR_RO(target_stat_port_, busy_count);
 
 static struct configfs_attribute *target_stat_scsi_port_attrs[] = {
-       &target_stat_scsi_port_inst.attr,
-       &target_stat_scsi_port_dev.attr,
-       &target_stat_scsi_port_indx.attr,
-       &target_stat_scsi_port_role.attr,
-       &target_stat_scsi_port_busy_count.attr,
+       &target_stat_port_attr_inst,
+       &target_stat_port_attr_dev,
+       &target_stat_port_attr_indx,
+       &target_stat_port_attr_role,
+       &target_stat_port_attr_busy_count,
        NULL,
 };
 
-static struct configfs_item_operations target_stat_scsi_port_attrib_ops = {
-       .show_attribute         = target_stat_scsi_port_attr_show,
-       .store_attribute        = target_stat_scsi_port_attr_store,
-};
-
 static struct config_item_type target_stat_scsi_port_cit = {
-       .ct_item_ops            = &target_stat_scsi_port_attrib_ops,
        .ct_attrs               = target_stat_scsi_port_attrs,
        .ct_owner               = THIS_MODULE,
 };
@@ -642,24 +529,17 @@ static struct config_item_type target_stat_scsi_port_cit = {
 /*
  * SCSI Target Port Table
  */
-CONFIGFS_EATTR_STRUCT(target_stat_scsi_tgt_port, se_port_stat_grps);
-#define DEV_STAT_SCSI_TGT_PORT_ATTR(_name, _mode)                      \
-static struct target_stat_scsi_tgt_port_attribute                      \
-                       target_stat_scsi_tgt_port_##_name =             \
-       __CONFIGFS_EATTR(_name, _mode,                                  \
-       target_stat_scsi_tgt_port_show_attr_##_name,                    \
-       target_stat_scsi_tgt_port_store_attr_##_name);
-
-#define DEV_STAT_SCSI_TGT_PORT_ATTR_RO(_name)                          \
-static struct target_stat_scsi_tgt_port_attribute                      \
-                       target_stat_scsi_tgt_port_##_name =             \
-       __CONFIGFS_EATTR_RO(_name,                                      \
-       target_stat_scsi_tgt_port_show_attr_##_name);
-
-static ssize_t target_stat_scsi_tgt_port_show_attr_inst(
-       struct se_port_stat_grps *pgrps, char *page)
-{
-       struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
+static struct se_lun *to_stat_tgt_port(struct config_item *item)
+{
+       struct se_port_stat_grps *pgrps = container_of(to_config_group(item),
+                       struct se_port_stat_grps, scsi_tgt_port_group);
+       return container_of(pgrps, struct se_lun, port_stat_grps);
+}
+
+static ssize_t target_stat_tgt_port_inst_show(struct config_item *item,
+               char *page)
+{
+       struct se_lun *lun = to_stat_tgt_port(item);
        struct se_device *dev;
        ssize_t ret = -ENODEV;
 
@@ -670,12 +550,11 @@ static ssize_t target_stat_scsi_tgt_port_show_attr_inst(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_TGT_PORT_ATTR_RO(inst);
 
-static ssize_t target_stat_scsi_tgt_port_show_attr_dev(
-       struct se_port_stat_grps *pgrps, char *page)
+static ssize_t target_stat_tgt_port_dev_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
+       struct se_lun *lun = to_stat_tgt_port(item);
        struct se_device *dev;
        ssize_t ret = -ENODEV;
 
@@ -686,12 +565,11 @@ static ssize_t target_stat_scsi_tgt_port_show_attr_dev(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_TGT_PORT_ATTR_RO(dev);
 
-static ssize_t target_stat_scsi_tgt_port_show_attr_indx(
-       struct se_port_stat_grps *pgrps, char *page)
+static ssize_t target_stat_tgt_port_indx_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
+       struct se_lun *lun = to_stat_tgt_port(item);
        struct se_device *dev;
        ssize_t ret = -ENODEV;
 
@@ -702,12 +580,11 @@ static ssize_t target_stat_scsi_tgt_port_show_attr_indx(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_TGT_PORT_ATTR_RO(indx);
 
-static ssize_t target_stat_scsi_tgt_port_show_attr_name(
-       struct se_port_stat_grps *pgrps, char *page)
+static ssize_t target_stat_tgt_port_name_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
+       struct se_lun *lun = to_stat_tgt_port(item);
        struct se_portal_group *tpg = lun->lun_tpg;
        struct se_device *dev;
        ssize_t ret = -ENODEV;
@@ -721,12 +598,11 @@ static ssize_t target_stat_scsi_tgt_port_show_attr_name(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_TGT_PORT_ATTR_RO(name);
 
-static ssize_t target_stat_scsi_tgt_port_show_attr_port_index(
-       struct se_port_stat_grps *pgrps, char *page)
+static ssize_t target_stat_tgt_port_port_index_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
+       struct se_lun *lun = to_stat_tgt_port(item);
        struct se_portal_group *tpg = lun->lun_tpg;
        struct se_device *dev;
        ssize_t ret = -ENODEV;
@@ -740,12 +616,11 @@ static ssize_t target_stat_scsi_tgt_port_show_attr_port_index(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_TGT_PORT_ATTR_RO(port_index);
 
-static ssize_t target_stat_scsi_tgt_port_show_attr_in_cmds(
-       struct se_port_stat_grps *pgrps, char *page)
+static ssize_t target_stat_tgt_port_in_cmds_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
+       struct se_lun *lun = to_stat_tgt_port(item);
        struct se_device *dev;
        ssize_t ret = -ENODEV;
 
@@ -757,12 +632,11 @@ static ssize_t target_stat_scsi_tgt_port_show_attr_in_cmds(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_TGT_PORT_ATTR_RO(in_cmds);
 
-static ssize_t target_stat_scsi_tgt_port_show_attr_write_mbytes(
-       struct se_port_stat_grps *pgrps, char *page)
+static ssize_t target_stat_tgt_port_write_mbytes_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
+       struct se_lun *lun = to_stat_tgt_port(item);
        struct se_device *dev;
        ssize_t ret = -ENODEV;
 
@@ -774,12 +648,11 @@ static ssize_t target_stat_scsi_tgt_port_show_attr_write_mbytes(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_TGT_PORT_ATTR_RO(write_mbytes);
 
-static ssize_t target_stat_scsi_tgt_port_show_attr_read_mbytes(
-       struct se_port_stat_grps *pgrps, char *page)
+static ssize_t target_stat_tgt_port_read_mbytes_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
+       struct se_lun *lun = to_stat_tgt_port(item);
        struct se_device *dev;
        ssize_t ret = -ENODEV;
 
@@ -791,12 +664,11 @@ static ssize_t target_stat_scsi_tgt_port_show_attr_read_mbytes(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_TGT_PORT_ATTR_RO(read_mbytes);
 
-static ssize_t target_stat_scsi_tgt_port_show_attr_hs_in_cmds(
-       struct se_port_stat_grps *pgrps, char *page)
+static ssize_t target_stat_tgt_port_hs_in_cmds_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
+       struct se_lun *lun = to_stat_tgt_port(item);
        struct se_device *dev;
        ssize_t ret = -ENODEV;
 
@@ -809,57 +681,49 @@ static ssize_t target_stat_scsi_tgt_port_show_attr_hs_in_cmds(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_TGT_PORT_ATTR_RO(hs_in_cmds);
 
-CONFIGFS_EATTR_OPS(target_stat_scsi_tgt_port, se_port_stat_grps,
-               scsi_tgt_port_group);
+CONFIGFS_ATTR_RO(target_stat_tgt_port_, inst);
+CONFIGFS_ATTR_RO(target_stat_tgt_port_, dev);
+CONFIGFS_ATTR_RO(target_stat_tgt_port_, indx);
+CONFIGFS_ATTR_RO(target_stat_tgt_port_, name);
+CONFIGFS_ATTR_RO(target_stat_tgt_port_, port_index);
+CONFIGFS_ATTR_RO(target_stat_tgt_port_, in_cmds);
+CONFIGFS_ATTR_RO(target_stat_tgt_port_, write_mbytes);
+CONFIGFS_ATTR_RO(target_stat_tgt_port_, read_mbytes);
+CONFIGFS_ATTR_RO(target_stat_tgt_port_, hs_in_cmds);
 
 static struct configfs_attribute *target_stat_scsi_tgt_port_attrs[] = {
-       &target_stat_scsi_tgt_port_inst.attr,
-       &target_stat_scsi_tgt_port_dev.attr,
-       &target_stat_scsi_tgt_port_indx.attr,
-       &target_stat_scsi_tgt_port_name.attr,
-       &target_stat_scsi_tgt_port_port_index.attr,
-       &target_stat_scsi_tgt_port_in_cmds.attr,
-       &target_stat_scsi_tgt_port_write_mbytes.attr,
-       &target_stat_scsi_tgt_port_read_mbytes.attr,
-       &target_stat_scsi_tgt_port_hs_in_cmds.attr,
+       &target_stat_tgt_port_attr_inst,
+       &target_stat_tgt_port_attr_dev,
+       &target_stat_tgt_port_attr_indx,
+       &target_stat_tgt_port_attr_name,
+       &target_stat_tgt_port_attr_port_index,
+       &target_stat_tgt_port_attr_in_cmds,
+       &target_stat_tgt_port_attr_write_mbytes,
+       &target_stat_tgt_port_attr_read_mbytes,
+       &target_stat_tgt_port_attr_hs_in_cmds,
        NULL,
 };
 
-static struct configfs_item_operations target_stat_scsi_tgt_port_attrib_ops = {
-       .show_attribute         = target_stat_scsi_tgt_port_attr_show,
-       .store_attribute        = target_stat_scsi_tgt_port_attr_store,
-};
-
 static struct config_item_type target_stat_scsi_tgt_port_cit = {
-       .ct_item_ops            = &target_stat_scsi_tgt_port_attrib_ops,
        .ct_attrs               = target_stat_scsi_tgt_port_attrs,
        .ct_owner               = THIS_MODULE,
 };
 
 /*
  * SCSI Transport Table
-o */
-
-CONFIGFS_EATTR_STRUCT(target_stat_scsi_transport, se_port_stat_grps);
-#define DEV_STAT_SCSI_TRANSPORT_ATTR(_name, _mode)                     \
-static struct target_stat_scsi_transport_attribute                     \
-                       target_stat_scsi_transport_##_name =            \
-       __CONFIGFS_EATTR(_name, _mode,                                  \
-       target_stat_scsi_transport_show_attr_##_name,                   \
-       target_stat_scsi_transport_store_attr_##_name);
-
-#define DEV_STAT_SCSI_TRANSPORT_ATTR_RO(_name)                         \
-static struct target_stat_scsi_transport_attribute                     \
-                       target_stat_scsi_transport_##_name =            \
-       __CONFIGFS_EATTR_RO(_name,                                      \
-       target_stat_scsi_transport_show_attr_##_name);
-
-static ssize_t target_stat_scsi_transport_show_attr_inst(
-       struct se_port_stat_grps *pgrps, char *page)
-{
-       struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
+ */
+static struct se_lun *to_transport_stat(struct config_item *item)
+{
+       struct se_port_stat_grps *pgrps = container_of(to_config_group(item),
+                       struct se_port_stat_grps, scsi_transport_group);
+       return container_of(pgrps, struct se_lun, port_stat_grps);
+}
+
+static ssize_t target_stat_transport_inst_show(struct config_item *item,
+               char *page)
+{
+       struct se_lun *lun = to_transport_stat(item);
        struct se_device *dev;
        ssize_t ret = -ENODEV;
 
@@ -870,12 +734,11 @@ static ssize_t target_stat_scsi_transport_show_attr_inst(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_TRANSPORT_ATTR_RO(inst);
 
-static ssize_t target_stat_scsi_transport_show_attr_device(
-       struct se_port_stat_grps *pgrps, char *page)
+static ssize_t target_stat_transport_device_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
+       struct se_lun *lun = to_transport_stat(item);
        struct se_device *dev;
        struct se_portal_group *tpg = lun->lun_tpg;
        ssize_t ret = -ENODEV;
@@ -890,12 +753,11 @@ static ssize_t target_stat_scsi_transport_show_attr_device(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_TRANSPORT_ATTR_RO(device);
 
-static ssize_t target_stat_scsi_transport_show_attr_indx(
-       struct se_port_stat_grps *pgrps, char *page)
+static ssize_t target_stat_transport_indx_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
+       struct se_lun *lun = to_transport_stat(item);
        struct se_device *dev;
        struct se_portal_group *tpg = lun->lun_tpg;
        ssize_t ret = -ENODEV;
@@ -908,12 +770,11 @@ static ssize_t target_stat_scsi_transport_show_attr_indx(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_TRANSPORT_ATTR_RO(indx);
 
-static ssize_t target_stat_scsi_transport_show_attr_dev_name(
-       struct se_port_stat_grps *pgrps, char *page)
+static ssize_t target_stat_transport_dev_name_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun *lun = container_of(pgrps, struct se_lun, port_stat_grps);
+       struct se_lun *lun = to_transport_stat(item);
        struct se_device *dev;
        struct se_portal_group *tpg = lun->lun_tpg;
        struct t10_wwn *wwn;
@@ -932,26 +793,21 @@ static ssize_t target_stat_scsi_transport_show_attr_dev_name(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_TRANSPORT_ATTR_RO(dev_name);
 
-CONFIGFS_EATTR_OPS(target_stat_scsi_transport, se_port_stat_grps,
-               scsi_transport_group);
+CONFIGFS_ATTR_RO(target_stat_transport_, inst);
+CONFIGFS_ATTR_RO(target_stat_transport_, device);
+CONFIGFS_ATTR_RO(target_stat_transport_, indx);
+CONFIGFS_ATTR_RO(target_stat_transport_, dev_name);
 
 static struct configfs_attribute *target_stat_scsi_transport_attrs[] = {
-       &target_stat_scsi_transport_inst.attr,
-       &target_stat_scsi_transport_device.attr,
-       &target_stat_scsi_transport_indx.attr,
-       &target_stat_scsi_transport_dev_name.attr,
+       &target_stat_transport_attr_inst,
+       &target_stat_transport_attr_device,
+       &target_stat_transport_attr_indx,
+       &target_stat_transport_attr_dev_name,
        NULL,
 };
 
-static struct configfs_item_operations target_stat_scsi_transport_attrib_ops = {
-       .show_attribute         = target_stat_scsi_transport_attr_show,
-       .store_attribute        = target_stat_scsi_transport_attr_store,
-};
-
 static struct config_item_type target_stat_scsi_transport_cit = {
-       .ct_item_ops            = &target_stat_scsi_transport_attrib_ops,
        .ct_attrs               = target_stat_scsi_transport_attrs,
        .ct_owner               = THIS_MODULE,
 };
@@ -981,25 +837,17 @@ void target_stat_setup_port_default_groups(struct se_lun *lun)
  * SCSI Authorized Initiator Table
  */
 
-CONFIGFS_EATTR_STRUCT(target_stat_scsi_auth_intr, se_ml_stat_grps);
-#define DEV_STAT_SCSI_AUTH_INTR_ATTR(_name, _mode)                     \
-static struct target_stat_scsi_auth_intr_attribute                     \
-                       target_stat_scsi_auth_intr_##_name =            \
-       __CONFIGFS_EATTR(_name, _mode,                                  \
-       target_stat_scsi_auth_intr_show_attr_##_name,                   \
-       target_stat_scsi_auth_intr_store_attr_##_name);
-
-#define DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(_name)                         \
-static struct target_stat_scsi_auth_intr_attribute                     \
-                       target_stat_scsi_auth_intr_##_name =            \
-       __CONFIGFS_EATTR_RO(_name,                                      \
-       target_stat_scsi_auth_intr_show_attr_##_name);
-
-static ssize_t target_stat_scsi_auth_intr_show_attr_inst(
-       struct se_ml_stat_grps *lgrps, char *page)
-{
-       struct se_lun_acl *lacl = container_of(lgrps,
-                       struct se_lun_acl, ml_stat_grps);
+static struct se_lun_acl *auth_to_lacl(struct config_item *item)
+{
+       struct se_ml_stat_grps *lgrps = container_of(to_config_group(item),
+                       struct se_ml_stat_grps, scsi_auth_intr_group);
+       return container_of(lgrps, struct se_lun_acl, ml_stat_grps);
+}
+
+static ssize_t target_stat_auth_inst_show(struct config_item *item,
+               char *page)
+{
+       struct se_lun_acl *lacl = auth_to_lacl(item);
        struct se_node_acl *nacl = lacl->se_lun_nacl;
        struct se_dev_entry *deve;
        struct se_portal_group *tpg;
@@ -1018,13 +866,11 @@ static ssize_t target_stat_scsi_auth_intr_show_attr_inst(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(inst);
 
-static ssize_t target_stat_scsi_auth_intr_show_attr_dev(
-       struct se_ml_stat_grps *lgrps, char *page)
+static ssize_t target_stat_auth_dev_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun_acl *lacl = container_of(lgrps,
-                       struct se_lun_acl, ml_stat_grps);
+       struct se_lun_acl *lacl = auth_to_lacl(item);
        struct se_node_acl *nacl = lacl->se_lun_nacl;
        struct se_dev_entry *deve;
        struct se_lun *lun;
@@ -1042,13 +888,11 @@ static ssize_t target_stat_scsi_auth_intr_show_attr_dev(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(dev);
 
-static ssize_t target_stat_scsi_auth_intr_show_attr_port(
-       struct se_ml_stat_grps *lgrps, char *page)
+static ssize_t target_stat_auth_port_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun_acl *lacl = container_of(lgrps,
-                       struct se_lun_acl, ml_stat_grps);
+       struct se_lun_acl *lacl = auth_to_lacl(item);
        struct se_node_acl *nacl = lacl->se_lun_nacl;
        struct se_dev_entry *deve;
        struct se_portal_group *tpg;
@@ -1066,13 +910,11 @@ static ssize_t target_stat_scsi_auth_intr_show_attr_port(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(port);
 
-static ssize_t target_stat_scsi_auth_intr_show_attr_indx(
-       struct se_ml_stat_grps *lgrps, char *page)
+static ssize_t target_stat_auth_indx_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun_acl *lacl = container_of(lgrps,
-                       struct se_lun_acl, ml_stat_grps);
+       struct se_lun_acl *lacl = auth_to_lacl(item);
        struct se_node_acl *nacl = lacl->se_lun_nacl;
        struct se_dev_entry *deve;
        ssize_t ret;
@@ -1088,13 +930,11 @@ static ssize_t target_stat_scsi_auth_intr_show_attr_indx(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(indx);
 
-static ssize_t target_stat_scsi_auth_intr_show_attr_dev_or_port(
-       struct se_ml_stat_grps *lgrps, char *page)
+static ssize_t target_stat_auth_dev_or_port_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun_acl *lacl = container_of(lgrps,
-                       struct se_lun_acl, ml_stat_grps);
+       struct se_lun_acl *lacl = auth_to_lacl(item);
        struct se_node_acl *nacl = lacl->se_lun_nacl;
        struct se_dev_entry *deve;
        ssize_t ret;
@@ -1110,13 +950,11 @@ static ssize_t target_stat_scsi_auth_intr_show_attr_dev_or_port(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(dev_or_port);
 
-static ssize_t target_stat_scsi_auth_intr_show_attr_intr_name(
-       struct se_ml_stat_grps *lgrps, char *page)
+static ssize_t target_stat_auth_intr_name_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun_acl *lacl = container_of(lgrps,
-                       struct se_lun_acl, ml_stat_grps);
+       struct se_lun_acl *lacl = auth_to_lacl(item);
        struct se_node_acl *nacl = lacl->se_lun_nacl;
        struct se_dev_entry *deve;
        ssize_t ret;
@@ -1132,13 +970,11 @@ static ssize_t target_stat_scsi_auth_intr_show_attr_intr_name(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(intr_name);
 
-static ssize_t target_stat_scsi_auth_intr_show_attr_map_indx(
-       struct se_ml_stat_grps *lgrps, char *page)
+static ssize_t target_stat_auth_map_indx_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun_acl *lacl = container_of(lgrps,
-                       struct se_lun_acl, ml_stat_grps);
+       struct se_lun_acl *lacl = auth_to_lacl(item);
        struct se_node_acl *nacl = lacl->se_lun_nacl;
        struct se_dev_entry *deve;
        ssize_t ret;
@@ -1154,13 +990,11 @@ static ssize_t target_stat_scsi_auth_intr_show_attr_map_indx(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(map_indx);
 
-static ssize_t target_stat_scsi_auth_intr_show_attr_att_count(
-       struct se_ml_stat_grps *lgrps, char *page)
+static ssize_t target_stat_auth_att_count_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun_acl *lacl = container_of(lgrps,
-                       struct se_lun_acl, ml_stat_grps);
+       struct se_lun_acl *lacl = auth_to_lacl(item);
        struct se_node_acl *nacl = lacl->se_lun_nacl;
        struct se_dev_entry *deve;
        ssize_t ret;
@@ -1176,13 +1010,11 @@ static ssize_t target_stat_scsi_auth_intr_show_attr_att_count(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(att_count);
 
-static ssize_t target_stat_scsi_auth_intr_show_attr_num_cmds(
-       struct se_ml_stat_grps *lgrps, char *page)
+static ssize_t target_stat_auth_num_cmds_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun_acl *lacl = container_of(lgrps,
-                       struct se_lun_acl, ml_stat_grps);
+       struct se_lun_acl *lacl = auth_to_lacl(item);
        struct se_node_acl *nacl = lacl->se_lun_nacl;
        struct se_dev_entry *deve;
        ssize_t ret;
@@ -1199,13 +1031,11 @@ static ssize_t target_stat_scsi_auth_intr_show_attr_num_cmds(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(num_cmds);
 
-static ssize_t target_stat_scsi_auth_intr_show_attr_read_mbytes(
-       struct se_ml_stat_grps *lgrps, char *page)
+static ssize_t target_stat_auth_read_mbytes_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun_acl *lacl = container_of(lgrps,
-                       struct se_lun_acl, ml_stat_grps);
+       struct se_lun_acl *lacl = auth_to_lacl(item);
        struct se_node_acl *nacl = lacl->se_lun_nacl;
        struct se_dev_entry *deve;
        ssize_t ret;
@@ -1222,13 +1052,11 @@ static ssize_t target_stat_scsi_auth_intr_show_attr_read_mbytes(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(read_mbytes);
 
-static ssize_t target_stat_scsi_auth_intr_show_attr_write_mbytes(
-       struct se_ml_stat_grps *lgrps, char *page)
+static ssize_t target_stat_auth_write_mbytes_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun_acl *lacl = container_of(lgrps,
-                       struct se_lun_acl, ml_stat_grps);
+       struct se_lun_acl *lacl = auth_to_lacl(item);
        struct se_node_acl *nacl = lacl->se_lun_nacl;
        struct se_dev_entry *deve;
        ssize_t ret;
@@ -1245,13 +1073,11 @@ static ssize_t target_stat_scsi_auth_intr_show_attr_write_mbytes(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(write_mbytes);
 
-static ssize_t target_stat_scsi_auth_intr_show_attr_hs_num_cmds(
-       struct se_ml_stat_grps *lgrps, char *page)
+static ssize_t target_stat_auth_hs_num_cmds_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun_acl *lacl = container_of(lgrps,
-                       struct se_lun_acl, ml_stat_grps);
+       struct se_lun_acl *lacl = auth_to_lacl(item);
        struct se_node_acl *nacl = lacl->se_lun_nacl;
        struct se_dev_entry *deve;
        ssize_t ret;
@@ -1267,13 +1093,11 @@ static ssize_t target_stat_scsi_auth_intr_show_attr_hs_num_cmds(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(hs_num_cmds);
 
-static ssize_t target_stat_scsi_auth_intr_show_attr_creation_time(
-       struct se_ml_stat_grps *lgrps, char *page)
+static ssize_t target_stat_auth_creation_time_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun_acl *lacl = container_of(lgrps,
-                       struct se_lun_acl, ml_stat_grps);
+       struct se_lun_acl *lacl = auth_to_lacl(item);
        struct se_node_acl *nacl = lacl->se_lun_nacl;
        struct se_dev_entry *deve;
        ssize_t ret;
@@ -1290,13 +1114,11 @@ static ssize_t target_stat_scsi_auth_intr_show_attr_creation_time(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(creation_time);
 
-static ssize_t target_stat_scsi_auth_intr_show_attr_row_status(
-       struct se_ml_stat_grps *lgrps, char *page)
+static ssize_t target_stat_auth_row_status_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun_acl *lacl = container_of(lgrps,
-                       struct se_lun_acl, ml_stat_grps);
+       struct se_lun_acl *lacl = auth_to_lacl(item);
        struct se_node_acl *nacl = lacl->se_lun_nacl;
        struct se_dev_entry *deve;
        ssize_t ret;
@@ -1312,36 +1134,41 @@ static ssize_t target_stat_scsi_auth_intr_show_attr_row_status(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_AUTH_INTR_ATTR_RO(row_status);
 
-CONFIGFS_EATTR_OPS(target_stat_scsi_auth_intr, se_ml_stat_grps,
-               scsi_auth_intr_group);
+CONFIGFS_ATTR_RO(target_stat_auth_, inst);
+CONFIGFS_ATTR_RO(target_stat_auth_, dev);
+CONFIGFS_ATTR_RO(target_stat_auth_, port);
+CONFIGFS_ATTR_RO(target_stat_auth_, indx);
+CONFIGFS_ATTR_RO(target_stat_auth_, dev_or_port);
+CONFIGFS_ATTR_RO(target_stat_auth_, intr_name);
+CONFIGFS_ATTR_RO(target_stat_auth_, map_indx);
+CONFIGFS_ATTR_RO(target_stat_auth_, att_count);
+CONFIGFS_ATTR_RO(target_stat_auth_, num_cmds);
+CONFIGFS_ATTR_RO(target_stat_auth_, read_mbytes);
+CONFIGFS_ATTR_RO(target_stat_auth_, write_mbytes);
+CONFIGFS_ATTR_RO(target_stat_auth_, hs_num_cmds);
+CONFIGFS_ATTR_RO(target_stat_auth_, creation_time);
+CONFIGFS_ATTR_RO(target_stat_auth_, row_status);
 
 static struct configfs_attribute *target_stat_scsi_auth_intr_attrs[] = {
-       &target_stat_scsi_auth_intr_inst.attr,
-       &target_stat_scsi_auth_intr_dev.attr,
-       &target_stat_scsi_auth_intr_port.attr,
-       &target_stat_scsi_auth_intr_indx.attr,
-       &target_stat_scsi_auth_intr_dev_or_port.attr,
-       &target_stat_scsi_auth_intr_intr_name.attr,
-       &target_stat_scsi_auth_intr_map_indx.attr,
-       &target_stat_scsi_auth_intr_att_count.attr,
-       &target_stat_scsi_auth_intr_num_cmds.attr,
-       &target_stat_scsi_auth_intr_read_mbytes.attr,
-       &target_stat_scsi_auth_intr_write_mbytes.attr,
-       &target_stat_scsi_auth_intr_hs_num_cmds.attr,
-       &target_stat_scsi_auth_intr_creation_time.attr,
-       &target_stat_scsi_auth_intr_row_status.attr,
+       &target_stat_auth_attr_inst,
+       &target_stat_auth_attr_dev,
+       &target_stat_auth_attr_port,
+       &target_stat_auth_attr_indx,
+       &target_stat_auth_attr_dev_or_port,
+       &target_stat_auth_attr_intr_name,
+       &target_stat_auth_attr_map_indx,
+       &target_stat_auth_attr_att_count,
+       &target_stat_auth_attr_num_cmds,
+       &target_stat_auth_attr_read_mbytes,
+       &target_stat_auth_attr_write_mbytes,
+       &target_stat_auth_attr_hs_num_cmds,
+       &target_stat_auth_attr_creation_time,
+       &target_stat_auth_attr_row_status,
        NULL,
 };
 
-static struct configfs_item_operations target_stat_scsi_auth_intr_attrib_ops = {
-       .show_attribute         = target_stat_scsi_auth_intr_attr_show,
-       .store_attribute        = target_stat_scsi_auth_intr_attr_store,
-};
-
 static struct config_item_type target_stat_scsi_auth_intr_cit = {
-       .ct_item_ops            = &target_stat_scsi_auth_intr_attrib_ops,
        .ct_attrs               = target_stat_scsi_auth_intr_attrs,
        .ct_owner               = THIS_MODULE,
 };
@@ -1350,25 +1177,17 @@ static struct config_item_type target_stat_scsi_auth_intr_cit = {
  * SCSI Attached Initiator Port Table
  */
 
-CONFIGFS_EATTR_STRUCT(target_stat_scsi_att_intr_port, se_ml_stat_grps);
-#define DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR(_name, _mode)                        \
-static struct target_stat_scsi_att_intr_port_attribute                 \
-               target_stat_scsi_att_intr_port_##_name =                \
-       __CONFIGFS_EATTR(_name, _mode,                                  \
-       target_stat_scsi_att_intr_port_show_attr_##_name,               \
-       target_stat_scsi_att_intr_port_store_attr_##_name);
-
-#define DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(_name)                    \
-static struct target_stat_scsi_att_intr_port_attribute                 \
-               target_stat_scsi_att_intr_port_##_name =                \
-       __CONFIGFS_EATTR_RO(_name,                                      \
-       target_stat_scsi_att_intr_port_show_attr_##_name);
-
-static ssize_t target_stat_scsi_att_intr_port_show_attr_inst(
-       struct se_ml_stat_grps *lgrps, char *page)
-{
-       struct se_lun_acl *lacl = container_of(lgrps,
-                       struct se_lun_acl, ml_stat_grps);
+static struct se_lun_acl *iport_to_lacl(struct config_item *item)
+{
+       struct se_ml_stat_grps *lgrps = container_of(to_config_group(item),
+                       struct se_ml_stat_grps, scsi_att_intr_port_group);
+       return container_of(lgrps, struct se_lun_acl, ml_stat_grps);
+}
+
+static ssize_t target_stat_iport_inst_show(struct config_item *item,
+               char *page)
+{
+       struct se_lun_acl *lacl = iport_to_lacl(item);
        struct se_node_acl *nacl = lacl->se_lun_nacl;
        struct se_dev_entry *deve;
        struct se_portal_group *tpg;
@@ -1387,13 +1206,11 @@ static ssize_t target_stat_scsi_att_intr_port_show_attr_inst(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(inst);
 
-static ssize_t target_stat_scsi_att_intr_port_show_attr_dev(
-       struct se_ml_stat_grps *lgrps, char *page)
+static ssize_t target_stat_iport_dev_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun_acl *lacl = container_of(lgrps,
-                       struct se_lun_acl, ml_stat_grps);
+       struct se_lun_acl *lacl = iport_to_lacl(item);
        struct se_node_acl *nacl = lacl->se_lun_nacl;
        struct se_dev_entry *deve;
        struct se_lun *lun;
@@ -1411,13 +1228,11 @@ static ssize_t target_stat_scsi_att_intr_port_show_attr_dev(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(dev);
 
-static ssize_t target_stat_scsi_att_intr_port_show_attr_port(
-       struct se_ml_stat_grps *lgrps, char *page)
+static ssize_t target_stat_iport_port_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun_acl *lacl = container_of(lgrps,
-                       struct se_lun_acl, ml_stat_grps);
+       struct se_lun_acl *lacl = iport_to_lacl(item);
        struct se_node_acl *nacl = lacl->se_lun_nacl;
        struct se_dev_entry *deve;
        struct se_portal_group *tpg;
@@ -1435,13 +1250,11 @@ static ssize_t target_stat_scsi_att_intr_port_show_attr_port(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(port);
 
-static ssize_t target_stat_scsi_att_intr_port_show_attr_indx(
-       struct se_ml_stat_grps *lgrps, char *page)
+static ssize_t target_stat_iport_indx_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun_acl *lacl = container_of(lgrps,
-                       struct se_lun_acl, ml_stat_grps);
+       struct se_lun_acl *lacl = iport_to_lacl(item);
        struct se_node_acl *nacl = lacl->se_lun_nacl;
        struct se_session *se_sess;
        struct se_portal_group *tpg;
@@ -1461,13 +1274,11 @@ static ssize_t target_stat_scsi_att_intr_port_show_attr_indx(
        spin_unlock_irq(&nacl->nacl_sess_lock);
        return ret;
 }
-DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(indx);
 
-static ssize_t target_stat_scsi_att_intr_port_show_attr_port_auth_indx(
-       struct se_ml_stat_grps *lgrps, char *page)
+static ssize_t target_stat_iport_port_auth_indx_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun_acl *lacl = container_of(lgrps,
-                       struct se_lun_acl, ml_stat_grps);
+       struct se_lun_acl *lacl = iport_to_lacl(item);
        struct se_node_acl *nacl = lacl->se_lun_nacl;
        struct se_dev_entry *deve;
        ssize_t ret;
@@ -1483,13 +1294,11 @@ static ssize_t target_stat_scsi_att_intr_port_show_attr_port_auth_indx(
        rcu_read_unlock();
        return ret;
 }
-DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(port_auth_indx);
 
-static ssize_t target_stat_scsi_att_intr_port_show_attr_port_ident(
-       struct se_ml_stat_grps *lgrps, char *page)
+static ssize_t target_stat_iport_port_ident_show(struct config_item *item,
+               char *page)
 {
-       struct se_lun_acl *lacl = container_of(lgrps,
-                       struct se_lun_acl, ml_stat_grps);
+       struct se_lun_acl *lacl = iport_to_lacl(item);
        struct se_node_acl *nacl = lacl->se_lun_nacl;
        struct se_session *se_sess;
        struct se_portal_group *tpg;
@@ -1513,28 +1322,25 @@ static ssize_t target_stat_scsi_att_intr_port_show_attr_port_ident(
        spin_unlock_irq(&nacl->nacl_sess_lock);
        return ret;
 }
-DEV_STAT_SCSI_ATTR_INTR_PORT_ATTR_RO(port_ident);
 
-CONFIGFS_EATTR_OPS(target_stat_scsi_att_intr_port, se_ml_stat_grps,
-               scsi_att_intr_port_group);
+CONFIGFS_ATTR_RO(target_stat_iport_, inst);
+CONFIGFS_ATTR_RO(target_stat_iport_, dev);
+CONFIGFS_ATTR_RO(target_stat_iport_, port);
+CONFIGFS_ATTR_RO(target_stat_iport_, indx);
+CONFIGFS_ATTR_RO(target_stat_iport_, port_auth_indx);
+CONFIGFS_ATTR_RO(target_stat_iport_, port_ident);
 
 static struct configfs_attribute *target_stat_scsi_ath_intr_port_attrs[] = {
-       &target_stat_scsi_att_intr_port_inst.attr,
-       &target_stat_scsi_att_intr_port_dev.attr,
-       &target_stat_scsi_att_intr_port_port.attr,
-       &target_stat_scsi_att_intr_port_indx.attr,
-       &target_stat_scsi_att_intr_port_port_auth_indx.attr,
-       &target_stat_scsi_att_intr_port_port_ident.attr,
+       &target_stat_iport_attr_inst,
+       &target_stat_iport_attr_dev,
+       &target_stat_iport_attr_port,
+       &target_stat_iport_attr_indx,
+       &target_stat_iport_attr_port_auth_indx,
+       &target_stat_iport_attr_port_ident,
        NULL,
 };
 
-static struct configfs_item_operations target_stat_scsi_att_intr_port_attrib_ops = {
-       .show_attribute         = target_stat_scsi_att_intr_port_attr_show,
-       .store_attribute        = target_stat_scsi_att_intr_port_attr_store,
-};
-
 static struct config_item_type target_stat_scsi_att_intr_port_cit = {
-       .ct_item_ops            = &target_stat_scsi_att_intr_port_attrib_ops,
        .ct_attrs               = target_stat_scsi_ath_intr_port_attrs,
        .ct_owner               = THIS_MODULE,
 };
index aa3caca8bace13dc29a8cd9cb01d5b252b5c8a6c..064d6dfb5b6d9391bdd96f55ec4ae3f7d238655b 100644 (file)
@@ -36,7 +36,6 @@
 
 #include <target/target_core_base.h>
 #include <target/target_core_fabric.h>
-#include <target/configfs_macros.h>
 
 #include "tcm_fc.h"
 
index 16670933013bf6b7d803471a73de3c87b79459a1..85aeaa0ad303b9cff6e33234c2fe685b964ca53b 100644 (file)
@@ -38,8 +38,6 @@
 
 #include <target/target_core_base.h>
 #include <target/target_core_fabric.h>
-#include <target/target_core_fabric_configfs.h>
-#include <target/configfs_macros.h>
 
 #include "tcm_fc.h"
 
@@ -131,55 +129,51 @@ static ssize_t ft_wwn_store(void *arg, const char *buf, size_t len)
  * ACL auth ops.
  */
 
-static ssize_t ft_nacl_show_port_name(
-       struct se_node_acl *se_nacl,
-       char *page)
+static ssize_t ft_nacl_port_name_show(struct config_item *item, char *page)
 {
+       struct se_node_acl *se_nacl = acl_to_nacl(item);
        struct ft_node_acl *acl = container_of(se_nacl,
                        struct ft_node_acl, se_node_acl);
 
        return ft_wwn_show(&acl->node_auth.port_name, page);
 }
 
-static ssize_t ft_nacl_store_port_name(
-       struct se_node_acl *se_nacl,
-       const char *page,
-       size_t count)
+static ssize_t ft_nacl_port_name_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_node_acl *se_nacl = acl_to_nacl(item);
        struct ft_node_acl *acl = container_of(se_nacl,
                        struct ft_node_acl, se_node_acl);
 
        return ft_wwn_store(&acl->node_auth.port_name, page, count);
 }
 
-TF_NACL_BASE_ATTR(ft, port_name, S_IRUGO | S_IWUSR);
-
-static ssize_t ft_nacl_show_node_name(
-       struct se_node_acl *se_nacl,
-       char *page)
+static ssize_t ft_nacl_node_name_show(struct config_item *item,
+               char *page)
 {
+       struct se_node_acl *se_nacl = acl_to_nacl(item);
        struct ft_node_acl *acl = container_of(se_nacl,
                        struct ft_node_acl, se_node_acl);
 
        return ft_wwn_show(&acl->node_auth.node_name, page);
 }
 
-static ssize_t ft_nacl_store_node_name(
-       struct se_node_acl *se_nacl,
-       const char *page,
-       size_t count)
+static ssize_t ft_nacl_node_name_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_node_acl *se_nacl = acl_to_nacl(item);
        struct ft_node_acl *acl = container_of(se_nacl,
                        struct ft_node_acl, se_node_acl);
 
        return ft_wwn_store(&acl->node_auth.node_name, page, count);
 }
 
-TF_NACL_BASE_ATTR(ft, node_name, S_IRUGO | S_IWUSR);
+CONFIGFS_ATTR(ft_nacl_, node_name);
+CONFIGFS_ATTR(ft_nacl_, port_name);
 
 static struct configfs_attribute *ft_nacl_base_attrs[] = {
-       &ft_nacl_port_name.attr,
-       &ft_nacl_node_name.attr,
+       &ft_nacl_attr_port_name,
+       &ft_nacl_attr_node_name,
        NULL,
 };
 
@@ -386,18 +380,16 @@ static void ft_del_wwn(struct se_wwn *wwn)
        kfree(ft_wwn);
 }
 
-static ssize_t ft_wwn_show_attr_version(
-       struct target_fabric_configfs *tf,
-       char *page)
+static ssize_t ft_wwn_version_show(struct config_item *item, char *page)
 {
        return sprintf(page, "TCM FC " FT_VERSION " on %s/%s on "
                ""UTS_RELEASE"\n",  utsname()->sysname, utsname()->machine);
 }
 
-TF_WWN_ATTR_RO(ft, version);
+CONFIGFS_ATTR_RO(ft_wwn_, version);
 
 static struct configfs_attribute *ft_wwn_attrs[] = {
-       &ft_wwn_version.attr,
+       &ft_wwn_attr_version,
        NULL,
 };
 
index 4b0fedd6bd4be2236f2beb636e05251345687c60..847c1aa6fbf4d037bb385041719b39f1ef2c37b6 100644 (file)
@@ -44,7 +44,6 @@
 
 #include <target/target_core_base.h>
 #include <target/target_core_fabric.h>
-#include <target/configfs_macros.h>
 
 #include "tcm_fc.h"
 
index 31a9e3fb98c5321de2e6b774c875845638c81862..7b934eac995df68aaf764bceaaa4f14472db3314 100644 (file)
@@ -36,7 +36,6 @@
 
 #include <target/target_core_base.h>
 #include <target/target_core_fabric.h>
-#include <target/configfs_macros.h>
 
 #include "tcm_fc.h"
 
index 294eb74fb078508f6889902e1a0c841f3b603ece..163d305e1200bb07a73357d7b5824d97b362b924 100644 (file)
@@ -64,6 +64,11 @@ struct gadget_info {
        char qw_sign[OS_STRING_QW_SIGN_LEN];
 };
 
+static inline struct gadget_info *to_gadget_info(struct config_item *item)
+{
+        return container_of(to_config_group(item), struct gadget_info, group);
+}
+
 struct config_usb_cfg {
        struct config_group group;
        struct config_group strings_group;
@@ -74,6 +79,12 @@ struct config_usb_cfg {
        struct usb_gadget_strings *gstrings[MAX_USB_STRING_LANGS + 1];
 };
 
+static inline struct config_usb_cfg *to_config_usb_cfg(struct config_item *item)
+{
+       return container_of(to_config_group(item), struct config_usb_cfg,
+                       group);
+}
+
 struct gadget_strings {
        struct usb_gadget_strings stringtab_dev;
        struct usb_string strings[USB_GADGET_FIRST_AVAIL_IDX];
@@ -117,32 +128,25 @@ static int usb_string_copy(const char *s, char **s_copy)
        return 0;
 }
 
-CONFIGFS_ATTR_STRUCT(gadget_info);
-CONFIGFS_ATTR_STRUCT(config_usb_cfg);
-
-#define GI_DEVICE_DESC_ITEM_ATTR(name) \
-       static struct gadget_info_attribute gadget_cdev_desc_##name = \
-               __CONFIGFS_ATTR(name,  S_IRUGO | S_IWUSR,               \
-                               gadget_dev_desc_##name##_show,          \
-                               gadget_dev_desc_##name##_store)
-
 #define GI_DEVICE_DESC_SIMPLE_R_u8(__name)     \
-       static ssize_t gadget_dev_desc_##__name##_show(struct gadget_info *gi, \
+static ssize_t gadget_dev_desc_##__name##_show(struct config_item *item, \
                        char *page)     \
 {      \
-       return sprintf(page, "0x%02x\n", gi->cdev.desc.__name); \
+       return sprintf(page, "0x%02x\n", \
+               to_gadget_info(item)->cdev.desc.__name); \
 }
 
 #define GI_DEVICE_DESC_SIMPLE_R_u16(__name)    \
-       static ssize_t gadget_dev_desc_##__name##_show(struct gadget_info *gi, \
+static ssize_t gadget_dev_desc_##__name##_show(struct config_item *item, \
                        char *page)     \
 {      \
-       return sprintf(page, "0x%04x\n", le16_to_cpup(&gi->cdev.desc.__name)); \
+       return sprintf(page, "0x%04x\n", \
+               le16_to_cpup(&to_gadget_info(item)->cdev.desc.__name)); \
 }
 
 
 #define GI_DEVICE_DESC_SIMPLE_W_u8(_name)              \
-       static ssize_t gadget_dev_desc_##_name##_store(struct gadget_info *gi, \
+static ssize_t gadget_dev_desc_##_name##_store(struct config_item *item, \
                const char *page, size_t len)           \
 {                                                      \
        u8 val;                                         \
@@ -150,12 +154,12 @@ CONFIGFS_ATTR_STRUCT(config_usb_cfg);
        ret = kstrtou8(page, 0, &val);                  \
        if (ret)                                        \
                return ret;                             \
-       gi->cdev.desc._name = val;                      \
+       to_gadget_info(item)->cdev.desc._name = val;    \
        return len;                                     \
 }
 
 #define GI_DEVICE_DESC_SIMPLE_W_u16(_name)     \
-       static ssize_t gadget_dev_desc_##_name##_store(struct gadget_info *gi, \
+static ssize_t gadget_dev_desc_##_name##_store(struct config_item *item, \
                const char *page, size_t len)           \
 {                                                      \
        u16 val;                                        \
@@ -163,7 +167,7 @@ CONFIGFS_ATTR_STRUCT(config_usb_cfg);
        ret = kstrtou16(page, 0, &val);                 \
        if (ret)                                        \
                return ret;                             \
-       gi->cdev.desc._name = cpu_to_le16p(&val);       \
+       to_gadget_info(item)->cdev.desc._name = cpu_to_le16p(&val);     \
        return len;                                     \
 }
 
@@ -193,7 +197,7 @@ static ssize_t is_valid_bcd(u16 bcd_val)
        return 0;
 }
 
-static ssize_t gadget_dev_desc_bcdDevice_store(struct gadget_info *gi,
+static ssize_t gadget_dev_desc_bcdDevice_store(struct config_item *item,
                const char *page, size_t len)
 {
        u16 bcdDevice;
@@ -206,11 +210,11 @@ static ssize_t gadget_dev_desc_bcdDevice_store(struct gadget_info *gi,
        if (ret)
                return ret;
 
-       gi->cdev.desc.bcdDevice = cpu_to_le16(bcdDevice);
+       to_gadget_info(item)->cdev.desc.bcdDevice = cpu_to_le16(bcdDevice);
        return len;
 }
 
-static ssize_t gadget_dev_desc_bcdUSB_store(struct gadget_info *gi,
+static ssize_t gadget_dev_desc_bcdUSB_store(struct config_item *item,
                const char *page, size_t len)
 {
        u16 bcdUSB;
@@ -223,13 +227,13 @@ static ssize_t gadget_dev_desc_bcdUSB_store(struct gadget_info *gi,
        if (ret)
                return ret;
 
-       gi->cdev.desc.bcdUSB = cpu_to_le16(bcdUSB);
+       to_gadget_info(item)->cdev.desc.bcdUSB = cpu_to_le16(bcdUSB);
        return len;
 }
 
-static ssize_t gadget_dev_desc_UDC_show(struct gadget_info *gi, char *page)
+static ssize_t gadget_dev_desc_UDC_show(struct config_item *item, char *page)
 {
-       return sprintf(page, "%s\n", gi->udc_name ?: "");
+       return sprintf(page, "%s\n", to_gadget_info(item)->udc_name ?: "");
 }
 
 static int unregister_gadget(struct gadget_info *gi)
@@ -247,9 +251,10 @@ static int unregister_gadget(struct gadget_info *gi)
        return 0;
 }
 
-static ssize_t gadget_dev_desc_UDC_store(struct gadget_info *gi,
+static ssize_t gadget_dev_desc_UDC_store(struct config_item *item,
                const char *page, size_t len)
 {
+       struct gadget_info *gi = to_gadget_info(item);
        char *name;
        int ret;
 
@@ -283,34 +288,29 @@ err:
        return ret;
 }
 
-GI_DEVICE_DESC_ITEM_ATTR(bDeviceClass);
-GI_DEVICE_DESC_ITEM_ATTR(bDeviceSubClass);
-GI_DEVICE_DESC_ITEM_ATTR(bDeviceProtocol);
-GI_DEVICE_DESC_ITEM_ATTR(bMaxPacketSize0);
-GI_DEVICE_DESC_ITEM_ATTR(idVendor);
-GI_DEVICE_DESC_ITEM_ATTR(idProduct);
-GI_DEVICE_DESC_ITEM_ATTR(bcdDevice);
-GI_DEVICE_DESC_ITEM_ATTR(bcdUSB);
-GI_DEVICE_DESC_ITEM_ATTR(UDC);
+CONFIGFS_ATTR(gadget_dev_desc_, bDeviceClass);
+CONFIGFS_ATTR(gadget_dev_desc_, bDeviceSubClass);
+CONFIGFS_ATTR(gadget_dev_desc_, bDeviceProtocol);
+CONFIGFS_ATTR(gadget_dev_desc_, bMaxPacketSize0);
+CONFIGFS_ATTR(gadget_dev_desc_, idVendor);
+CONFIGFS_ATTR(gadget_dev_desc_, idProduct);
+CONFIGFS_ATTR(gadget_dev_desc_, bcdDevice);
+CONFIGFS_ATTR(gadget_dev_desc_, bcdUSB);
+CONFIGFS_ATTR(gadget_dev_desc_, UDC);
 
 static struct configfs_attribute *gadget_root_attrs[] = {
-       &gadget_cdev_desc_bDeviceClass.attr,
-       &gadget_cdev_desc_bDeviceSubClass.attr,
-       &gadget_cdev_desc_bDeviceProtocol.attr,
-       &gadget_cdev_desc_bMaxPacketSize0.attr,
-       &gadget_cdev_desc_idVendor.attr,
-       &gadget_cdev_desc_idProduct.attr,
-       &gadget_cdev_desc_bcdDevice.attr,
-       &gadget_cdev_desc_bcdUSB.attr,
-       &gadget_cdev_desc_UDC.attr,
+       &gadget_dev_desc_attr_bDeviceClass,
+       &gadget_dev_desc_attr_bDeviceSubClass,
+       &gadget_dev_desc_attr_bDeviceProtocol,
+       &gadget_dev_desc_attr_bMaxPacketSize0,
+       &gadget_dev_desc_attr_idVendor,
+       &gadget_dev_desc_attr_idProduct,
+       &gadget_dev_desc_attr_bcdDevice,
+       &gadget_dev_desc_attr_bcdUSB,
+       &gadget_dev_desc_attr_UDC,
        NULL,
 };
 
-static inline struct gadget_info *to_gadget_info(struct config_item *item)
-{
-        return container_of(to_config_group(item), struct gadget_info, group);
-}
-
 static inline struct gadget_strings *to_gadget_strings(struct config_item *item)
 {
         return container_of(to_config_group(item), struct gadget_strings,
@@ -324,12 +324,6 @@ static inline struct gadget_config_name *to_gadget_config_name(
                         group);
 }
 
-static inline struct config_usb_cfg *to_config_usb_cfg(struct config_item *item)
-{
-       return container_of(to_config_group(item), struct config_usb_cfg,
-                       group);
-}
-
 static inline struct usb_function_instance *to_usb_function_instance(
                struct config_item *item)
 {
@@ -348,12 +342,8 @@ static void gadget_info_attr_release(struct config_item *item)
        kfree(gi);
 }
 
-CONFIGFS_ATTR_OPS(gadget_info);
-
 static struct configfs_item_operations gadget_root_item_ops = {
        .release                = gadget_info_attr_release,
-       .show_attribute         = gadget_info_attr_show,
-       .store_attribute        = gadget_info_attr_store,
 };
 
 static void gadget_config_attr_release(struct config_item *item)
@@ -454,24 +444,20 @@ static int config_usb_cfg_unlink(
        return 0;
 }
 
-CONFIGFS_ATTR_OPS(config_usb_cfg);
-
 static struct configfs_item_operations gadget_config_item_ops = {
        .release                = gadget_config_attr_release,
-       .show_attribute         = config_usb_cfg_attr_show,
-       .store_attribute        = config_usb_cfg_attr_store,
        .allow_link             = config_usb_cfg_link,
        .drop_link              = config_usb_cfg_unlink,
 };
 
 
-static ssize_t gadget_config_desc_MaxPower_show(struct config_usb_cfg *cfg,
+static ssize_t gadget_config_desc_MaxPower_show(struct config_item *item,
                char *page)
 {
-       return sprintf(page, "%u\n", cfg->c.MaxPower);
+       return sprintf(page, "%u\n", to_config_usb_cfg(item)->c.MaxPower);
 }
 
-static ssize_t gadget_config_desc_MaxPower_store(struct config_usb_cfg *cfg,
+static ssize_t gadget_config_desc_MaxPower_store(struct config_item *item,
                const char *page, size_t len)
 {
        u16 val;
@@ -481,17 +467,18 @@ static ssize_t gadget_config_desc_MaxPower_store(struct config_usb_cfg *cfg,
                return ret;
        if (DIV_ROUND_UP(val, 8) > 0xff)
                return -ERANGE;
-       cfg->c.MaxPower = val;
+       to_config_usb_cfg(item)->c.MaxPower = val;
        return len;
 }
 
-static ssize_t gadget_config_desc_bmAttributes_show(struct config_usb_cfg *cfg,
+static ssize_t gadget_config_desc_bmAttributes_show(struct config_item *item,
                char *page)
 {
-       return sprintf(page, "0x%02x\n", cfg->c.bmAttributes);
+       return sprintf(page, "0x%02x\n",
+               to_config_usb_cfg(item)->c.bmAttributes);
 }
 
-static ssize_t gadget_config_desc_bmAttributes_store(struct config_usb_cfg *cfg,
+static ssize_t gadget_config_desc_bmAttributes_store(struct config_item *item,
                const char *page, size_t len)
 {
        u8 val;
@@ -504,22 +491,16 @@ static ssize_t gadget_config_desc_bmAttributes_store(struct config_usb_cfg *cfg,
        if (val & ~(USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER |
                                USB_CONFIG_ATT_WAKEUP))
                return -EINVAL;
-       cfg->c.bmAttributes = val;
+       to_config_usb_cfg(item)->c.bmAttributes = val;
        return len;
 }
 
-#define CFG_CONFIG_DESC_ITEM_ATTR(name)        \
-       static struct config_usb_cfg_attribute gadget_usb_cfg_##name = \
-               __CONFIGFS_ATTR(name,  S_IRUGO | S_IWUSR,               \
-                               gadget_config_desc_##name##_show,       \
-                               gadget_config_desc_##name##_store)
-
-CFG_CONFIG_DESC_ITEM_ATTR(MaxPower);
-CFG_CONFIG_DESC_ITEM_ATTR(bmAttributes);
+CONFIGFS_ATTR(gadget_config_desc_, MaxPower);
+CONFIGFS_ATTR(gadget_config_desc_, bmAttributes);
 
 static struct configfs_attribute *gadget_config_attrs[] = {
-       &gadget_usb_cfg_MaxPower.attr,
-       &gadget_usb_cfg_bmAttributes.attr,
+       &gadget_config_desc_attr_MaxPower,
+       &gadget_config_desc_attr_bmAttributes,
        NULL,
 };
 
@@ -616,11 +597,10 @@ static struct config_item_type functions_type = {
        .ct_owner       = THIS_MODULE,
 };
 
-CONFIGFS_ATTR_STRUCT(gadget_config_name);
 GS_STRINGS_RW(gadget_config_name, configuration);
 
 static struct configfs_attribute *gadget_config_name_langid_attrs[] = {
-       &gadget_config_name_configuration.attr,
+       &gadget_config_name_attr_configuration,
        NULL,
 };
 
@@ -719,15 +699,14 @@ static struct config_item_type config_desc_type = {
        .ct_owner       = THIS_MODULE,
 };
 
-CONFIGFS_ATTR_STRUCT(gadget_strings);
 GS_STRINGS_RW(gadget_strings, manufacturer);
 GS_STRINGS_RW(gadget_strings, product);
 GS_STRINGS_RW(gadget_strings, serialnumber);
 
 static struct configfs_attribute *gadget_strings_langid_attrs[] = {
-       &gadget_strings_manufacturer.attr,
-       &gadget_strings_product.attr,
-       &gadget_strings_serialnumber.attr,
+       &gadget_strings_attr_manufacturer,
+       &gadget_strings_attr_product,
+       &gadget_strings_attr_serialnumber,
        NULL,
 };
 
@@ -751,27 +730,25 @@ static inline struct os_desc *to_os_desc(struct config_item *item)
        return container_of(to_config_group(item), struct os_desc, group);
 }
 
-CONFIGFS_ATTR_STRUCT(os_desc);
-CONFIGFS_ATTR_OPS(os_desc);
-
-static ssize_t os_desc_use_show(struct os_desc *os_desc, char *page)
+static inline struct gadget_info *os_desc_item_to_gadget_info(
+               struct config_item *item)
 {
-       struct gadget_info *gi;
-
-       gi = to_gadget_info(os_desc->group.cg_item.ci_parent);
+       return to_gadget_info(to_os_desc(item)->group.cg_item.ci_parent);
+}
 
-       return sprintf(page, "%d", gi->use_os_desc);
+static ssize_t os_desc_use_show(struct config_item *item, char *page)
+{
+       return sprintf(page, "%d",
+                       os_desc_item_to_gadget_info(item)->use_os_desc);
 }
 
-static ssize_t os_desc_use_store(struct os_desc *os_desc, const char *page,
+static ssize_t os_desc_use_store(struct config_item *item, const char *page,
                                 size_t len)
 {
-       struct gadget_info *gi;
+       struct gadget_info *gi = os_desc_item_to_gadget_info(item);
        int ret;
        bool use;
 
-       gi = to_gadget_info(os_desc->group.cg_item.ci_parent);
-
        mutex_lock(&gi->lock);
        ret = strtobool(page, &use);
        if (!ret) {
@@ -783,29 +760,19 @@ static ssize_t os_desc_use_store(struct os_desc *os_desc, const char *page,
        return ret;
 }
 
-static struct os_desc_attribute os_desc_use =
-       __CONFIGFS_ATTR(use, S_IRUGO | S_IWUSR,
-                       os_desc_use_show,
-                       os_desc_use_store);
-
-static ssize_t os_desc_b_vendor_code_show(struct os_desc *os_desc, char *page)
+static ssize_t os_desc_b_vendor_code_show(struct config_item *item, char *page)
 {
-       struct gadget_info *gi;
-
-       gi = to_gadget_info(os_desc->group.cg_item.ci_parent);
-
-       return sprintf(page, "%d", gi->b_vendor_code);
+       return sprintf(page, "%d",
+                       os_desc_item_to_gadget_info(item)->b_vendor_code);
 }
 
-static ssize_t os_desc_b_vendor_code_store(struct os_desc *os_desc,
+static ssize_t os_desc_b_vendor_code_store(struct config_item *item,
                                           const char *page, size_t len)
 {
-       struct gadget_info *gi;
+       struct gadget_info *gi = os_desc_item_to_gadget_info(item);
        int ret;
        u8 b_vendor_code;
 
-       gi = to_gadget_info(os_desc->group.cg_item.ci_parent);
-
        mutex_lock(&gi->lock);
        ret = kstrtou8(page, 0, &b_vendor_code);
        if (!ret) {
@@ -817,29 +784,20 @@ static ssize_t os_desc_b_vendor_code_store(struct os_desc *os_desc,
        return ret;
 }
 
-static struct os_desc_attribute os_desc_b_vendor_code =
-       __CONFIGFS_ATTR(b_vendor_code, S_IRUGO | S_IWUSR,
-                       os_desc_b_vendor_code_show,
-                       os_desc_b_vendor_code_store);
-
-static ssize_t os_desc_qw_sign_show(struct os_desc *os_desc, char *page)
+static ssize_t os_desc_qw_sign_show(struct config_item *item, char *page)
 {
-       struct gadget_info *gi;
-
-       gi = to_gadget_info(os_desc->group.cg_item.ci_parent);
+       struct gadget_info *gi = os_desc_item_to_gadget_info(item);
 
        memcpy(page, gi->qw_sign, OS_STRING_QW_SIGN_LEN);
-
        return OS_STRING_QW_SIGN_LEN;
 }
 
-static ssize_t os_desc_qw_sign_store(struct os_desc *os_desc, const char *page,
+static ssize_t os_desc_qw_sign_store(struct config_item *item, const char *page,
                                     size_t len)
 {
-       struct gadget_info *gi;
+       struct gadget_info *gi = os_desc_item_to_gadget_info(item);
        int res, l;
 
-       gi = to_gadget_info(os_desc->group.cg_item.ci_parent);
        l = min((int)len, OS_STRING_QW_SIGN_LEN >> 1);
        if (page[l - 1] == '\n')
                --l;
@@ -855,15 +813,14 @@ static ssize_t os_desc_qw_sign_store(struct os_desc *os_desc, const char *page,
        return res;
 }
 
-static struct os_desc_attribute os_desc_qw_sign =
-       __CONFIGFS_ATTR(qw_sign, S_IRUGO | S_IWUSR,
-                       os_desc_qw_sign_show,
-                       os_desc_qw_sign_store);
+CONFIGFS_ATTR(os_desc_, use);
+CONFIGFS_ATTR(os_desc_, b_vendor_code);
+CONFIGFS_ATTR(os_desc_, qw_sign);
 
 static struct configfs_attribute *os_desc_attrs[] = {
-       &os_desc_use.attr,
-       &os_desc_b_vendor_code.attr,
-       &os_desc_qw_sign.attr,
+       &os_desc_attr_use,
+       &os_desc_attr_b_vendor_code,
+       &os_desc_attr_qw_sign,
        NULL,
 };
 
@@ -926,8 +883,6 @@ static int os_desc_unlink(struct config_item *os_desc_ci,
 
 static struct configfs_item_operations os_desc_ops = {
        .release                = os_desc_attr_release,
-       .show_attribute         = os_desc_attr_show,
-       .store_attribute        = os_desc_attr_store,
        .allow_link             = os_desc_link,
        .drop_link              = os_desc_unlink,
 };
@@ -938,28 +893,21 @@ static struct config_item_type os_desc_type = {
        .ct_owner       = THIS_MODULE,
 };
 
-CONFIGFS_ATTR_STRUCT(usb_os_desc);
-CONFIGFS_ATTR_OPS(usb_os_desc);
-
-
 static inline struct usb_os_desc_ext_prop
 *to_usb_os_desc_ext_prop(struct config_item *item)
 {
        return container_of(item, struct usb_os_desc_ext_prop, item);
 }
 
-CONFIGFS_ATTR_STRUCT(usb_os_desc_ext_prop);
-CONFIGFS_ATTR_OPS(usb_os_desc_ext_prop);
-
-static ssize_t ext_prop_type_show(struct usb_os_desc_ext_prop *ext_prop,
-                                 char *page)
+static ssize_t ext_prop_type_show(struct config_item *item, char *page)
 {
-       return sprintf(page, "%d", ext_prop->type);
+       return sprintf(page, "%d", to_usb_os_desc_ext_prop(item)->type);
 }
 
-static ssize_t ext_prop_type_store(struct usb_os_desc_ext_prop *ext_prop,
+static ssize_t ext_prop_type_store(struct config_item *item,
                                   const char *page, size_t len)
 {
+       struct usb_os_desc_ext_prop *ext_prop = to_usb_os_desc_ext_prop(item);
        struct usb_os_desc *desc = to_usb_os_desc(ext_prop->item.ci_parent);
        u8 type;
        int ret;
@@ -997,9 +945,9 @@ end:
        return ret;
 }
 
-static ssize_t ext_prop_data_show(struct usb_os_desc_ext_prop *ext_prop,
-                                 char *page)
+static ssize_t ext_prop_data_show(struct config_item *item, char *page)
 {
+       struct usb_os_desc_ext_prop *ext_prop = to_usb_os_desc_ext_prop(item);
        int len = ext_prop->data_len;
 
        if (ext_prop->type == USB_EXT_PROP_UNICODE ||
@@ -1011,9 +959,10 @@ static ssize_t ext_prop_data_show(struct usb_os_desc_ext_prop *ext_prop,
        return len;
 }
 
-static ssize_t ext_prop_data_store(struct usb_os_desc_ext_prop *ext_prop,
+static ssize_t ext_prop_data_store(struct config_item *item,
                                   const char *page, size_t len)
 {
+       struct usb_os_desc_ext_prop *ext_prop = to_usb_os_desc_ext_prop(item);
        struct usb_os_desc *desc = to_usb_os_desc(ext_prop->item.ci_parent);
        char *new_data;
        size_t ret_len = len;
@@ -1044,17 +993,12 @@ static ssize_t ext_prop_data_store(struct usb_os_desc_ext_prop *ext_prop,
        return ret_len;
 }
 
-static struct usb_os_desc_ext_prop_attribute ext_prop_type =
-       __CONFIGFS_ATTR(type, S_IRUGO | S_IWUSR,
-                       ext_prop_type_show, ext_prop_type_store);
-
-static struct usb_os_desc_ext_prop_attribute ext_prop_data =
-       __CONFIGFS_ATTR(data, S_IRUGO | S_IWUSR,
-                       ext_prop_data_show, ext_prop_data_store);
+CONFIGFS_ATTR(ext_prop_, type);
+CONFIGFS_ATTR(ext_prop_, data);
 
 static struct configfs_attribute *ext_prop_attrs[] = {
-       &ext_prop_type.attr,
-       &ext_prop_data.attr,
+       &ext_prop_attr_type,
+       &ext_prop_attr_data,
        NULL,
 };
 
@@ -1067,8 +1011,6 @@ static void usb_os_desc_ext_prop_release(struct config_item *item)
 
 static struct configfs_item_operations ext_prop_ops = {
        .release                = usb_os_desc_ext_prop_release,
-       .show_attribute         = usb_os_desc_ext_prop_attr_show,
-       .store_attribute        = usb_os_desc_ext_prop_attr_store,
 };
 
 static struct config_item *ext_prop_make(
@@ -1137,21 +1079,17 @@ static struct configfs_group_operations interf_grp_ops = {
        .drop_item      = &ext_prop_drop,
 };
 
-static struct configfs_item_operations interf_item_ops = {
-       .show_attribute         = usb_os_desc_attr_show,
-       .store_attribute        = usb_os_desc_attr_store,
-};
-
-static ssize_t interf_grp_compatible_id_show(struct usb_os_desc *desc,
+static ssize_t interf_grp_compatible_id_show(struct config_item *item,
                                             char *page)
 {
-       memcpy(page, desc->ext_compat_id, 8);
+       memcpy(page, to_usb_os_desc(item)->ext_compat_id, 8);
        return 8;
 }
 
-static ssize_t interf_grp_compatible_id_store(struct usb_os_desc *desc,
+static ssize_t interf_grp_compatible_id_store(struct config_item *item,
                                              const char *page, size_t len)
 {
+       struct usb_os_desc *desc = to_usb_os_desc(item);
        int l;
 
        l = min_t(int, 8, len);
@@ -1167,21 +1105,17 @@ static ssize_t interf_grp_compatible_id_store(struct usb_os_desc *desc,
        return len;
 }
 
-static struct usb_os_desc_attribute interf_grp_attr_compatible_id =
-       __CONFIGFS_ATTR(compatible_id, S_IRUGO | S_IWUSR,
-                       interf_grp_compatible_id_show,
-                       interf_grp_compatible_id_store);
-
-static ssize_t interf_grp_sub_compatible_id_show(struct usb_os_desc *desc,
+static ssize_t interf_grp_sub_compatible_id_show(struct config_item *item,
                                                 char *page)
 {
-       memcpy(page, desc->ext_compat_id + 8, 8);
+       memcpy(page, to_usb_os_desc(item)->ext_compat_id + 8, 8);
        return 8;
 }
 
-static ssize_t interf_grp_sub_compatible_id_store(struct usb_os_desc *desc,
+static ssize_t interf_grp_sub_compatible_id_store(struct config_item *item,
                                                  const char *page, size_t len)
 {
+       struct usb_os_desc *desc = to_usb_os_desc(item);
        int l;
 
        l = min_t(int, 8, len);
@@ -1197,14 +1131,12 @@ static ssize_t interf_grp_sub_compatible_id_store(struct usb_os_desc *desc,
        return len;
 }
 
-static struct usb_os_desc_attribute interf_grp_attr_sub_compatible_id =
-       __CONFIGFS_ATTR(sub_compatible_id, S_IRUGO | S_IWUSR,
-                       interf_grp_sub_compatible_id_show,
-                       interf_grp_sub_compatible_id_store);
+CONFIGFS_ATTR(interf_grp_, compatible_id);
+CONFIGFS_ATTR(interf_grp_, sub_compatible_id);
 
 static struct configfs_attribute *interf_grp_attrs[] = {
-       &interf_grp_attr_compatible_id.attr,
-       &interf_grp_attr_sub_compatible_id.attr,
+       &interf_grp_attr_compatible_id,
+       &interf_grp_attr_sub_compatible_id,
        NULL
 };
 
@@ -1242,7 +1174,6 @@ int usb_os_desc_prepare_interf_dir(struct config_group *parent,
        f_default_groups[0] = os_desc_group;
 
        os_desc_group->default_groups = interface_groups;
-       interface_type->ct_item_ops = &interf_item_ops;
        interface_type->ct_group_ops = &interf_grp_ops;
        interface_type->ct_attrs = interf_grp_attrs;
        interface_type->ct_owner = owner;
index 22e723d12d36ff4a6a24b07b703ac6172cf799ba..2fa1e80a3ce7bbdd941ddf30fb79e8860812a907 100644 (file)
@@ -761,21 +761,6 @@ static inline struct f_serial_opts *to_f_serial_opts(struct config_item *item)
                        func_inst.group);
 }
 
-CONFIGFS_ATTR_STRUCT(f_serial_opts);
-static ssize_t f_acm_attr_show(struct config_item *item,
-                                struct configfs_attribute *attr,
-                                char *page)
-{
-       struct f_serial_opts *opts = to_f_serial_opts(item);
-       struct f_serial_opts_attribute *f_serial_opts_attr =
-               container_of(attr, struct f_serial_opts_attribute, attr);
-       ssize_t ret = 0;
-
-       if (f_serial_opts_attr->show)
-               ret = f_serial_opts_attr->show(opts, page);
-       return ret;
-}
-
 static void acm_attr_release(struct config_item *item)
 {
        struct f_serial_opts *opts = to_f_serial_opts(item);
@@ -785,20 +770,17 @@ static void acm_attr_release(struct config_item *item)
 
 static struct configfs_item_operations acm_item_ops = {
        .release                = acm_attr_release,
-       .show_attribute         = f_acm_attr_show,
 };
 
-static ssize_t f_acm_port_num_show(struct f_serial_opts *opts, char *page)
+static ssize_t f_acm_port_num_show(struct config_item *item, char *page)
 {
-       return sprintf(page, "%u\n", opts->port_num);
+       return sprintf(page, "%u\n", to_f_serial_opts(item)->port_num);
 }
 
-static struct f_serial_opts_attribute f_acm_port_num =
-       __CONFIGFS_ATTR_RO(port_num, f_acm_port_num_show);
-
+CONFIGFS_ATTR_RO(f_acm_port_, num);
 
 static struct configfs_attribute *acm_attrs[] = {
-       &f_acm_port_num.attr,
+       &f_acm_port_attr_num,
        NULL,
 };
 
index 4abca70cdaab9d52e529dcc85b2dabb30137d7e1..7ad60ee419144fd89b6d109439dcacd99c6a3db7 100644 (file)
@@ -838,10 +838,10 @@ USB_ETHERNET_CONFIGFS_ITEM_ATTR_QMULT(ecm);
 USB_ETHERNET_CONFIGFS_ITEM_ATTR_IFNAME(ecm);
 
 static struct configfs_attribute *ecm_attrs[] = {
-       &f_ecm_opts_dev_addr.attr,
-       &f_ecm_opts_host_addr.attr,
-       &f_ecm_opts_qmult.attr,
-       &f_ecm_opts_ifname.attr,
+       &ecm_opts_attr_dev_addr,
+       &ecm_opts_attr_host_addr,
+       &ecm_opts_attr_qmult,
+       &ecm_opts_attr_ifname,
        NULL,
 };
 
index 9a55757c729b2f59f1d512a8f4f67dffa89c5feb..cad35a502d3f73a64759cd8eb8d541d36104cbac 100644 (file)
@@ -545,10 +545,10 @@ USB_ETHERNET_CONFIGFS_ITEM_ATTR_QMULT(eem);
 USB_ETHERNET_CONFIGFS_ITEM_ATTR_IFNAME(eem);
 
 static struct configfs_attribute *eem_attrs[] = {
-       &f_eem_opts_dev_addr.attr,
-       &f_eem_opts_host_addr.attr,
-       &f_eem_opts_qmult.attr,
-       &f_eem_opts_ifname.attr,
+       &eem_opts_attr_dev_addr,
+       &eem_opts_attr_host_addr,
+       &eem_opts_attr_qmult,
+       &eem_opts_attr_ifname,
        NULL,
 };
 
index 21fcf18f53a0409ed00bc302ac62b4f012e5c766..99285b416308f84917a6500aad64daff34c2ce05 100644 (file)
@@ -705,9 +705,6 @@ static inline struct f_hid_opts *to_f_hid_opts(struct config_item *item)
                            func_inst.group);
 }
 
-CONFIGFS_ATTR_STRUCT(f_hid_opts);
-CONFIGFS_ATTR_OPS(f_hid_opts);
-
 static void hid_attr_release(struct config_item *item)
 {
        struct f_hid_opts *opts = to_f_hid_opts(item);
@@ -717,13 +714,12 @@ static void hid_attr_release(struct config_item *item)
 
 static struct configfs_item_operations hidg_item_ops = {
        .release        = hid_attr_release,
-       .show_attribute = f_hid_opts_attr_show,
-       .store_attribute = f_hid_opts_attr_store,
 };
 
 #define F_HID_OPT(name, prec, limit)                                   \
-static ssize_t f_hid_opts_##name##_show(struct f_hid_opts *opts, char *page)\
+static ssize_t f_hid_opts_##name##_show(struct config_item *item, char *page)\
 {                                                                      \
+       struct f_hid_opts *opts = to_f_hid_opts(item);                  \
        int result;                                                     \
                                                                        \
        mutex_lock(&opts->lock);                                        \
@@ -733,9 +729,10 @@ static ssize_t f_hid_opts_##name##_show(struct f_hid_opts *opts, char *page)\
        return result;                                                  \
 }                                                                      \
                                                                        \
-static ssize_t f_hid_opts_##name##_store(struct f_hid_opts *opts,      \
+static ssize_t f_hid_opts_##name##_store(struct config_item *item,     \
                                         const char *page, size_t len)  \
 {                                                                      \
+       struct f_hid_opts *opts = to_f_hid_opts(item);                  \
        int ret;                                                        \
        u##prec num;                                                    \
                                                                        \
@@ -761,16 +758,15 @@ end:                                                                      \
        return ret;                                                     \
 }                                                                      \
                                                                        \
-static struct f_hid_opts_attribute f_hid_opts_##name =                 \
-       __CONFIGFS_ATTR(name, S_IRUGO | S_IWUSR, f_hid_opts_##name##_show,\
-                       f_hid_opts_##name##_store)
+CONFIGFS_ATTR(f_hid_opts_, name)
 
 F_HID_OPT(subclass, 8, 255);
 F_HID_OPT(protocol, 8, 255);
 F_HID_OPT(report_length, 16, 65535);
 
-static ssize_t f_hid_opts_report_desc_show(struct f_hid_opts *opts, char *page)
+static ssize_t f_hid_opts_report_desc_show(struct config_item *item, char *page)
 {
+       struct f_hid_opts *opts = to_f_hid_opts(item);
        int result;
 
        mutex_lock(&opts->lock);
@@ -781,9 +777,10 @@ static ssize_t f_hid_opts_report_desc_show(struct f_hid_opts *opts, char *page)
        return result;
 }
 
-static ssize_t f_hid_opts_report_desc_store(struct f_hid_opts *opts,
+static ssize_t f_hid_opts_report_desc_store(struct config_item *item,
                                            const char *page, size_t len)
 {
+       struct f_hid_opts *opts = to_f_hid_opts(item);
        int ret = -EBUSY;
        char *d;
 
@@ -810,16 +807,13 @@ end:
        return ret;
 }
 
-static struct f_hid_opts_attribute f_hid_opts_report_desc =
-       __CONFIGFS_ATTR(report_desc, S_IRUGO | S_IWUSR,
-                       f_hid_opts_report_desc_show,
-                       f_hid_opts_report_desc_store);
+CONFIGFS_ATTR(f_hid_opts_, report_desc);
 
 static struct configfs_attribute *hid_attrs[] = {
-       &f_hid_opts_subclass.attr,
-       &f_hid_opts_protocol.attr,
-       &f_hid_opts_report_length.attr,
-       &f_hid_opts_report_desc.attr,
+       &f_hid_opts_attr_subclass,
+       &f_hid_opts_attr_protocol,
+       &f_hid_opts_attr_report_length,
+       &f_hid_opts_attr_report_desc,
        NULL,
 };
 
index 6b2102bc069973554db95d3311470b0545067727..23933bdf2d9d6cebc66750050ba704c9a20d109c 100644 (file)
@@ -465,9 +465,6 @@ static inline struct f_lb_opts *to_f_lb_opts(struct config_item *item)
                            func_inst.group);
 }
 
-CONFIGFS_ATTR_STRUCT(f_lb_opts);
-CONFIGFS_ATTR_OPS(f_lb_opts);
-
 static void lb_attr_release(struct config_item *item)
 {
        struct f_lb_opts *lb_opts = to_f_lb_opts(item);
@@ -477,12 +474,11 @@ static void lb_attr_release(struct config_item *item)
 
 static struct configfs_item_operations lb_item_ops = {
        .release                = lb_attr_release,
-       .show_attribute         = f_lb_opts_attr_show,
-       .store_attribute        = f_lb_opts_attr_store,
 };
 
-static ssize_t f_lb_opts_qlen_show(struct f_lb_opts *opts, char *page)
+static ssize_t f_lb_opts_qlen_show(struct config_item *item, char *page)
 {
+       struct f_lb_opts *opts = to_f_lb_opts(item);
        int result;
 
        mutex_lock(&opts->lock);
@@ -492,9 +488,10 @@ static ssize_t f_lb_opts_qlen_show(struct f_lb_opts *opts, char *page)
        return result;
 }
 
-static ssize_t f_lb_opts_qlen_store(struct f_lb_opts *opts,
+static ssize_t f_lb_opts_qlen_store(struct config_item *item,
                                    const char *page, size_t len)
 {
+       struct f_lb_opts *opts = to_f_lb_opts(item);
        int ret;
        u32 num;
 
@@ -515,13 +512,11 @@ end:
        return ret;
 }
 
-static struct f_lb_opts_attribute f_lb_opts_qlen =
-       __CONFIGFS_ATTR(qlen, S_IRUGO | S_IWUSR,
-                       f_lb_opts_qlen_show,
-                       f_lb_opts_qlen_store);
+CONFIGFS_ATTR(f_lb_opts_, qlen);
 
-static ssize_t f_lb_opts_bulk_buflen_show(struct f_lb_opts *opts, char *page)
+static ssize_t f_lb_opts_bulk_buflen_show(struct config_item *item, char *page)
 {
+       struct f_lb_opts *opts = to_f_lb_opts(item);
        int result;
 
        mutex_lock(&opts->lock);
@@ -531,9 +526,10 @@ static ssize_t f_lb_opts_bulk_buflen_show(struct f_lb_opts *opts, char *page)
        return result;
 }
 
-static ssize_t f_lb_opts_bulk_buflen_store(struct f_lb_opts *opts,
+static ssize_t f_lb_opts_bulk_buflen_store(struct config_item *item,
                                    const char *page, size_t len)
 {
+       struct f_lb_opts *opts = to_f_lb_opts(item);
        int ret;
        u32 num;
 
@@ -554,14 +550,11 @@ end:
        return ret;
 }
 
-static struct f_lb_opts_attribute f_lb_opts_bulk_buflen =
-       __CONFIGFS_ATTR(buflen, S_IRUGO | S_IWUSR,
-                       f_lb_opts_bulk_buflen_show,
-                       f_lb_opts_bulk_buflen_store);
+CONFIGFS_ATTR(f_lb_opts_, bulk_buflen);
 
 static struct configfs_attribute *lb_attrs[] = {
-       &f_lb_opts_qlen.attr,
-       &f_lb_opts_bulk_buflen.attr,
+       &f_lb_opts_attr_qlen,
+       &f_lb_opts_attr_bulk_buflen,
        NULL,
 };
 
index cd54e72a6c50d74ee5088b015e71d772cddd9d38..c69b650b7bba67ef5f1a885027b17f36f44dd3d7 100644 (file)
@@ -3142,9 +3142,6 @@ static inline struct fsg_opts *to_fsg_opts(struct config_item *item)
                            func_inst.group);
 }
 
-CONFIGFS_ATTR_STRUCT(fsg_lun_opts);
-CONFIGFS_ATTR_OPS(fsg_lun_opts);
-
 static void fsg_lun_attr_release(struct config_item *item)
 {
        struct fsg_lun_opts *lun_opts;
@@ -3155,110 +3152,93 @@ static void fsg_lun_attr_release(struct config_item *item)
 
 static struct configfs_item_operations fsg_lun_item_ops = {
        .release                = fsg_lun_attr_release,
-       .show_attribute         = fsg_lun_opts_attr_show,
-       .store_attribute        = fsg_lun_opts_attr_store,
 };
 
-static ssize_t fsg_lun_opts_file_show(struct fsg_lun_opts *opts, char *page)
+static ssize_t fsg_lun_opts_file_show(struct config_item *item, char *page)
 {
-       struct fsg_opts *fsg_opts;
-
-       fsg_opts = to_fsg_opts(opts->group.cg_item.ci_parent);
+       struct fsg_lun_opts *opts = to_fsg_lun_opts(item);
+       struct fsg_opts *fsg_opts = to_fsg_opts(opts->group.cg_item.ci_parent);
 
        return fsg_show_file(opts->lun, &fsg_opts->common->filesem, page);
 }
 
-static ssize_t fsg_lun_opts_file_store(struct fsg_lun_opts *opts,
+static ssize_t fsg_lun_opts_file_store(struct config_item *item,
                                       const char *page, size_t len)
 {
-       struct fsg_opts *fsg_opts;
-
-       fsg_opts = to_fsg_opts(opts->group.cg_item.ci_parent);
+       struct fsg_lun_opts *opts = to_fsg_lun_opts(item);
+       struct fsg_opts *fsg_opts = to_fsg_opts(opts->group.cg_item.ci_parent);
 
        return fsg_store_file(opts->lun, &fsg_opts->common->filesem, page, len);
 }
 
-static struct fsg_lun_opts_attribute fsg_lun_opts_file =
-       __CONFIGFS_ATTR(file, S_IRUGO | S_IWUSR, fsg_lun_opts_file_show,
-                       fsg_lun_opts_file_store);
+CONFIGFS_ATTR(fsg_lun_opts_, file);
 
-static ssize_t fsg_lun_opts_ro_show(struct fsg_lun_opts *opts, char *page)
+static ssize_t fsg_lun_opts_ro_show(struct config_item *item, char *page)
 {
-       return fsg_show_ro(opts->lun, page);
+       return fsg_show_ro(to_fsg_lun_opts(item)->lun, page);
 }
 
-static ssize_t fsg_lun_opts_ro_store(struct fsg_lun_opts *opts,
+static ssize_t fsg_lun_opts_ro_store(struct config_item *item,
                                       const char *page, size_t len)
 {
-       struct fsg_opts *fsg_opts;
-
-       fsg_opts = to_fsg_opts(opts->group.cg_item.ci_parent);
+       struct fsg_lun_opts *opts = to_fsg_lun_opts(item);
+       struct fsg_opts *fsg_opts = to_fsg_opts(opts->group.cg_item.ci_parent);
 
        return fsg_store_ro(opts->lun, &fsg_opts->common->filesem, page, len);
 }
 
-static struct fsg_lun_opts_attribute fsg_lun_opts_ro =
-       __CONFIGFS_ATTR(ro, S_IRUGO | S_IWUSR, fsg_lun_opts_ro_show,
-                       fsg_lun_opts_ro_store);
+CONFIGFS_ATTR(fsg_lun_opts_, ro);
 
-static ssize_t fsg_lun_opts_removable_show(struct fsg_lun_opts *opts,
+static ssize_t fsg_lun_opts_removable_show(struct config_item *item,
                                           char *page)
 {
-       return fsg_show_removable(opts->lun, page);
+       return fsg_show_removable(to_fsg_lun_opts(item)->lun, page);
 }
 
-static ssize_t fsg_lun_opts_removable_store(struct fsg_lun_opts *opts,
+static ssize_t fsg_lun_opts_removable_store(struct config_item *item,
                                       const char *page, size_t len)
 {
-       return fsg_store_removable(opts->lun, page, len);
+       return fsg_store_removable(to_fsg_lun_opts(item)->lun, page, len);
 }
 
-static struct fsg_lun_opts_attribute fsg_lun_opts_removable =
-       __CONFIGFS_ATTR(removable, S_IRUGO | S_IWUSR,
-                       fsg_lun_opts_removable_show,
-                       fsg_lun_opts_removable_store);
+CONFIGFS_ATTR(fsg_lun_opts_, removable);
 
-static ssize_t fsg_lun_opts_cdrom_show(struct fsg_lun_opts *opts, char *page)
+static ssize_t fsg_lun_opts_cdrom_show(struct config_item *item, char *page)
 {
-       return fsg_show_cdrom(opts->lun, page);
+       return fsg_show_cdrom(to_fsg_lun_opts(item)->lun, page);
 }
 
-static ssize_t fsg_lun_opts_cdrom_store(struct fsg_lun_opts *opts,
+static ssize_t fsg_lun_opts_cdrom_store(struct config_item *item,
                                       const char *page, size_t len)
 {
-       struct fsg_opts *fsg_opts;
-
-       fsg_opts = to_fsg_opts(opts->group.cg_item.ci_parent);
+       struct fsg_lun_opts *opts = to_fsg_lun_opts(item);
+       struct fsg_opts *fsg_opts = to_fsg_opts(opts->group.cg_item.ci_parent);
 
        return fsg_store_cdrom(opts->lun, &fsg_opts->common->filesem, page,
                               len);
 }
 
-static struct fsg_lun_opts_attribute fsg_lun_opts_cdrom =
-       __CONFIGFS_ATTR(cdrom, S_IRUGO | S_IWUSR, fsg_lun_opts_cdrom_show,
-                       fsg_lun_opts_cdrom_store);
+CONFIGFS_ATTR(fsg_lun_opts_, cdrom);
 
-static ssize_t fsg_lun_opts_nofua_show(struct fsg_lun_opts *opts, char *page)
+static ssize_t fsg_lun_opts_nofua_show(struct config_item *item, char *page)
 {
-       return fsg_show_nofua(opts->lun, page);
+       return fsg_show_nofua(to_fsg_lun_opts(item)->lun, page);
 }
 
-static ssize_t fsg_lun_opts_nofua_store(struct fsg_lun_opts *opts,
+static ssize_t fsg_lun_opts_nofua_store(struct config_item *item,
                                       const char *page, size_t len)
 {
-       return fsg_store_nofua(opts->lun, page, len);
+       return fsg_store_nofua(to_fsg_lun_opts(item)->lun, page, len);
 }
 
-static struct fsg_lun_opts_attribute fsg_lun_opts_nofua =
-       __CONFIGFS_ATTR(nofua, S_IRUGO | S_IWUSR, fsg_lun_opts_nofua_show,
-                       fsg_lun_opts_nofua_store);
+CONFIGFS_ATTR(fsg_lun_opts_, nofua);
 
 static struct configfs_attribute *fsg_lun_attrs[] = {
-       &fsg_lun_opts_file.attr,
-       &fsg_lun_opts_ro.attr,
-       &fsg_lun_opts_removable.attr,
-       &fsg_lun_opts_cdrom.attr,
-       &fsg_lun_opts_nofua.attr,
+       &fsg_lun_opts_attr_file,
+       &fsg_lun_opts_attr_ro,
+       &fsg_lun_opts_attr_removable,
+       &fsg_lun_opts_attr_cdrom,
+       &fsg_lun_opts_attr_nofua,
        NULL,
 };
 
@@ -3350,9 +3330,6 @@ static void fsg_lun_drop(struct config_group *group, struct config_item *item)
        config_item_put(item);
 }
 
-CONFIGFS_ATTR_STRUCT(fsg_opts);
-CONFIGFS_ATTR_OPS(fsg_opts);
-
 static void fsg_attr_release(struct config_item *item)
 {
        struct fsg_opts *opts = to_fsg_opts(item);
@@ -3362,12 +3339,11 @@ static void fsg_attr_release(struct config_item *item)
 
 static struct configfs_item_operations fsg_item_ops = {
        .release                = fsg_attr_release,
-       .show_attribute         = fsg_opts_attr_show,
-       .store_attribute        = fsg_opts_attr_store,
 };
 
-static ssize_t fsg_opts_stall_show(struct fsg_opts *opts, char *page)
+static ssize_t fsg_opts_stall_show(struct config_item *item, char *page)
 {
+       struct fsg_opts *opts = to_fsg_opts(item);
        int result;
 
        mutex_lock(&opts->lock);
@@ -3377,9 +3353,10 @@ static ssize_t fsg_opts_stall_show(struct fsg_opts *opts, char *page)
        return result;
 }
 
-static ssize_t fsg_opts_stall_store(struct fsg_opts *opts, const char *page,
+static ssize_t fsg_opts_stall_store(struct config_item *item, const char *page,
                                    size_t len)
 {
+       struct fsg_opts *opts = to_fsg_opts(item);
        int ret;
        bool stall;
 
@@ -3401,13 +3378,12 @@ static ssize_t fsg_opts_stall_store(struct fsg_opts *opts, const char *page,
        return ret;
 }
 
-static struct fsg_opts_attribute fsg_opts_stall =
-       __CONFIGFS_ATTR(stall, S_IRUGO | S_IWUSR, fsg_opts_stall_show,
-                       fsg_opts_stall_store);
+CONFIGFS_ATTR(fsg_opts_, stall);
 
 #ifdef CONFIG_USB_GADGET_DEBUG_FILES
-static ssize_t fsg_opts_num_buffers_show(struct fsg_opts *opts, char *page)
+static ssize_t fsg_opts_num_buffers_show(struct config_item *item, char *page)
 {
+       struct fsg_opts *opts = to_fsg_opts(item);
        int result;
 
        mutex_lock(&opts->lock);
@@ -3417,9 +3393,10 @@ static ssize_t fsg_opts_num_buffers_show(struct fsg_opts *opts, char *page)
        return result;
 }
 
-static ssize_t fsg_opts_num_buffers_store(struct fsg_opts *opts,
+static ssize_t fsg_opts_num_buffers_store(struct config_item *item,
                                          const char *page, size_t len)
 {
+       struct fsg_opts *opts = to_fsg_opts(item);
        int ret;
        u8 num;
 
@@ -3444,17 +3421,13 @@ end:
        return ret;
 }
 
-static struct fsg_opts_attribute fsg_opts_num_buffers =
-       __CONFIGFS_ATTR(num_buffers, S_IRUGO | S_IWUSR,
-                       fsg_opts_num_buffers_show,
-                       fsg_opts_num_buffers_store);
-
+CONFIGFS_ATTR(fsg_opts_, num_buffers);
 #endif
 
 static struct configfs_attribute *fsg_attrs[] = {
-       &fsg_opts_stall.attr,
+       &fsg_opts_attr_stall,
 #ifdef CONFIG_USB_GADGET_DEBUG_FILES
-       &fsg_opts_num_buffers.attr,
+       &fsg_opts_attr_num_buffers,
 #endif
        NULL,
 };
index ce3c8a629266c12d6de7638f2c9900af4085cd83..42acb45e1ab42dd9436244bec16d4903603d6089 100644 (file)
@@ -902,9 +902,6 @@ static inline struct f_midi_opts *to_f_midi_opts(struct config_item *item)
                            func_inst.group);
 }
 
-CONFIGFS_ATTR_STRUCT(f_midi_opts);
-CONFIGFS_ATTR_OPS(f_midi_opts);
-
 static void midi_attr_release(struct config_item *item)
 {
        struct f_midi_opts *opts = to_f_midi_opts(item);
@@ -914,13 +911,12 @@ static void midi_attr_release(struct config_item *item)
 
 static struct configfs_item_operations midi_item_ops = {
        .release        = midi_attr_release,
-       .show_attribute = f_midi_opts_attr_show,
-       .store_attribute = f_midi_opts_attr_store,
 };
 
 #define F_MIDI_OPT(name, test_limit, limit)                            \
-static ssize_t f_midi_opts_##name##_show(struct f_midi_opts *opts, char *page) \
+static ssize_t f_midi_opts_##name##_show(struct config_item *item, char *page) \
 {                                                                      \
+       struct f_midi_opts *opts = to_f_midi_opts(item);                \
        int result;                                                     \
                                                                        \
        mutex_lock(&opts->lock);                                        \
@@ -930,9 +926,10 @@ static ssize_t f_midi_opts_##name##_show(struct f_midi_opts *opts, char *page) \
        return result;                                                  \
 }                                                                      \
                                                                        \
-static ssize_t f_midi_opts_##name##_store(struct f_midi_opts *opts,    \
+static ssize_t f_midi_opts_##name##_store(struct config_item *item,    \
                                         const char *page, size_t len)  \
 {                                                                      \
+       struct f_midi_opts *opts = to_f_midi_opts(item);                \
        int ret;                                                        \
        u32 num;                                                        \
                                                                        \
@@ -958,9 +955,7 @@ end:                                                                        \
        return ret;                                                     \
 }                                                                      \
                                                                        \
-static struct f_midi_opts_attribute f_midi_opts_##name =               \
-       __CONFIGFS_ATTR(name, S_IRUGO | S_IWUSR, f_midi_opts_##name##_show, \
-                       f_midi_opts_##name##_store)
+CONFIGFS_ATTR(f_midi_opts_, name);
 
 F_MIDI_OPT(index, true, SNDRV_CARDS);
 F_MIDI_OPT(buflen, false, 0);
@@ -968,8 +963,9 @@ F_MIDI_OPT(qlen, false, 0);
 F_MIDI_OPT(in_ports, true, MAX_PORTS);
 F_MIDI_OPT(out_ports, true, MAX_PORTS);
 
-static ssize_t f_midi_opts_id_show(struct f_midi_opts *opts, char *page)
+static ssize_t f_midi_opts_id_show(struct config_item *item, char *page)
 {
+       struct f_midi_opts *opts = to_f_midi_opts(item);
        int result;
 
        mutex_lock(&opts->lock);
@@ -985,9 +981,10 @@ static ssize_t f_midi_opts_id_show(struct f_midi_opts *opts, char *page)
        return result;
 }
 
-static ssize_t f_midi_opts_id_store(struct f_midi_opts *opts,
+static ssize_t f_midi_opts_id_store(struct config_item *item,
                                    const char *page, size_t len)
 {
+       struct f_midi_opts *opts = to_f_midi_opts(item);
        int ret;
        char *c;
 
@@ -1012,17 +1009,15 @@ end:
        return ret;
 }
 
-static struct f_midi_opts_attribute f_midi_opts_id =
-       __CONFIGFS_ATTR(id, S_IRUGO | S_IWUSR, f_midi_opts_id_show,
-                       f_midi_opts_id_store);
+CONFIGFS_ATTR(f_midi_opts_, id);
 
 static struct configfs_attribute *midi_attrs[] = {
-       &f_midi_opts_index.attr,
-       &f_midi_opts_buflen.attr,
-       &f_midi_opts_qlen.attr,
-       &f_midi_opts_in_ports.attr,
-       &f_midi_opts_out_ports.attr,
-       &f_midi_opts_id.attr,
+       &f_midi_opts_attr_index,
+       &f_midi_opts_attr_buflen,
+       &f_midi_opts_attr_qlen,
+       &f_midi_opts_attr_in_ports,
+       &f_midi_opts_attr_out_ports,
+       &f_midi_opts_attr_id,
        NULL,
 };
 
index b6f7ed7d48a7fa6a297ccfeca6440465593462be..7ad798ace1e5b5d60c15712510fcf6b09ac81c86 100644 (file)
@@ -1488,10 +1488,10 @@ USB_ETHERNET_CONFIGFS_ITEM_ATTR_QMULT(ncm);
 USB_ETHERNET_CONFIGFS_ITEM_ATTR_IFNAME(ncm);
 
 static struct configfs_attribute *ncm_attrs[] = {
-       &f_ncm_opts_dev_addr.attr,
-       &f_ncm_opts_host_addr.attr,
-       &f_ncm_opts_qmult.attr,
-       &f_ncm_opts_ifname.attr,
+       &ncm_opts_attr_dev_addr,
+       &ncm_opts_attr_host_addr,
+       &ncm_opts_attr_qmult,
+       &ncm_opts_attr_ifname,
        NULL,
 };
 
index 1c3d30ad2f92cb3edba2ab0eb3ca490378de86f1..d6396e0909eeb45898541094cb2347b4d38bde24 100644 (file)
@@ -387,22 +387,6 @@ static inline struct f_serial_opts *to_f_serial_opts(struct config_item *item)
                            func_inst.group);
 }
 
-CONFIGFS_ATTR_STRUCT(f_serial_opts);
-static ssize_t f_obex_attr_show(struct config_item *item,
-                               struct configfs_attribute *attr,
-                               char *page)
-{
-       struct f_serial_opts *opts = to_f_serial_opts(item);
-       struct f_serial_opts_attribute *f_serial_opts_attr =
-               container_of(attr, struct f_serial_opts_attribute, attr);
-       ssize_t ret = 0;
-
-       if (f_serial_opts_attr->show)
-               ret = f_serial_opts_attr->show(opts, page);
-
-       return ret;
-}
-
 static void obex_attr_release(struct config_item *item)
 {
        struct f_serial_opts *opts = to_f_serial_opts(item);
@@ -412,19 +396,17 @@ static void obex_attr_release(struct config_item *item)
 
 static struct configfs_item_operations obex_item_ops = {
        .release        = obex_attr_release,
-       .show_attribute = f_obex_attr_show,
 };
 
-static ssize_t f_obex_port_num_show(struct f_serial_opts *opts, char *page)
+static ssize_t f_obex_port_num_show(struct config_item *item, char *page)
 {
-       return sprintf(page, "%u\n", opts->port_num);
+       return sprintf(page, "%u\n", to_f_serial_opts(item)->port_num);
 }
 
-static struct f_serial_opts_attribute f_obex_port_num =
-       __CONFIGFS_ATTR_RO(port_num, f_obex_port_num_show);
+CONFIGFS_ATTR_RO(f_obex_, port_num);
 
 static struct configfs_attribute *acm_attrs[] = {
-       &f_obex_port_num.attr,
+       &f_obex_attr_port_num,
        NULL,
 };
 
index 62a198754029e1f707147a12713f758a186cdd8e..157441dbfeba861d4d877f8009dca6fb44acd740 100644 (file)
@@ -583,21 +583,6 @@ static inline struct f_phonet_opts *to_f_phonet_opts(struct config_item *item)
                        func_inst.group);
 }
 
-CONFIGFS_ATTR_STRUCT(f_phonet_opts);
-static ssize_t f_phonet_attr_show(struct config_item *item,
-                               struct configfs_attribute *attr,
-                               char *page)
-{
-       struct f_phonet_opts *opts = to_f_phonet_opts(item);
-       struct f_phonet_opts_attribute *f_phonet_opts_attr =
-               container_of(attr, struct f_phonet_opts_attribute, attr);
-       ssize_t ret = 0;
-
-       if (f_phonet_opts_attr->show)
-               ret = f_phonet_opts_attr->show(opts, page);
-       return ret;
-}
-
 static void phonet_attr_release(struct config_item *item)
 {
        struct f_phonet_opts *opts = to_f_phonet_opts(item);
@@ -607,19 +592,17 @@ static void phonet_attr_release(struct config_item *item)
 
 static struct configfs_item_operations phonet_item_ops = {
        .release                = phonet_attr_release,
-       .show_attribute         = f_phonet_attr_show,
 };
 
-static ssize_t f_phonet_ifname_show(struct f_phonet_opts *opts, char *page)
+static ssize_t f_phonet_ifname_show(struct config_item *item, char *page)
 {
-       return gether_get_ifname(opts->net, page, PAGE_SIZE);
+       return gether_get_ifname(to_f_phonet_opts(item)->net, page, PAGE_SIZE);
 }
 
-static struct f_phonet_opts_attribute f_phonet_ifname =
-       __CONFIGFS_ATTR_RO(ifname, f_phonet_ifname_show);
+CONFIGFS_ATTR_RO(f_phonet_, ifname);
 
 static struct configfs_attribute *phonet_attrs[] = {
-       &f_phonet_ifname.attr,
+       &f_phonet_attr_ifname,
        NULL,
 };
 
index 7fb3209ed52c31c662b24b1799e78ff9a4d38700..0fbfb2b2aa08b3ade8e4b487d012188687b29e05 100644 (file)
@@ -1146,9 +1146,6 @@ static inline struct f_printer_opts
                            func_inst.group);
 }
 
-CONFIGFS_ATTR_STRUCT(f_printer_opts);
-CONFIGFS_ATTR_OPS(f_printer_opts);
-
 static void printer_attr_release(struct config_item *item)
 {
        struct f_printer_opts *opts = to_f_printer_opts(item);
@@ -1158,13 +1155,12 @@ static void printer_attr_release(struct config_item *item)
 
 static struct configfs_item_operations printer_item_ops = {
        .release        = printer_attr_release,
-       .show_attribute = f_printer_opts_attr_show,
-       .store_attribute = f_printer_opts_attr_store,
 };
 
-static ssize_t f_printer_opts_pnp_string_show(struct f_printer_opts *opts,
+static ssize_t f_printer_opts_pnp_string_show(struct config_item *item,
                                              char *page)
 {
+       struct f_printer_opts *opts = to_f_printer_opts(item);
        int result;
 
        mutex_lock(&opts->lock);
@@ -1174,9 +1170,10 @@ static ssize_t f_printer_opts_pnp_string_show(struct f_printer_opts *opts,
        return result;
 }
 
-static ssize_t f_printer_opts_pnp_string_store(struct f_printer_opts *opts,
+static ssize_t f_printer_opts_pnp_string_store(struct config_item *item,
                                               const char *page, size_t len)
 {
+       struct f_printer_opts *opts = to_f_printer_opts(item);
        int result, l;
 
        mutex_lock(&opts->lock);
@@ -1189,14 +1186,12 @@ static ssize_t f_printer_opts_pnp_string_store(struct f_printer_opts *opts,
        return result;
 }
 
-static struct f_printer_opts_attribute f_printer_opts_pnp_string =
-       __CONFIGFS_ATTR(pnp_string, S_IRUGO | S_IWUSR,
-                       f_printer_opts_pnp_string_show,
-                       f_printer_opts_pnp_string_store);
+CONFIGFS_ATTR(f_printer_opts_, pnp_string);
 
-static ssize_t f_printer_opts_q_len_show(struct f_printer_opts *opts,
+static ssize_t f_printer_opts_q_len_show(struct config_item *item,
                                         char *page)
 {
+       struct f_printer_opts *opts = to_f_printer_opts(item);
        int result;
 
        mutex_lock(&opts->lock);
@@ -1206,9 +1201,10 @@ static ssize_t f_printer_opts_q_len_show(struct f_printer_opts *opts,
        return result;
 }
 
-static ssize_t f_printer_opts_q_len_store(struct f_printer_opts *opts,
+static ssize_t f_printer_opts_q_len_store(struct config_item *item,
                                          const char *page, size_t len)
 {
+       struct f_printer_opts *opts = to_f_printer_opts(item);
        int ret;
        u16 num;
 
@@ -1229,13 +1225,11 @@ end:
        return ret;
 }
 
-static struct f_printer_opts_attribute f_printer_opts_q_len =
-       __CONFIGFS_ATTR(q_len, S_IRUGO | S_IWUSR, f_printer_opts_q_len_show,
-                       f_printer_opts_q_len_store);
+CONFIGFS_ATTR(f_printer_opts_, q_len);
 
 static struct configfs_attribute *printer_attrs[] = {
-       &f_printer_opts_pnp_string.attr,
-       &f_printer_opts_q_len.attr,
+       &f_printer_opts_attr_pnp_string,
+       &f_printer_opts_attr_q_len,
        NULL,
 };
 
index fd301ed9e294fa480ad0336fc17833e772611765..e587767e374cbc2fbae3b02879b5358c38d48e69 100644 (file)
@@ -864,10 +864,10 @@ USB_ETHERNET_CONFIGFS_ITEM_ATTR_QMULT(rndis);
 USB_ETHERNET_CONFIGFS_ITEM_ATTR_IFNAME(rndis);
 
 static struct configfs_attribute *rndis_attrs[] = {
-       &f_rndis_opts_dev_addr.attr,
-       &f_rndis_opts_host_addr.attr,
-       &f_rndis_opts_qmult.attr,
-       &f_rndis_opts_ifname.attr,
+       &rndis_opts_attr_dev_addr,
+       &rndis_opts_attr_host_addr,
+       &rndis_opts_attr_qmult,
+       &rndis_opts_attr_ifname,
        NULL,
 };
 
index ba705e047d7e0fca31ce8a2ede4d67f595efb5ca..6bb44d613baba28106d31023d337edf6367b9333 100644 (file)
@@ -258,22 +258,6 @@ static inline struct f_serial_opts *to_f_serial_opts(struct config_item *item)
                            func_inst.group);
 }
 
-CONFIGFS_ATTR_STRUCT(f_serial_opts);
-static ssize_t f_serial_attr_show(struct config_item *item,
-                                 struct configfs_attribute *attr,
-                                 char *page)
-{
-       struct f_serial_opts *opts = to_f_serial_opts(item);
-       struct f_serial_opts_attribute *f_serial_opts_attr =
-               container_of(attr, struct f_serial_opts_attribute, attr);
-       ssize_t ret = 0;
-
-       if (f_serial_opts_attr->show)
-               ret = f_serial_opts_attr->show(opts, page);
-
-       return ret;
-}
-
 static void serial_attr_release(struct config_item *item)
 {
        struct f_serial_opts *opts = to_f_serial_opts(item);
@@ -283,19 +267,17 @@ static void serial_attr_release(struct config_item *item)
 
 static struct configfs_item_operations serial_item_ops = {
        .release        = serial_attr_release,
-       .show_attribute = f_serial_attr_show,
 };
 
-static ssize_t f_serial_port_num_show(struct f_serial_opts *opts, char *page)
+static ssize_t f_serial_port_num_show(struct config_item *item, char *page)
 {
-       return sprintf(page, "%u\n", opts->port_num);
+       return sprintf(page, "%u\n", to_f_serial_opts(item)->port_num);
 }
 
-static struct f_serial_opts_attribute f_serial_port_num =
-       __CONFIGFS_ATTR_RO(port_num, f_serial_port_num_show);
+CONFIGFS_ATTR_RO(f_serial_, port_num);
 
 static struct configfs_attribute *acm_attrs[] = {
-       &f_serial_port_num.attr,
+       &f_serial_attr_port_num,
        NULL,
 };
 
index d7646d3acd63ecb4aa87362e069b54faff909844..9f3ced62d9162c991c03b0db68d10fd0cbe06ea9 100644 (file)
@@ -889,9 +889,6 @@ static inline struct f_ss_opts *to_f_ss_opts(struct config_item *item)
                            func_inst.group);
 }
 
-CONFIGFS_ATTR_STRUCT(f_ss_opts);
-CONFIGFS_ATTR_OPS(f_ss_opts);
-
 static void ss_attr_release(struct config_item *item)
 {
        struct f_ss_opts *ss_opts = to_f_ss_opts(item);
@@ -901,12 +898,11 @@ static void ss_attr_release(struct config_item *item)
 
 static struct configfs_item_operations ss_item_ops = {
        .release                = ss_attr_release,
-       .show_attribute         = f_ss_opts_attr_show,
-       .store_attribute        = f_ss_opts_attr_store,
 };
 
-static ssize_t f_ss_opts_pattern_show(struct f_ss_opts *opts, char *page)
+static ssize_t f_ss_opts_pattern_show(struct config_item *item, char *page)
 {
+       struct f_ss_opts *opts = to_f_ss_opts(item);
        int result;
 
        mutex_lock(&opts->lock);
@@ -916,9 +912,10 @@ static ssize_t f_ss_opts_pattern_show(struct f_ss_opts *opts, char *page)
        return result;
 }
 
-static ssize_t f_ss_opts_pattern_store(struct f_ss_opts *opts,
+static ssize_t f_ss_opts_pattern_store(struct config_item *item,
                                       const char *page, size_t len)
 {
+       struct f_ss_opts *opts = to_f_ss_opts(item);
        int ret;
        u8 num;
 
@@ -944,13 +941,11 @@ end:
        return ret;
 }
 
-static struct f_ss_opts_attribute f_ss_opts_pattern =
-       __CONFIGFS_ATTR(pattern, S_IRUGO | S_IWUSR,
-                       f_ss_opts_pattern_show,
-                       f_ss_opts_pattern_store);
+CONFIGFS_ATTR(f_ss_opts_, pattern);
 
-static ssize_t f_ss_opts_isoc_interval_show(struct f_ss_opts *opts, char *page)
+static ssize_t f_ss_opts_isoc_interval_show(struct config_item *item, char *page)
 {
+       struct f_ss_opts *opts = to_f_ss_opts(item);
        int result;
 
        mutex_lock(&opts->lock);
@@ -960,9 +955,10 @@ static ssize_t f_ss_opts_isoc_interval_show(struct f_ss_opts *opts, char *page)
        return result;
 }
 
-static ssize_t f_ss_opts_isoc_interval_store(struct f_ss_opts *opts,
+static ssize_t f_ss_opts_isoc_interval_store(struct config_item *item,
                                       const char *page, size_t len)
 {
+       struct f_ss_opts *opts = to_f_ss_opts(item);
        int ret;
        u8 num;
 
@@ -988,13 +984,11 @@ end:
        return ret;
 }
 
-static struct f_ss_opts_attribute f_ss_opts_isoc_interval =
-       __CONFIGFS_ATTR(isoc_interval, S_IRUGO | S_IWUSR,
-                       f_ss_opts_isoc_interval_show,
-                       f_ss_opts_isoc_interval_store);
+CONFIGFS_ATTR(f_ss_opts_, isoc_interval);
 
-static ssize_t f_ss_opts_isoc_maxpacket_show(struct f_ss_opts *opts, char *page)
+static ssize_t f_ss_opts_isoc_maxpacket_show(struct config_item *item, char *page)
 {
+       struct f_ss_opts *opts = to_f_ss_opts(item);
        int result;
 
        mutex_lock(&opts->lock);
@@ -1004,9 +998,10 @@ static ssize_t f_ss_opts_isoc_maxpacket_show(struct f_ss_opts *opts, char *page)
        return result;
 }
 
-static ssize_t f_ss_opts_isoc_maxpacket_store(struct f_ss_opts *opts,
+static ssize_t f_ss_opts_isoc_maxpacket_store(struct config_item *item,
                                       const char *page, size_t len)
 {
+       struct f_ss_opts *opts = to_f_ss_opts(item);
        int ret;
        u16 num;
 
@@ -1032,13 +1027,11 @@ end:
        return ret;
 }
 
-static struct f_ss_opts_attribute f_ss_opts_isoc_maxpacket =
-       __CONFIGFS_ATTR(isoc_maxpacket, S_IRUGO | S_IWUSR,
-                       f_ss_opts_isoc_maxpacket_show,
-                       f_ss_opts_isoc_maxpacket_store);
+CONFIGFS_ATTR(f_ss_opts_, isoc_maxpacket);
 
-static ssize_t f_ss_opts_isoc_mult_show(struct f_ss_opts *opts, char *page)
+static ssize_t f_ss_opts_isoc_mult_show(struct config_item *item, char *page)
 {
+       struct f_ss_opts *opts = to_f_ss_opts(item);
        int result;
 
        mutex_lock(&opts->lock);
@@ -1048,9 +1041,10 @@ static ssize_t f_ss_opts_isoc_mult_show(struct f_ss_opts *opts, char *page)
        return result;
 }
 
-static ssize_t f_ss_opts_isoc_mult_store(struct f_ss_opts *opts,
+static ssize_t f_ss_opts_isoc_mult_store(struct config_item *item,
                                       const char *page, size_t len)
 {
+       struct f_ss_opts *opts = to_f_ss_opts(item);
        int ret;
        u8 num;
 
@@ -1076,13 +1070,11 @@ end:
        return ret;
 }
 
-static struct f_ss_opts_attribute f_ss_opts_isoc_mult =
-       __CONFIGFS_ATTR(isoc_mult, S_IRUGO | S_IWUSR,
-                       f_ss_opts_isoc_mult_show,
-                       f_ss_opts_isoc_mult_store);
+CONFIGFS_ATTR(f_ss_opts_, isoc_mult);
 
-static ssize_t f_ss_opts_isoc_maxburst_show(struct f_ss_opts *opts, char *page)
+static ssize_t f_ss_opts_isoc_maxburst_show(struct config_item *item, char *page)
 {
+       struct f_ss_opts *opts = to_f_ss_opts(item);
        int result;
 
        mutex_lock(&opts->lock);
@@ -1092,9 +1084,10 @@ static ssize_t f_ss_opts_isoc_maxburst_show(struct f_ss_opts *opts, char *page)
        return result;
 }
 
-static ssize_t f_ss_opts_isoc_maxburst_store(struct f_ss_opts *opts,
+static ssize_t f_ss_opts_isoc_maxburst_store(struct config_item *item,
                                       const char *page, size_t len)
 {
+       struct f_ss_opts *opts = to_f_ss_opts(item);
        int ret;
        u8 num;
 
@@ -1120,13 +1113,11 @@ end:
        return ret;
 }
 
-static struct f_ss_opts_attribute f_ss_opts_isoc_maxburst =
-       __CONFIGFS_ATTR(isoc_maxburst, S_IRUGO | S_IWUSR,
-                       f_ss_opts_isoc_maxburst_show,
-                       f_ss_opts_isoc_maxburst_store);
+CONFIGFS_ATTR(f_ss_opts_, isoc_maxburst);
 
-static ssize_t f_ss_opts_bulk_buflen_show(struct f_ss_opts *opts, char *page)
+static ssize_t f_ss_opts_bulk_buflen_show(struct config_item *item, char *page)
 {
+       struct f_ss_opts *opts = to_f_ss_opts(item);
        int result;
 
        mutex_lock(&opts->lock);
@@ -1136,9 +1127,10 @@ static ssize_t f_ss_opts_bulk_buflen_show(struct f_ss_opts *opts, char *page)
        return result;
 }
 
-static ssize_t f_ss_opts_bulk_buflen_store(struct f_ss_opts *opts,
+static ssize_t f_ss_opts_bulk_buflen_store(struct config_item *item,
                                           const char *page, size_t len)
 {
+       struct f_ss_opts *opts = to_f_ss_opts(item);
        int ret;
        u32 num;
 
@@ -1159,18 +1151,15 @@ end:
        return ret;
 }
 
-static struct f_ss_opts_attribute f_ss_opts_bulk_buflen =
-       __CONFIGFS_ATTR(buflen, S_IRUGO | S_IWUSR,
-                       f_ss_opts_bulk_buflen_show,
-                       f_ss_opts_bulk_buflen_store);
+CONFIGFS_ATTR(f_ss_opts_, bulk_buflen);
 
 static struct configfs_attribute *ss_attrs[] = {
-       &f_ss_opts_pattern.attr,
-       &f_ss_opts_isoc_interval.attr,
-       &f_ss_opts_isoc_maxpacket.attr,
-       &f_ss_opts_isoc_mult.attr,
-       &f_ss_opts_isoc_maxburst.attr,
-       &f_ss_opts_bulk_buflen.attr,
+       &f_ss_opts_attr_pattern,
+       &f_ss_opts_attr_isoc_interval,
+       &f_ss_opts_attr_isoc_maxpacket,
+       &f_ss_opts_attr_isoc_mult,
+       &f_ss_opts_attr_isoc_maxburst,
+       &f_ss_opts_attr_bulk_buflen,
        NULL,
 };
 
index 2e66e624e6e13dfed2fde71fff294a10a986bb7a..829c78de9ebac728919784951b89d05d7d942361 100644 (file)
@@ -405,10 +405,10 @@ USB_ETHERNET_CONFIGFS_ITEM_ATTR_QMULT(gether);
 USB_ETHERNET_CONFIGFS_ITEM_ATTR_IFNAME(gether);
 
 static struct configfs_attribute *gether_attrs[] = {
-       &f_gether_opts_dev_addr.attr,
-       &f_gether_opts_host_addr.attr,
-       &f_gether_opts_qmult.attr,
-       &f_gether_opts_ifname.attr,
+       &gether_opts_attr_dev_addr,
+       &gether_opts_attr_host_addr,
+       &gether_opts_attr_qmult,
+       &gether_opts_attr_ifname,
        NULL,
 };
 
index 8ee701924d29d0c5ad27edfed1b3e23c15b5c3e7..6a2346b99f5591911f92200d68e880ff3b2e5d18 100644 (file)
@@ -769,9 +769,6 @@ static inline struct f_uac1_opts *to_f_uac1_opts(struct config_item *item)
                            func_inst.group);
 }
 
-CONFIGFS_ATTR_STRUCT(f_uac1_opts);
-CONFIGFS_ATTR_OPS(f_uac1_opts);
-
 static void f_uac1_attr_release(struct config_item *item)
 {
        struct f_uac1_opts *opts = to_f_uac1_opts(item);
@@ -781,14 +778,13 @@ static void f_uac1_attr_release(struct config_item *item)
 
 static struct configfs_item_operations f_uac1_item_ops = {
        .release        = f_uac1_attr_release,
-       .show_attribute = f_uac1_opts_attr_show,
-       .store_attribute = f_uac1_opts_attr_store,
 };
 
 #define UAC1_INT_ATTRIBUTE(name)                                       \
-static ssize_t f_uac1_opts_##name##_show(struct f_uac1_opts *opts,     \
+static ssize_t f_uac1_opts_##name##_show(struct config_item *item,     \
                                         char *page)                    \
 {                                                                      \
+       struct f_uac1_opts *opts = to_f_uac1_opts(item);                \
        int result;                                                     \
                                                                        \
        mutex_lock(&opts->lock);                                        \
@@ -798,9 +794,10 @@ static ssize_t f_uac1_opts_##name##_show(struct f_uac1_opts *opts, \
        return result;                                                  \
 }                                                                      \
                                                                        \
-static ssize_t f_uac1_opts_##name##_store(struct f_uac1_opts *opts,    \
+static ssize_t f_uac1_opts_##name##_store(struct config_item *item,            \
                                          const char *page, size_t len) \
 {                                                                      \
+       struct f_uac1_opts *opts = to_f_uac1_opts(item);                \
        int ret;                                                        \
        u32 num;                                                        \
                                                                        \
@@ -822,19 +819,17 @@ end:                                                                      \
        return ret;                                                     \
 }                                                                      \
                                                                        \
-static struct f_uac1_opts_attribute f_uac1_opts_##name =               \
-       __CONFIGFS_ATTR(name, S_IRUGO | S_IWUSR,                        \
-                       f_uac1_opts_##name##_show,                      \
-                       f_uac1_opts_##name##_store)
+CONFIGFS_ATTR(f_uac1_opts_, name)
 
 UAC1_INT_ATTRIBUTE(req_buf_size);
 UAC1_INT_ATTRIBUTE(req_count);
 UAC1_INT_ATTRIBUTE(audio_buf_size);
 
 #define UAC1_STR_ATTRIBUTE(name)                                       \
-static ssize_t f_uac1_opts_##name##_show(struct f_uac1_opts *opts,     \
+static ssize_t f_uac1_opts_##name##_show(struct config_item *item,     \
                                         char *page)                    \
 {                                                                      \
+       struct f_uac1_opts *opts = to_f_uac1_opts(item);                \
        int result;                                                     \
                                                                        \
        mutex_lock(&opts->lock);                                        \
@@ -844,9 +839,10 @@ static ssize_t f_uac1_opts_##name##_show(struct f_uac1_opts *opts, \
        return result;                                                  \
 }                                                                      \
                                                                        \
-static ssize_t f_uac1_opts_##name##_store(struct f_uac1_opts *opts,    \
+static ssize_t f_uac1_opts_##name##_store(struct config_item *item,    \
                                          const char *page, size_t len) \
 {                                                                      \
+       struct f_uac1_opts *opts = to_f_uac1_opts(item);                \
        int ret = -EBUSY;                                               \
        char *tmp;                                                      \
                                                                        \
@@ -870,22 +866,19 @@ end:                                                                      \
        return ret;                                                     \
 }                                                                      \
                                                                        \
-static struct f_uac1_opts_attribute f_uac1_opts_##name =               \
-       __CONFIGFS_ATTR(name, S_IRUGO | S_IWUSR,                        \
-                       f_uac1_opts_##name##_show,                      \
-                       f_uac1_opts_##name##_store)
+CONFIGFS_ATTR(f_uac1_opts_, name)
 
 UAC1_STR_ATTRIBUTE(fn_play);
 UAC1_STR_ATTRIBUTE(fn_cap);
 UAC1_STR_ATTRIBUTE(fn_cntl);
 
 static struct configfs_attribute *f_uac1_attrs[] = {
-       &f_uac1_opts_req_buf_size.attr,
-       &f_uac1_opts_req_count.attr,
-       &f_uac1_opts_audio_buf_size.attr,
-       &f_uac1_opts_fn_play.attr,
-       &f_uac1_opts_fn_cap.attr,
-       &f_uac1_opts_fn_cntl.attr,
+       &f_uac1_opts_attr_req_buf_size,
+       &f_uac1_opts_attr_req_count,
+       &f_uac1_opts_attr_audio_buf_size,
+       &f_uac1_opts_attr_fn_play,
+       &f_uac1_opts_attr_fn_cap,
+       &f_uac1_opts_attr_fn_cntl,
        NULL,
 };
 
index 63336e269898d07ac42c2ab66117c9aaed2ae142..044ca79d3cb5d3b8a4764e27c1a1749caa43c971 100644 (file)
@@ -1439,9 +1439,6 @@ static inline struct f_uac2_opts *to_f_uac2_opts(struct config_item *item)
                            func_inst.group);
 }
 
-CONFIGFS_ATTR_STRUCT(f_uac2_opts);
-CONFIGFS_ATTR_OPS(f_uac2_opts);
-
 static void f_uac2_attr_release(struct config_item *item)
 {
        struct f_uac2_opts *opts = to_f_uac2_opts(item);
@@ -1451,14 +1448,13 @@ static void f_uac2_attr_release(struct config_item *item)
 
 static struct configfs_item_operations f_uac2_item_ops = {
        .release        = f_uac2_attr_release,
-       .show_attribute = f_uac2_opts_attr_show,
-       .store_attribute = f_uac2_opts_attr_store,
 };
 
 #define UAC2_ATTRIBUTE(name)                                           \
-static ssize_t f_uac2_opts_##name##_show(struct f_uac2_opts *opts,     \
+static ssize_t f_uac2_opts_##name##_show(struct config_item *item,     \
                                         char *page)                    \
 {                                                                      \
+       struct f_uac2_opts *opts = to_f_uac2_opts(item);                \
        int result;                                                     \
                                                                        \
        mutex_lock(&opts->lock);                                        \
@@ -1468,9 +1464,10 @@ static ssize_t f_uac2_opts_##name##_show(struct f_uac2_opts *opts,       \
        return result;                                                  \
 }                                                                      \
                                                                        \
-static ssize_t f_uac2_opts_##name##_store(struct f_uac2_opts *opts,    \
+static ssize_t f_uac2_opts_##name##_store(struct config_item *item,    \
                                          const char *page, size_t len) \
 {                                                                      \
+       struct f_uac2_opts *opts = to_f_uac2_opts(item);                \
        int ret;                                                        \
        u32 num;                                                        \
                                                                        \
@@ -1492,10 +1489,7 @@ end:                                                                     \
        return ret;                                                     \
 }                                                                      \
                                                                        \
-static struct f_uac2_opts_attribute f_uac2_opts_##name =               \
-       __CONFIGFS_ATTR(name, S_IRUGO | S_IWUSR,                        \
-                       f_uac2_opts_##name##_show,                      \
-                       f_uac2_opts_##name##_store)
+CONFIGFS_ATTR(f_uac2_opts_, name)
 
 UAC2_ATTRIBUTE(p_chmask);
 UAC2_ATTRIBUTE(p_srate);
@@ -1505,12 +1499,12 @@ UAC2_ATTRIBUTE(c_srate);
 UAC2_ATTRIBUTE(c_ssize);
 
 static struct configfs_attribute *f_uac2_attrs[] = {
-       &f_uac2_opts_p_chmask.attr,
-       &f_uac2_opts_p_srate.attr,
-       &f_uac2_opts_p_ssize.attr,
-       &f_uac2_opts_c_chmask.attr,
-       &f_uac2_opts_c_srate.attr,
-       &f_uac2_opts_c_ssize.attr,
+       &f_uac2_opts_attr_p_chmask,
+       &f_uac2_opts_attr_p_srate,
+       &f_uac2_opts_attr_p_ssize,
+       &f_uac2_opts_attr_c_chmask,
+       &f_uac2_opts_attr_c_srate,
+       &f_uac2_opts_attr_c_ssize,
        NULL,
 };
 
index bcbd30146cfde6a3ff74b252621ee6b0b3e1c764..4f47289fcf7cee45e93e8f9171a19390f91ee49f 100644 (file)
@@ -17,9 +17,6 @@
 #define __U_ETHER_CONFIGFS_H
 
 #define USB_ETHERNET_CONFIGFS_ITEM(_f_)                                        \
-       CONFIGFS_ATTR_STRUCT(f_##_f_##_opts);                           \
-       CONFIGFS_ATTR_OPS(f_##_f_##_opts);                              \
-                                                                       \
        static void _f_##_attr_release(struct config_item *item)        \
        {                                                               \
                struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item);  \
                                                                        \
        static struct configfs_item_operations _f_##_item_ops = {       \
                .release        = _f_##_attr_release,                   \
-               .show_attribute = f_##_f_##_opts_attr_show,             \
-               .store_attribute = f_##_f_##_opts_attr_store,           \
        }
 
 #define USB_ETHERNET_CONFIGFS_ITEM_ATTR_DEV_ADDR(_f_)                  \
-       static ssize_t _f_##_opts_dev_addr_show(struct f_##_f_##_opts *opts, \
+       static ssize_t _f_##_opts_dev_addr_show(struct config_item *item, \
                                                char *page)             \
        {                                                               \
+               struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item);  \
                int result;                                             \
                                                                        \
                mutex_lock(&opts->lock);                                \
                return result;                                          \
        }                                                               \
                                                                        \
-       static ssize_t _f_##_opts_dev_addr_store(struct f_##_f_##_opts *opts, \
+       static ssize_t _f_##_opts_dev_addr_store(struct config_item *item, \
                                                 const char *page, size_t len)\
        {                                                               \
+               struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item);  \
                int ret;                                                \
                                                                        \
                mutex_lock(&opts->lock);                                \
                return ret;                                             \
        }                                                               \
                                                                        \
-       static struct f_##_f_##_opts_attribute f_##_f_##_opts_dev_addr = \
-               __CONFIGFS_ATTR(dev_addr, S_IRUGO | S_IWUSR,            \
-                               _f_##_opts_dev_addr_show,               \
-                               _f_##_opts_dev_addr_store)
+       CONFIGFS_ATTR(_f_##_opts_, dev_addr)
 
 #define USB_ETHERNET_CONFIGFS_ITEM_ATTR_HOST_ADDR(_f_)                 \
-       static ssize_t _f_##_opts_host_addr_show(struct f_##_f_##_opts *opts, \
+       static ssize_t _f_##_opts_host_addr_show(struct config_item *item, \
                                                 char *page)            \
        {                                                               \
+               struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item);  \
                int result;                                             \
                                                                        \
                mutex_lock(&opts->lock);                                \
                return result;                                          \
        }                                                               \
                                                                        \
-       static ssize_t _f_##_opts_host_addr_store(struct f_##_f_##_opts *opts, \
+       static ssize_t _f_##_opts_host_addr_store(struct config_item *item, \
                                                  const char *page, size_t len)\
        {                                                               \
+               struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item);  \
                int ret;                                                \
                                                                        \
                mutex_lock(&opts->lock);                                \
                return ret;                                             \
        }                                                               \
                                                                        \
-       static struct f_##_f_##_opts_attribute f_##_f_##_opts_host_addr = \
-               __CONFIGFS_ATTR(host_addr, S_IRUGO | S_IWUSR,           \
-                               _f_##_opts_host_addr_show,              \
-                               _f_##_opts_host_addr_store)
+       CONFIGFS_ATTR(_f_##_opts_, host_addr)
 
 #define USB_ETHERNET_CONFIGFS_ITEM_ATTR_QMULT(_f_)                     \
-       static ssize_t _f_##_opts_qmult_show(struct f_##_f_##_opts *opts, \
+       static ssize_t _f_##_opts_qmult_show(struct config_item *item,  \
                                             char *page)                \
        {                                                               \
+               struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item);  \
                unsigned qmult;                                         \
                                                                        \
                mutex_lock(&opts->lock);                                \
                return sprintf(page, "%d", qmult);                      \
        }                                                               \
                                                                        \
-       static ssize_t _f_##_opts_qmult_store(struct f_##_f_##_opts *opts, \
+       static ssize_t _f_##_opts_qmult_store(struct config_item *item, \
                                              const char *page, size_t len)\
        {                                                               \
+               struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item);  \
                u8 val;                                                 \
                int ret;                                                \
                                                                        \
@@ -140,15 +135,13 @@ out:                                                                      \
                return ret;                                             \
        }                                                               \
                                                                        \
-       static struct f_##_f_##_opts_attribute f_##_f_##_opts_qmult =   \
-               __CONFIGFS_ATTR(qmult, S_IRUGO | S_IWUSR,               \
-                               _f_##_opts_qmult_show,          \
-                               _f_##_opts_qmult_store)
+       CONFIGFS_ATTR(_f_##_opts_, qmult)
 
 #define USB_ETHERNET_CONFIGFS_ITEM_ATTR_IFNAME(_f_)                    \
-       static ssize_t _f_##_opts_ifname_show(struct f_##_f_##_opts *opts, \
+       static ssize_t _f_##_opts_ifname_show(struct config_item *item, \
                                              char *page)               \
        {                                                               \
+               struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item);  \
                int ret;                                                \
                                                                        \
                mutex_lock(&opts->lock);                                \
@@ -158,7 +151,6 @@ out:                                                                        \
                return ret;                                             \
        }                                                               \
                                                                        \
-       static struct f_##_f_##_opts_attribute f_##_f_##_opts_ifname =  \
-               __CONFIGFS_ATTR_RO(ifname, _f_##_opts_ifname_show)
+       CONFIGFS_ATTR_RO(_f_##_opts_, ifname)
 
 #endif /* __U_ETHER_CONFIGFS_H */
index 3c0467bcb14fd9a3ccc15104a22e24f461781b4d..289ebca316d3f4ab0e136a14858bb7275eee53c0 100644 (file)
 
 #define UVCG_STREAMING_CONTROL_SIZE    1
 
-#define CONFIGFS_ATTR_OPS_RO(_item)                                    \
-static ssize_t _item##_attr_show(struct config_item *item,             \
-                                struct configfs_attribute *attr,       \
-                                char *page)                            \
-{                                                                      \
-       struct _item *_item = to_##_item(item);                         \
-       struct _item##_attribute *_item##_attr =                        \
-               container_of(attr, struct _item##_attribute, attr);     \
-       ssize_t ret = 0;                                                \
-                                                                       \
-       if (_item##_attr->show)                                         \
-               ret = _item##_attr->show(_item, page);                  \
-       return ret;                                                     \
+#define UVC_ATTR(prefix, cname, aname) \
+static struct configfs_attribute prefix##attr_##cname = { \
+       .ca_name        = __stringify(aname),                           \
+       .ca_mode        = S_IRUGO,                                      \
+       .ca_owner       = THIS_MODULE,                                  \
+       .show           = prefix##cname##_show,                         \
+       .store          = prefix##cname##_store,                        \
+}
+
+#define UVC_ATTR_RO(prefix, cname, aname) \
+static struct configfs_attribute prefix##attr_##cname = { \
+       .ca_name        = __stringify(aname),                           \
+       .ca_mode        = S_IRUGO,                                      \
+       .ca_owner       = THIS_MODULE,                                  \
+       .show           = prefix##cname##_show,                         \
 }
 
 static inline struct f_uvc_opts *to_f_uvc_opts(struct config_item *item);
@@ -48,18 +50,11 @@ static struct uvcg_control_header *to_uvcg_control_header(struct config_item *it
        return container_of(item, struct uvcg_control_header, item);
 }
 
-CONFIGFS_ATTR_STRUCT(uvcg_control_header);
-CONFIGFS_ATTR_OPS(uvcg_control_header);
-
-static struct configfs_item_operations uvcg_control_header_item_ops = {
-       .show_attribute         = uvcg_control_header_attr_show,
-       .store_attribute        = uvcg_control_header_attr_store,
-};
-
 #define UVCG_CTRL_HDR_ATTR(cname, aname, conv, str2u, uxx, vnoc, limit)        \
 static ssize_t uvcg_control_header_##cname##_show(                     \
-       struct uvcg_control_header *ch, char *page)                     \
+       struct config_item *item, char *page)                   \
 {                                                                      \
+       struct uvcg_control_header *ch = to_uvcg_control_header(item);  \
        struct f_uvc_opts *opts;                                        \
        struct config_item *opts_item;                                  \
        struct mutex *su_mutex = &ch->item.ci_group->cg_subsys->su_mutex;\
@@ -79,9 +74,10 @@ static ssize_t uvcg_control_header_##cname##_show(                   \
 }                                                                      \
                                                                        \
 static ssize_t                                                         \
-uvcg_control_header_##cname##_store(struct uvcg_control_header *ch,    \
+uvcg_control_header_##cname##_store(struct config_item *item,          \
                           const char *page, size_t len)                \
 {                                                                      \
+       struct uvcg_control_header *ch = to_uvcg_control_header(item);  \
        struct f_uvc_opts *opts;                                        \
        struct config_item *opts_item;                                  \
        struct mutex *su_mutex = &ch->item.ci_group->cg_subsys->su_mutex;\
@@ -115,11 +111,7 @@ end:                                                                       \
        return ret;                                                     \
 }                                                                      \
                                                                        \
-static struct uvcg_control_header_attribute                            \
-       uvcg_control_header_##cname =                                   \
-       __CONFIGFS_ATTR(aname, S_IRUGO | S_IWUSR,                       \
-                       uvcg_control_header_##cname##_show,             \
-                       uvcg_control_header_##cname##_store)
+UVC_ATTR(uvcg_control_header_, cname, aname)
 
 UVCG_CTRL_HDR_ATTR(bcd_uvc, bcdUVC, le16_to_cpu, kstrtou16, u16, cpu_to_le16,
                   0xffff);
@@ -130,13 +122,12 @@ UVCG_CTRL_HDR_ATTR(dw_clock_frequency, dwClockFrequency, le32_to_cpu, kstrtou32,
 #undef UVCG_CTRL_HDR_ATTR
 
 static struct configfs_attribute *uvcg_control_header_attrs[] = {
-       &uvcg_control_header_bcd_uvc.attr,
-       &uvcg_control_header_dw_clock_frequency.attr,
+       &uvcg_control_header_attr_bcd_uvc,
+       &uvcg_control_header_attr_dw_clock_frequency,
        NULL,
 };
 
 static struct config_item_type uvcg_control_header_type = {
-       .ct_item_ops    = &uvcg_control_header_item_ops,
        .ct_attrs       = uvcg_control_header_attrs,
        .ct_owner       = THIS_MODULE,
 };
@@ -196,17 +187,11 @@ static inline struct uvcg_default_processing
                            struct uvcg_default_processing, group);
 }
 
-CONFIGFS_ATTR_STRUCT(uvcg_default_processing);
-CONFIGFS_ATTR_OPS_RO(uvcg_default_processing);
-
-static struct configfs_item_operations uvcg_default_processing_item_ops = {
-       .show_attribute         = uvcg_default_processing_attr_show,
-};
-
 #define UVCG_DEFAULT_PROCESSING_ATTR(cname, aname, conv)               \
 static ssize_t uvcg_default_processing_##cname##_show(                 \
-       struct uvcg_default_processing *dp, char *page)                 \
+       struct config_item *item, char *page)                           \
 {                                                                      \
+       struct uvcg_default_processing *dp = to_uvcg_default_processing(item); \
        struct f_uvc_opts *opts;                                        \
        struct config_item *opts_item;                                  \
        struct mutex *su_mutex = &dp->group.cg_subsys->su_mutex;        \
@@ -227,9 +212,7 @@ static ssize_t uvcg_default_processing_##cname##_show(                      \
        return result;                                                  \
 }                                                                      \
                                                                        \
-static struct uvcg_default_processing_attribute                                \
-       uvcg_default_processing_##cname =                               \
-       __CONFIGFS_ATTR_RO(aname, uvcg_default_processing_##cname##_show)
+UVC_ATTR_RO(uvcg_default_processing_, cname, aname)
 
 #define identity_conv(x) (x)
 
@@ -243,8 +226,9 @@ UVCG_DEFAULT_PROCESSING_ATTR(i_processing, iProcessing, identity_conv);
 #undef UVCG_DEFAULT_PROCESSING_ATTR
 
 static ssize_t uvcg_default_processing_bm_controls_show(
-       struct uvcg_default_processing *dp, char *page)
+       struct config_item *item, char *page)
 {
+       struct uvcg_default_processing *dp = to_uvcg_default_processing(item);
        struct f_uvc_opts *opts;
        struct config_item *opts_item;
        struct mutex *su_mutex = &dp->group.cg_subsys->su_mutex;
@@ -270,22 +254,18 @@ static ssize_t uvcg_default_processing_bm_controls_show(
        return result;
 }
 
-static struct uvcg_default_processing_attribute
-       uvcg_default_processing_bm_controls =
-       __CONFIGFS_ATTR_RO(bmControls,
-               uvcg_default_processing_bm_controls_show);
+UVC_ATTR_RO(uvcg_default_processing_, bm_controls, bmControls);
 
 static struct configfs_attribute *uvcg_default_processing_attrs[] = {
-       &uvcg_default_processing_b_unit_id.attr,
-       &uvcg_default_processing_b_source_id.attr,
-       &uvcg_default_processing_w_max_multiplier.attr,
-       &uvcg_default_processing_bm_controls.attr,
-       &uvcg_default_processing_i_processing.attr,
+       &uvcg_default_processing_attr_b_unit_id,
+       &uvcg_default_processing_attr_b_source_id,
+       &uvcg_default_processing_attr_w_max_multiplier,
+       &uvcg_default_processing_attr_bm_controls,
+       &uvcg_default_processing_attr_i_processing,
        NULL,
 };
 
 static struct config_item_type uvcg_default_processing_type = {
-       .ct_item_ops    = &uvcg_default_processing_item_ops,
        .ct_attrs       = uvcg_default_processing_attrs,
        .ct_owner       = THIS_MODULE,
 };
@@ -318,17 +298,11 @@ static inline struct uvcg_default_camera
                            struct uvcg_default_camera, group);
 }
 
-CONFIGFS_ATTR_STRUCT(uvcg_default_camera);
-CONFIGFS_ATTR_OPS_RO(uvcg_default_camera);
-
-static struct configfs_item_operations uvcg_default_camera_item_ops = {
-       .show_attribute         = uvcg_default_camera_attr_show,
-};
-
 #define UVCG_DEFAULT_CAMERA_ATTR(cname, aname, conv)                   \
 static ssize_t uvcg_default_camera_##cname##_show(                     \
-       struct uvcg_default_camera *dc, char *page)                     \
+       struct config_item *item, char *page)                           \
 {                                                                      \
+       struct uvcg_default_camera *dc = to_uvcg_default_camera(item);  \
        struct f_uvc_opts *opts;                                        \
        struct config_item *opts_item;                                  \
        struct mutex *su_mutex = &dc->group.cg_subsys->su_mutex;        \
@@ -351,9 +325,7 @@ static ssize_t uvcg_default_camera_##cname##_show(                  \
        return result;                                                  \
 }                                                                      \
                                                                        \
-static struct uvcg_default_camera_attribute                            \
-       uvcg_default_camera_##cname =                                   \
-       __CONFIGFS_ATTR_RO(aname, uvcg_default_camera_##cname##_show)
+UVC_ATTR_RO(uvcg_default_camera_, cname, aname)
 
 #define identity_conv(x) (x)
 
@@ -373,8 +345,9 @@ UVCG_DEFAULT_CAMERA_ATTR(w_ocular_focal_length, wOcularFocalLength,
 #undef UVCG_DEFAULT_CAMERA_ATTR
 
 static ssize_t uvcg_default_camera_bm_controls_show(
-       struct uvcg_default_camera *dc, char *page)
+       struct config_item *item, char *page)
 {
+       struct uvcg_default_camera *dc = to_uvcg_default_camera(item);
        struct f_uvc_opts *opts;
        struct config_item *opts_item;
        struct mutex *su_mutex = &dc->group.cg_subsys->su_mutex;
@@ -400,24 +373,21 @@ static ssize_t uvcg_default_camera_bm_controls_show(
        return result;
 }
 
-static struct uvcg_default_camera_attribute
-       uvcg_default_camera_bm_controls =
-       __CONFIGFS_ATTR_RO(bmControls, uvcg_default_camera_bm_controls_show);
+UVC_ATTR_RO(uvcg_default_camera_, bm_controls, bmControls);
 
 static struct configfs_attribute *uvcg_default_camera_attrs[] = {
-       &uvcg_default_camera_b_terminal_id.attr,
-       &uvcg_default_camera_w_terminal_type.attr,
-       &uvcg_default_camera_b_assoc_terminal.attr,
-       &uvcg_default_camera_i_terminal.attr,
-       &uvcg_default_camera_w_objective_focal_length_min.attr,
-       &uvcg_default_camera_w_objective_focal_length_max.attr,
-       &uvcg_default_camera_w_ocular_focal_length.attr,
-       &uvcg_default_camera_bm_controls.attr,
+       &uvcg_default_camera_attr_b_terminal_id,
+       &uvcg_default_camera_attr_w_terminal_type,
+       &uvcg_default_camera_attr_b_assoc_terminal,
+       &uvcg_default_camera_attr_i_terminal,
+       &uvcg_default_camera_attr_w_objective_focal_length_min,
+       &uvcg_default_camera_attr_w_objective_focal_length_max,
+       &uvcg_default_camera_attr_w_ocular_focal_length,
+       &uvcg_default_camera_attr_bm_controls,
        NULL,
 };
 
 static struct config_item_type uvcg_default_camera_type = {
-       .ct_item_ops    = &uvcg_default_camera_item_ops,
        .ct_attrs       = uvcg_default_camera_attrs,
        .ct_owner       = THIS_MODULE,
 };
@@ -450,17 +420,11 @@ static inline struct uvcg_default_output
                            struct uvcg_default_output, group);
 }
 
-CONFIGFS_ATTR_STRUCT(uvcg_default_output);
-CONFIGFS_ATTR_OPS_RO(uvcg_default_output);
-
-static struct configfs_item_operations uvcg_default_output_item_ops = {
-       .show_attribute         = uvcg_default_output_attr_show,
-};
-
 #define UVCG_DEFAULT_OUTPUT_ATTR(cname, aname, conv)                   \
 static ssize_t uvcg_default_output_##cname##_show(                     \
-       struct uvcg_default_output *dout, char *page)                   \
+       struct config_item *item, char *page)                   \
 {                                                                      \
+       struct uvcg_default_output *dout = to_uvcg_default_output(item); \
        struct f_uvc_opts *opts;                                        \
        struct config_item *opts_item;                                  \
        struct mutex *su_mutex = &dout->group.cg_subsys->su_mutex;      \
@@ -483,9 +447,7 @@ static ssize_t uvcg_default_output_##cname##_show(                  \
        return result;                                                  \
 }                                                                      \
                                                                        \
-static struct uvcg_default_output_attribute                            \
-       uvcg_default_output_##cname =                                   \
-       __CONFIGFS_ATTR_RO(aname, uvcg_default_output_##cname##_show)
+UVC_ATTR_RO(uvcg_default_output_, cname, aname)
 
 #define identity_conv(x) (x)
 
@@ -500,16 +462,15 @@ UVCG_DEFAULT_OUTPUT_ATTR(i_terminal, iTerminal, identity_conv);
 #undef UVCG_DEFAULT_OUTPUT_ATTR
 
 static struct configfs_attribute *uvcg_default_output_attrs[] = {
-       &uvcg_default_output_b_terminal_id.attr,
-       &uvcg_default_output_w_terminal_type.attr,
-       &uvcg_default_output_b_assoc_terminal.attr,
-       &uvcg_default_output_b_source_id.attr,
-       &uvcg_default_output_i_terminal.attr,
+       &uvcg_default_output_attr_b_terminal_id,
+       &uvcg_default_output_attr_w_terminal_type,
+       &uvcg_default_output_attr_b_assoc_terminal,
+       &uvcg_default_output_attr_b_source_id,
+       &uvcg_default_output_attr_i_terminal,
        NULL,
 };
 
 static struct config_item_type uvcg_default_output_type = {
-       .ct_item_ops    = &uvcg_default_output_item_ops,
        .ct_attrs       = uvcg_default_output_attrs,
        .ct_owner       = THIS_MODULE,
 };
@@ -800,9 +761,6 @@ static struct uvcg_streaming_header *to_uvcg_streaming_header(struct config_item
        return container_of(item, struct uvcg_streaming_header, item);
 }
 
-CONFIGFS_ATTR_STRUCT(uvcg_streaming_header);
-CONFIGFS_ATTR_OPS(uvcg_streaming_header);
-
 static int uvcg_streaming_header_allow_link(struct config_item *src,
                                            struct config_item *target)
 {
@@ -893,16 +851,15 @@ out:
 }
 
 static struct configfs_item_operations uvcg_streaming_header_item_ops = {
-       .show_attribute         = uvcg_streaming_header_attr_show,
-       .store_attribute        = uvcg_streaming_header_attr_store,
        .allow_link             = uvcg_streaming_header_allow_link,
        .drop_link              = uvcg_streaming_header_drop_link,
 };
 
 #define UVCG_STREAMING_HEADER_ATTR(cname, aname, conv)                 \
 static ssize_t uvcg_streaming_header_##cname##_show(                   \
-       struct uvcg_streaming_header *sh, char *page)                   \
+       struct config_item *item, char *page)                   \
 {                                                                      \
+       struct uvcg_streaming_header *sh = to_uvcg_streaming_header(item); \
        struct f_uvc_opts *opts;                                        \
        struct config_item *opts_item;                                  \
        struct mutex *su_mutex = &sh->item.ci_group->cg_subsys->su_mutex;\
@@ -921,9 +878,7 @@ static ssize_t uvcg_streaming_header_##cname##_show(                        \
        return result;                                                  \
 }                                                                      \
                                                                        \
-static struct uvcg_streaming_header_attribute                          \
-       uvcg_streaming_header_##cname =                                 \
-       __CONFIGFS_ATTR_RO(aname, uvcg_streaming_header_##cname##_show)
+UVC_ATTR_RO(uvcg_streaming_header_, cname, aname)
 
 #define identity_conv(x) (x)
 
@@ -939,11 +894,11 @@ UVCG_STREAMING_HEADER_ATTR(b_trigger_usage, bTriggerUsage, identity_conv);
 #undef UVCG_STREAMING_HEADER_ATTR
 
 static struct configfs_attribute *uvcg_streaming_header_attrs[] = {
-       &uvcg_streaming_header_bm_info.attr,
-       &uvcg_streaming_header_b_terminal_link.attr,
-       &uvcg_streaming_header_b_still_capture_method.attr,
-       &uvcg_streaming_header_b_trigger_support.attr,
-       &uvcg_streaming_header_b_trigger_usage.attr,
+       &uvcg_streaming_header_attr_bm_info,
+       &uvcg_streaming_header_attr_b_terminal_link,
+       &uvcg_streaming_header_attr_b_still_capture_method,
+       &uvcg_streaming_header_attr_b_trigger_support,
+       &uvcg_streaming_header_attr_b_trigger_usage,
        NULL,
 };
 
@@ -1022,17 +977,10 @@ static struct uvcg_frame *to_uvcg_frame(struct config_item *item)
        return container_of(item, struct uvcg_frame, item);
 }
 
-CONFIGFS_ATTR_STRUCT(uvcg_frame);
-CONFIGFS_ATTR_OPS(uvcg_frame);
-
-static struct configfs_item_operations uvcg_frame_item_ops = {
-       .show_attribute         = uvcg_frame_attr_show,
-       .store_attribute        = uvcg_frame_attr_store,
-};
-
 #define UVCG_FRAME_ATTR(cname, aname, to_cpu_endian, to_little_endian, bits) \
-static ssize_t uvcg_frame_##cname##_show(struct uvcg_frame *f, char *page)\
+static ssize_t uvcg_frame_##cname##_show(struct config_item *item, char *page)\
 {                                                                      \
+       struct uvcg_frame *f = to_uvcg_frame(item);                     \
        struct f_uvc_opts *opts;                                        \
        struct config_item *opts_item;                                  \
        struct mutex *su_mutex = &f->item.ci_group->cg_subsys->su_mutex;\
@@ -1051,9 +999,10 @@ static ssize_t uvcg_frame_##cname##_show(struct uvcg_frame *f, char *page)\
        return result;                                                  \
 }                                                                      \
                                                                        \
-static ssize_t  uvcg_frame_##cname##_store(struct uvcg_frame *f,       \
+static ssize_t  uvcg_frame_##cname##_store(struct config_item *item,   \
                                           const char *page, size_t len)\
 {                                                                      \
+       struct uvcg_frame *f = to_uvcg_frame(item);                     \
        struct f_uvc_opts *opts;                                        \
        struct config_item *opts_item;                                  \
        struct uvcg_format *fmt;                                        \
@@ -1085,11 +1034,7 @@ end:                                                                     \
        return ret;                                                     \
 }                                                                      \
                                                                        \
-static struct uvcg_frame_attribute                                     \
-       uvcg_frame_##cname =                                            \
-       __CONFIGFS_ATTR(aname, S_IRUGO | S_IWUSR,                       \
-                       uvcg_frame_##cname##_show,                      \
-                       uvcg_frame_##cname##_store)
+UVC_ATTR(uvcg_frame_, cname, aname);
 
 #define noop_conversion(x) (x)
 
@@ -1108,9 +1053,10 @@ UVCG_FRAME_ATTR(dw_default_frame_interval, dwDefaultFrameInterval,
 
 #undef UVCG_FRAME_ATTR
 
-static ssize_t uvcg_frame_dw_frame_interval_show(struct uvcg_frame *frm,
+static ssize_t uvcg_frame_dw_frame_interval_show(struct config_item *item,
                                                 char *page)
 {
+       struct uvcg_frame *frm = to_uvcg_frame(item);
        struct f_uvc_opts *opts;
        struct config_item *opts_item;
        struct mutex *su_mutex = &frm->item.ci_group->cg_subsys->su_mutex;
@@ -1185,9 +1131,10 @@ static int __uvcg_iter_frm_intrv(const char *page, size_t len,
        return 0;
 }
 
-static ssize_t uvcg_frame_dw_frame_interval_store(struct uvcg_frame *ch,
+static ssize_t uvcg_frame_dw_frame_interval_store(struct config_item *item,
                                                  const char *page, size_t len)
 {
+       struct uvcg_frame *ch = to_uvcg_frame(item);
        struct f_uvc_opts *opts;
        struct config_item *opts_item;
        struct uvcg_format *fmt;
@@ -1234,26 +1181,21 @@ end:
        return ret;
 }
 
-static struct uvcg_frame_attribute
-       uvcg_frame_dw_frame_interval =
-       __CONFIGFS_ATTR(dwFrameInterval, S_IRUGO | S_IWUSR,
-                       uvcg_frame_dw_frame_interval_show,
-                       uvcg_frame_dw_frame_interval_store);
+UVC_ATTR(uvcg_frame_, dw_frame_interval, dwFrameInterval);
 
 static struct configfs_attribute *uvcg_frame_attrs[] = {
-       &uvcg_frame_bm_capabilities.attr,
-       &uvcg_frame_w_width.attr,
-       &uvcg_frame_w_height.attr,
-       &uvcg_frame_dw_min_bit_rate.attr,
-       &uvcg_frame_dw_max_bit_rate.attr,
-       &uvcg_frame_dw_max_video_frame_buffer_size.attr,
-       &uvcg_frame_dw_default_frame_interval.attr,
-       &uvcg_frame_dw_frame_interval.attr,
+       &uvcg_frame_attr_bm_capabilities,
+       &uvcg_frame_attr_w_width,
+       &uvcg_frame_attr_w_height,
+       &uvcg_frame_attr_dw_min_bit_rate,
+       &uvcg_frame_attr_dw_max_bit_rate,
+       &uvcg_frame_attr_dw_max_video_frame_buffer_size,
+       &uvcg_frame_attr_dw_default_frame_interval,
+       &uvcg_frame_attr_dw_frame_interval,
        NULL,
 };
 
 static struct config_item_type uvcg_frame_type = {
-       .ct_item_ops    = &uvcg_frame_item_ops,
        .ct_attrs       = uvcg_frame_attrs,
        .ct_owner       = THIS_MODULE,
 };
@@ -1333,22 +1275,15 @@ static struct uvcg_uncompressed *to_uvcg_uncompressed(struct config_item *item)
                struct uvcg_uncompressed, fmt);
 }
 
-CONFIGFS_ATTR_STRUCT(uvcg_uncompressed);
-CONFIGFS_ATTR_OPS(uvcg_uncompressed);
-
-static struct configfs_item_operations uvcg_uncompressed_item_ops = {
-       .show_attribute         = uvcg_uncompressed_attr_show,
-       .store_attribute        = uvcg_uncompressed_attr_store,
-};
-
 static struct configfs_group_operations uvcg_uncompressed_group_ops = {
        .make_item              = uvcg_frame_make,
        .drop_item              = uvcg_frame_drop,
 };
 
-static ssize_t uvcg_uncompressed_guid_format_show(struct uvcg_uncompressed *ch,
+static ssize_t uvcg_uncompressed_guid_format_show(struct config_item *item,
                                                        char *page)
 {
+       struct uvcg_uncompressed *ch = to_uvcg_uncompressed(item);
        struct f_uvc_opts *opts;
        struct config_item *opts_item;
        struct mutex *su_mutex = &ch->fmt.group.cg_subsys->su_mutex;
@@ -1367,9 +1302,10 @@ static ssize_t uvcg_uncompressed_guid_format_show(struct uvcg_uncompressed *ch,
        return sizeof(ch->desc.guidFormat);
 }
 
-static ssize_t uvcg_uncompressed_guid_format_store(struct uvcg_uncompressed *ch,
+static ssize_t uvcg_uncompressed_guid_format_store(struct config_item *item,
                                                   const char *page, size_t len)
 {
+       struct uvcg_uncompressed *ch = to_uvcg_uncompressed(item);
        struct f_uvc_opts *opts;
        struct config_item *opts_item;
        struct mutex *su_mutex = &ch->fmt.group.cg_subsys->su_mutex;
@@ -1396,16 +1332,13 @@ end:
        return ret;
 }
 
-static struct uvcg_uncompressed_attribute uvcg_uncompressed_guid_format =
-       __CONFIGFS_ATTR(guidFormat, S_IRUGO | S_IWUSR,
-                       uvcg_uncompressed_guid_format_show,
-                       uvcg_uncompressed_guid_format_store);
-
+UVC_ATTR(uvcg_uncompressed_, guid_format, guidFormat);
 
 #define UVCG_UNCOMPRESSED_ATTR_RO(cname, aname, conv)                  \
 static ssize_t uvcg_uncompressed_##cname##_show(                       \
-       struct uvcg_uncompressed *u, char *page)                        \
+       struct config_item *item, char *page)                           \
 {                                                                      \
+       struct uvcg_uncompressed *u = to_uvcg_uncompressed(item);       \
        struct f_uvc_opts *opts;                                        \
        struct config_item *opts_item;                                  \
        struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex;     \
@@ -1424,14 +1357,13 @@ static ssize_t uvcg_uncompressed_##cname##_show(                        \
        return result;                                                  \
 }                                                                      \
                                                                        \
-static struct uvcg_uncompressed_attribute                              \
-       uvcg_uncompressed_##cname =                                     \
-       __CONFIGFS_ATTR_RO(aname, uvcg_uncompressed_##cname##_show)
+UVC_ATTR_RO(uvcg_uncompressed_, cname, aname);
 
 #define UVCG_UNCOMPRESSED_ATTR(cname, aname, conv)                     \
 static ssize_t uvcg_uncompressed_##cname##_show(                       \
-       struct uvcg_uncompressed *u, char *page)                        \
+       struct config_item *item, char *page)                           \
 {                                                                      \
+       struct uvcg_uncompressed *u = to_uvcg_uncompressed(item);       \
        struct f_uvc_opts *opts;                                        \
        struct config_item *opts_item;                                  \
        struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex;     \
@@ -1451,9 +1383,10 @@ static ssize_t uvcg_uncompressed_##cname##_show(                 \
 }                                                                      \
                                                                        \
 static ssize_t                                                         \
-uvcg_uncompressed_##cname##_store(struct uvcg_uncompressed *u,         \
+uvcg_uncompressed_##cname##_store(struct config_item *item,            \
                                    const char *page, size_t len)       \
 {                                                                      \
+       struct uvcg_uncompressed *u = to_uvcg_uncompressed(item);       \
        struct f_uvc_opts *opts;                                        \
        struct config_item *opts_item;                                  \
        struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex;     \
@@ -1487,11 +1420,7 @@ end:                                                                     \
        return ret;                                                     \
 }                                                                      \
                                                                        \
-static struct uvcg_uncompressed_attribute                              \
-       uvcg_uncompressed_##cname =                                     \
-       __CONFIGFS_ATTR(aname, S_IRUGO | S_IWUSR,                       \
-                       uvcg_uncompressed_##cname##_show,               \
-                       uvcg_uncompressed_##cname##_store)
+UVC_ATTR(uvcg_uncompressed_, cname, aname);
 
 #define identity_conv(x) (x)
 
@@ -1508,36 +1437,34 @@ UVCG_UNCOMPRESSED_ATTR_RO(bm_interface_flags, bmInterfaceFlags, identity_conv);
 #undef UVCG_UNCOMPRESSED_ATTR_RO
 
 static inline ssize_t
-uvcg_uncompressed_bma_controls_show(struct uvcg_uncompressed *unc, char *page)
+uvcg_uncompressed_bma_controls_show(struct config_item *item, char *page)
 {
+       struct uvcg_uncompressed *unc = to_uvcg_uncompressed(item);
        return uvcg_format_bma_controls_show(&unc->fmt, page);
 }
 
 static inline ssize_t
-uvcg_uncompressed_bma_controls_store(struct uvcg_uncompressed *ch,
+uvcg_uncompressed_bma_controls_store(struct config_item *item,
                                     const char *page, size_t len)
 {
-       return uvcg_format_bma_controls_store(&ch->fmt, page, len);
+       struct uvcg_uncompressed *unc = to_uvcg_uncompressed(item);
+       return uvcg_format_bma_controls_store(&unc->fmt, page, len);
 }
 
-static struct uvcg_uncompressed_attribute uvcg_uncompressed_bma_controls =
-       __CONFIGFS_ATTR(bmaControls, S_IRUGO | S_IWUSR,
-                       uvcg_uncompressed_bma_controls_show,
-                       uvcg_uncompressed_bma_controls_store);
+UVC_ATTR(uvcg_uncompressed_, bma_controls, bmaControls);
 
 static struct configfs_attribute *uvcg_uncompressed_attrs[] = {
-       &uvcg_uncompressed_guid_format.attr,
-       &uvcg_uncompressed_b_bits_per_pixel.attr,
-       &uvcg_uncompressed_b_default_frame_index.attr,
-       &uvcg_uncompressed_b_aspect_ratio_x.attr,
-       &uvcg_uncompressed_b_aspect_ratio_y.attr,
-       &uvcg_uncompressed_bm_interface_flags.attr,
-       &uvcg_uncompressed_bma_controls.attr,
+       &uvcg_uncompressed_attr_guid_format,
+       &uvcg_uncompressed_attr_b_bits_per_pixel,
+       &uvcg_uncompressed_attr_b_default_frame_index,
+       &uvcg_uncompressed_attr_b_aspect_ratio_x,
+       &uvcg_uncompressed_attr_b_aspect_ratio_y,
+       &uvcg_uncompressed_attr_bm_interface_flags,
+       &uvcg_uncompressed_attr_bma_controls,
        NULL,
 };
 
 static struct config_item_type uvcg_uncompressed_type = {
-       .ct_item_ops    = &uvcg_uncompressed_item_ops,
        .ct_group_ops   = &uvcg_uncompressed_group_ops,
        .ct_attrs       = uvcg_uncompressed_attrs,
        .ct_owner       = THIS_MODULE,
@@ -1605,22 +1532,15 @@ static struct uvcg_mjpeg *to_uvcg_mjpeg(struct config_item *item)
                struct uvcg_mjpeg, fmt);
 }
 
-CONFIGFS_ATTR_STRUCT(uvcg_mjpeg);
-CONFIGFS_ATTR_OPS(uvcg_mjpeg);
-
-static struct configfs_item_operations uvcg_mjpeg_item_ops = {
-       .show_attribute         = uvcg_mjpeg_attr_show,
-       .store_attribute        = uvcg_mjpeg_attr_store,
-};
-
 static struct configfs_group_operations uvcg_mjpeg_group_ops = {
        .make_item              = uvcg_frame_make,
        .drop_item              = uvcg_frame_drop,
 };
 
 #define UVCG_MJPEG_ATTR_RO(cname, aname, conv)                         \
-static ssize_t uvcg_mjpeg_##cname##_show(struct uvcg_mjpeg *u, char *page)\
+static ssize_t uvcg_mjpeg_##cname##_show(struct config_item *item, char *page)\
 {                                                                      \
+       struct uvcg_mjpeg *u = to_uvcg_mjpeg(item);                     \
        struct f_uvc_opts *opts;                                        \
        struct config_item *opts_item;                                  \
        struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex;     \
@@ -1639,13 +1559,12 @@ static ssize_t uvcg_mjpeg_##cname##_show(struct uvcg_mjpeg *u, char *page)\
        return result;                                                  \
 }                                                                      \
                                                                        \
-static struct uvcg_mjpeg_attribute                                     \
-       uvcg_mjpeg_##cname =                                            \
-       __CONFIGFS_ATTR_RO(aname, uvcg_mjpeg_##cname##_show)
+UVC_ATTR_RO(uvcg_mjpeg_, cname, aname)
 
 #define UVCG_MJPEG_ATTR(cname, aname, conv)                            \
-static ssize_t uvcg_mjpeg_##cname##_show(struct uvcg_mjpeg *u, char *page)\
+static ssize_t uvcg_mjpeg_##cname##_show(struct config_item *item, char *page)\
 {                                                                      \
+       struct uvcg_mjpeg *u = to_uvcg_mjpeg(item);                     \
        struct f_uvc_opts *opts;                                        \
        struct config_item *opts_item;                                  \
        struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex;     \
@@ -1665,9 +1584,10 @@ static ssize_t uvcg_mjpeg_##cname##_show(struct uvcg_mjpeg *u, char *page)\
 }                                                                      \
                                                                        \
 static ssize_t                                                         \
-uvcg_mjpeg_##cname##_store(struct uvcg_mjpeg *u,                       \
+uvcg_mjpeg_##cname##_store(struct config_item *item,                   \
                           const char *page, size_t len)                \
 {                                                                      \
+       struct uvcg_mjpeg *u = to_uvcg_mjpeg(item);                     \
        struct f_uvc_opts *opts;                                        \
        struct config_item *opts_item;                                  \
        struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex;     \
@@ -1701,11 +1621,7 @@ end:                                                                     \
        return ret;                                                     \
 }                                                                      \
                                                                        \
-static struct uvcg_mjpeg_attribute                                     \
-       uvcg_mjpeg_##cname =                                            \
-       __CONFIGFS_ATTR(aname, S_IRUGO | S_IWUSR,                       \
-                       uvcg_mjpeg_##cname##_show,                      \
-                       uvcg_mjpeg_##cname##_store)
+UVC_ATTR(uvcg_mjpeg_, cname, aname)
 
 #define identity_conv(x) (x)
 
@@ -1722,35 +1638,33 @@ UVCG_MJPEG_ATTR_RO(bm_interface_flags, bmInterfaceFlags, identity_conv);
 #undef UVCG_MJPEG_ATTR_RO
 
 static inline ssize_t
-uvcg_mjpeg_bma_controls_show(struct uvcg_mjpeg *unc, char *page)
+uvcg_mjpeg_bma_controls_show(struct config_item *item, char *page)
 {
-       return uvcg_format_bma_controls_show(&unc->fmt, page);
+       struct uvcg_mjpeg *u = to_uvcg_mjpeg(item);
+       return uvcg_format_bma_controls_show(&u->fmt, page);
 }
 
 static inline ssize_t
-uvcg_mjpeg_bma_controls_store(struct uvcg_mjpeg *ch,
+uvcg_mjpeg_bma_controls_store(struct config_item *item,
                                     const char *page, size_t len)
 {
-       return uvcg_format_bma_controls_store(&ch->fmt, page, len);
+       struct uvcg_mjpeg *u = to_uvcg_mjpeg(item);
+       return uvcg_format_bma_controls_store(&u->fmt, page, len);
 }
 
-static struct uvcg_mjpeg_attribute uvcg_mjpeg_bma_controls =
-       __CONFIGFS_ATTR(bmaControls, S_IRUGO | S_IWUSR,
-                       uvcg_mjpeg_bma_controls_show,
-                       uvcg_mjpeg_bma_controls_store);
+UVC_ATTR(uvcg_mjpeg_, bma_controls, bmaControls);
 
 static struct configfs_attribute *uvcg_mjpeg_attrs[] = {
-       &uvcg_mjpeg_b_default_frame_index.attr,
-       &uvcg_mjpeg_bm_flags.attr,
-       &uvcg_mjpeg_b_aspect_ratio_x.attr,
-       &uvcg_mjpeg_b_aspect_ratio_y.attr,
-       &uvcg_mjpeg_bm_interface_flags.attr,
-       &uvcg_mjpeg_bma_controls.attr,
+       &uvcg_mjpeg_attr_b_default_frame_index,
+       &uvcg_mjpeg_attr_bm_flags,
+       &uvcg_mjpeg_attr_b_aspect_ratio_x,
+       &uvcg_mjpeg_attr_b_aspect_ratio_y,
+       &uvcg_mjpeg_attr_bm_interface_flags,
+       &uvcg_mjpeg_attr_bma_controls,
        NULL,
 };
 
 static struct config_item_type uvcg_mjpeg_type = {
-       .ct_item_ops    = &uvcg_mjpeg_item_ops,
        .ct_group_ops   = &uvcg_mjpeg_group_ops,
        .ct_attrs       = uvcg_mjpeg_attrs,
        .ct_owner       = THIS_MODULE,
@@ -1811,17 +1725,12 @@ static inline struct uvcg_default_color_matching
                            struct uvcg_default_color_matching, group);
 }
 
-CONFIGFS_ATTR_STRUCT(uvcg_default_color_matching);
-CONFIGFS_ATTR_OPS_RO(uvcg_default_color_matching);
-
-static struct configfs_item_operations uvcg_default_color_matching_item_ops = {
-       .show_attribute         = uvcg_default_color_matching_attr_show,
-};
-
 #define UVCG_DEFAULT_COLOR_MATCHING_ATTR(cname, aname, conv)           \
 static ssize_t uvcg_default_color_matching_##cname##_show(             \
-       struct uvcg_default_color_matching *dc, char *page)             \
+       struct config_item *item, char *page)           \
 {                                                                      \
+       struct uvcg_default_color_matching *dc =                        \
+               to_uvcg_default_color_matching(item);                   \
        struct f_uvc_opts *opts;                                        \
        struct config_item *opts_item;                                  \
        struct mutex *su_mutex = &dc->group.cg_subsys->su_mutex;        \
@@ -1842,9 +1751,7 @@ static ssize_t uvcg_default_color_matching_##cname##_show(                \
        return result;                                                  \
 }                                                                      \
                                                                        \
-static struct uvcg_default_color_matching_attribute                    \
-       uvcg_default_color_matching_##cname =                           \
-       __CONFIGFS_ATTR_RO(aname, uvcg_default_color_matching_##cname##_show)
+UVC_ATTR_RO(uvcg_default_color_matching_, cname, aname)
 
 #define identity_conv(x) (x)
 
@@ -1860,14 +1767,13 @@ UVCG_DEFAULT_COLOR_MATCHING_ATTR(b_matrix_coefficients, bMatrixCoefficients,
 #undef UVCG_DEFAULT_COLOR_MATCHING_ATTR
 
 static struct configfs_attribute *uvcg_default_color_matching_attrs[] = {
-       &uvcg_default_color_matching_b_color_primaries.attr,
-       &uvcg_default_color_matching_b_transfer_characteristics.attr,
-       &uvcg_default_color_matching_b_matrix_coefficients.attr,
+       &uvcg_default_color_matching_attr_b_color_primaries,
+       &uvcg_default_color_matching_attr_b_transfer_characteristics,
+       &uvcg_default_color_matching_attr_b_matrix_coefficients,
        NULL,
 };
 
 static struct config_item_type uvcg_default_color_matching_type = {
-       .ct_item_ops    = &uvcg_default_color_matching_item_ops,
        .ct_attrs       = uvcg_default_color_matching_attrs,
        .ct_owner       = THIS_MODULE,
 };
@@ -2285,9 +2191,6 @@ static inline struct f_uvc_opts *to_f_uvc_opts(struct config_item *item)
                            func_inst.group);
 }
 
-CONFIGFS_ATTR_STRUCT(f_uvc_opts);
-CONFIGFS_ATTR_OPS(f_uvc_opts);
-
 static void uvc_attr_release(struct config_item *item)
 {
        struct f_uvc_opts *opts = to_f_uvc_opts(item);
@@ -2297,14 +2200,13 @@ static void uvc_attr_release(struct config_item *item)
 
 static struct configfs_item_operations uvc_item_ops = {
        .release                = uvc_attr_release,
-       .show_attribute         = f_uvc_opts_attr_show,
-       .store_attribute        = f_uvc_opts_attr_store,
 };
 
 #define UVCG_OPTS_ATTR(cname, conv, str2u, uxx, vnoc, limit)           \
 static ssize_t f_uvc_opts_##cname##_show(                              \
-       struct f_uvc_opts *opts, char *page)                            \
+       struct config_item *item, char *page)                           \
 {                                                                      \
+       struct f_uvc_opts *opts = to_f_uvc_opts(item);                  \
        int result;                                                     \
                                                                        \
        mutex_lock(&opts->lock);                                        \
@@ -2315,9 +2217,10 @@ static ssize_t f_uvc_opts_##cname##_show(                                \
 }                                                                      \
                                                                        \
 static ssize_t                                                         \
-f_uvc_opts_##cname##_store(struct f_uvc_opts *opts,                    \
+f_uvc_opts_##cname##_store(struct config_item *item,                   \
                           const char *page, size_t len)                \
 {                                                                      \
+       struct f_uvc_opts *opts = to_f_uvc_opts(item);                  \
        int ret;                                                        \
        uxx num;                                                        \
                                                                        \
@@ -2342,11 +2245,7 @@ end:                                                                     \
        return ret;                                                     \
 }                                                                      \
                                                                        \
-static struct f_uvc_opts_attribute                                     \
-       f_uvc_opts_attribute_##cname =                                  \
-       __CONFIGFS_ATTR(cname, S_IRUGO | S_IWUSR,                       \
-                       f_uvc_opts_##cname##_show,                      \
-                       f_uvc_opts_##cname##_store)
+UVC_ATTR(f_uvc_opts_, cname, aname)
 
 #define identity_conv(x) (x)
 
@@ -2362,9 +2261,9 @@ UVCG_OPTS_ATTR(streaming_maxburst, identity_conv, kstrtou8, u8, identity_conv,
 #undef UVCG_OPTS_ATTR
 
 static struct configfs_attribute *uvc_attrs[] = {
-       &f_uvc_opts_attribute_streaming_interval.attr,
-       &f_uvc_opts_attribute_streaming_maxpacket.attr,
-       &f_uvc_opts_attribute_streaming_maxburst.attr,
+       &f_uvc_opts_attr_streaming_interval,
+       &f_uvc_opts_attr_streaming_maxpacket,
+       &f_uvc_opts_attr_streaming_maxburst,
        NULL,
 };
 
index 778e42abb3cb8703fcf19b829e21f764ac798d1e..22e56158d5850236242375d036f70250b676dac7 100644 (file)
@@ -19,8 +19,6 @@
 #include <scsi/scsi_tcq.h>
 #include <target/target_core_base.h>
 #include <target/target_core_fabric.h>
-#include <target/target_core_fabric_configfs.h>
-#include <target/configfs_macros.h>
 #include <asm/unaligned.h>
 
 #include "tcm_usb_gadget.h"
@@ -1467,23 +1465,21 @@ static void usbg_drop_tport(struct se_wwn *wwn)
 /*
  * If somebody feels like dropping the version property, go ahead.
  */
-static ssize_t usbg_wwn_show_attr_version(
-       struct target_fabric_configfs *tf,
-       char *page)
+static ssize_t usbg_wwn_version_show(struct config_item *item, char *page)
 {
        return sprintf(page, "usb-gadget fabric module\n");
 }
-TF_WWN_ATTR_RO(usbg, version);
+
+CONFIGFS_ATTR_RO(usbg_wwn_, version);
 
 static struct configfs_attribute *usbg_wwn_attrs[] = {
-       &usbg_wwn_version.attr,
+       &usbg_wwn_attr_version,
        NULL,
 };
 
-static ssize_t tcm_usbg_tpg_show_enable(
-               struct se_portal_group *se_tpg,
-               char *page)
+static ssize_t tcm_usbg_tpg_enable_show(struct config_item *item, char *page)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct usbg_tpg  *tpg = container_of(se_tpg, struct usbg_tpg, se_tpg);
 
        return snprintf(page, PAGE_SIZE, "%u\n", tpg->gadget_connect);
@@ -1492,11 +1488,10 @@ static ssize_t tcm_usbg_tpg_show_enable(
 static int usbg_attach(struct usbg_tpg *);
 static void usbg_detach(struct usbg_tpg *);
 
-static ssize_t tcm_usbg_tpg_store_enable(
-               struct se_portal_group *se_tpg,
-               const char *page,
-               size_t count)
+static ssize_t tcm_usbg_tpg_enable_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct usbg_tpg  *tpg = container_of(se_tpg, struct usbg_tpg, se_tpg);
        unsigned long op;
        ssize_t ret;
@@ -1523,12 +1518,10 @@ static ssize_t tcm_usbg_tpg_store_enable(
 out:
        return count;
 }
-TF_TPG_BASE_ATTR(tcm_usbg, enable, S_IRUGO | S_IWUSR);
 
-static ssize_t tcm_usbg_tpg_show_nexus(
-               struct se_portal_group *se_tpg,
-               char *page)
+static ssize_t tcm_usbg_tpg_nexus_show(struct config_item *item, char *page)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct usbg_tpg *tpg = container_of(se_tpg, struct usbg_tpg, se_tpg);
        struct tcm_usbg_nexus *tv_nexus;
        ssize_t ret;
@@ -1636,11 +1629,10 @@ out:
        return ret;
 }
 
-static ssize_t tcm_usbg_tpg_store_nexus(
-               struct se_portal_group *se_tpg,
-               const char *page,
-               size_t count)
+static ssize_t tcm_usbg_tpg_nexus_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct usbg_tpg *tpg = container_of(se_tpg, struct usbg_tpg, se_tpg);
        unsigned char i_port[USBG_NAMELEN], *ptr;
        int ret;
@@ -1670,11 +1662,13 @@ static ssize_t tcm_usbg_tpg_store_nexus(
                return ret;
        return count;
 }
-TF_TPG_BASE_ATTR(tcm_usbg, nexus, S_IRUGO | S_IWUSR);
+
+CONFIGFS_ATTR(tcm_usbg_tpg_, enable);
+CONFIGFS_ATTR(tcm_usbg_tpg_, nexus);
 
 static struct configfs_attribute *usbg_base_attrs[] = {
-       &tcm_usbg_tpg_enable.attr,
-       &tcm_usbg_tpg_nexus.attr,
+       &tcm_usbg_tpg_attr_enable,
+       &tcm_usbg_tpg_attr_nexus,
        NULL,
 };
 
index e25a23692822c16ce26f7a2b9b9f7f96153a6563..29cfc57d496e9497ebcf7bd5c5bd07a083bd91dc 100644 (file)
@@ -42,8 +42,6 @@
 #include <scsi/scsi_proto.h>
 #include <target/target_core_base.h>
 #include <target/target_core_fabric.h>
-#include <target/target_core_fabric_configfs.h>
-#include <target/configfs_macros.h>
 #include <linux/vhost.h>
 #include <linux/virtio_scsi.h>
 #include <linux/llist.h>
@@ -1684,11 +1682,10 @@ static void vhost_scsi_free_cmd_map_res(struct vhost_scsi_nexus *nexus,
        }
 }
 
-static ssize_t vhost_scsi_tpg_attrib_store_fabric_prot_type(
-       struct se_portal_group *se_tpg,
-       const char *page,
-       size_t count)
+static ssize_t vhost_scsi_tpg_attrib_fabric_prot_type_store(
+               struct config_item *item, const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = attrib_to_tpg(item);
        struct vhost_scsi_tpg *tpg = container_of(se_tpg,
                                struct vhost_scsi_tpg, se_tpg);
        unsigned long val;
@@ -1707,19 +1704,20 @@ static ssize_t vhost_scsi_tpg_attrib_store_fabric_prot_type(
        return count;
 }
 
-static ssize_t vhost_scsi_tpg_attrib_show_fabric_prot_type(
-       struct se_portal_group *se_tpg,
-       char *page)
+static ssize_t vhost_scsi_tpg_attrib_fabric_prot_type_show(
+               struct config_item *item, char *page)
 {
+       struct se_portal_group *se_tpg = attrib_to_tpg(item);
        struct vhost_scsi_tpg *tpg = container_of(se_tpg,
                                struct vhost_scsi_tpg, se_tpg);
 
        return sprintf(page, "%d\n", tpg->tv_fabric_prot_type);
 }
-TF_TPG_ATTRIB_ATTR(vhost_scsi, fabric_prot_type, S_IRUGO | S_IWUSR);
+
+CONFIGFS_ATTR(vhost_scsi_tpg_attrib_, fabric_prot_type);
 
 static struct configfs_attribute *vhost_scsi_tpg_attrib_attrs[] = {
-       &vhost_scsi_tpg_attrib_fabric_prot_type.attr,
+       &vhost_scsi_tpg_attrib_attr_fabric_prot_type,
        NULL,
 };
 
@@ -1867,9 +1865,9 @@ static int vhost_scsi_drop_nexus(struct vhost_scsi_tpg *tpg)
        return 0;
 }
 
-static ssize_t vhost_scsi_tpg_show_nexus(struct se_portal_group *se_tpg,
-                                       char *page)
+static ssize_t vhost_scsi_tpg_nexus_show(struct config_item *item, char *page)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct vhost_scsi_tpg *tpg = container_of(se_tpg,
                                struct vhost_scsi_tpg, se_tpg);
        struct vhost_scsi_nexus *tv_nexus;
@@ -1888,10 +1886,10 @@ static ssize_t vhost_scsi_tpg_show_nexus(struct se_portal_group *se_tpg,
        return ret;
 }
 
-static ssize_t vhost_scsi_tpg_store_nexus(struct se_portal_group *se_tpg,
-                                        const char *page,
-                                        size_t count)
+static ssize_t vhost_scsi_tpg_nexus_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct vhost_scsi_tpg *tpg = container_of(se_tpg,
                                struct vhost_scsi_tpg, se_tpg);
        struct vhost_scsi_tport *tport_wwn = tpg->tport;
@@ -1966,10 +1964,10 @@ check_newline:
        return count;
 }
 
-TF_TPG_BASE_ATTR(vhost_scsi, nexus, S_IRUGO | S_IWUSR);
+CONFIGFS_ATTR(vhost_scsi_tpg_, nexus);
 
 static struct configfs_attribute *vhost_scsi_tpg_attrs[] = {
-       &vhost_scsi_tpg_nexus.attr,
+       &vhost_scsi_tpg_attr_nexus,
        NULL,
 };
 
@@ -2105,18 +2103,17 @@ static void vhost_scsi_drop_tport(struct se_wwn *wwn)
 }
 
 static ssize_t
-vhost_scsi_wwn_show_attr_version(struct target_fabric_configfs *tf,
-                               char *page)
+vhost_scsi_wwn_version_show(struct config_item *item, char *page)
 {
        return sprintf(page, "TCM_VHOST fabric module %s on %s/%s"
                "on "UTS_RELEASE"\n", VHOST_SCSI_VERSION, utsname()->sysname,
                utsname()->machine);
 }
 
-TF_WWN_ATTR_RO(vhost_scsi, version);
+CONFIGFS_ATTR_RO(vhost_scsi_wwn_, version);
 
 static struct configfs_attribute *vhost_scsi_wwn_attrs[] = {
-       &vhost_scsi_wwn_version.attr,
+       &vhost_scsi_wwn_attr_version,
        NULL,
 };
 
index 9eeefd7cad41127dcade5d81c06647218abeaccc..43bcae852546ad2e5021b4a1d326dda375ae4023 100644 (file)
@@ -53,7 +53,6 @@
 
 #include <target/target_core_base.h>
 #include <target/target_core_fabric.h>
-#include <target/target_core_fabric_configfs.h>
 
 #include <asm/hypervisor.h>
 
@@ -1438,9 +1437,10 @@ static void scsiback_aborted_task(struct se_cmd *se_cmd)
 {
 }
 
-static ssize_t scsiback_tpg_param_show_alias(struct se_portal_group *se_tpg,
+static ssize_t scsiback_tpg_param_alias_show(struct config_item *item,
                                             char *page)
 {
+       struct se_portal_group *se_tpg = param_to_tpg(item);
        struct scsiback_tpg *tpg = container_of(se_tpg, struct scsiback_tpg,
                                                se_tpg);
        ssize_t rb;
@@ -1452,9 +1452,10 @@ static ssize_t scsiback_tpg_param_show_alias(struct se_portal_group *se_tpg,
        return rb;
 }
 
-static ssize_t scsiback_tpg_param_store_alias(struct se_portal_group *se_tpg,
+static ssize_t scsiback_tpg_param_alias_store(struct config_item *item,
                                              const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = param_to_tpg(item);
        struct scsiback_tpg *tpg = container_of(se_tpg, struct scsiback_tpg,
                                                se_tpg);
        int len;
@@ -1474,10 +1475,10 @@ static ssize_t scsiback_tpg_param_store_alias(struct se_portal_group *se_tpg,
        return count;
 }
 
-TF_TPG_PARAM_ATTR(scsiback, alias, S_IRUGO | S_IWUSR);
+CONFIGFS_ATTR(scsiback_tpg_param_, alias);
 
 static struct configfs_attribute *scsiback_param_attrs[] = {
-       &scsiback_tpg_param_alias.attr,
+       &scsiback_tpg_param_attr_alias,
        NULL,
 };
 
@@ -1585,9 +1586,9 @@ static int scsiback_drop_nexus(struct scsiback_tpg *tpg)
        return 0;
 }
 
-static ssize_t scsiback_tpg_show_nexus(struct se_portal_group *se_tpg,
-                                       char *page)
+static ssize_t scsiback_tpg_nexus_show(struct config_item *item, char *page)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct scsiback_tpg *tpg = container_of(se_tpg,
                                struct scsiback_tpg, se_tpg);
        struct scsiback_nexus *tv_nexus;
@@ -1606,10 +1607,10 @@ static ssize_t scsiback_tpg_show_nexus(struct se_portal_group *se_tpg,
        return ret;
 }
 
-static ssize_t scsiback_tpg_store_nexus(struct se_portal_group *se_tpg,
-                                        const char *page,
-                                        size_t count)
+static ssize_t scsiback_tpg_nexus_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct scsiback_tpg *tpg = container_of(se_tpg,
                                struct scsiback_tpg, se_tpg);
        struct scsiback_tport *tport_wwn = tpg->tport;
@@ -1681,26 +1682,25 @@ check_newline:
        return count;
 }
 
-TF_TPG_BASE_ATTR(scsiback, nexus, S_IRUGO | S_IWUSR);
+CONFIGFS_ATTR(scsiback_tpg_, nexus);
 
 static struct configfs_attribute *scsiback_tpg_attrs[] = {
-       &scsiback_tpg_nexus.attr,
+       &scsiback_tpg_attr_nexus,
        NULL,
 };
 
 static ssize_t
-scsiback_wwn_show_attr_version(struct target_fabric_configfs *tf,
-                               char *page)
+scsiback_wwn_version_show(struct config_item *item, char *page)
 {
        return sprintf(page, "xen-pvscsi fabric module %s on %s/%s on "
                UTS_RELEASE"\n",
                VSCSI_VERSION, utsname()->sysname, utsname()->machine);
 }
 
-TF_WWN_ATTR_RO(scsiback, version);
+CONFIGFS_ATTR_RO(scsiback_wwn_, version);
 
 static struct configfs_attribute *scsiback_wwn_attrs[] = {
-       &scsiback_wwn_version.attr,
+       &scsiback_wwn_attr_version,
        NULL,
 };
 
index 403269ffcdf3518b45f878166270c12e3365c17e..d39099ea7df76d723e4501c316eb43352b11e69c 100644 (file)
@@ -65,7 +65,6 @@ static int fill_read_buffer(struct dentry * dentry, struct configfs_buffer * buf
 {
        struct configfs_attribute * attr = to_attr(dentry);
        struct config_item * item = to_item(dentry->d_parent);
-       struct configfs_item_operations * ops = buffer->ops;
        int ret = 0;
        ssize_t count;
 
@@ -74,7 +73,8 @@ static int fill_read_buffer(struct dentry * dentry, struct configfs_buffer * buf
        if (!buffer->page)
                return -ENOMEM;
 
-       count = ops->show_attribute(item,attr,buffer->page);
+       count = attr->show(item, buffer->page);
+
        buffer->needs_read_fill = 0;
        BUG_ON(count > (ssize_t)SIMPLE_ATTR_SIZE);
        if (count >= 0)
@@ -171,9 +171,8 @@ flush_write_buffer(struct dentry * dentry, struct configfs_buffer * buffer, size
 {
        struct configfs_attribute * attr = to_attr(dentry);
        struct config_item * item = to_item(dentry->d_parent);
-       struct configfs_item_operations * ops = buffer->ops;
 
-       return ops->store_attribute(item,attr,buffer->page,count);
+       return attr->store(item, buffer->page, count);
 }
 
 
@@ -237,8 +236,7 @@ static int check_perm(struct inode * inode, struct file * file)
         * and we must have a store method.
         */
        if (file->f_mode & FMODE_WRITE) {
-
-               if (!(inode->i_mode & S_IWUGO) || !ops->store_attribute)
+               if (!(inode->i_mode & S_IWUGO) || !attr->store)
                        goto Eaccess;
 
        }
@@ -248,7 +246,7 @@ static int check_perm(struct inode * inode, struct file * file)
         * must be a show method for it.
         */
        if (file->f_mode & FMODE_READ) {
-               if (!(inode->i_mode & S_IRUGO) || !ops->show_attribute)
+               if (!(inode->i_mode & S_IRUGO) || !attr->show)
                        goto Eaccess;
        }
 
index d521bddf876dce012927937f83546db31a3426e7..8e294fbbac392c9bacdc6ee886be7ba3e80cd070 100644 (file)
@@ -61,35 +61,8 @@ static struct config_item *make_node(struct config_group *, const char *);
 static void drop_node(struct config_group *, struct config_item *);
 static void release_node(struct config_item *);
 
-static ssize_t show_cluster(struct config_item *i, struct configfs_attribute *a,
-                           char *buf);
-static ssize_t store_cluster(struct config_item *i,
-                            struct configfs_attribute *a,
-                            const char *buf, size_t len);
-static ssize_t show_comm(struct config_item *i, struct configfs_attribute *a,
-                        char *buf);
-static ssize_t store_comm(struct config_item *i, struct configfs_attribute *a,
-                         const char *buf, size_t len);
-static ssize_t show_node(struct config_item *i, struct configfs_attribute *a,
-                        char *buf);
-static ssize_t store_node(struct config_item *i, struct configfs_attribute *a,
-                         const char *buf, size_t len);
-
-static ssize_t comm_nodeid_read(struct dlm_comm *cm, char *buf);
-static ssize_t comm_nodeid_write(struct dlm_comm *cm, const char *buf,
-                               size_t len);
-static ssize_t comm_local_read(struct dlm_comm *cm, char *buf);
-static ssize_t comm_local_write(struct dlm_comm *cm, const char *buf,
-                               size_t len);
-static ssize_t comm_addr_write(struct dlm_comm *cm, const char *buf,
-                               size_t len);
-static ssize_t comm_addr_list_read(struct dlm_comm *cm, char *buf);
-static ssize_t node_nodeid_read(struct dlm_node *nd, char *buf);
-static ssize_t node_nodeid_write(struct dlm_node *nd, const char *buf,
-                               size_t len);
-static ssize_t node_weight_read(struct dlm_node *nd, char *buf);
-static ssize_t node_weight_write(struct dlm_node *nd, const char *buf,
-                               size_t len);
+static struct configfs_attribute *comm_attrs[];
+static struct configfs_attribute *node_attrs[];
 
 struct dlm_cluster {
        struct config_group group;
@@ -108,6 +81,12 @@ struct dlm_cluster {
        char cl_cluster_name[DLM_LOCKSPACE_LEN];
 };
 
+static struct dlm_cluster *config_item_to_cluster(struct config_item *i)
+{
+       return i ? container_of(to_config_group(i), struct dlm_cluster, group) :
+                  NULL;
+}
+
 enum {
        CLUSTER_ATTR_TCP_PORT = 0,
        CLUSTER_ATTR_BUFFER_SIZE,
@@ -124,33 +103,24 @@ enum {
        CLUSTER_ATTR_CLUSTER_NAME,
 };
 
-struct cluster_attribute {
-       struct configfs_attribute attr;
-       ssize_t (*show)(struct dlm_cluster *, char *);
-       ssize_t (*store)(struct dlm_cluster *, const char *, size_t);
-};
-
-static ssize_t cluster_cluster_name_read(struct dlm_cluster *cl, char *buf)
+static ssize_t cluster_cluster_name_show(struct config_item *item, char *buf)
 {
+       struct dlm_cluster *cl = config_item_to_cluster(item);
        return sprintf(buf, "%s\n", cl->cl_cluster_name);
 }
 
-static ssize_t cluster_cluster_name_write(struct dlm_cluster *cl,
+static ssize_t cluster_cluster_name_store(struct config_item *item,
                                          const char *buf, size_t len)
 {
+       struct dlm_cluster *cl = config_item_to_cluster(item);
+
        strlcpy(dlm_config.ci_cluster_name, buf,
                                sizeof(dlm_config.ci_cluster_name));
        strlcpy(cl->cl_cluster_name, buf, sizeof(cl->cl_cluster_name));
        return len;
 }
 
-static struct cluster_attribute cluster_attr_cluster_name = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                    .ca_name = "cluster_name",
-                    .ca_mode = S_IRUGO | S_IWUSR },
-       .show   = cluster_cluster_name_read,
-       .store  = cluster_cluster_name_write,
-};
+CONFIGFS_ATTR(cluster_, cluster_name);
 
 static ssize_t cluster_set(struct dlm_cluster *cl, unsigned int *cl_field,
                           int *info_field, int check_zero,
@@ -175,17 +145,19 @@ static ssize_t cluster_set(struct dlm_cluster *cl, unsigned int *cl_field,
 }
 
 #define CLUSTER_ATTR(name, check_zero)                                        \
-static ssize_t name##_write(struct dlm_cluster *cl, const char *buf, size_t len) \
+static ssize_t cluster_##name##_store(struct config_item *item, \
+               const char *buf, size_t len) \
 {                                                                             \
+       struct dlm_cluster *cl = config_item_to_cluster(item);                \
        return cluster_set(cl, &cl->cl_##name, &dlm_config.ci_##name,         \
                           check_zero, buf, len);                             \
 }                                                                             \
-static ssize_t name##_read(struct dlm_cluster *cl, char *buf)                 \
+static ssize_t cluster_##name##_show(struct config_item *item, char *buf)     \
 {                                                                             \
+       struct dlm_cluster *cl = config_item_to_cluster(item);                \
        return snprintf(buf, PAGE_SIZE, "%u\n", cl->cl_##name);               \
 }                                                                             \
-static struct cluster_attribute cluster_attr_##name =                         \
-__CONFIGFS_ATTR(name, 0644, name##_read, name##_write)
+CONFIGFS_ATTR(cluster_, name);
 
 CLUSTER_ATTR(tcp_port, 1);
 CLUSTER_ATTR(buffer_size, 1);
@@ -201,19 +173,19 @@ CLUSTER_ATTR(new_rsb_count, 0);
 CLUSTER_ATTR(recover_callbacks, 0);
 
 static struct configfs_attribute *cluster_attrs[] = {
-       [CLUSTER_ATTR_TCP_PORT] = &cluster_attr_tcp_port.attr,
-       [CLUSTER_ATTR_BUFFER_SIZE] = &cluster_attr_buffer_size.attr,
-       [CLUSTER_ATTR_RSBTBL_SIZE] = &cluster_attr_rsbtbl_size.attr,
-       [CLUSTER_ATTR_RECOVER_TIMER] = &cluster_attr_recover_timer.attr,
-       [CLUSTER_ATTR_TOSS_SECS] = &cluster_attr_toss_secs.attr,
-       [CLUSTER_ATTR_SCAN_SECS] = &cluster_attr_scan_secs.attr,
-       [CLUSTER_ATTR_LOG_DEBUG] = &cluster_attr_log_debug.attr,
-       [CLUSTER_ATTR_PROTOCOL] = &cluster_attr_protocol.attr,
-       [CLUSTER_ATTR_TIMEWARN_CS] = &cluster_attr_timewarn_cs.attr,
-       [CLUSTER_ATTR_WAITWARN_US] = &cluster_attr_waitwarn_us.attr,
-       [CLUSTER_ATTR_NEW_RSB_COUNT] = &cluster_attr_new_rsb_count.attr,
-       [CLUSTER_ATTR_RECOVER_CALLBACKS] = &cluster_attr_recover_callbacks.attr,
-       [CLUSTER_ATTR_CLUSTER_NAME] = &cluster_attr_cluster_name.attr,
+       [CLUSTER_ATTR_TCP_PORT] = &cluster_attr_tcp_port,
+       [CLUSTER_ATTR_BUFFER_SIZE] = &cluster_attr_buffer_size,
+       [CLUSTER_ATTR_RSBTBL_SIZE] = &cluster_attr_rsbtbl_size,
+       [CLUSTER_ATTR_RECOVER_TIMER] = &cluster_attr_recover_timer,
+       [CLUSTER_ATTR_TOSS_SECS] = &cluster_attr_toss_secs,
+       [CLUSTER_ATTR_SCAN_SECS] = &cluster_attr_scan_secs,
+       [CLUSTER_ATTR_LOG_DEBUG] = &cluster_attr_log_debug,
+       [CLUSTER_ATTR_PROTOCOL] = &cluster_attr_protocol,
+       [CLUSTER_ATTR_TIMEWARN_CS] = &cluster_attr_timewarn_cs,
+       [CLUSTER_ATTR_WAITWARN_US] = &cluster_attr_waitwarn_us,
+       [CLUSTER_ATTR_NEW_RSB_COUNT] = &cluster_attr_new_rsb_count,
+       [CLUSTER_ATTR_RECOVER_CALLBACKS] = &cluster_attr_recover_callbacks,
+       [CLUSTER_ATTR_CLUSTER_NAME] = &cluster_attr_cluster_name,
        NULL,
 };
 
@@ -224,83 +196,11 @@ enum {
        COMM_ATTR_ADDR_LIST,
 };
 
-struct comm_attribute {
-       struct configfs_attribute attr;
-       ssize_t (*show)(struct dlm_comm *, char *);
-       ssize_t (*store)(struct dlm_comm *, const char *, size_t);
-};
-
-static struct comm_attribute comm_attr_nodeid = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                    .ca_name = "nodeid",
-                    .ca_mode = S_IRUGO | S_IWUSR },
-       .show   = comm_nodeid_read,
-       .store  = comm_nodeid_write,
-};
-
-static struct comm_attribute comm_attr_local = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                    .ca_name = "local",
-                    .ca_mode = S_IRUGO | S_IWUSR },
-       .show   = comm_local_read,
-       .store  = comm_local_write,
-};
-
-static struct comm_attribute comm_attr_addr = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                    .ca_name = "addr",
-                    .ca_mode = S_IWUSR },
-       .store  = comm_addr_write,
-};
-
-static struct comm_attribute comm_attr_addr_list = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                    .ca_name = "addr_list",
-                    .ca_mode = S_IRUGO },
-       .show   = comm_addr_list_read,
-};
-
-static struct configfs_attribute *comm_attrs[] = {
-       [COMM_ATTR_NODEID] = &comm_attr_nodeid.attr,
-       [COMM_ATTR_LOCAL] = &comm_attr_local.attr,
-       [COMM_ATTR_ADDR] = &comm_attr_addr.attr,
-       [COMM_ATTR_ADDR_LIST] = &comm_attr_addr_list.attr,
-       NULL,
-};
-
 enum {
        NODE_ATTR_NODEID = 0,
        NODE_ATTR_WEIGHT,
 };
 
-struct node_attribute {
-       struct configfs_attribute attr;
-       ssize_t (*show)(struct dlm_node *, char *);
-       ssize_t (*store)(struct dlm_node *, const char *, size_t);
-};
-
-static struct node_attribute node_attr_nodeid = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                    .ca_name = "nodeid",
-                    .ca_mode = S_IRUGO | S_IWUSR },
-       .show   = node_nodeid_read,
-       .store  = node_nodeid_write,
-};
-
-static struct node_attribute node_attr_weight = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                    .ca_name = "weight",
-                    .ca_mode = S_IRUGO | S_IWUSR },
-       .show   = node_weight_read,
-       .store  = node_weight_write,
-};
-
-static struct configfs_attribute *node_attrs[] = {
-       [NODE_ATTR_NODEID] = &node_attr_nodeid.attr,
-       [NODE_ATTR_WEIGHT] = &node_attr_weight.attr,
-       NULL,
-};
-
 struct dlm_clusters {
        struct configfs_subsystem subsys;
 };
@@ -349,8 +249,6 @@ static struct configfs_group_operations clusters_ops = {
 
 static struct configfs_item_operations cluster_ops = {
        .release = release_cluster,
-       .show_attribute = show_cluster,
-       .store_attribute = store_cluster,
 };
 
 static struct configfs_group_operations spaces_ops = {
@@ -369,8 +267,6 @@ static struct configfs_group_operations comms_ops = {
 
 static struct configfs_item_operations comm_ops = {
        .release = release_comm,
-       .show_attribute = show_comm,
-       .store_attribute = store_comm,
 };
 
 static struct configfs_group_operations nodes_ops = {
@@ -380,8 +276,6 @@ static struct configfs_group_operations nodes_ops = {
 
 static struct configfs_item_operations node_ops = {
        .release = release_node,
-       .show_attribute = show_node,
-       .store_attribute = store_node,
 };
 
 static struct config_item_type clusters_type = {
@@ -427,12 +321,6 @@ static struct config_item_type node_type = {
        .ct_owner = THIS_MODULE,
 };
 
-static struct dlm_cluster *config_item_to_cluster(struct config_item *i)
-{
-       return i ? container_of(to_config_group(i), struct dlm_cluster, group) :
-                  NULL;
-}
-
 static struct dlm_space *config_item_to_space(struct config_item *i)
 {
        return i ? container_of(to_config_group(i), struct dlm_space, group) :
@@ -687,66 +575,30 @@ void dlm_config_exit(void)
  * Functions for user space to read/write attributes
  */
 
-static ssize_t show_cluster(struct config_item *i, struct configfs_attribute *a,
-                           char *buf)
-{
-       struct dlm_cluster *cl = config_item_to_cluster(i);
-       struct cluster_attribute *cla =
-                       container_of(a, struct cluster_attribute, attr);
-       return cla->show ? cla->show(cl, buf) : 0;
-}
-
-static ssize_t store_cluster(struct config_item *i,
-                            struct configfs_attribute *a,
-                            const char *buf, size_t len)
+static ssize_t comm_nodeid_show(struct config_item *item, char *buf)
 {
-       struct dlm_cluster *cl = config_item_to_cluster(i);
-       struct cluster_attribute *cla =
-               container_of(a, struct cluster_attribute, attr);
-       return cla->store ? cla->store(cl, buf, len) : -EINVAL;
-}
-
-static ssize_t show_comm(struct config_item *i, struct configfs_attribute *a,
-                        char *buf)
-{
-       struct dlm_comm *cm = config_item_to_comm(i);
-       struct comm_attribute *cma =
-                       container_of(a, struct comm_attribute, attr);
-       return cma->show ? cma->show(cm, buf) : 0;
-}
-
-static ssize_t store_comm(struct config_item *i, struct configfs_attribute *a,
-                         const char *buf, size_t len)
-{
-       struct dlm_comm *cm = config_item_to_comm(i);
-       struct comm_attribute *cma =
-               container_of(a, struct comm_attribute, attr);
-       return cma->store ? cma->store(cm, buf, len) : -EINVAL;
+       return sprintf(buf, "%d\n", config_item_to_comm(item)->nodeid);
 }
 
-static ssize_t comm_nodeid_read(struct dlm_comm *cm, char *buf)
-{
-       return sprintf(buf, "%d\n", cm->nodeid);
-}
-
-static ssize_t comm_nodeid_write(struct dlm_comm *cm, const char *buf,
+static ssize_t comm_nodeid_store(struct config_item *item, const char *buf,
                                 size_t len)
 {
-       int rc = kstrtoint(buf, 0, &cm->nodeid);
+       int rc = kstrtoint(buf, 0, &config_item_to_comm(item)->nodeid);
 
        if (rc)
                return rc;
        return len;
 }
 
-static ssize_t comm_local_read(struct dlm_comm *cm, char *buf)
+static ssize_t comm_local_show(struct config_item *item, char *buf)
 {
-       return sprintf(buf, "%d\n", cm->local);
+       return sprintf(buf, "%d\n", config_item_to_comm(item)->local);
 }
 
-static ssize_t comm_local_write(struct dlm_comm *cm, const char *buf,
+static ssize_t comm_local_store(struct config_item *item, const char *buf,
                                size_t len)
 {
+       struct dlm_comm *cm = config_item_to_comm(item);
        int rc = kstrtoint(buf, 0, &cm->local);
 
        if (rc)
@@ -756,8 +608,10 @@ static ssize_t comm_local_write(struct dlm_comm *cm, const char *buf,
        return len;
 }
 
-static ssize_t comm_addr_write(struct dlm_comm *cm, const char *buf, size_t len)
+static ssize_t comm_addr_store(struct config_item *item, const char *buf,
+               size_t len)
 {
+       struct dlm_comm *cm = config_item_to_comm(item);
        struct sockaddr_storage *addr;
        int rv;
 
@@ -783,8 +637,9 @@ static ssize_t comm_addr_write(struct dlm_comm *cm, const char *buf, size_t len)
        return len;
 }
 
-static ssize_t comm_addr_list_read(struct dlm_comm *cm, char *buf)
+static ssize_t comm_addr_list_show(struct config_item *item, char *buf)
 {
+       struct dlm_comm *cm = config_item_to_comm(item);
        ssize_t s;
        ssize_t allowance;
        int i;
@@ -827,32 +682,28 @@ static ssize_t comm_addr_list_read(struct dlm_comm *cm, char *buf)
        return 4096 - allowance;
 }
 
-static ssize_t show_node(struct config_item *i, struct configfs_attribute *a,
-                        char *buf)
-{
-       struct dlm_node *nd = config_item_to_node(i);
-       struct node_attribute *nda =
-                       container_of(a, struct node_attribute, attr);
-       return nda->show ? nda->show(nd, buf) : 0;
-}
+CONFIGFS_ATTR(comm_, nodeid);
+CONFIGFS_ATTR(comm_, local);
+CONFIGFS_ATTR_WO(comm_, addr);
+CONFIGFS_ATTR_RO(comm_, addr_list);
 
-static ssize_t store_node(struct config_item *i, struct configfs_attribute *a,
-                         const char *buf, size_t len)
-{
-       struct dlm_node *nd = config_item_to_node(i);
-       struct node_attribute *nda =
-               container_of(a, struct node_attribute, attr);
-       return nda->store ? nda->store(nd, buf, len) : -EINVAL;
-}
+static struct configfs_attribute *comm_attrs[] = {
+       [COMM_ATTR_NODEID] = &comm_attr_nodeid,
+       [COMM_ATTR_LOCAL] = &comm_attr_local,
+       [COMM_ATTR_ADDR] = &comm_attr_addr,
+       [COMM_ATTR_ADDR_LIST] = &comm_attr_addr_list,
+       NULL,
+};
 
-static ssize_t node_nodeid_read(struct dlm_node *nd, char *buf)
+static ssize_t node_nodeid_show(struct config_item *item, char *buf)
 {
-       return sprintf(buf, "%d\n", nd->nodeid);
+       return sprintf(buf, "%d\n", config_item_to_node(item)->nodeid);
 }
 
-static ssize_t node_nodeid_write(struct dlm_node *nd, const char *buf,
+static ssize_t node_nodeid_store(struct config_item *item, const char *buf,
                                 size_t len)
 {
+       struct dlm_node *nd = config_item_to_node(item);
        uint32_t seq = 0;
        int rc = kstrtoint(buf, 0, &nd->nodeid);
 
@@ -863,21 +714,30 @@ static ssize_t node_nodeid_write(struct dlm_node *nd, const char *buf,
        return len;
 }
 
-static ssize_t node_weight_read(struct dlm_node *nd, char *buf)
+static ssize_t node_weight_show(struct config_item *item, char *buf)
 {
-       return sprintf(buf, "%d\n", nd->weight);
+       return sprintf(buf, "%d\n", config_item_to_node(item)->weight);
 }
 
-static ssize_t node_weight_write(struct dlm_node *nd, const char *buf,
+static ssize_t node_weight_store(struct config_item *item, const char *buf,
                                 size_t len)
 {
-       int rc = kstrtoint(buf, 0, &nd->weight);
+       int rc = kstrtoint(buf, 0, &config_item_to_node(item)->weight);
 
        if (rc)
                return rc;
        return len;
 }
 
+CONFIGFS_ATTR(node_, nodeid);
+CONFIGFS_ATTR(node_, weight);
+
+static struct configfs_attribute *node_attrs[] = {
+       [NODE_ATTR_NODEID] = &node_attr_nodeid,
+       [NODE_ATTR_WEIGHT] = &node_attr_weight,
+       NULL,
+};
+
 /*
  * Functions for the dlm to get the info that's been configured
  */
index fa15debcc02be1c8fe1d3419d10dd7c5ab0ff968..e404386bd93e8535a32152fcc5936ede9ac5fa41 100644 (file)
@@ -1473,16 +1473,17 @@ static int o2hb_read_block_input(struct o2hb_region *reg,
        return 0;
 }
 
-static ssize_t o2hb_region_block_bytes_read(struct o2hb_region *reg,
+static ssize_t o2hb_region_block_bytes_show(struct config_item *item,
                                            char *page)
 {
-       return sprintf(page, "%u\n", reg->hr_block_bytes);
+       return sprintf(page, "%u\n", to_o2hb_region(item)->hr_block_bytes);
 }
 
-static ssize_t o2hb_region_block_bytes_write(struct o2hb_region *reg,
+static ssize_t o2hb_region_block_bytes_store(struct config_item *item,
                                             const char *page,
                                             size_t count)
 {
+       struct o2hb_region *reg = to_o2hb_region(item);
        int status;
        unsigned long block_bytes;
        unsigned int block_bits;
@@ -1501,16 +1502,17 @@ static ssize_t o2hb_region_block_bytes_write(struct o2hb_region *reg,
        return count;
 }
 
-static ssize_t o2hb_region_start_block_read(struct o2hb_region *reg,
+static ssize_t o2hb_region_start_block_show(struct config_item *item,
                                            char *page)
 {
-       return sprintf(page, "%llu\n", reg->hr_start_block);
+       return sprintf(page, "%llu\n", to_o2hb_region(item)->hr_start_block);
 }
 
-static ssize_t o2hb_region_start_block_write(struct o2hb_region *reg,
+static ssize_t o2hb_region_start_block_store(struct config_item *item,
                                             const char *page,
                                             size_t count)
 {
+       struct o2hb_region *reg = to_o2hb_region(item);
        unsigned long long tmp;
        char *p = (char *)page;
 
@@ -1526,16 +1528,16 @@ static ssize_t o2hb_region_start_block_write(struct o2hb_region *reg,
        return count;
 }
 
-static ssize_t o2hb_region_blocks_read(struct o2hb_region *reg,
-                                      char *page)
+static ssize_t o2hb_region_blocks_show(struct config_item *item, char *page)
 {
-       return sprintf(page, "%d\n", reg->hr_blocks);
+       return sprintf(page, "%d\n", to_o2hb_region(item)->hr_blocks);
 }
 
-static ssize_t o2hb_region_blocks_write(struct o2hb_region *reg,
+static ssize_t o2hb_region_blocks_store(struct config_item *item,
                                        const char *page,
                                        size_t count)
 {
+       struct o2hb_region *reg = to_o2hb_region(item);
        unsigned long tmp;
        char *p = (char *)page;
 
@@ -1554,13 +1556,12 @@ static ssize_t o2hb_region_blocks_write(struct o2hb_region *reg,
        return count;
 }
 
-static ssize_t o2hb_region_dev_read(struct o2hb_region *reg,
-                                   char *page)
+static ssize_t o2hb_region_dev_show(struct config_item *item, char *page)
 {
        unsigned int ret = 0;
 
-       if (reg->hr_bdev)
-               ret = sprintf(page, "%s\n", reg->hr_dev_name);
+       if (to_o2hb_region(item)->hr_bdev)
+               ret = sprintf(page, "%s\n", to_o2hb_region(item)->hr_dev_name);
 
        return ret;
 }
@@ -1670,10 +1671,11 @@ out:
 }
 
 /* this is acting as commit; we set up all of hr_bdev and hr_task or nothing */
-static ssize_t o2hb_region_dev_write(struct o2hb_region *reg,
+static ssize_t o2hb_region_dev_store(struct config_item *item,
                                     const char *page,
                                     size_t count)
 {
+       struct o2hb_region *reg = to_o2hb_region(item);
        struct task_struct *hb_task;
        long fd;
        int sectsize;
@@ -1828,9 +1830,9 @@ out:
        return ret;
 }
 
-static ssize_t o2hb_region_pid_read(struct o2hb_region *reg,
-                                      char *page)
+static ssize_t o2hb_region_pid_show(struct config_item *item, char *page)
 {
+       struct o2hb_region *reg = to_o2hb_region(item);
        pid_t pid = 0;
 
        spin_lock(&o2hb_live_lock);
@@ -1844,92 +1846,23 @@ static ssize_t o2hb_region_pid_read(struct o2hb_region *reg,
        return sprintf(page, "%u\n", pid);
 }
 
-struct o2hb_region_attribute {
-       struct configfs_attribute attr;
-       ssize_t (*show)(struct o2hb_region *, char *);
-       ssize_t (*store)(struct o2hb_region *, const char *, size_t);
-};
-
-static struct o2hb_region_attribute o2hb_region_attr_block_bytes = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                   .ca_name = "block_bytes",
-                   .ca_mode = S_IRUGO | S_IWUSR },
-       .show   = o2hb_region_block_bytes_read,
-       .store  = o2hb_region_block_bytes_write,
-};
-
-static struct o2hb_region_attribute o2hb_region_attr_start_block = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                   .ca_name = "start_block",
-                   .ca_mode = S_IRUGO | S_IWUSR },
-       .show   = o2hb_region_start_block_read,
-       .store  = o2hb_region_start_block_write,
-};
-
-static struct o2hb_region_attribute o2hb_region_attr_blocks = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                   .ca_name = "blocks",
-                   .ca_mode = S_IRUGO | S_IWUSR },
-       .show   = o2hb_region_blocks_read,
-       .store  = o2hb_region_blocks_write,
-};
-
-static struct o2hb_region_attribute o2hb_region_attr_dev = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                   .ca_name = "dev",
-                   .ca_mode = S_IRUGO | S_IWUSR },
-       .show   = o2hb_region_dev_read,
-       .store  = o2hb_region_dev_write,
-};
-
-static struct o2hb_region_attribute o2hb_region_attr_pid = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                   .ca_name = "pid",
-                   .ca_mode = S_IRUGO | S_IRUSR },
-       .show   = o2hb_region_pid_read,
-};
+CONFIGFS_ATTR(o2hb_region_, block_bytes);
+CONFIGFS_ATTR(o2hb_region_, start_block);
+CONFIGFS_ATTR(o2hb_region_, blocks);
+CONFIGFS_ATTR(o2hb_region_, dev);
+CONFIGFS_ATTR_RO(o2hb_region_, pid);
 
 static struct configfs_attribute *o2hb_region_attrs[] = {
-       &o2hb_region_attr_block_bytes.attr,
-       &o2hb_region_attr_start_block.attr,
-       &o2hb_region_attr_blocks.attr,
-       &o2hb_region_attr_dev.attr,
-       &o2hb_region_attr_pid.attr,
+       &o2hb_region_attr_block_bytes,
+       &o2hb_region_attr_start_block,
+       &o2hb_region_attr_blocks,
+       &o2hb_region_attr_dev,
+       &o2hb_region_attr_pid,
        NULL,
 };
 
-static ssize_t o2hb_region_show(struct config_item *item,
-                               struct configfs_attribute *attr,
-                               char *page)
-{
-       struct o2hb_region *reg = to_o2hb_region(item);
-       struct o2hb_region_attribute *o2hb_region_attr =
-               container_of(attr, struct o2hb_region_attribute, attr);
-       ssize_t ret = 0;
-
-       if (o2hb_region_attr->show)
-               ret = o2hb_region_attr->show(reg, page);
-       return ret;
-}
-
-static ssize_t o2hb_region_store(struct config_item *item,
-                                struct configfs_attribute *attr,
-                                const char *page, size_t count)
-{
-       struct o2hb_region *reg = to_o2hb_region(item);
-       struct o2hb_region_attribute *o2hb_region_attr =
-               container_of(attr, struct o2hb_region_attribute, attr);
-       ssize_t ret = -EINVAL;
-
-       if (o2hb_region_attr->store)
-               ret = o2hb_region_attr->store(reg, page, count);
-       return ret;
-}
-
 static struct configfs_item_operations o2hb_region_item_ops = {
        .release                = o2hb_region_release,
-       .show_attribute         = o2hb_region_show,
-       .store_attribute        = o2hb_region_store,
 };
 
 static struct config_item_type o2hb_region_type = {
@@ -2124,49 +2057,14 @@ unlock:
        spin_unlock(&o2hb_live_lock);
 }
 
-struct o2hb_heartbeat_group_attribute {
-       struct configfs_attribute attr;
-       ssize_t (*show)(struct o2hb_heartbeat_group *, char *);
-       ssize_t (*store)(struct o2hb_heartbeat_group *, const char *, size_t);
-};
-
-static ssize_t o2hb_heartbeat_group_show(struct config_item *item,
-                                        struct configfs_attribute *attr,
-                                        char *page)
-{
-       struct o2hb_heartbeat_group *reg = to_o2hb_heartbeat_group(to_config_group(item));
-       struct o2hb_heartbeat_group_attribute *o2hb_heartbeat_group_attr =
-               container_of(attr, struct o2hb_heartbeat_group_attribute, attr);
-       ssize_t ret = 0;
-
-       if (o2hb_heartbeat_group_attr->show)
-               ret = o2hb_heartbeat_group_attr->show(reg, page);
-       return ret;
-}
-
-static ssize_t o2hb_heartbeat_group_store(struct config_item *item,
-                                         struct configfs_attribute *attr,
-                                         const char *page, size_t count)
-{
-       struct o2hb_heartbeat_group *reg = to_o2hb_heartbeat_group(to_config_group(item));
-       struct o2hb_heartbeat_group_attribute *o2hb_heartbeat_group_attr =
-               container_of(attr, struct o2hb_heartbeat_group_attribute, attr);
-       ssize_t ret = -EINVAL;
-
-       if (o2hb_heartbeat_group_attr->store)
-               ret = o2hb_heartbeat_group_attr->store(reg, page, count);
-       return ret;
-}
-
-static ssize_t o2hb_heartbeat_group_threshold_show(struct o2hb_heartbeat_group *group,
-                                                    char *page)
+static ssize_t o2hb_heartbeat_group_threshold_show(struct config_item *item,
+               char *page)
 {
        return sprintf(page, "%u\n", o2hb_dead_threshold);
 }
 
-static ssize_t o2hb_heartbeat_group_threshold_store(struct o2hb_heartbeat_group *group,
-                                                   const char *page,
-                                                   size_t count)
+static ssize_t o2hb_heartbeat_group_threshold_store(struct config_item *item,
+               const char *page, size_t count)
 {
        unsigned long tmp;
        char *p = (char *)page;
@@ -2181,17 +2079,15 @@ static ssize_t o2hb_heartbeat_group_threshold_store(struct o2hb_heartbeat_group
        return count;
 }
 
-static
-ssize_t o2hb_heartbeat_group_mode_show(struct o2hb_heartbeat_group *group,
-                                      char *page)
+static ssize_t o2hb_heartbeat_group_mode_show(struct config_item *item,
+               char *page)
 {
        return sprintf(page, "%s\n",
                       o2hb_heartbeat_mode_desc[o2hb_heartbeat_mode]);
 }
 
-static
-ssize_t o2hb_heartbeat_group_mode_store(struct o2hb_heartbeat_group *group,
-                                       const char *page, size_t count)
+static ssize_t o2hb_heartbeat_group_mode_store(struct config_item *item,
+               const char *page, size_t count)
 {
        unsigned int i;
        int ret;
@@ -2216,33 +2112,15 @@ ssize_t o2hb_heartbeat_group_mode_store(struct o2hb_heartbeat_group *group,
 
 }
 
-static struct o2hb_heartbeat_group_attribute o2hb_heartbeat_group_attr_threshold = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                   .ca_name = "dead_threshold",
-                   .ca_mode = S_IRUGO | S_IWUSR },
-       .show   = o2hb_heartbeat_group_threshold_show,
-       .store  = o2hb_heartbeat_group_threshold_store,
-};
-
-static struct o2hb_heartbeat_group_attribute o2hb_heartbeat_group_attr_mode = {
-       .attr   = { .ca_owner = THIS_MODULE,
-               .ca_name = "mode",
-               .ca_mode = S_IRUGO | S_IWUSR },
-       .show   = o2hb_heartbeat_group_mode_show,
-       .store  = o2hb_heartbeat_group_mode_store,
-};
+CONFIGFS_ATTR(o2hb_heartbeat_group_, threshold);
+CONFIGFS_ATTR(o2hb_heartbeat_group_, mode);
 
 static struct configfs_attribute *o2hb_heartbeat_group_attrs[] = {
-       &o2hb_heartbeat_group_attr_threshold.attr,
-       &o2hb_heartbeat_group_attr_mode.attr,
+       &o2hb_heartbeat_group_attr_threshold,
+       &o2hb_heartbeat_group_attr_mode,
        NULL,
 };
 
-static struct configfs_item_operations o2hb_heartbeat_group_item_ops = {
-       .show_attribute         = o2hb_heartbeat_group_show,
-       .store_attribute        = o2hb_heartbeat_group_store,
-};
-
 static struct configfs_group_operations o2hb_heartbeat_group_group_ops = {
        .make_item      = o2hb_heartbeat_group_make_item,
        .drop_item      = o2hb_heartbeat_group_drop_item,
@@ -2250,7 +2128,6 @@ static struct configfs_group_operations o2hb_heartbeat_group_group_ops = {
 
 static struct config_item_type o2hb_heartbeat_group_type = {
        .ct_group_ops   = &o2hb_heartbeat_group_group_ops,
-       .ct_item_ops    = &o2hb_heartbeat_group_item_ops,
        .ct_attrs       = o2hb_heartbeat_group_attrs,
        .ct_owner       = THIS_MODULE,
 };
index 441c84e169e6f05e819d7331027f6e519d02b3be..72afdca3cea70cbf87e2720e99dbff510be535f9 100644 (file)
@@ -172,9 +172,9 @@ static void o2nm_node_release(struct config_item *item)
        kfree(node);
 }
 
-static ssize_t o2nm_node_num_read(struct o2nm_node *node, char *page)
+static ssize_t o2nm_node_num_show(struct config_item *item, char *page)
 {
-       return sprintf(page, "%d\n", node->nd_num);
+       return sprintf(page, "%d\n", to_o2nm_node(item)->nd_num);
 }
 
 static struct o2nm_cluster *to_o2nm_cluster_from_node(struct o2nm_node *node)
@@ -188,15 +188,16 @@ enum {
        O2NM_NODE_ATTR_NUM = 0,
        O2NM_NODE_ATTR_PORT,
        O2NM_NODE_ATTR_ADDRESS,
-       O2NM_NODE_ATTR_LOCAL,
 };
 
-static ssize_t o2nm_node_num_write(struct o2nm_node *node, const char *page,
+static ssize_t o2nm_node_num_store(struct config_item *item, const char *page,
                                   size_t count)
 {
+       struct o2nm_node *node = to_o2nm_node(item);
        struct o2nm_cluster *cluster = to_o2nm_cluster_from_node(node);
        unsigned long tmp;
        char *p = (char *)page;
+       int ret = 0;
 
        tmp = simple_strtoul(p, &p, 0);
        if (!p || (*p && (*p != '\n')))
@@ -215,26 +216,30 @@ static ssize_t o2nm_node_num_write(struct o2nm_node *node, const char *page,
 
        write_lock(&cluster->cl_nodes_lock);
        if (cluster->cl_nodes[tmp])
-               p = NULL;
+               ret = -EEXIST;
+       else if (test_and_set_bit(O2NM_NODE_ATTR_NUM,
+                       &node->nd_set_attributes))
+               ret = -EBUSY;
        else  {
                cluster->cl_nodes[tmp] = node;
                node->nd_num = tmp;
                set_bit(tmp, cluster->cl_nodes_bitmap);
        }
        write_unlock(&cluster->cl_nodes_lock);
-       if (p == NULL)
-               return -EEXIST;
+       if (ret)
+               return ret;
 
        return count;
 }
-static ssize_t o2nm_node_ipv4_port_read(struct o2nm_node *node, char *page)
+static ssize_t o2nm_node_ipv4_port_show(struct config_item *item, char *page)
 {
-       return sprintf(page, "%u\n", ntohs(node->nd_ipv4_port));
+       return sprintf(page, "%u\n", ntohs(to_o2nm_node(item)->nd_ipv4_port));
 }
 
-static ssize_t o2nm_node_ipv4_port_write(struct o2nm_node *node,
+static ssize_t o2nm_node_ipv4_port_store(struct config_item *item,
                                         const char *page, size_t count)
 {
+       struct o2nm_node *node = to_o2nm_node(item);
        unsigned long tmp;
        char *p = (char *)page;
 
@@ -247,20 +252,23 @@ static ssize_t o2nm_node_ipv4_port_write(struct o2nm_node *node,
        if (tmp >= (u16)-1)
                return -ERANGE;
 
+       if (test_and_set_bit(O2NM_NODE_ATTR_PORT, &node->nd_set_attributes))
+               return -EBUSY;
        node->nd_ipv4_port = htons(tmp);
 
        return count;
 }
 
-static ssize_t o2nm_node_ipv4_address_read(struct o2nm_node *node, char *page)
+static ssize_t o2nm_node_ipv4_address_show(struct config_item *item, char *page)
 {
-       return sprintf(page, "%pI4\n", &node->nd_ipv4_address);
+       return sprintf(page, "%pI4\n", &to_o2nm_node(item)->nd_ipv4_address);
 }
 
-static ssize_t o2nm_node_ipv4_address_write(struct o2nm_node *node,
+static ssize_t o2nm_node_ipv4_address_store(struct config_item *item,
                                            const char *page,
                                            size_t count)
 {
+       struct o2nm_node *node = to_o2nm_node(item);
        struct o2nm_cluster *cluster = to_o2nm_cluster_from_node(node);
        int ret, i;
        struct rb_node **p, *parent;
@@ -282,6 +290,9 @@ static ssize_t o2nm_node_ipv4_address_write(struct o2nm_node *node,
        write_lock(&cluster->cl_nodes_lock);
        if (o2nm_node_ip_tree_lookup(cluster, ipv4_addr, &p, &parent))
                ret = -EEXIST;
+       else if (test_and_set_bit(O2NM_NODE_ATTR_ADDRESS,
+                       &node->nd_set_attributes))
+               ret = -EBUSY;
        else {
                rb_link_node(&node->nd_ip_node, parent, p);
                rb_insert_color(&node->nd_ip_node, &cluster->cl_node_ip_tree);
@@ -295,14 +306,15 @@ static ssize_t o2nm_node_ipv4_address_write(struct o2nm_node *node,
        return count;
 }
 
-static ssize_t o2nm_node_local_read(struct o2nm_node *node, char *page)
+static ssize_t o2nm_node_local_show(struct config_item *item, char *page)
 {
-       return sprintf(page, "%d\n", node->nd_local);
+       return sprintf(page, "%d\n", to_o2nm_node(item)->nd_local);
 }
 
-static ssize_t o2nm_node_local_write(struct o2nm_node *node, const char *page,
+static ssize_t o2nm_node_local_store(struct config_item *item, const char *page,
                                     size_t count)
 {
+       struct o2nm_node *node = to_o2nm_node(item);
        struct o2nm_cluster *cluster = to_o2nm_cluster_from_node(node);
        unsigned long tmp;
        char *p = (char *)page;
@@ -349,108 +361,21 @@ static ssize_t o2nm_node_local_write(struct o2nm_node *node, const char *page,
        return count;
 }
 
-struct o2nm_node_attribute {
-       struct configfs_attribute attr;
-       ssize_t (*show)(struct o2nm_node *, char *);
-       ssize_t (*store)(struct o2nm_node *, const char *, size_t);
-};
-
-static struct o2nm_node_attribute o2nm_node_attr_num = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                   .ca_name = "num",
-                   .ca_mode = S_IRUGO | S_IWUSR },
-       .show   = o2nm_node_num_read,
-       .store  = o2nm_node_num_write,
-};
-
-static struct o2nm_node_attribute o2nm_node_attr_ipv4_port = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                   .ca_name = "ipv4_port",
-                   .ca_mode = S_IRUGO | S_IWUSR },
-       .show   = o2nm_node_ipv4_port_read,
-       .store  = o2nm_node_ipv4_port_write,
-};
-
-static struct o2nm_node_attribute o2nm_node_attr_ipv4_address = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                   .ca_name = "ipv4_address",
-                   .ca_mode = S_IRUGO | S_IWUSR },
-       .show   = o2nm_node_ipv4_address_read,
-       .store  = o2nm_node_ipv4_address_write,
-};
-
-static struct o2nm_node_attribute o2nm_node_attr_local = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                   .ca_name = "local",
-                   .ca_mode = S_IRUGO | S_IWUSR },
-       .show   = o2nm_node_local_read,
-       .store  = o2nm_node_local_write,
-};
+CONFIGFS_ATTR(o2nm_node_, num);
+CONFIGFS_ATTR(o2nm_node_, ipv4_port);
+CONFIGFS_ATTR(o2nm_node_, ipv4_address);
+CONFIGFS_ATTR(o2nm_node_, local);
 
 static struct configfs_attribute *o2nm_node_attrs[] = {
-       [O2NM_NODE_ATTR_NUM] = &o2nm_node_attr_num.attr,
-       [O2NM_NODE_ATTR_PORT] = &o2nm_node_attr_ipv4_port.attr,
-       [O2NM_NODE_ATTR_ADDRESS] = &o2nm_node_attr_ipv4_address.attr,
-       [O2NM_NODE_ATTR_LOCAL] = &o2nm_node_attr_local.attr,
+       &o2nm_node_attr_num,
+       &o2nm_node_attr_ipv4_port,
+       &o2nm_node_attr_ipv4_address,
+       &o2nm_node_attr_local,
        NULL,
 };
 
-static int o2nm_attr_index(struct configfs_attribute *attr)
-{
-       int i;
-       for (i = 0; i < ARRAY_SIZE(o2nm_node_attrs); i++) {
-               if (attr == o2nm_node_attrs[i])
-                       return i;
-       }
-       BUG();
-       return 0;
-}
-
-static ssize_t o2nm_node_show(struct config_item *item,
-                             struct configfs_attribute *attr,
-                             char *page)
-{
-       struct o2nm_node *node = to_o2nm_node(item);
-       struct o2nm_node_attribute *o2nm_node_attr =
-               container_of(attr, struct o2nm_node_attribute, attr);
-       ssize_t ret = 0;
-
-       if (o2nm_node_attr->show)
-               ret = o2nm_node_attr->show(node, page);
-       return ret;
-}
-
-static ssize_t o2nm_node_store(struct config_item *item,
-                              struct configfs_attribute *attr,
-                              const char *page, size_t count)
-{
-       struct o2nm_node *node = to_o2nm_node(item);
-       struct o2nm_node_attribute *o2nm_node_attr =
-               container_of(attr, struct o2nm_node_attribute, attr);
-       ssize_t ret;
-       int attr_index = o2nm_attr_index(attr);
-
-       if (o2nm_node_attr->store == NULL) {
-               ret = -EINVAL;
-               goto out;
-       }
-
-       if (test_bit(attr_index, &node->nd_set_attributes))
-               return -EBUSY;
-
-       ret = o2nm_node_attr->store(node, page, count);
-       if (ret < count)
-               goto out;
-
-       set_bit(attr_index, &node->nd_set_attributes);
-out:
-       return ret;
-}
-
 static struct configfs_item_operations o2nm_node_item_ops = {
        .release                = o2nm_node_release,
-       .show_attribute         = o2nm_node_show,
-       .store_attribute        = o2nm_node_store,
 };
 
 static struct config_item_type o2nm_node_type = {
@@ -475,12 +400,6 @@ static struct o2nm_node_group *to_o2nm_node_group(struct config_group *group)
 }
 #endif
 
-struct o2nm_cluster_attribute {
-       struct configfs_attribute attr;
-       ssize_t (*show)(struct o2nm_cluster *, char *);
-       ssize_t (*store)(struct o2nm_cluster *, const char *, size_t);
-};
-
 static ssize_t o2nm_cluster_attr_write(const char *page, ssize_t count,
                                        unsigned int *val)
 {
@@ -501,15 +420,16 @@ static ssize_t o2nm_cluster_attr_write(const char *page, ssize_t count,
        return count;
 }
 
-static ssize_t o2nm_cluster_attr_idle_timeout_ms_read(
-       struct o2nm_cluster *cluster, char *page)
+static ssize_t o2nm_cluster_idle_timeout_ms_show(struct config_item *item,
+       char *page)
 {
-       return sprintf(page, "%u\n", cluster->cl_idle_timeout_ms);
+       return sprintf(page, "%u\n", to_o2nm_cluster(item)->cl_idle_timeout_ms);
 }
 
-static ssize_t o2nm_cluster_attr_idle_timeout_ms_write(
-       struct o2nm_cluster *cluster, const char *page, size_t count)
+static ssize_t o2nm_cluster_idle_timeout_ms_store(struct config_item *item,
+       const char *page, size_t count)
 {
+       struct o2nm_cluster *cluster = to_o2nm_cluster(item);
        ssize_t ret;
        unsigned int val;
 
@@ -536,15 +456,17 @@ static ssize_t o2nm_cluster_attr_idle_timeout_ms_write(
        return ret;
 }
 
-static ssize_t o2nm_cluster_attr_keepalive_delay_ms_read(
-       struct o2nm_cluster *cluster, char *page)
+static ssize_t o2nm_cluster_keepalive_delay_ms_show(
+       struct config_item *item, char *page)
 {
-       return sprintf(page, "%u\n", cluster->cl_keepalive_delay_ms);
+       return sprintf(page, "%u\n",
+                       to_o2nm_cluster(item)->cl_keepalive_delay_ms);
 }
 
-static ssize_t o2nm_cluster_attr_keepalive_delay_ms_write(
-       struct o2nm_cluster *cluster, const char *page, size_t count)
+static ssize_t o2nm_cluster_keepalive_delay_ms_store(
+       struct config_item *item, const char *page, size_t count)
 {
+       struct o2nm_cluster *cluster = to_o2nm_cluster(item);
        ssize_t ret;
        unsigned int val;
 
@@ -571,22 +493,24 @@ static ssize_t o2nm_cluster_attr_keepalive_delay_ms_write(
        return ret;
 }
 
-static ssize_t o2nm_cluster_attr_reconnect_delay_ms_read(
-       struct o2nm_cluster *cluster, char *page)
+static ssize_t o2nm_cluster_reconnect_delay_ms_show(
+       struct config_item *item, char *page)
 {
-       return sprintf(page, "%u\n", cluster->cl_reconnect_delay_ms);
+       return sprintf(page, "%u\n",
+                       to_o2nm_cluster(item)->cl_reconnect_delay_ms);
 }
 
-static ssize_t o2nm_cluster_attr_reconnect_delay_ms_write(
-       struct o2nm_cluster *cluster, const char *page, size_t count)
+static ssize_t o2nm_cluster_reconnect_delay_ms_store(
+       struct config_item *item, const char *page, size_t count)
 {
        return o2nm_cluster_attr_write(page, count,
-                                      &cluster->cl_reconnect_delay_ms);
+                               &to_o2nm_cluster(item)->cl_reconnect_delay_ms);
 }
 
-static ssize_t o2nm_cluster_attr_fence_method_read(
-       struct o2nm_cluster *cluster, char *page)
+static ssize_t o2nm_cluster_fence_method_show(
+       struct config_item *item, char *page)
 {
+       struct o2nm_cluster *cluster = to_o2nm_cluster(item);
        ssize_t ret = 0;
 
        if (cluster)
@@ -595,8 +519,8 @@ static ssize_t o2nm_cluster_attr_fence_method_read(
        return ret;
 }
 
-static ssize_t o2nm_cluster_attr_fence_method_write(
-       struct o2nm_cluster *cluster, const char *page, size_t count)
+static ssize_t o2nm_cluster_fence_method_store(
+       struct config_item *item, const char *page, size_t count)
 {
        unsigned int i;
 
@@ -608,10 +532,10 @@ static ssize_t o2nm_cluster_attr_fence_method_write(
                        continue;
                if (strncasecmp(page, o2nm_fence_method_desc[i], count - 1))
                        continue;
-               if (cluster->cl_fence_method != i) {
+               if (to_o2nm_cluster(item)->cl_fence_method != i) {
                        printk(KERN_INFO "ocfs2: Changing fence method to %s\n",
                               o2nm_fence_method_desc[i]);
-                       cluster->cl_fence_method = i;
+                       to_o2nm_cluster(item)->cl_fence_method = i;
                }
                return count;
        }
@@ -620,79 +544,18 @@ bail:
        return -EINVAL;
 }
 
-static struct o2nm_cluster_attribute o2nm_cluster_attr_idle_timeout_ms = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                   .ca_name = "idle_timeout_ms",
-                   .ca_mode = S_IRUGO | S_IWUSR },
-       .show   = o2nm_cluster_attr_idle_timeout_ms_read,
-       .store  = o2nm_cluster_attr_idle_timeout_ms_write,
-};
-
-static struct o2nm_cluster_attribute o2nm_cluster_attr_keepalive_delay_ms = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                   .ca_name = "keepalive_delay_ms",
-                   .ca_mode = S_IRUGO | S_IWUSR },
-       .show   = o2nm_cluster_attr_keepalive_delay_ms_read,
-       .store  = o2nm_cluster_attr_keepalive_delay_ms_write,
-};
-
-static struct o2nm_cluster_attribute o2nm_cluster_attr_reconnect_delay_ms = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                   .ca_name = "reconnect_delay_ms",
-                   .ca_mode = S_IRUGO | S_IWUSR },
-       .show   = o2nm_cluster_attr_reconnect_delay_ms_read,
-       .store  = o2nm_cluster_attr_reconnect_delay_ms_write,
-};
-
-static struct o2nm_cluster_attribute o2nm_cluster_attr_fence_method = {
-       .attr   = { .ca_owner = THIS_MODULE,
-                   .ca_name = "fence_method",
-                   .ca_mode = S_IRUGO | S_IWUSR },
-       .show   = o2nm_cluster_attr_fence_method_read,
-       .store  = o2nm_cluster_attr_fence_method_write,
-};
+CONFIGFS_ATTR(o2nm_cluster_, idle_timeout_ms);
+CONFIGFS_ATTR(o2nm_cluster_, keepalive_delay_ms);
+CONFIGFS_ATTR(o2nm_cluster_, reconnect_delay_ms);
+CONFIGFS_ATTR(o2nm_cluster_, fence_method);
 
 static struct configfs_attribute *o2nm_cluster_attrs[] = {
-       &o2nm_cluster_attr_idle_timeout_ms.attr,
-       &o2nm_cluster_attr_keepalive_delay_ms.attr,
-       &o2nm_cluster_attr_reconnect_delay_ms.attr,
-       &o2nm_cluster_attr_fence_method.attr,
+       &o2nm_cluster_attr_idle_timeout_ms,
+       &o2nm_cluster_attr_keepalive_delay_ms,
+       &o2nm_cluster_attr_reconnect_delay_ms,
+       &o2nm_cluster_attr_fence_method,
        NULL,
 };
-static ssize_t o2nm_cluster_show(struct config_item *item,
-                                 struct configfs_attribute *attr,
-                                 char *page)
-{
-       struct o2nm_cluster *cluster = to_o2nm_cluster(item);
-       struct o2nm_cluster_attribute *o2nm_cluster_attr =
-               container_of(attr, struct o2nm_cluster_attribute, attr);
-       ssize_t ret = 0;
-
-       if (o2nm_cluster_attr->show)
-               ret = o2nm_cluster_attr->show(cluster, page);
-       return ret;
-}
-
-static ssize_t o2nm_cluster_store(struct config_item *item,
-                                  struct configfs_attribute *attr,
-                                  const char *page, size_t count)
-{
-       struct o2nm_cluster *cluster = to_o2nm_cluster(item);
-       struct o2nm_cluster_attribute *o2nm_cluster_attr =
-               container_of(attr, struct o2nm_cluster_attribute, attr);
-       ssize_t ret;
-
-       if (o2nm_cluster_attr->store == NULL) {
-               ret = -EINVAL;
-               goto out;
-       }
-
-       ret = o2nm_cluster_attr->store(cluster, page, count);
-       if (ret < count)
-               goto out;
-out:
-       return ret;
-}
 
 static struct config_item *o2nm_node_group_make_item(struct config_group *group,
                                                     const char *name)
@@ -773,8 +636,6 @@ static void o2nm_cluster_release(struct config_item *item)
 
 static struct configfs_item_operations o2nm_cluster_item_ops = {
        .release        = o2nm_cluster_release,
-       .show_attribute         = o2nm_cluster_show,
-       .store_attribute        = o2nm_cluster_store,
 };
 
 static struct config_item_type o2nm_cluster_type = {
index 63a36e89d0eb6b3f718d7058b723291662c186d3..a8a335b7fce083984c0b05df49e3ff74f7732719 100644 (file)
@@ -125,86 +125,33 @@ struct configfs_attribute {
        const char              *ca_name;
        struct module           *ca_owner;
        umode_t                 ca_mode;
+       ssize_t (*show)(struct config_item *, char *);
+       ssize_t (*store)(struct config_item *, const char *, size_t);
 };
 
-/*
- * Users often need to create attribute structures for their configurable
- * attributes, containing a configfs_attribute member and function pointers
- * for the show() and store() operations on that attribute. If they don't
- * need anything else on the extended attribute structure, they can use
- * this macro to define it  The argument _item is the name of the
- * config_item structure.
- */
-#define CONFIGFS_ATTR_STRUCT(_item)                                    \
-struct _item##_attribute {                                             \
-       struct configfs_attribute attr;                                 \
-       ssize_t (*show)(struct _item *, char *);                        \
-       ssize_t (*store)(struct _item *, const char *, size_t);         \
+#define CONFIGFS_ATTR(_pfx, _name)                     \
+static struct configfs_attribute _pfx##attr_##_name = {        \
+       .ca_name        = __stringify(_name),           \
+       .ca_mode        = S_IRUGO | S_IWUSR,            \
+       .ca_owner       = THIS_MODULE,                  \
+       .show           = _pfx##_name##_show,           \
+       .store          = _pfx##_name##_store,          \
 }
 
-/*
- * With the extended attribute structure, users can use this macro
- * (similar to sysfs' __ATTR) to make defining attributes easier.
- * An example:
- * #define MYITEM_ATTR(_name, _mode, _show, _store)    \
- * struct myitem_attribute childless_attr_##_name =    \
- *         __CONFIGFS_ATTR(_name, _mode, _show, _store)
- */
-#define __CONFIGFS_ATTR(_name, _mode, _show, _store)                   \
-{                                                                      \
-       .attr   = {                                                     \
-                       .ca_name = __stringify(_name),                  \
-                       .ca_mode = _mode,                               \
-                       .ca_owner = THIS_MODULE,                        \
-       },                                                              \
-       .show   = _show,                                                \
-       .store  = _store,                                               \
-}
-/* Here is a readonly version, only requiring a show() operation */
-#define __CONFIGFS_ATTR_RO(_name, _show)                               \
-{                                                                      \
-       .attr   = {                                                     \
-                       .ca_name = __stringify(_name),                  \
-                       .ca_mode = 0444,                                \
-                       .ca_owner = THIS_MODULE,                        \
-       },                                                              \
-       .show   = _show,                                                \
+#define CONFIGFS_ATTR_RO(_pfx, _name)                  \
+static struct configfs_attribute _pfx##attr_##_name = {        \
+       .ca_name        = __stringify(_name),           \
+       .ca_mode        = S_IRUGO,                      \
+       .ca_owner       = THIS_MODULE,                  \
+       .show           = _pfx##_name##_show,           \
 }
 
-/*
- * With these extended attributes, the simple show_attribute() and
- * store_attribute() operations need to call the show() and store() of the
- * attributes.  This is a common pattern, so we provide a macro to define
- * them.  The argument _item is the name of the config_item structure.
- * This macro expects the attributes to be named "struct <name>_attribute"
- * and the function to_<name>() to exist;
- */
-#define CONFIGFS_ATTR_OPS(_item)                                       \
-static ssize_t _item##_attr_show(struct config_item *item,             \
-                                struct configfs_attribute *attr,       \
-                                char *page)                            \
-{                                                                      \
-       struct _item *_item = to_##_item(item);                         \
-       struct _item##_attribute *_item##_attr =                        \
-               container_of(attr, struct _item##_attribute, attr);     \
-       ssize_t ret = 0;                                                \
-                                                                       \
-       if (_item##_attr->show)                                         \
-               ret = _item##_attr->show(_item, page);                  \
-       return ret;                                                     \
-}                                                                      \
-static ssize_t _item##_attr_store(struct config_item *item,            \
-                                 struct configfs_attribute *attr,      \
-                                 const char *page, size_t count)       \
-{                                                                      \
-       struct _item *_item = to_##_item(item);                         \
-       struct _item##_attribute *_item##_attr =                        \
-               container_of(attr, struct _item##_attribute, attr);     \
-       ssize_t ret = -EINVAL;                                          \
-                                                                       \
-       if (_item##_attr->store)                                        \
-               ret = _item##_attr->store(_item, page, count);          \
-       return ret;                                                     \
+#define CONFIGFS_ATTR_WO(_pfx, _name)                  \
+static struct configfs_attribute _pfx##attr_##_name = {        \
+       .ca_name        = __stringify(_name),           \
+       .ca_mode        = S_IWUSR,                      \
+       .ca_owner       = THIS_MODULE,                  \
+       .store          = _pfx##_name##_store,          \
 }
 
 /*
@@ -223,8 +170,6 @@ static ssize_t _item##_attr_store(struct config_item *item,         \
  */
 struct configfs_item_operations {
        void (*release)(struct config_item *);
-       ssize_t (*show_attribute)(struct config_item *, struct configfs_attribute *,char *);
-       ssize_t (*store_attribute)(struct config_item *,struct configfs_attribute *,const char *, size_t);
        int (*allow_link)(struct config_item *src, struct config_item *target);
        int (*drop_link)(struct config_item *src, struct config_item *target);
 };
index d74c0ae989d501d4d50af2cd974595f49632b3dc..c36e95730de14d577e2a84962dc1c9fa2694f27a 100644 (file)
@@ -7,9 +7,10 @@ int check_user_usb_string(const char *name,
                struct usb_gadget_strings *stringtab_dev);
 
 #define GS_STRINGS_W(__struct, __name) \
-       static ssize_t __struct##_##__name##_store(struct __struct *gs, \
+static ssize_t __struct##_##__name##_store(struct config_item *item, \
                const char *page, size_t len)           \
 {                                                      \
+       struct __struct *gs = to_##__struct(item);      \
        int ret;                                        \
                                                        \
        ret = usb_string_copy(page, &gs->__name);       \
@@ -19,30 +20,20 @@ int check_user_usb_string(const char *name,
 }
 
 #define GS_STRINGS_R(__struct, __name) \
-       static ssize_t __struct##_##__name##_show(struct __struct *gs, \
-                       char *page)     \
+static ssize_t __struct##_##__name##_show(struct config_item *item, char *page) \
 {      \
+       struct __struct *gs = to_##__struct(item);      \
        return sprintf(page, "%s\n", gs->__name ?: ""); \
 }
 
-#define GS_STRING_ITEM_ATTR(struct_name, name) \
-       static struct struct_name##_attribute struct_name##_##name = \
-               __CONFIGFS_ATTR(name,  S_IRUGO | S_IWUSR,               \
-                               struct_name##_##name##_show,            \
-                               struct_name##_##name##_store)
-
 #define GS_STRINGS_RW(struct_name, _name)      \
        GS_STRINGS_R(struct_name, _name)        \
        GS_STRINGS_W(struct_name, _name)        \
-       GS_STRING_ITEM_ATTR(struct_name, _name)
+       CONFIGFS_ATTR(struct_name##_, _name)
 
 #define USB_CONFIG_STRING_RW_OPS(struct_in)                            \
-       CONFIGFS_ATTR_OPS(struct_in);                                   \
-                                                                       \
 static struct configfs_item_operations struct_in##_langid_item_ops = { \
        .release                = struct_in##_attr_release,             \
-       .show_attribute         = struct_in##_attr_show,                \
-       .store_attribute        = struct_in##_attr_store,               \
 };                                                                     \
                                                                        \
 static struct config_item_type struct_in##_langid_type = {             \
diff --git a/include/target/configfs_macros.h b/include/target/configfs_macros.h
deleted file mode 100644 (file)
index a0fc85b..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-/* -*- mode: c; c-basic-offset: 8; -*-
- * vim: noexpandtab sw=8 ts=8 sts=0:
- *
- * configfs_macros.h - extends macros for configfs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 021110-1307, USA.
- *
- * Based on sysfs:
- *     sysfs is Copyright (C) 2001, 2002, 2003 Patrick Mochel
- *
- * Based on kobject.h:
- *      Copyright (c) 2002-2003        Patrick Mochel
- *      Copyright (c) 2002-2003        Open Source Development Labs
- *
- * configfs Copyright (C) 2005 Oracle.  All rights reserved.
- *
- * Added CONFIGFS_EATTR() macros from original configfs.h macros
- * Copright (C) 2008-2009 Nicholas A. Bellinger <nab@linux-iscsi.org>
- *
- * Please read Documentation/filesystems/configfs/configfs.txt before using
- * the configfs interface, ESPECIALLY the parts about reference counts and
- * item destructors.
- */
-
-#ifndef _CONFIGFS_MACROS_H_
-#define _CONFIGFS_MACROS_H_
-
-#include <linux/configfs.h>
-
-/*
- * Users often need to create attribute structures for their configurable
- * attributes, containing a configfs_attribute member and function pointers
- * for the show() and store() operations on that attribute. If they don't
- * need anything else on the extended attribute structure, they can use
- * this macro to define it.  The argument _name isends up as
- * 'struct _name_attribute, as well as names of to CONFIGFS_ATTR_OPS() below.
- * The argument _item is the name of the structure containing the
- * struct config_item or struct config_group structure members
- */
-#define CONFIGFS_EATTR_STRUCT(_name, _item)                            \
-struct _name##_attribute {                                             \
-       struct configfs_attribute attr;                                 \
-       ssize_t (*show)(struct _item *, char *);                        \
-       ssize_t (*store)(struct _item *, const char *, size_t);         \
-}
-
-/*
- * With the extended attribute structure, users can use this macro
- * (similar to sysfs' __ATTR) to make defining attributes easier.
- * An example:
- * #define MYITEM_EATTR(_name, _mode, _show, _store)   \
- * struct myitem_attribute childless_attr_##_name =    \
- *         __CONFIGFS_EATTR(_name, _mode, _show, _store)
- */
-#define __CONFIGFS_EATTR(_name, _mode, _show, _store)                  \
-{                                                                      \
-       .attr   = {                                                     \
-                       .ca_name = __stringify(_name),                  \
-                       .ca_mode = _mode,                               \
-                       .ca_owner = THIS_MODULE,                        \
-       },                                                              \
-       .show   = _show,                                                \
-       .store  = _store,                                               \
-}
-/* Here is a readonly version, only requiring a show() operation */
-#define __CONFIGFS_EATTR_RO(_name, _show)                              \
-{                                                                      \
-       .attr   = {                                                     \
-                       .ca_name = __stringify(_name),                  \
-                       .ca_mode = 0444,                                \
-                       .ca_owner = THIS_MODULE,                        \
-       },                                                              \
-       .show   = _show,                                                \
-}
-
-/*
- * With these extended attributes, the simple show_attribute() and
- * store_attribute() operations need to call the show() and store() of the
- * attributes.  This is a common pattern, so we provide a macro to define
- * them.  The argument _name is the name of the attribute defined by
- * CONFIGFS_ATTR_STRUCT(). The argument _item is the name of the structure
- * containing the struct config_item or struct config_group structure member.
- * The argument _item_member is the actual name of the struct config_* struct
- * in your _item structure.  Meaning  my_structure->some_config_group.
- *                                   ^^_item^^^^^  ^^_item_member^^^
- * This macro expects the attributes to be named "struct <name>_attribute".
- */
-#define CONFIGFS_EATTR_OPS_TO_FUNC(_name, _item, _item_member)         \
-static struct _item *to_##_name(struct config_item *ci)                        \
-{                                                                      \
-       return (ci) ? container_of(to_config_group(ci), struct _item,   \
-               _item_member) : NULL;                                   \
-}
-
-#define CONFIGFS_EATTR_OPS_SHOW(_name, _item)                          \
-static ssize_t _name##_attr_show(struct config_item *item,             \
-                                struct configfs_attribute *attr,       \
-                                char *page)                            \
-{                                                                      \
-       struct _item *_item = to_##_name(item);                         \
-       struct _name##_attribute * _name##_attr =                       \
-               container_of(attr, struct _name##_attribute, attr);     \
-       ssize_t ret = 0;                                                \
-                                                                       \
-       if (_name##_attr->show)                                         \
-               ret = _name##_attr->show(_item, page);                  \
-       return ret;                                                     \
-}
-
-#define CONFIGFS_EATTR_OPS_STORE(_name, _item)                         \
-static ssize_t _name##_attr_store(struct config_item *item,            \
-                                 struct configfs_attribute *attr,      \
-                                 const char *page, size_t count)       \
-{                                                                      \
-       struct _item *_item = to_##_name(item);                         \
-       struct _name##_attribute * _name##_attr =                       \
-               container_of(attr, struct _name##_attribute, attr);     \
-       ssize_t ret = -EINVAL;                                          \
-                                                                       \
-       if (_name##_attr->store)                                        \
-               ret = _name##_attr->store(_item, page, count);          \
-       return ret;                                                     \
-}
-
-#define CONFIGFS_EATTR_OPS(_name, _item, _item_member)                 \
-       CONFIGFS_EATTR_OPS_TO_FUNC(_name, _item, _item_member);         \
-       CONFIGFS_EATTR_OPS_SHOW(_name, _item);                          \
-       CONFIGFS_EATTR_OPS_STORE(_name, _item);
-
-#define CONFIGFS_EATTR_OPS_RO(_name, _item, _item_member)              \
-       CONFIGFS_EATTR_OPS_TO_FUNC(_name, _item, _item_member);         \
-       CONFIGFS_EATTR_OPS_SHOW(_name, _item);
-
-#endif /* _CONFIGFS_MACROS_H_ */
index 5f48754dc36ae0e15e06527c0cb63dc29324721e..0a2c74008e5388f6d817272735882f40abc3a013 100644 (file)
@@ -563,6 +563,36 @@ struct se_node_acl {
        struct kref             acl_kref;
 };
 
+static inline struct se_node_acl *acl_to_nacl(struct config_item *item)
+{
+       return container_of(to_config_group(item), struct se_node_acl,
+                       acl_group);
+}
+
+static inline struct se_node_acl *attrib_to_nacl(struct config_item *item)
+{
+       return container_of(to_config_group(item), struct se_node_acl,
+                       acl_attrib_group);
+}
+
+static inline struct se_node_acl *auth_to_nacl(struct config_item *item)
+{
+       return container_of(to_config_group(item), struct se_node_acl,
+                       acl_auth_group);
+}
+
+static inline struct se_node_acl *param_to_nacl(struct config_item *item)
+{
+       return container_of(to_config_group(item), struct se_node_acl,
+                       acl_param_group);
+}
+
+static inline struct se_node_acl *fabric_stat_to_nacl(struct config_item *item)
+{
+       return container_of(to_config_group(item), struct se_node_acl,
+                       acl_fabric_stat_group);
+}
+
 struct se_session {
        unsigned                sess_tearing_down:1;
        u64                     sess_bin_isid;
@@ -821,6 +851,12 @@ struct se_tpg_np {
        struct config_group     tpg_np_group;
 };
 
+static inline struct se_tpg_np *to_tpg_np(struct config_item *item)
+{
+       return container_of(to_config_group(item), struct se_tpg_np,
+                       tpg_np_group);
+}
+
 struct se_portal_group {
        /*
         * PROTOCOL IDENTIFIER value per SPC4, 7.5.1.
@@ -857,6 +893,30 @@ struct se_portal_group {
        struct config_group     tpg_param_group;
 };
 
+static inline struct se_portal_group *to_tpg(struct config_item *item)
+{
+       return container_of(to_config_group(item), struct se_portal_group,
+                       tpg_group);
+}
+
+static inline struct se_portal_group *attrib_to_tpg(struct config_item *item)
+{
+       return container_of(to_config_group(item), struct se_portal_group,
+                       tpg_attrib_group);
+}
+
+static inline struct se_portal_group *auth_to_tpg(struct config_item *item)
+{
+       return container_of(to_config_group(item), struct se_portal_group,
+                       tpg_auth_group);
+}
+
+static inline struct se_portal_group *param_to_tpg(struct config_item *item)
+{
+       return container_of(to_config_group(item), struct se_portal_group,
+                       tpg_param_group);
+}
+
 struct se_wwn {
        struct target_fabric_configfs *wwn_tf;
        struct config_group     wwn_group;
diff --git a/include/target/target_core_fabric_configfs.h b/include/target/target_core_fabric_configfs.h
deleted file mode 100644 (file)
index 7a0649c..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Used for tfc_wwn_cit attributes
- */
-
-#include <target/configfs_macros.h>
-
-CONFIGFS_EATTR_STRUCT(target_fabric_nacl_attrib, se_node_acl);
-#define TF_NACL_ATTRIB_ATTR(_fabric, _name, _mode)                     \
-static struct target_fabric_nacl_attrib_attribute _fabric##_nacl_attrib_##_name = \
-       __CONFIGFS_EATTR(_name, _mode,                                  \
-       _fabric##_nacl_attrib_show_##_name,                             \
-       _fabric##_nacl_attrib_store_##_name);
-
-CONFIGFS_EATTR_STRUCT(target_fabric_nacl_auth, se_node_acl);
-#define TF_NACL_AUTH_ATTR(_fabric, _name, _mode)                       \
-static struct target_fabric_nacl_auth_attribute _fabric##_nacl_auth_##_name = \
-       __CONFIGFS_EATTR(_name, _mode,                                  \
-       _fabric##_nacl_auth_show_##_name,                               \
-       _fabric##_nacl_auth_store_##_name);
-
-#define TF_NACL_AUTH_ATTR_RO(_fabric, _name)                           \
-static struct target_fabric_nacl_auth_attribute _fabric##_nacl_auth_##_name = \
-       __CONFIGFS_EATTR_RO(_name,                                      \
-       _fabric##_nacl_auth_show_##_name);
-
-CONFIGFS_EATTR_STRUCT(target_fabric_nacl_param, se_node_acl);
-#define TF_NACL_PARAM_ATTR(_fabric, _name, _mode)                      \
-static struct target_fabric_nacl_param_attribute _fabric##_nacl_param_##_name = \
-       __CONFIGFS_EATTR(_name, _mode,                                  \
-       _fabric##_nacl_param_show_##_name,                              \
-       _fabric##_nacl_param_store_##_name);
-
-#define TF_NACL_PARAM_ATTR_RO(_fabric, _name)                          \
-static struct target_fabric_nacl_param_attribute _fabric##_nacl_param_##_name = \
-       __CONFIGFS_EATTR_RO(_name,                                      \
-       _fabric##_nacl_param_show_##_name);
-
-
-CONFIGFS_EATTR_STRUCT(target_fabric_nacl_base, se_node_acl);
-#define TF_NACL_BASE_ATTR(_fabric, _name, _mode)                       \
-static struct target_fabric_nacl_base_attribute _fabric##_nacl_##_name = \
-       __CONFIGFS_EATTR(_name, _mode,                                  \
-       _fabric##_nacl_show_##_name,                                    \
-       _fabric##_nacl_store_##_name);
-
-#define TF_NACL_BASE_ATTR_RO(_fabric, _name)                           \
-static struct target_fabric_nacl_base_attribute _fabric##_nacl_##_name = \
-       __CONFIGFS_EATTR_RO(_name,                                      \
-       _fabric##_nacl_show_##_name);
-
-CONFIGFS_EATTR_STRUCT(target_fabric_np_base, se_tpg_np);
-#define TF_NP_BASE_ATTR(_fabric, _name, _mode)                         \
-static struct target_fabric_np_base_attribute _fabric##_np_##_name =   \
-       __CONFIGFS_EATTR(_name, _mode,                                  \
-       _fabric##_np_show_##_name,                                      \
-       _fabric##_np_store_##_name);
-
-CONFIGFS_EATTR_STRUCT(target_fabric_tpg_attrib, se_portal_group);
-#define TF_TPG_ATTRIB_ATTR(_fabric, _name, _mode)                      \
-static struct target_fabric_tpg_attrib_attribute _fabric##_tpg_attrib_##_name = \
-       __CONFIGFS_EATTR(_name, _mode,                                  \
-       _fabric##_tpg_attrib_show_##_name,                              \
-       _fabric##_tpg_attrib_store_##_name);
-
-CONFIGFS_EATTR_STRUCT(target_fabric_tpg_auth, se_portal_group);
-#define TF_TPG_AUTH_ATTR(_fabric, _name, _mode)                        \
-static struct target_fabric_tpg_auth_attribute _fabric##_tpg_auth_##_name = \
-       __CONFIGFS_EATTR(_name, _mode,                                  \
-       _fabric##_tpg_auth_show_##_name,                                \
-       _fabric##_tpg_auth_store_##_name);
-
-#define TF_TPG_AUTH_ATTR_RO(_fabric, _name)                            \
-static struct target_fabric_tpg_auth_attribute _fabric##_tpg_auth_##_name = \
-       __CONFIGFS_EATTR_RO(_name,                                      \
-       _fabric##_tpg_auth_show_##_name);
-
-CONFIGFS_EATTR_STRUCT(target_fabric_tpg_param, se_portal_group);
-#define TF_TPG_PARAM_ATTR(_fabric, _name, _mode)                       \
-static struct target_fabric_tpg_param_attribute _fabric##_tpg_param_##_name = \
-       __CONFIGFS_EATTR(_name, _mode,                                  \
-       _fabric##_tpg_param_show_##_name,                               \
-       _fabric##_tpg_param_store_##_name);
-
-
-CONFIGFS_EATTR_STRUCT(target_fabric_tpg, se_portal_group);
-#define TF_TPG_BASE_ATTR(_fabric, _name, _mode)                                \
-static struct target_fabric_tpg_attribute _fabric##_tpg_##_name =      \
-       __CONFIGFS_EATTR(_name, _mode,                                  \
-       _fabric##_tpg_show_##_name,                                     \
-       _fabric##_tpg_store_##_name);
-
-
-#define TF_TPG_BASE_ATTR_RO(_fabric, _name)                            \
-static struct target_fabric_tpg_attribute _fabric##_tpg_##_name =      \
-       __CONFIGFS_EATTR_RO(_name,                                      \
-       _fabric##_tpg_show_##_name);
-
-CONFIGFS_EATTR_STRUCT(target_fabric_wwn, target_fabric_configfs);
-#define TF_WWN_ATTR(_fabric, _name, _mode)                             \
-static struct target_fabric_wwn_attribute _fabric##_wwn_##_name =      \
-       __CONFIGFS_EATTR(_name, _mode,                                  \
-       _fabric##_wwn_show_attr_##_name,                                \
-       _fabric##_wwn_store_attr_##_name);
-
-#define TF_WWN_ATTR_RO(_fabric, _name)                                 \
-static struct target_fabric_wwn_attribute _fabric##_wwn_##_name =      \
-       __CONFIGFS_EATTR_RO(_name,                                      \
-       _fabric##_wwn_show_attr_##_name);
-
-CONFIGFS_EATTR_STRUCT(target_fabric_discovery, target_fabric_configfs);
-#define TF_DISC_ATTR(_fabric, _name, _mode)                            \
-static struct target_fabric_discovery_attribute _fabric##_disc_##_name = \
-       __CONFIGFS_EATTR(_name, _mode,                                  \
-       _fabric##_disc_show_##_name,                                    \
-       _fabric##_disc_store_##_name);
-
-#define TF_DISC_ATTR_RO(_fabric, _name)                                        \
-static struct target_fabric_discovery_attribute _fabric##_disc_##_name = \
-       __CONFIGFS_EATTR_RO(_name,                                      \
-       _fabric##_disc_show_##_name);
-
-extern int target_fabric_setup_cits(struct target_fabric_configfs *);
index 224ebb46bed5f8cf2965103f18ffa659d7629e76..d54f28c6dc5e5450595f1d5472f14cad3c42cee9 100644 (file)
@@ -70,4 +70,10 @@ config SAMPLE_LIVEPATCH
          Builds a sample live patch that replaces the procfs handler
          for /proc/cmdline to print "this has been live patched".
 
+config SAMPLE_CONFIGFS
+       tristate "Build configfs patching sample -- loadable modules only"
+       depends on CONFIGFS_FS && m
+       help
+         Builds a sample configfs interface.
+
 endif # SAMPLES
index f00257bcc5a73570013f5a25253ed8da3e2ee629..48001d7e23f042a7f777ec810ab2ff29e7db5f52 100644 (file)
@@ -1,4 +1,5 @@
 # Makefile for Linux samples code
 
 obj-$(CONFIG_SAMPLES)  += kobject/ kprobes/ trace_events/ livepatch/ \
-                          hw_breakpoint/ kfifo/ kdb/ hidraw/ rpmsg/ seccomp/
+                          hw_breakpoint/ kfifo/ kdb/ hidraw/ rpmsg/ seccomp/ \
+                          configfs/
diff --git a/samples/configfs/Makefile b/samples/configfs/Makefile
new file mode 100644 (file)
index 0000000..a9afd99
--- /dev/null
@@ -0,0 +1,2 @@
+
+obj-$(CONFIG_SAMPLE_CONFIGFS) += configfs_sample.o
similarity index 74%
rename from Documentation/filesystems/configfs/configfs_example_macros.c
rename to samples/configfs/configfs_sample.c
index 327dfbc640a9087302ce6ea5c6b30c77ad721acf..1ea33119e53272e09ee20e727e44ce21577d6ece 100644 (file)
@@ -54,18 +54,13 @@ struct childless {
 
 static inline struct childless *to_childless(struct config_item *item)
 {
-       return item ? container_of(to_configfs_subsystem(to_config_group(item)), struct childless, subsys) : NULL;
+       return item ? container_of(to_configfs_subsystem(to_config_group(item)),
+                       struct childless, subsys) : NULL;
 }
 
-CONFIGFS_ATTR_STRUCT(childless);
-#define CHILDLESS_ATTR(_name, _mode, _show, _store)    \
-struct childless_attribute childless_attr_##_name = __CONFIGFS_ATTR(_name, _mode, _show, _store)
-#define CHILDLESS_ATTR_RO(_name, _show)        \
-struct childless_attribute childless_attr_##_name = __CONFIGFS_ATTR_RO(_name, _show);
-
-static ssize_t childless_showme_read(struct childless *childless,
-                                    char *page)
+static ssize_t childless_showme_show(struct config_item *item, char *page)
 {
+       struct childless *childless = to_childless(item);
        ssize_t pos;
 
        pos = sprintf(page, "%d\n", childless->showme);
@@ -74,16 +69,15 @@ static ssize_t childless_showme_read(struct childless *childless,
        return pos;
 }
 
-static ssize_t childless_storeme_read(struct childless *childless,
-                                     char *page)
+static ssize_t childless_storeme_show(struct config_item *item, char *page)
 {
-       return sprintf(page, "%d\n", childless->storeme);
+       return sprintf(page, "%d\n", to_childless(item)->storeme);
 }
 
-static ssize_t childless_storeme_write(struct childless *childless,
-                                      const char *page,
-                                      size_t count)
+static ssize_t childless_storeme_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct childless *childless = to_childless(item);
        unsigned long tmp;
        char *p = (char *) page;
 
@@ -99,8 +93,7 @@ static ssize_t childless_storeme_write(struct childless *childless,
        return count;
 }
 
-static ssize_t childless_description_read(struct childless *childless,
-                                         char *page)
+static ssize_t childless_description_show(struct config_item *item, char *page)
 {
        return sprintf(page,
 "[01-childless]\n"
@@ -111,26 +104,18 @@ static ssize_t childless_description_read(struct childless *childless,
 "than a directory in /proc.\n");
 }
 
-CHILDLESS_ATTR_RO(showme, childless_showme_read);
-CHILDLESS_ATTR(storeme, S_IRUGO | S_IWUSR, childless_storeme_read,
-              childless_storeme_write);
-CHILDLESS_ATTR_RO(description, childless_description_read);
+CONFIGFS_ATTR_RO(childless_, showme);
+CONFIGFS_ATTR(childless_, storeme);
+CONFIGFS_ATTR_RO(childless_, description);
 
 static struct configfs_attribute *childless_attrs[] = {
-       &childless_attr_showme.attr,
-       &childless_attr_storeme.attr,
-       &childless_attr_description.attr,
+       &childless_attr_showme,
+       &childless_attr_storeme,
+       &childless_attr_description,
        NULL,
 };
 
-CONFIGFS_ATTR_OPS(childless);
-static struct configfs_item_operations childless_item_ops = {
-       .show_attribute         = childless_attr_show,
-       .store_attribute        = childless_attr_store,
-};
-
 static struct config_item_type childless_type = {
-       .ct_item_ops    = &childless_item_ops,
        .ct_attrs       = childless_attrs,
        .ct_owner       = THIS_MODULE,
 };
@@ -168,32 +153,13 @@ static inline struct simple_child *to_simple_child(struct config_item *item)
        return item ? container_of(item, struct simple_child, item) : NULL;
 }
 
-static struct configfs_attribute simple_child_attr_storeme = {
-       .ca_owner = THIS_MODULE,
-       .ca_name = "storeme",
-       .ca_mode = S_IRUGO | S_IWUSR,
-};
-
-static struct configfs_attribute *simple_child_attrs[] = {
-       &simple_child_attr_storeme,
-       NULL,
-};
-
-static ssize_t simple_child_attr_show(struct config_item *item,
-                                     struct configfs_attribute *attr,
-                                     char *page)
+static ssize_t simple_child_storeme_show(struct config_item *item, char *page)
 {
-       ssize_t count;
-       struct simple_child *simple_child = to_simple_child(item);
-
-       count = sprintf(page, "%d\n", simple_child->storeme);
-
-       return count;
+       return sprintf(page, "%d\n", to_simple_child(item)->storeme);
 }
 
-static ssize_t simple_child_attr_store(struct config_item *item,
-                                      struct configfs_attribute *attr,
-                                      const char *page, size_t count)
+static ssize_t simple_child_storeme_store(struct config_item *item,
+               const char *page, size_t count)
 {
        struct simple_child *simple_child = to_simple_child(item);
        unsigned long tmp;
@@ -211,6 +177,13 @@ static ssize_t simple_child_attr_store(struct config_item *item,
        return count;
 }
 
+CONFIGFS_ATTR(simple_child_, storeme);
+
+static struct configfs_attribute *simple_child_attrs[] = {
+       &simple_child_attr_storeme,
+       NULL,
+};
+
 static void simple_child_release(struct config_item *item)
 {
        kfree(to_simple_child(item));
@@ -218,8 +191,6 @@ static void simple_child_release(struct config_item *item)
 
 static struct configfs_item_operations simple_child_item_ops = {
        .release                = simple_child_release,
-       .show_attribute         = simple_child_attr_show,
-       .store_attribute        = simple_child_attr_store,
 };
 
 static struct config_item_type simple_child_type = {
@@ -235,10 +206,12 @@ struct simple_children {
 
 static inline struct simple_children *to_simple_children(struct config_item *item)
 {
-       return item ? container_of(to_config_group(item), struct simple_children, group) : NULL;
+       return item ? container_of(to_config_group(item),
+                       struct simple_children, group) : NULL;
 }
 
-static struct config_item *simple_children_make_item(struct config_group *group, const char *name)
+static struct config_item *simple_children_make_item(struct config_group *group,
+               const char *name)
 {
        struct simple_child *simple_child;
 
@@ -254,20 +227,8 @@ static struct config_item *simple_children_make_item(struct config_group *group,
        return &simple_child->item;
 }
 
-static struct configfs_attribute simple_children_attr_description = {
-       .ca_owner = THIS_MODULE,
-       .ca_name = "description",
-       .ca_mode = S_IRUGO,
-};
-
-static struct configfs_attribute *simple_children_attrs[] = {
-       &simple_children_attr_description,
-       NULL,
-};
-
-static ssize_t simple_children_attr_show(struct config_item *item,
-                                        struct configfs_attribute *attr,
-                                        char *page)
+static ssize_t simple_children_description_show(struct config_item *item,
+               char *page)
 {
        return sprintf(page,
 "[02-simple-children]\n"
@@ -276,6 +237,13 @@ static ssize_t simple_children_attr_show(struct config_item *item,
 "items have only one attribute that is readable and writeable.\n");
 }
 
+CONFIGFS_ATTR_RO(simple_children_, description);
+
+static struct configfs_attribute *simple_children_attrs[] = {
+       &simple_children_attr_description,
+       NULL,
+};
+
 static void simple_children_release(struct config_item *item)
 {
        kfree(to_simple_children(item));
@@ -283,7 +251,6 @@ static void simple_children_release(struct config_item *item)
 
 static struct configfs_item_operations simple_children_item_ops = {
        .release        = simple_children_release,
-       .show_attribute = simple_children_attr_show,
 };
 
 /*
@@ -323,7 +290,8 @@ static struct configfs_subsystem simple_children_subsys = {
  * children of its own.
  */
 
-static struct config_group *group_children_make_group(struct config_group *group, const char *name)
+static struct config_group *group_children_make_group(
+               struct config_group *group, const char *name)
 {
        struct simple_children *simple_children;
 
@@ -338,20 +306,8 @@ static struct config_group *group_children_make_group(struct config_group *group
        return &simple_children->group;
 }
 
-static struct configfs_attribute group_children_attr_description = {
-       .ca_owner = THIS_MODULE,
-       .ca_name = "description",
-       .ca_mode = S_IRUGO,
-};
-
-static struct configfs_attribute *group_children_attrs[] = {
-       &group_children_attr_description,
-       NULL,
-};
-
-static ssize_t group_children_attr_show(struct config_item *item,
-                                       struct configfs_attribute *attr,
-                                       char *page)
+static ssize_t group_children_description_show(struct config_item *item,
+               char *page)
 {
        return sprintf(page,
 "[03-group-children]\n"
@@ -360,8 +316,11 @@ static ssize_t group_children_attr_show(struct config_item *item,
 "groups are like the subsystem simple-children.\n");
 }
 
-static struct configfs_item_operations group_children_item_ops = {
-       .show_attribute = group_children_attr_show,
+CONFIGFS_ATTR_RO(group_children_, description);
+
+static struct configfs_attribute *group_children_attrs[] = {
+       &group_children_attr_description,
+       NULL,
 };
 
 /*
@@ -373,7 +332,6 @@ static struct configfs_group_operations group_children_group_ops = {
 };
 
 static struct config_item_type group_children_type = {
-       .ct_item_ops    = &group_children_item_ops,
        .ct_group_ops   = &group_children_group_ops,
        .ct_attrs       = group_children_attrs,
        .ct_owner       = THIS_MODULE,