提交 9aa3d651 编写于 作者: L Linus Torvalds

Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending

Pull SCSI target updates from Nicholas Bellinger:
 "This series contains HCH's changes to absorb configfs attribute
  ->show() + ->store() function pointer usage from it's original
  tree-wide consumers, into common configfs code.

  It includes usb-gadget, target w/ drivers, netconsole and ocfs2
  changes to realize the improved simplicity, that now renders the
  original include/target/configfs_macros.h CPP magic for fabric drivers
  and others, unnecessary and obsolete.

  And with common code in place, new configfs attributes can be added
  easier than ever before.

  Note, there are further improvements in-flight from other folks for
  v4.5 code in configfs land, plus number of target fixes for post -rc1
  code"

In the meantime, a new user of the now-removed old configfs API came in
through the char/misc tree in commit 7bd1d409 ("stm class: Introduce
an abstraction for System Trace Module devices").

This merge resolution comes from Alexander Shishkin, who updated his stm
class tracing abstraction to account for the removal of the old
show_attribute and store_attribute methods in commit 51798222
("configfs: remove old API") from this pull.  As Alexander says about
that patch:

 "There's no need to keep an extra wrapper structure per item and the
  awkward show_attribute/store_attribute item ops are no longer needed.

  This patch converts policy code to the new api, all the while making
  the code quite a bit smaller and easier on the eyes.

  Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>"

That patch was folded into the merge so that the tree should be fully
bisectable.

* 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending: (23 commits)
  configfs: remove old API
  ocfs2/cluster: use per-attribute show and store methods
  ocfs2/cluster: move locking into attribute store methods
  netconsole: use per-attribute show and store methods
  target: use per-attribute show and store methods
  spear13xx_pcie_gadget: use per-attribute show and store methods
  dlm: use per-attribute show and store methods
  usb-gadget/f_serial: use per-attribute show and store methods
  usb-gadget/f_phonet: use per-attribute show and store methods
  usb-gadget/f_obex: use per-attribute show and store methods
  usb-gadget/f_uac2: use per-attribute show and store methods
  usb-gadget/f_uac1: use per-attribute show and store methods
  usb-gadget/f_mass_storage: use per-attribute show and store methods
  usb-gadget/f_sourcesink: use per-attribute show and store methods
  usb-gadget/f_printer: use per-attribute show and store methods
  usb-gadget/f_midi: use per-attribute show and store methods
  usb-gadget/f_loopback: use per-attribute show and store methods
  usb-gadget/ether: use per-attribute show and store methods
  usb-gadget/f_acm: use per-attribute show and store methods
  usb-gadget/f_hid: use per-attribute show and store methods
  ...
subdir-y := configfs
# List of programs to build # List of programs to build
hostprogs-y := dnotify_test hostprogs-y := dnotify_test
......
ifneq ($(CONFIG_CONFIGFS_FS),)
obj-m += configfs_example_explicit.o configfs_example_macros.o
endif
...@@ -160,12 +160,6 @@ among other things. For that, it needs a type. ...@@ -160,12 +160,6 @@ among other things. For that, it needs a type.
struct configfs_item_operations { struct configfs_item_operations {
void (*release)(struct config_item *); 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, int (*allow_link)(struct config_item *src,
struct config_item *target); struct config_item *target);
int (*drop_link)(struct config_item *src, int (*drop_link)(struct config_item *src,
...@@ -183,9 +177,7 @@ The most basic function of a config_item_type is to define what ...@@ -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 operations can be performed on a config_item. All items that have been
allocated dynamically will need to provide the ct_item_ops->release() allocated dynamically will need to provide the ct_item_ops->release()
method. This method is called when the config_item's reference count method. This method is called when the config_item's reference count
reaches zero. Items that wish to display an attribute need to provide reaches zero.
the ct_item_ops->show_attribute() method. Similarly, storing a new
attribute value uses the store_attribute() method.
[struct configfs_attribute] [struct configfs_attribute]
...@@ -193,6 +185,8 @@ attribute value uses the store_attribute() method. ...@@ -193,6 +185,8 @@ attribute value uses the store_attribute() method.
char *ca_name; char *ca_name;
struct module *ca_owner; struct module *ca_owner;
umode_t ca_mode; 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 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 ...@@ -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 attribute file will appear with the configfs_attribute->ca_name
filename. configfs_attribute->ca_mode specifies the file permissions. filename. configfs_attribute->ca_mode specifies the file permissions.
If an attribute is readable and the config_item provides a If an attribute is readable and provides a ->show method, that method will
ct_item_ops->show_attribute() method, that method will be called be called whenever userspace asks for a read(2) on the attribute. If an
whenever userspace asks for a read(2) on the attribute. The converse attribute is writable and provides a ->store method, that method will be
will happen for write(2). be called whenever userspace asks for a write(2) on the attribute.
[struct config_group] [struct config_group]
...@@ -311,20 +305,10 @@ the subsystem must be ready for it. ...@@ -311,20 +305,10 @@ the subsystem must be ready for it.
[An Example] [An Example]
The best example of these basic concepts is the simple_children The best example of these basic concepts is the simple_children
subsystem/group and the simple_child item in configfs_example_explicit.c subsystem/group and the simple_child item in
and configfs_example_macros.c. It shows a trivial object displaying and samples/configfs/configfs_sample.c. It shows a trivial object displaying
storing an attribute, and a simple group creating and destroying these and storing an attribute, and a simple group creating and destroying
children. 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.
[Hierarchy Navigation and the Subsystem Mutex] [Hierarchy Navigation and the Subsystem Mutex]
......
/*
* 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");
...@@ -203,8 +203,6 @@ def tcm_mod_build_configfs(proto_ident, fabric_mod_dir_var, fabric_mod_name): ...@@ -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 <scsi/scsi_proto.h>\n\n"
buf += "#include <target/target_core_base.h>\n" buf += "#include <target/target_core_base.h>\n"
buf += "#include <target/target_core_fabric.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 + "_base.h\"\n"
buf += "#include \"" + fabric_mod_name + "_fabric.h\"\n\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): ...@@ -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 += " struct " + fabric_mod_name + "_" + fabric_mod_port + ", " + fabric_mod_port + "_wwn);\n"
buf += " kfree(" + fabric_mod_port + ");\n" buf += " kfree(" + fabric_mod_port + ");\n"
buf += "}\n\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 += "static const struct target_core_fabric_ops " + fabric_mod_name + "_ops = {\n"
buf += " .module = THIS_MODULE,\n" buf += " .module = THIS_MODULE,\n"
...@@ -328,8 +313,6 @@ def tcm_mod_build_configfs(proto_ident, fabric_mod_dir_var, fabric_mod_name): ...@@ -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_drop_wwn = " + fabric_mod_name + "_drop_" + fabric_mod_port + ",\n"
buf += " .fabric_make_tpg = " + fabric_mod_name + "_make_tpg,\n" buf += " .fabric_make_tpg = " + fabric_mod_name + "_make_tpg,\n"
buf += " .fabric_drop_tpg = " + fabric_mod_name + "_drop_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 += "};\n\n"
buf += "static int __init " + fabric_mod_name + "_init(void)\n" buf += "static int __init " + fabric_mod_name + "_init(void)\n"
......
...@@ -76,9 +76,10 @@ to_stp_policy_node(struct config_item *item) ...@@ -76,9 +76,10 @@ to_stp_policy_node(struct config_item *item)
NULL; NULL;
} }
static ssize_t stp_policy_node_masters_show(struct stp_policy_node *policy_node, static ssize_t
char *page) 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; ssize_t count;
count = sprintf(page, "%u %u\n", policy_node->first_master, 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, ...@@ -88,9 +89,10 @@ static ssize_t stp_policy_node_masters_show(struct stp_policy_node *policy_node,
} }
static ssize_t static ssize_t
stp_policy_node_masters_store(struct stp_policy_node *policy_node, stp_policy_node_masters_store(struct config_item *item, const char *page,
const char *page, size_t count) size_t count)
{ {
struct stp_policy_node *policy_node = to_stp_policy_node(item);
unsigned int first, last; unsigned int first, last;
struct stm_device *stm; struct stm_device *stm;
char *p = (char *)page; char *p = (char *)page;
...@@ -123,8 +125,9 @@ stp_policy_node_masters_store(struct stp_policy_node *policy_node, ...@@ -123,8 +125,9 @@ stp_policy_node_masters_store(struct stp_policy_node *policy_node,
} }
static ssize_t 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; ssize_t count;
count = sprintf(page, "%u %u\n", policy_node->first_channel, 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) ...@@ -134,9 +137,10 @@ stp_policy_node_channels_show(struct stp_policy_node *policy_node, char *page)
} }
static ssize_t static ssize_t
stp_policy_node_channels_store(struct stp_policy_node *policy_node, stp_policy_node_channels_store(struct config_item *item, const char *page,
const char *page, size_t count) size_t count)
{ {
struct stp_policy_node *policy_node = to_stp_policy_node(item);
unsigned int first, last; unsigned int first, last;
struct stm_device *stm; struct stm_device *stm;
char *p = (char *)page; char *p = (char *)page;
...@@ -171,71 +175,16 @@ static void stp_policy_node_release(struct config_item *item) ...@@ -171,71 +175,16 @@ static void stp_policy_node_release(struct config_item *item)
kfree(to_stp_policy_node(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 = { static struct configfs_item_operations stp_policy_node_item_ops = {
.release = stp_policy_node_release, .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 = { CONFIGFS_ATTR(stp_policy_node_, masters);
.attr = { CONFIGFS_ATTR(stp_policy_node_, channels);
.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,
};
static struct configfs_attribute *stp_policy_node_attrs[] = { static struct configfs_attribute *stp_policy_node_attrs[] = {
&stp_policy_node_attr_range.attr, &stp_policy_node_attr_masters,
&stp_policy_node_attr_channels.attr, &stp_policy_node_attr_channels,
NULL, NULL,
}; };
...@@ -298,20 +247,8 @@ static struct config_item_type stp_policy_node_type = { ...@@ -298,20 +247,8 @@ static struct config_item_type stp_policy_node_type = {
/* /*
* Root group: policies. * Root group: policies.
*/ */
static struct configfs_attribute stp_policy_attr_device = { static ssize_t stp_policy_device_show(struct config_item *item,
.ca_owner = THIS_MODULE, char *page)
.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)
{ {
struct stp_policy *policy = to_stp_policy(item); struct stp_policy *policy = to_stp_policy(item);
ssize_t count; ssize_t count;
...@@ -324,6 +261,13 @@ static ssize_t stp_policy_attr_show(struct config_item *item, ...@@ -324,6 +261,13 @@ static ssize_t stp_policy_attr_show(struct config_item *item,
return count; 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) void stp_policy_unbind(struct stp_policy *policy)
{ {
struct stm_device *stm = policy->stm; struct stm_device *stm = policy->stm;
...@@ -350,7 +294,6 @@ static void stp_policy_release(struct config_item *item) ...@@ -350,7 +294,6 @@ static void stp_policy_release(struct config_item *item)
static struct configfs_item_operations stp_policy_item_ops = { static struct configfs_item_operations stp_policy_item_ops = {
.release = stp_policy_release, .release = stp_policy_release,
.show_attribute = stp_policy_attr_show,
}; };
static struct configfs_group_operations stp_policy_group_ops = { static struct configfs_group_operations stp_policy_group_ops = {
......
...@@ -43,9 +43,7 @@ ...@@ -43,9 +43,7 @@
#include <linux/atomic.h> #include <linux/atomic.h>
#include <scsi/scsi_proto.h> #include <scsi/scsi_proto.h>
#include <scsi/scsi_tcq.h> #include <scsi/scsi_tcq.h>
#include <target/configfs_macros.h>
#include <target/target_core_base.h> #include <target/target_core_base.h>
#include <target/target_core_fabric_configfs.h>
#include <target/target_core_fabric.h> #include <target/target_core_fabric.h>
#include "ib_srpt.h" #include "ib_srpt.h"
...@@ -3546,20 +3544,19 @@ static void srpt_cleanup_nodeacl(struct se_node_acl *se_nacl) ...@@ -3546,20 +3544,19 @@ static void srpt_cleanup_nodeacl(struct se_node_acl *se_nacl)
spin_unlock_irq(&sport->port_acl_lock); spin_unlock_irq(&sport->port_acl_lock);
} }
static ssize_t srpt_tpg_attrib_show_srp_max_rdma_size( static ssize_t srpt_tpg_attrib_srp_max_rdma_size_show(struct config_item *item,
struct se_portal_group *se_tpg, char *page)
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); 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); return sprintf(page, "%u\n", sport->port_attrib.srp_max_rdma_size);
} }
static ssize_t srpt_tpg_attrib_store_srp_max_rdma_size( static ssize_t srpt_tpg_attrib_srp_max_rdma_size_store(struct config_item *item,
struct se_portal_group *se_tpg, const char *page, size_t count)
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); struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
unsigned long val; unsigned long val;
int ret; int ret;
...@@ -3584,22 +3581,19 @@ static ssize_t srpt_tpg_attrib_store_srp_max_rdma_size( ...@@ -3584,22 +3581,19 @@ static ssize_t srpt_tpg_attrib_store_srp_max_rdma_size(
return count; return count;
} }
TF_TPG_ATTRIB_ATTR(srpt, srp_max_rdma_size, S_IRUGO | S_IWUSR); static ssize_t srpt_tpg_attrib_srp_max_rsp_size_show(struct config_item *item,
char *page)
static ssize_t srpt_tpg_attrib_show_srp_max_rsp_size(
struct se_portal_group *se_tpg,
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); 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); return sprintf(page, "%u\n", sport->port_attrib.srp_max_rsp_size);
} }
static ssize_t srpt_tpg_attrib_store_srp_max_rsp_size( static ssize_t srpt_tpg_attrib_srp_max_rsp_size_store(struct config_item *item,
struct se_portal_group *se_tpg, const char *page, size_t count)
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); struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
unsigned long val; unsigned long val;
int ret; int ret;
...@@ -3624,22 +3618,19 @@ static ssize_t srpt_tpg_attrib_store_srp_max_rsp_size( ...@@ -3624,22 +3618,19 @@ static ssize_t srpt_tpg_attrib_store_srp_max_rsp_size(
return count; return count;
} }
TF_TPG_ATTRIB_ATTR(srpt, srp_max_rsp_size, S_IRUGO | S_IWUSR); static ssize_t srpt_tpg_attrib_srp_sq_size_show(struct config_item *item,
char *page)
static ssize_t srpt_tpg_attrib_show_srp_sq_size(
struct se_portal_group *se_tpg,
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); 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); return sprintf(page, "%u\n", sport->port_attrib.srp_sq_size);
} }
static ssize_t srpt_tpg_attrib_store_srp_sq_size( static ssize_t srpt_tpg_attrib_srp_sq_size_store(struct config_item *item,
struct se_portal_group *se_tpg, const char *page, size_t count)
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); struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
unsigned long val; unsigned long val;
int ret; int ret;
...@@ -3664,29 +3655,29 @@ static ssize_t srpt_tpg_attrib_store_srp_sq_size( ...@@ -3664,29 +3655,29 @@ static ssize_t srpt_tpg_attrib_store_srp_sq_size(
return count; 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[] = { static struct configfs_attribute *srpt_tpg_attrib_attrs[] = {
&srpt_tpg_attrib_srp_max_rdma_size.attr, &srpt_tpg_attrib_attr_srp_max_rdma_size,
&srpt_tpg_attrib_srp_max_rsp_size.attr, &srpt_tpg_attrib_attr_srp_max_rsp_size,
&srpt_tpg_attrib_srp_sq_size.attr, &srpt_tpg_attrib_attr_srp_sq_size,
NULL, NULL,
}; };
static ssize_t srpt_tpg_show_enable( static ssize_t srpt_tpg_enable_show(struct config_item *item, char *page)
struct se_portal_group *se_tpg,
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); 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); return snprintf(page, PAGE_SIZE, "%d\n", (sport->enabled) ? 1: 0);
} }
static ssize_t srpt_tpg_store_enable( static ssize_t srpt_tpg_enable_store(struct config_item *item,
struct se_portal_group *se_tpg, const char *page, size_t count)
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); struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
unsigned long tmp; unsigned long tmp;
int ret; int ret;
...@@ -3709,10 +3700,10 @@ static ssize_t srpt_tpg_store_enable( ...@@ -3709,10 +3700,10 @@ static ssize_t srpt_tpg_store_enable(
return count; return count;
} }
TF_TPG_BASE_ATTR(srpt, enable, S_IRUGO | S_IWUSR); CONFIGFS_ATTR(srpt_tpg_, enable);
static struct configfs_attribute *srpt_tpg_attrs[] = { static struct configfs_attribute *srpt_tpg_attrs[] = {
&srpt_tpg_enable.attr, &srpt_tpg_attr_enable,
NULL, NULL,
}; };
...@@ -3782,16 +3773,15 @@ static void srpt_drop_tport(struct se_wwn *wwn) ...@@ -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)); 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, static ssize_t srpt_wwn_version_show(struct config_item *item, char *buf)
char *buf)
{ {
return scnprintf(buf, PAGE_SIZE, "%s\n", DRV_VERSION); 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[] = { static struct configfs_attribute *srpt_wwn_attrs[] = {
&srpt_wwn_version.attr, &srpt_wwn_attr_version,
NULL, NULL,
}; };
......
...@@ -220,11 +220,17 @@ static irqreturn_t spear_pcie_gadget_irq(int irq, void *dev_id) ...@@ -220,11 +220,17 @@ static irqreturn_t spear_pcie_gadget_irq(int irq, void *dev_id)
/* /*
* configfs interfaces show/store functions * configfs interfaces show/store functions
*/ */
static ssize_t pcie_gadget_show_link(
struct spear_pcie_gadget_config *config, static struct pcie_gadget_target *to_target(struct config_item *item)
char *buf)
{ {
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)) if (readl(&app_reg->app_status_1) & ((u32)1 << XMLH_LINK_UP_ID))
return sprintf(buf, "UP"); return sprintf(buf, "UP");
...@@ -232,11 +238,10 @@ static ssize_t pcie_gadget_show_link( ...@@ -232,11 +238,10 @@ static ssize_t pcie_gadget_show_link(
return sprintf(buf, "DOWN"); return sprintf(buf, "DOWN");
} }
static ssize_t pcie_gadget_store_link( static ssize_t pcie_gadget_link_store(struct config_item *item,
struct spear_pcie_gadget_config *config,
const char *buf, size_t count) 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")) if (sysfs_streq(buf, "UP"))
writel(readl(&app_reg->app_ctrl_0) | (1 << APP_LTSSM_ENABLE_ID), writel(readl(&app_reg->app_ctrl_0) | (1 << APP_LTSSM_ENABLE_ID),
...@@ -250,17 +255,15 @@ static ssize_t pcie_gadget_store_link( ...@@ -250,17 +255,15 @@ static ssize_t pcie_gadget_store_link(
return count; return count;
} }
static ssize_t pcie_gadget_show_int_type( static ssize_t pcie_gadget_int_type_show(struct config_item *item, char *buf)
struct spear_pcie_gadget_config *config,
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( static ssize_t pcie_gadget_int_type_store(struct config_item *item,
struct spear_pcie_gadget_config *config,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct spear_pcie_gadget_config *config = to_target(item)
u32 cap, vec, flags; u32 cap, vec, flags;
ulong vector; ulong vector;
...@@ -288,11 +291,10 @@ static ssize_t pcie_gadget_store_int_type( ...@@ -288,11 +291,10 @@ static ssize_t pcie_gadget_store_int_type(
return count; return count;
} }
static ssize_t pcie_gadget_show_no_of_msi( static ssize_t pcie_gadget_no_of_msi_show(struct config_item *item, char *buf)
struct spear_pcie_gadget_config *config,
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; u32 cap, vec, flags;
ulong vector; ulong vector;
...@@ -313,13 +315,12 @@ static ssize_t pcie_gadget_show_no_of_msi( ...@@ -313,13 +315,12 @@ static ssize_t pcie_gadget_show_no_of_msi(
return sprintf(buf, "%lu", vector); return sprintf(buf, "%lu", vector);
} }
static ssize_t pcie_gadget_store_no_of_msi( static ssize_t pcie_gadget_no_of_msi_store(struct config_item *item,
struct spear_pcie_gadget_config *config,
const char *buf, size_t count) const char *buf, size_t count)
{ {
int ret; int ret;
ret = kstrtoul(buf, 0, &config->requested_msi); ret = kstrtoul(buf, 0, &to_target(item)->requested_msi);
if (ret) if (ret)
return ret; return ret;
...@@ -329,11 +330,10 @@ static ssize_t pcie_gadget_store_no_of_msi( ...@@ -329,11 +330,10 @@ static ssize_t pcie_gadget_store_no_of_msi(
return count; return count;
} }
static ssize_t pcie_gadget_store_inta( static ssize_t pcie_gadget_inta_store(struct config_item *item,
struct spear_pcie_gadget_config *config,
const char *buf, size_t count) 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; ulong en;
int ret; int ret;
...@@ -351,10 +351,10 @@ static ssize_t pcie_gadget_store_inta( ...@@ -351,10 +351,10 @@ static ssize_t pcie_gadget_store_inta(
return count; return count;
} }
static ssize_t pcie_gadget_store_send_msi( static ssize_t pcie_gadget_send_msi_store(struct config_item *item,
struct spear_pcie_gadget_config *config,
const char *buf, size_t count) 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; struct pcie_app_reg __iomem *app_reg = config->va_app_base;
ulong vector; ulong vector;
u32 ven_msi; u32 ven_msi;
...@@ -388,19 +388,16 @@ static ssize_t pcie_gadget_store_send_msi( ...@@ -388,19 +388,16 @@ static ssize_t pcie_gadget_store_send_msi(
return count; return count;
} }
static ssize_t pcie_gadget_show_vendor_id( static ssize_t pcie_gadget_vendor_id_show(struct config_item *item, char *buf)
struct spear_pcie_gadget_config *config,
char *buf)
{ {
u32 id; 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); return sprintf(buf, "%x", id);
} }
static ssize_t pcie_gadget_store_vendor_id( static ssize_t pcie_gadget_vendor_id_store(struct config_item *item,
struct spear_pcie_gadget_config *config,
const char *buf, size_t count) const char *buf, size_t count)
{ {
ulong id; ulong id;
...@@ -410,24 +407,21 @@ static ssize_t pcie_gadget_store_vendor_id( ...@@ -410,24 +407,21 @@ static ssize_t pcie_gadget_store_vendor_id(
if (ret) if (ret)
return 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; return count;
} }
static ssize_t pcie_gadget_show_device_id( static ssize_t pcie_gadget_device_id_show(struct config_item *item, char *buf)
struct spear_pcie_gadget_config *config,
char *buf)
{ {
u32 id; 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); return sprintf(buf, "%x", id);
} }
static ssize_t pcie_gadget_store_device_id( static ssize_t pcie_gadget_device_id_store(struct config_item *item,
struct spear_pcie_gadget_config *config,
const char *buf, size_t count) const char *buf, size_t count)
{ {
ulong id; ulong id;
...@@ -437,22 +431,20 @@ static ssize_t pcie_gadget_store_device_id( ...@@ -437,22 +431,20 @@ static ssize_t pcie_gadget_store_device_id(
if (ret) if (ret)
return 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; return count;
} }
static ssize_t pcie_gadget_show_bar0_size( static ssize_t pcie_gadget_bar0_size_show(struct config_item *item, char *buf)
struct spear_pcie_gadget_config *config,
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( static ssize_t pcie_gadget_bar0_size_store(struct config_item *item,
struct spear_pcie_gadget_config *config,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct spear_pcie_gadget_config *config = to_target(item)
ulong size; ulong size;
u32 pos, pos1; u32 pos, pos1;
u32 no_of_bit = 0; u32 no_of_bit = 0;
...@@ -489,21 +481,20 @@ static ssize_t pcie_gadget_store_bar0_size( ...@@ -489,21 +481,20 @@ static ssize_t pcie_gadget_store_bar0_size(
return count; return count;
} }
static ssize_t pcie_gadget_show_bar0_address( static ssize_t pcie_gadget_bar0_address_show(struct config_item *item,
struct spear_pcie_gadget_config *config,
char *buf) 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); u32 address = readl(&app_reg->pim0_mem_addr_start);
return sprintf(buf, "%x", address); return sprintf(buf, "%x", address);
} }
static ssize_t pcie_gadget_store_bar0_address( static ssize_t pcie_gadget_bar0_address_store(struct config_item *item,
struct spear_pcie_gadget_config *config,
const char *buf, size_t count) 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; struct pcie_app_reg __iomem *app_reg = config->va_app_base;
ulong address; ulong address;
int ret; int ret;
...@@ -524,15 +515,13 @@ static ssize_t pcie_gadget_store_bar0_address( ...@@ -524,15 +515,13 @@ static ssize_t pcie_gadget_store_bar0_address(
return count; return count;
} }
static ssize_t pcie_gadget_show_bar0_rw_offset( static ssize_t pcie_gadget_bar0_rw_offset_show(struct config_item *item,
struct spear_pcie_gadget_config *config,
char *buf) 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( static ssize_t pcie_gadget_bar0_rw_offset_store(struct config_item *item,
struct spear_pcie_gadget_config *config,
const char *buf, size_t count) const char *buf, size_t count)
{ {
ulong offset; ulong offset;
...@@ -545,15 +534,14 @@ static ssize_t pcie_gadget_store_bar0_rw_offset( ...@@ -545,15 +534,14 @@ static ssize_t pcie_gadget_store_bar0_rw_offset(
if (offset % 4) if (offset % 4)
return -EINVAL; return -EINVAL;
config->bar0_rw_offset = offset; to_target(item)->bar0_rw_offset = offset;
return count; return count;
} }
static ssize_t pcie_gadget_show_bar0_data( static ssize_t pcie_gadget_bar0_data_show(struct config_item *item, char *buf)
struct spear_pcie_gadget_config *config,
char *buf)
{ {
struct spear_pcie_gadget_config *config = to_target(item)
ulong data; ulong data;
if (!config->va_bar0_address) if (!config->va_bar0_address)
...@@ -564,10 +552,10 @@ static ssize_t pcie_gadget_show_bar0_data( ...@@ -564,10 +552,10 @@ static ssize_t pcie_gadget_show_bar0_data(
return sprintf(buf, "%lx", data); return sprintf(buf, "%lx", data);
} }
static ssize_t pcie_gadget_store_bar0_data( static ssize_t pcie_gadget_bar0_data_store(struct config_item *item,
struct spear_pcie_gadget_config *config,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct spear_pcie_gadget_config *config = to_target(item)
ulong data; ulong data;
int ret; int ret;
...@@ -583,97 +571,35 @@ static ssize_t pcie_gadget_store_bar0_data( ...@@ -583,97 +571,35 @@ static ssize_t pcie_gadget_store_bar0_data(
return count; return count;
} }
/* CONFIGFS_ATTR(pcie_gadget_, link);
* Attribute definitions. CONFIGFS_ATTR(pcie_gadget_, int_type);
*/ CONFIGFS_ATTR(pcie_gadget_, no_of_msi);
CONFIGFS_ATTR_WO(pcie_gadget_, inta);
#define PCIE_GADGET_TARGET_ATTR_RO(_name) \ CONFIGFS_ATTR_WO(pcie_gadget_, send_msi);
static struct pcie_gadget_target_attr pcie_gadget_target_##_name = \ CONFIGFS_ATTR(pcie_gadget_, vendor_id);
__CONFIGFS_ATTR(_name, S_IRUGO, pcie_gadget_show_##_name, NULL) CONFIGFS_ATTR(pcie_gadget_, device_id);
CONFIGFS_ATTR(pcie_gadget_, bar0_size);
#define PCIE_GADGET_TARGET_ATTR_WO(_name) \ CONFIGFS_ATTR(pcie_gadget_, bar0_address);
static struct pcie_gadget_target_attr pcie_gadget_target_##_name = \ CONFIGFS_ATTR(pcie_gadget_, bar0_rw_offset);
__CONFIGFS_ATTR(_name, S_IWUSR, NULL, pcie_gadget_store_##_name) CONFIGFS_ATTR(pcie_gadget_, bar0_data);
#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);
static struct configfs_attribute *pcie_gadget_target_attrs[] = { static struct configfs_attribute *pcie_gadget_target_attrs[] = {
&pcie_gadget_target_link.attr, &pcie_gadget_attr_link,
&pcie_gadget_target_int_type.attr, &pcie_gadget_attr_int_type,
&pcie_gadget_target_no_of_msi.attr, &pcie_gadget_attr_no_of_msi,
&pcie_gadget_target_inta.attr, &pcie_gadget_attr_inta,
&pcie_gadget_target_send_msi.attr, &pcie_gadget_attr_send_msi,
&pcie_gadget_target_vendor_id.attr, &pcie_gadget_attr_vendor_id,
&pcie_gadget_target_device_id.attr, &pcie_gadget_attr_device_id,
&pcie_gadget_target_bar0_size.attr, &pcie_gadget_attr_bar0_size,
&pcie_gadget_target_bar0_address.attr, &pcie_gadget_attr_bar0_address,
&pcie_gadget_target_bar0_rw_offset.attr, &pcie_gadget_attr_bar0_rw_offset,
&pcie_gadget_target_bar0_data.attr, &pcie_gadget_attr_bar0_data,
NULL, 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 = { static struct config_item_type pcie_gadget_target_type = {
.ct_attrs = pcie_gadget_target_attrs, .ct_attrs = pcie_gadget_target_attrs,
.ct_item_ops = &pcie_gadget_target_item_ops,
.ct_owner = THIS_MODULE, .ct_owner = THIS_MODULE,
}; };
......
...@@ -244,15 +244,6 @@ static void free_param_target(struct netconsole_target *nt) ...@@ -244,15 +244,6 @@ static void free_param_target(struct netconsole_target *nt)
* <target>/... * <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) static struct netconsole_target *to_target(struct config_item *item)
{ {
return item ? return item ?
...@@ -264,58 +255,62 @@ static struct netconsole_target *to_target(struct config_item *item) ...@@ -264,58 +255,62 @@ static struct netconsole_target *to_target(struct config_item *item)
* Attribute operations for netconsole_target. * 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) if (nt->np.ipv6)
return snprintf(buf, PAGE_SIZE, "%pI6c\n", &nt->np.local_ip.in6); return snprintf(buf, PAGE_SIZE, "%pI6c\n", &nt->np.local_ip.in6);
else else
return snprintf(buf, PAGE_SIZE, "%pI4\n", &nt->np.local_ip); 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) if (nt->np.ipv6)
return snprintf(buf, PAGE_SIZE, "%pI6c\n", &nt->np.remote_ip.in6); return snprintf(buf, PAGE_SIZE, "%pI6c\n", &nt->np.remote_ip.in6);
else else
return snprintf(buf, PAGE_SIZE, "%pI4\n", &nt->np.remote_ip); 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 }; static const u8 bcast[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
return snprintf(buf, PAGE_SIZE, "%pM\n", dev ? dev->dev_addr : bcast); 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) ...@@ -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 * would enable him to dynamically add new netpoll targets for new
* network interfaces as and when they come up). * network interfaces as and when they come up).
*/ */
static ssize_t store_enabled(struct netconsole_target *nt, static ssize_t enabled_store(struct config_item *item,
const char *buf, const char *buf, size_t count)
size_t count)
{ {
struct netconsole_target *nt = to_target(item);
unsigned long flags; unsigned long flags;
int enabled; int enabled;
int err; int err;
mutex_lock(&dynamic_netconsole_mutex);
err = kstrtoint(buf, 10, &enabled); err = kstrtoint(buf, 10, &enabled);
if (err < 0) if (err < 0)
return err; goto out_unlock;
err = -EINVAL;
if (enabled < 0 || enabled > 1) if (enabled < 0 || enabled > 1)
return -EINVAL; goto out_unlock;
if ((bool)enabled == nt->enabled) { if ((bool)enabled == nt->enabled) {
pr_info("network logging has already %s\n", pr_info("network logging has already %s\n",
nt->enabled ? "started" : "stopped"); nt->enabled ? "started" : "stopped");
return -EINVAL; goto out_unlock;
} }
if (enabled) { /* true */ if (enabled) { /* true */
...@@ -358,7 +356,7 @@ static ssize_t store_enabled(struct netconsole_target *nt, ...@@ -358,7 +356,7 @@ static ssize_t store_enabled(struct netconsole_target *nt,
err = netpoll_setup(&nt->np); err = netpoll_setup(&nt->np);
if (err) if (err)
return err; goto out_unlock;
pr_info("netconsole: network logging started\n"); pr_info("netconsole: network logging started\n");
} else { /* false */ } else { /* false */
...@@ -374,42 +372,56 @@ static ssize_t store_enabled(struct netconsole_target *nt, ...@@ -374,42 +372,56 @@ static ssize_t store_enabled(struct netconsole_target *nt,
nt->enabled = enabled; nt->enabled = enabled;
mutex_unlock(&dynamic_netconsole_mutex);
return strnlen(buf, count); return strnlen(buf, count);
out_unlock:
mutex_unlock(&dynamic_netconsole_mutex);
return err;
} }
static ssize_t store_extended(struct netconsole_target *nt, static ssize_t extended_store(struct config_item *item, const char *buf,
const char *buf, size_t count)
size_t count)
{ {
struct netconsole_target *nt = to_target(item);
int extended; int extended;
int err; int err;
mutex_lock(&dynamic_netconsole_mutex);
if (nt->enabled) { if (nt->enabled) {
pr_err("target (%s) is enabled, disable to update parameters\n", pr_err("target (%s) is enabled, disable to update parameters\n",
config_item_name(&nt->item)); config_item_name(&nt->item));
return -EINVAL; err = -EINVAL;
goto out_unlock;
} }
err = kstrtoint(buf, 10, &extended); err = kstrtoint(buf, 10, &extended);
if (err < 0) if (err < 0)
return err; goto out_unlock;
if (extended < 0 || extended > 1) if (extended < 0 || extended > 1) {
return -EINVAL; err = -EINVAL;
goto out_unlock;
}
nt->extended = extended; nt->extended = extended;
mutex_unlock(&dynamic_netconsole_mutex);
return strnlen(buf, count); return strnlen(buf, count);
out_unlock:
mutex_unlock(&dynamic_netconsole_mutex);
return err;
} }
static ssize_t store_dev_name(struct netconsole_target *nt, static ssize_t dev_name_store(struct config_item *item, const char *buf,
const char *buf, size_t count)
size_t count)
{ {
struct netconsole_target *nt = to_target(item);
size_t len; size_t len;
mutex_lock(&dynamic_netconsole_mutex);
if (nt->enabled) { if (nt->enabled) {
pr_err("target (%s) is enabled, disable to update parameters\n", pr_err("target (%s) is enabled, disable to update parameters\n",
config_item_name(&nt->item)); config_item_name(&nt->item));
mutex_unlock(&dynamic_netconsole_mutex);
return -EINVAL; return -EINVAL;
} }
...@@ -420,53 +432,66 @@ static ssize_t store_dev_name(struct netconsole_target *nt, ...@@ -420,53 +432,66 @@ static ssize_t store_dev_name(struct netconsole_target *nt,
if (nt->np.dev_name[len - 1] == '\n') if (nt->np.dev_name[len - 1] == '\n')
nt->np.dev_name[len - 1] = '\0'; nt->np.dev_name[len - 1] = '\0';
mutex_unlock(&dynamic_netconsole_mutex);
return strnlen(buf, count); return strnlen(buf, count);
} }
static ssize_t store_local_port(struct netconsole_target *nt, static ssize_t local_port_store(struct config_item *item, const char *buf,
const char *buf, size_t count)
size_t count)
{ {
int rv; struct netconsole_target *nt = to_target(item);
int rv = -EINVAL;
mutex_lock(&dynamic_netconsole_mutex);
if (nt->enabled) { if (nt->enabled) {
pr_err("target (%s) is enabled, disable to update parameters\n", pr_err("target (%s) is enabled, disable to update parameters\n",
config_item_name(&nt->item)); config_item_name(&nt->item));
return -EINVAL; goto out_unlock;
} }
rv = kstrtou16(buf, 10, &nt->np.local_port); rv = kstrtou16(buf, 10, &nt->np.local_port);
if (rv < 0) if (rv < 0)
return rv; goto out_unlock;
mutex_unlock(&dynamic_netconsole_mutex);
return strnlen(buf, count); return strnlen(buf, count);
out_unlock:
mutex_unlock(&dynamic_netconsole_mutex);
return rv;
} }
static ssize_t store_remote_port(struct netconsole_target *nt, static ssize_t remote_port_store(struct config_item *item,
const char *buf, const char *buf, size_t count)
size_t count)
{ {
int rv; struct netconsole_target *nt = to_target(item);
int rv = -EINVAL;
mutex_lock(&dynamic_netconsole_mutex);
if (nt->enabled) { if (nt->enabled) {
pr_err("target (%s) is enabled, disable to update parameters\n", pr_err("target (%s) is enabled, disable to update parameters\n",
config_item_name(&nt->item)); config_item_name(&nt->item));
return -EINVAL; goto out_unlock;
} }
rv = kstrtou16(buf, 10, &nt->np.remote_port); rv = kstrtou16(buf, 10, &nt->np.remote_port);
if (rv < 0) if (rv < 0)
return rv; goto out_unlock;
mutex_unlock(&dynamic_netconsole_mutex);
return strnlen(buf, count); return strnlen(buf, count);
out_unlock:
mutex_unlock(&dynamic_netconsole_mutex);
return rv;
} }
static ssize_t store_local_ip(struct netconsole_target *nt, static ssize_t local_ip_store(struct config_item *item, const char *buf,
const char *buf, size_t count)
size_t count)
{ {
struct netconsole_target *nt = to_target(item);
mutex_lock(&dynamic_netconsole_mutex);
if (nt->enabled) { if (nt->enabled) {
pr_err("target (%s) is enabled, disable to update parameters\n", pr_err("target (%s) is enabled, disable to update parameters\n",
config_item_name(&nt->item)); config_item_name(&nt->item));
return -EINVAL; goto out_unlock;
} }
if (strnchr(buf, count, ':')) { if (strnchr(buf, count, ':')) {
...@@ -474,29 +499,35 @@ static ssize_t store_local_ip(struct netconsole_target *nt, ...@@ -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 (in6_pton(buf, count, nt->np.local_ip.in6.s6_addr, -1, &end) > 0) {
if (*end && *end != '\n') { if (*end && *end != '\n') {
pr_err("invalid IPv6 address at: <%c>\n", *end); pr_err("invalid IPv6 address at: <%c>\n", *end);
return -EINVAL; goto out_unlock;
} }
nt->np.ipv6 = true; nt->np.ipv6 = true;
} else } else
return -EINVAL; goto out_unlock;
} else { } else {
if (!nt->np.ipv6) { if (!nt->np.ipv6) {
nt->np.local_ip.ip = in_aton(buf); nt->np.local_ip.ip = in_aton(buf);
} else } else
return -EINVAL; goto out_unlock;
} }
mutex_unlock(&dynamic_netconsole_mutex);
return strnlen(buf, count); return strnlen(buf, count);
out_unlock:
mutex_unlock(&dynamic_netconsole_mutex);
return -EINVAL;
} }
static ssize_t store_remote_ip(struct netconsole_target *nt, static ssize_t remote_ip_store(struct config_item *item, const char *buf,
const char *buf, size_t count)
size_t count)
{ {
struct netconsole_target *nt = to_target(item);
mutex_lock(&dynamic_netconsole_mutex);
if (nt->enabled) { if (nt->enabled) {
pr_err("target (%s) is enabled, disable to update parameters\n", pr_err("target (%s) is enabled, disable to update parameters\n",
config_item_name(&nt->item)); config_item_name(&nt->item));
return -EINVAL; goto out_unlock;
} }
if (strnchr(buf, count, ':')) { if (strnchr(buf, count, ':')) {
...@@ -504,74 +535,71 @@ static ssize_t store_remote_ip(struct netconsole_target *nt, ...@@ -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 (in6_pton(buf, count, nt->np.remote_ip.in6.s6_addr, -1, &end) > 0) {
if (*end && *end != '\n') { if (*end && *end != '\n') {
pr_err("invalid IPv6 address at: <%c>\n", *end); pr_err("invalid IPv6 address at: <%c>\n", *end);
return -EINVAL; goto out_unlock;
} }
nt->np.ipv6 = true; nt->np.ipv6 = true;
} else } else
return -EINVAL; goto out_unlock;
} else { } else {
if (!nt->np.ipv6) { if (!nt->np.ipv6) {
nt->np.remote_ip.ip = in_aton(buf); nt->np.remote_ip.ip = in_aton(buf);
} else } else
return -EINVAL; goto out_unlock;
} }
mutex_unlock(&dynamic_netconsole_mutex);
return strnlen(buf, count); return strnlen(buf, count);
out_unlock:
mutex_unlock(&dynamic_netconsole_mutex);
return -EINVAL;
} }
static ssize_t store_remote_mac(struct netconsole_target *nt, static ssize_t remote_mac_store(struct config_item *item, const char *buf,
const char *buf, size_t count)
size_t count)
{ {
struct netconsole_target *nt = to_target(item);
u8 remote_mac[ETH_ALEN]; u8 remote_mac[ETH_ALEN];
mutex_lock(&dynamic_netconsole_mutex);
if (nt->enabled) { if (nt->enabled) {
pr_err("target (%s) is enabled, disable to update parameters\n", pr_err("target (%s) is enabled, disable to update parameters\n",
config_item_name(&nt->item)); config_item_name(&nt->item));
return -EINVAL; goto out_unlock;
} }
if (!mac_pton(buf, remote_mac)) if (!mac_pton(buf, remote_mac))
return -EINVAL; goto out_unlock;
if (buf[3 * ETH_ALEN - 1] && buf[3 * ETH_ALEN - 1] != '\n') 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); memcpy(nt->np.remote_mac, remote_mac, ETH_ALEN);
mutex_unlock(&dynamic_netconsole_mutex);
return strnlen(buf, count); return strnlen(buf, count);
out_unlock:
mutex_unlock(&dynamic_netconsole_mutex);
return -EINVAL;
} }
/* CONFIGFS_ATTR(, enabled);
* Attribute definitions for netconsole_target. CONFIGFS_ATTR(, extended);
*/ CONFIGFS_ATTR(, dev_name);
CONFIGFS_ATTR(, local_port);
#define NETCONSOLE_TARGET_ATTR_RO(_name) \ CONFIGFS_ATTR(, remote_port);
static struct netconsole_target_attr netconsole_target_##_name = \ CONFIGFS_ATTR(, local_ip);
__CONFIGFS_ATTR(_name, S_IRUGO, show_##_name, NULL) CONFIGFS_ATTR(, remote_ip);
CONFIGFS_ATTR_RO(, local_mac);
#define NETCONSOLE_TARGET_ATTR_RW(_name) \ CONFIGFS_ATTR(, remote_mac);
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);
static struct configfs_attribute *netconsole_target_attrs[] = { static struct configfs_attribute *netconsole_target_attrs[] = {
&netconsole_target_enabled.attr, &attr_enabled,
&netconsole_target_extended.attr, &attr_extended,
&netconsole_target_dev_name.attr, &attr_dev_name,
&netconsole_target_local_port.attr, &attr_local_port,
&netconsole_target_remote_port.attr, &attr_remote_port,
&netconsole_target_local_ip.attr, &attr_local_ip,
&netconsole_target_remote_ip.attr, &attr_remote_ip,
&netconsole_target_local_mac.attr, &attr_local_mac,
&netconsole_target_remote_mac.attr, &attr_remote_mac,
NULL, NULL,
}; };
...@@ -584,43 +612,8 @@ static void netconsole_target_release(struct config_item *item) ...@@ -584,43 +612,8 @@ static void netconsole_target_release(struct config_item *item)
kfree(to_target(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 = { static struct configfs_item_operations netconsole_target_item_ops = {
.release = netconsole_target_release, .release = netconsole_target_release,
.show_attribute = netconsole_target_attr_show,
.store_attribute = netconsole_target_attr_store,
}; };
static struct config_item_type netconsole_target_type = { static struct config_item_type netconsole_target_type = {
......
...@@ -43,8 +43,6 @@ ...@@ -43,8 +43,6 @@
#include <scsi/scsi_cmnd.h> #include <scsi/scsi_cmnd.h>
#include <target/target_core_base.h> #include <target/target_core_base.h>
#include <target/target_core_fabric.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_def.h"
#include "qla_target.h" #include "qla_target.h"
...@@ -729,23 +727,23 @@ static int tcm_qla2xxx_init_nodeacl(struct se_node_acl *se_nacl, ...@@ -729,23 +727,23 @@ static int tcm_qla2xxx_init_nodeacl(struct se_node_acl *se_nacl,
#define DEF_QLA_TPG_ATTRIB(name) \ #define DEF_QLA_TPG_ATTRIB(name) \
\ \
static ssize_t tcm_qla2xxx_tpg_attrib_show_##name( \ static ssize_t tcm_qla2xxx_tpg_attrib_##name##_show( \
struct se_portal_group *se_tpg, \ struct config_item *item, char *page) \
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 *tpg = container_of(se_tpg, \
struct tcm_qla2xxx_tpg, se_tpg); \ struct tcm_qla2xxx_tpg, se_tpg); \
\ \
return sprintf(page, "%u\n", tpg->tpg_attrib.name); \ return sprintf(page, "%u\n", tpg->tpg_attrib.name); \
} \ } \
\ \
static ssize_t tcm_qla2xxx_tpg_attrib_store_##name( \ static ssize_t tcm_qla2xxx_tpg_attrib_##name##_store( \
struct se_portal_group *se_tpg, \ struct config_item *item, const char *page, size_t count) \
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 *tpg = container_of(se_tpg, \
struct tcm_qla2xxx_tpg, se_tpg); \ struct tcm_qla2xxx_tpg, se_tpg); \
struct tcm_qla2xxx_tpg_attrib *a = &tpg->tpg_attrib; \
unsigned long val; \ unsigned long val; \
int ret; \ int ret; \
\ \
...@@ -755,81 +753,39 @@ static ssize_t tcm_qla2xxx_tpg_attrib_store_##name( \ ...@@ -755,81 +753,39 @@ static ssize_t tcm_qla2xxx_tpg_attrib_store_##name( \
" ret: %d\n", ret); \ " ret: %d\n", ret); \
return -EINVAL; \ 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)) { \ if ((val != 0) && (val != 1)) { \
pr_err("Illegal boolean value %lu\n", val); \ pr_err("Illegal boolean value %lu\n", val); \
return -EINVAL; \ return -EINVAL; \
} \ } \
\ \
a->_name = val; \ a->name = val; \
return 0; \ \
} return count; \
} \
#define QLA_TPG_ATTR(_name, _mode) \ CONFIGFS_ATTR(tcm_qla2xxx_tpg_attrib_, name)
TF_TPG_ATTRIB_ATTR(tcm_qla2xxx, _name, _mode);
/*
* Define tcm_qla2xxx_tpg_attrib_s_generate_node_acls
*/
DEF_QLA_TPG_ATTR_BOOL(generate_node_acls);
DEF_QLA_TPG_ATTRIB(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); 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); 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); 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); 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[] = { static struct configfs_attribute *tcm_qla2xxx_tpg_attrib_attrs[] = {
&tcm_qla2xxx_tpg_attrib_generate_node_acls.attr, &tcm_qla2xxx_tpg_attrib_attr_generate_node_acls,
&tcm_qla2xxx_tpg_attrib_cache_dynamic_acls.attr, &tcm_qla2xxx_tpg_attrib_attr_cache_dynamic_acls,
&tcm_qla2xxx_tpg_attrib_demo_mode_write_protect.attr, &tcm_qla2xxx_tpg_attrib_attr_demo_mode_write_protect,
&tcm_qla2xxx_tpg_attrib_prod_mode_write_protect.attr, &tcm_qla2xxx_tpg_attrib_attr_prod_mode_write_protect,
&tcm_qla2xxx_tpg_attrib_demo_mode_login_only.attr, &tcm_qla2xxx_tpg_attrib_attr_demo_mode_login_only,
NULL, NULL,
}; };
/* End items for tcm_qla2xxx_tpg_attrib_cit */ /* End items for tcm_qla2xxx_tpg_attrib_cit */
static ssize_t tcm_qla2xxx_tpg_show_enable( static ssize_t tcm_qla2xxx_tpg_enable_show(struct config_item *item,
struct se_portal_group *se_tpg, char *page)
char *page)
{ {
struct se_portal_group *se_tpg = to_tpg(item);
struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg,
struct tcm_qla2xxx_tpg, se_tpg); struct tcm_qla2xxx_tpg, se_tpg);
...@@ -865,11 +821,10 @@ static void tcm_qla2xxx_undepend_tpg(struct work_struct *work) ...@@ -865,11 +821,10 @@ static void tcm_qla2xxx_undepend_tpg(struct work_struct *work)
complete(&base_tpg->tpg_base_comp); complete(&base_tpg->tpg_base_comp);
} }
static ssize_t tcm_qla2xxx_tpg_store_enable( static ssize_t tcm_qla2xxx_tpg_enable_store(struct config_item *item,
struct se_portal_group *se_tpg, const char *page, size_t count)
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 *tpg = container_of(se_tpg,
struct tcm_qla2xxx_tpg, se_tpg); struct tcm_qla2xxx_tpg, se_tpg);
unsigned long op; unsigned long op;
...@@ -909,22 +864,16 @@ static ssize_t tcm_qla2xxx_tpg_store_enable( ...@@ -909,22 +864,16 @@ static ssize_t tcm_qla2xxx_tpg_store_enable(
return count; return count;
} }
TF_TPG_BASE_ATTR(tcm_qla2xxx, enable, S_IRUGO | S_IWUSR); static ssize_t tcm_qla2xxx_tpg_dynamic_sessions_show(struct config_item *item,
char *page)
static ssize_t tcm_qla2xxx_tpg_show_dynamic_sessions(
struct se_portal_group *se_tpg,
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_fabric_prot_type_store(struct config_item *item,
const char *page, size_t count)
static ssize_t tcm_qla2xxx_tpg_store_fabric_prot_type(
struct se_portal_group *se_tpg,
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 *tpg = container_of(se_tpg,
struct tcm_qla2xxx_tpg, se_tpg); struct tcm_qla2xxx_tpg, se_tpg);
unsigned long val; unsigned long val;
...@@ -943,21 +892,24 @@ static ssize_t tcm_qla2xxx_tpg_store_fabric_prot_type( ...@@ -943,21 +892,24 @@ static ssize_t tcm_qla2xxx_tpg_store_fabric_prot_type(
return count; return count;
} }
static ssize_t tcm_qla2xxx_tpg_show_fabric_prot_type( static ssize_t tcm_qla2xxx_tpg_fabric_prot_type_show(struct config_item *item,
struct se_portal_group *se_tpg, char *page)
char *page)
{ {
struct se_portal_group *se_tpg = to_tpg(item);
struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg,
struct tcm_qla2xxx_tpg, se_tpg); struct tcm_qla2xxx_tpg, se_tpg);
return sprintf(page, "%d\n", tpg->tpg_attrib.fabric_prot_type); 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[] = { static struct configfs_attribute *tcm_qla2xxx_tpg_attrs[] = {
&tcm_qla2xxx_tpg_enable.attr, &tcm_qla2xxx_tpg_attr_enable,
&tcm_qla2xxx_tpg_dynamic_sessions.attr, &tcm_qla2xxx_tpg_attr_dynamic_sessions,
&tcm_qla2xxx_tpg_fabric_prot_type.attr, &tcm_qla2xxx_tpg_attr_fabric_prot_type,
NULL, NULL,
}; };
...@@ -1030,18 +982,16 @@ static void tcm_qla2xxx_drop_tpg(struct se_portal_group *se_tpg) ...@@ -1030,18 +982,16 @@ static void tcm_qla2xxx_drop_tpg(struct se_portal_group *se_tpg)
kfree(tpg); kfree(tpg);
} }
static ssize_t tcm_qla2xxx_npiv_tpg_show_enable( static ssize_t tcm_qla2xxx_npiv_tpg_enable_show(struct config_item *item,
struct se_portal_group *se_tpg, char *page)
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( static ssize_t tcm_qla2xxx_npiv_tpg_enable_store(struct config_item *item,
struct se_portal_group *se_tpg, const char *page, size_t count)
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 se_wwn *se_wwn = se_tpg->se_tpg_wwn;
struct tcm_qla2xxx_lport *lport = container_of(se_wwn, struct tcm_qla2xxx_lport *lport = container_of(se_wwn,
struct tcm_qla2xxx_lport, lport_wwn); struct tcm_qla2xxx_lport, lport_wwn);
...@@ -1077,10 +1027,10 @@ static ssize_t tcm_qla2xxx_npiv_tpg_store_enable( ...@@ -1077,10 +1027,10 @@ static ssize_t tcm_qla2xxx_npiv_tpg_store_enable(
return count; 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[] = { static struct configfs_attribute *tcm_qla2xxx_npiv_tpg_attrs[] = {
&tcm_qla2xxx_npiv_tpg_enable.attr, &tcm_qla2xxx_npiv_tpg_attr_enable,
NULL, NULL,
}; };
...@@ -1783,9 +1733,8 @@ static void tcm_qla2xxx_npiv_drop_lport(struct se_wwn *wwn) ...@@ -1783,9 +1733,8 @@ static void tcm_qla2xxx_npiv_drop_lport(struct se_wwn *wwn)
} }
static ssize_t tcm_qla2xxx_wwn_show_attr_version( static ssize_t tcm_qla2xxx_wwn_version_show(struct config_item *item,
struct target_fabric_configfs *tf, char *page)
char *page)
{ {
return sprintf(page, return sprintf(page,
"TCM QLOGIC QLA2XXX NPIV capable fabric module %s on %s/%s on " "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( ...@@ -1793,10 +1742,10 @@ static ssize_t tcm_qla2xxx_wwn_show_attr_version(
utsname()->machine); utsname()->machine);
} }
TF_WWN_ATTR_RO(tcm_qla2xxx, version); CONFIGFS_ATTR_RO(tcm_qla2xxx_wwn_, version);
static struct configfs_attribute *tcm_qla2xxx_wwn_attrs[] = { static struct configfs_attribute *tcm_qla2xxx_wwn_attrs[] = {
&tcm_qla2xxx_wwn_version.attr, &tcm_qla2xxx_wwn_attr_version,
NULL, NULL,
}; };
......
...@@ -34,7 +34,6 @@ ...@@ -34,7 +34,6 @@
#include <target/target_core_base.h> #include <target/target_core_base.h>
#include <target/target_core_fabric.h> #include <target/target_core_fabric.h>
#include <target/target_core_fabric_configfs.h>
#include "tcm_loop.h" #include "tcm_loop.h"
...@@ -763,21 +762,20 @@ static void tcm_loop_port_unlink( ...@@ -763,21 +762,20 @@ static void tcm_loop_port_unlink(
/* End items for tcm_loop_port_cit */ /* End items for tcm_loop_port_cit */
static ssize_t tcm_loop_tpg_attrib_show_fabric_prot_type( static ssize_t tcm_loop_tpg_attrib_fabric_prot_type_show(
struct se_portal_group *se_tpg, struct config_item *item, char *page)
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, struct tcm_loop_tpg *tl_tpg = container_of(se_tpg, struct tcm_loop_tpg,
tl_se_tpg); tl_se_tpg);
return sprintf(page, "%d\n", tl_tpg->tl_fabric_prot_type); return sprintf(page, "%d\n", tl_tpg->tl_fabric_prot_type);
} }
static ssize_t tcm_loop_tpg_attrib_store_fabric_prot_type( static ssize_t tcm_loop_tpg_attrib_fabric_prot_type_store(
struct se_portal_group *se_tpg, struct config_item *item, const char *page, size_t count)
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, struct tcm_loop_tpg *tl_tpg = container_of(se_tpg, struct tcm_loop_tpg,
tl_se_tpg); tl_se_tpg);
unsigned long val; unsigned long val;
...@@ -796,10 +794,10 @@ static ssize_t tcm_loop_tpg_attrib_store_fabric_prot_type( ...@@ -796,10 +794,10 @@ static ssize_t tcm_loop_tpg_attrib_store_fabric_prot_type(
return count; 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[] = { 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, NULL,
}; };
...@@ -894,10 +892,9 @@ static int tcm_loop_drop_nexus( ...@@ -894,10 +892,9 @@ static int tcm_loop_drop_nexus(
/* End items for tcm_loop_nexus_cit */ /* End items for tcm_loop_nexus_cit */
static ssize_t tcm_loop_tpg_show_nexus( static ssize_t tcm_loop_tpg_nexus_show(struct config_item *item, char *page)
struct se_portal_group *se_tpg,
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_tpg = container_of(se_tpg,
struct tcm_loop_tpg, tl_se_tpg); struct tcm_loop_tpg, tl_se_tpg);
struct tcm_loop_nexus *tl_nexus; struct tcm_loop_nexus *tl_nexus;
...@@ -913,11 +910,10 @@ static ssize_t tcm_loop_tpg_show_nexus( ...@@ -913,11 +910,10 @@ static ssize_t tcm_loop_tpg_show_nexus(
return ret; return ret;
} }
static ssize_t tcm_loop_tpg_store_nexus( static ssize_t tcm_loop_tpg_nexus_store(struct config_item *item,
struct se_portal_group *se_tpg, const char *page, size_t count)
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_tpg = container_of(se_tpg,
struct tcm_loop_tpg, tl_se_tpg); struct tcm_loop_tpg, tl_se_tpg);
struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba; struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba;
...@@ -992,12 +988,10 @@ static ssize_t tcm_loop_tpg_store_nexus( ...@@ -992,12 +988,10 @@ static ssize_t tcm_loop_tpg_store_nexus(
return count; return count;
} }
TF_TPG_BASE_ATTR(tcm_loop, nexus, S_IRUGO | S_IWUSR); static ssize_t tcm_loop_tpg_transport_status_show(struct config_item *item,
char *page)
static ssize_t tcm_loop_tpg_show_transport_status(
struct se_portal_group *se_tpg,
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_tpg = container_of(se_tpg,
struct tcm_loop_tpg, tl_se_tpg); struct tcm_loop_tpg, tl_se_tpg);
const char *status = NULL; const char *status = NULL;
...@@ -1020,11 +1014,10 @@ static ssize_t tcm_loop_tpg_show_transport_status( ...@@ -1020,11 +1014,10 @@ static ssize_t tcm_loop_tpg_show_transport_status(
return ret; return ret;
} }
static ssize_t tcm_loop_tpg_store_transport_status( static ssize_t tcm_loop_tpg_transport_status_store(struct config_item *item,
struct se_portal_group *se_tpg, const char *page, size_t count)
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_tpg = container_of(se_tpg,
struct tcm_loop_tpg, tl_se_tpg); struct tcm_loop_tpg, tl_se_tpg);
...@@ -1044,11 +1037,12 @@ static ssize_t tcm_loop_tpg_store_transport_status( ...@@ -1044,11 +1037,12 @@ static ssize_t tcm_loop_tpg_store_transport_status(
return -EINVAL; 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[] = { static struct configfs_attribute *tcm_loop_tpg_attrs[] = {
&tcm_loop_tpg_nexus.attr, &tcm_loop_tpg_attr_nexus,
&tcm_loop_tpg_transport_status.attr, &tcm_loop_tpg_attr_transport_status,
NULL, NULL,
}; };
...@@ -1216,17 +1210,15 @@ static void tcm_loop_drop_scsi_hba( ...@@ -1216,17 +1210,15 @@ static void tcm_loop_drop_scsi_hba(
} }
/* Start items for tcm_loop_cit */ /* Start items for tcm_loop_cit */
static ssize_t tcm_loop_wwn_show_attr_version( static ssize_t tcm_loop_wwn_version_show(struct config_item *item, char *page)
struct target_fabric_configfs *tf,
char *page)
{ {
return sprintf(page, "TCM Loopback Fabric module %s\n", TCM_LOOP_VERSION); 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[] = { static struct configfs_attribute *tcm_loop_wwn_attrs[] = {
&tcm_loop_wwn_version.attr, &tcm_loop_wwn_attr_version,
NULL, NULL,
}; };
......
...@@ -35,8 +35,6 @@ ...@@ -35,8 +35,6 @@
#include <target/target_core_base.h> #include <target/target_core_base.h>
#include <target/target_core_backend.h> #include <target/target_core_backend.h>
#include <target/target_core_fabric.h> #include <target/target_core_fabric.h>
#include <target/target_core_fabric_configfs.h>
#include <target/configfs_macros.h>
#include <asm/unaligned.h> #include <asm/unaligned.h>
#include "sbp_target.h" #include "sbp_target.h"
...@@ -2111,24 +2109,21 @@ static void sbp_drop_tport(struct se_wwn *wwn) ...@@ -2111,24 +2109,21 @@ static void sbp_drop_tport(struct se_wwn *wwn)
kfree(tport); kfree(tport);
} }
static ssize_t sbp_wwn_show_attr_version( static ssize_t sbp_wwn_version_show(struct config_item *item, char *page)
struct target_fabric_configfs *tf,
char *page)
{ {
return sprintf(page, "FireWire SBP fabric module %s\n", SBP_VERSION); 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[] = { static struct configfs_attribute *sbp_wwn_attrs[] = {
&sbp_wwn_version.attr, &sbp_wwn_attr_version,
NULL, NULL,
}; };
static ssize_t sbp_tpg_show_directory_id( static ssize_t sbp_tpg_directory_id_show(struct config_item *item, char *page)
struct se_portal_group *se_tpg,
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_tpg *tpg = container_of(se_tpg, struct sbp_tpg, se_tpg);
struct sbp_tport *tport = tpg->tport; struct sbp_tport *tport = tpg->tport;
...@@ -2138,11 +2133,10 @@ static ssize_t sbp_tpg_show_directory_id( ...@@ -2138,11 +2133,10 @@ static ssize_t sbp_tpg_show_directory_id(
return sprintf(page, "%06x\n", tport->directory_id); return sprintf(page, "%06x\n", tport->directory_id);
} }
static ssize_t sbp_tpg_store_directory_id( static ssize_t sbp_tpg_directory_id_store(struct config_item *item,
struct se_portal_group *se_tpg, const char *page, size_t count)
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_tpg *tpg = container_of(se_tpg, struct sbp_tpg, se_tpg);
struct sbp_tport *tport = tpg->tport; struct sbp_tport *tport = tpg->tport;
unsigned long val; unsigned long val;
...@@ -2166,20 +2160,18 @@ static ssize_t sbp_tpg_store_directory_id( ...@@ -2166,20 +2160,18 @@ static ssize_t sbp_tpg_store_directory_id(
return count; return count;
} }
static ssize_t sbp_tpg_show_enable( static ssize_t sbp_tpg_enable_show(struct config_item *item, char *page)
struct se_portal_group *se_tpg,
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_tpg *tpg = container_of(se_tpg, struct sbp_tpg, se_tpg);
struct sbp_tport *tport = tpg->tport; struct sbp_tport *tport = tpg->tport;
return sprintf(page, "%d\n", tport->enable); return sprintf(page, "%d\n", tport->enable);
} }
static ssize_t sbp_tpg_store_enable( static ssize_t sbp_tpg_enable_store(struct config_item *item,
struct se_portal_group *se_tpg, const char *page, size_t count)
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_tpg *tpg = container_of(se_tpg, struct sbp_tpg, se_tpg);
struct sbp_tport *tport = tpg->tport; struct sbp_tport *tport = tpg->tport;
unsigned long val; unsigned long val;
...@@ -2219,29 +2211,28 @@ static ssize_t sbp_tpg_store_enable( ...@@ -2219,29 +2211,28 @@ static ssize_t sbp_tpg_store_enable(
return count; return count;
} }
TF_TPG_BASE_ATTR(sbp, directory_id, S_IRUGO | S_IWUSR); CONFIGFS_ATTR(sbp_tpg_, directory_id);
TF_TPG_BASE_ATTR(sbp, enable, S_IRUGO | S_IWUSR); CONFIGFS_ATTR(sbp_tpg_, enable);
static struct configfs_attribute *sbp_tpg_base_attrs[] = { static struct configfs_attribute *sbp_tpg_base_attrs[] = {
&sbp_tpg_directory_id.attr, &sbp_tpg_attr_directory_id,
&sbp_tpg_enable.attr, &sbp_tpg_attr_enable,
NULL, NULL,
}; };
static ssize_t sbp_tpg_attrib_show_mgt_orb_timeout( static ssize_t sbp_tpg_attrib_mgt_orb_timeout_show(struct config_item *item,
struct se_portal_group *se_tpg,
char *page) 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_tpg *tpg = container_of(se_tpg, struct sbp_tpg, se_tpg);
struct sbp_tport *tport = tpg->tport; struct sbp_tport *tport = tpg->tport;
return sprintf(page, "%d\n", tport->mgt_orb_timeout); return sprintf(page, "%d\n", tport->mgt_orb_timeout);
} }
static ssize_t sbp_tpg_attrib_store_mgt_orb_timeout( static ssize_t sbp_tpg_attrib_mgt_orb_timeout_store(struct config_item *item,
struct se_portal_group *se_tpg, const char *page, size_t count)
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_tpg *tpg = container_of(se_tpg, struct sbp_tpg, se_tpg);
struct sbp_tport *tport = tpg->tport; struct sbp_tport *tport = tpg->tport;
unsigned long val; unsigned long val;
...@@ -2264,20 +2255,19 @@ static ssize_t sbp_tpg_attrib_store_mgt_orb_timeout( ...@@ -2264,20 +2255,19 @@ static ssize_t sbp_tpg_attrib_store_mgt_orb_timeout(
return count; return count;
} }
static ssize_t sbp_tpg_attrib_show_max_reconnect_timeout( static ssize_t sbp_tpg_attrib_max_reconnect_timeout_show(struct config_item *item,
struct se_portal_group *se_tpg,
char *page) 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_tpg *tpg = container_of(se_tpg, struct sbp_tpg, se_tpg);
struct sbp_tport *tport = tpg->tport; struct sbp_tport *tport = tpg->tport;
return sprintf(page, "%d\n", tport->max_reconnect_timeout); return sprintf(page, "%d\n", tport->max_reconnect_timeout);
} }
static ssize_t sbp_tpg_attrib_store_max_reconnect_timeout( static ssize_t sbp_tpg_attrib_max_reconnect_timeout_store(struct config_item *item,
struct se_portal_group *se_tpg, const char *page, size_t count)
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_tpg *tpg = container_of(se_tpg, struct sbp_tpg, se_tpg);
struct sbp_tport *tport = tpg->tport; struct sbp_tport *tport = tpg->tport;
unsigned long val; unsigned long val;
...@@ -2300,20 +2290,19 @@ static ssize_t sbp_tpg_attrib_store_max_reconnect_timeout( ...@@ -2300,20 +2290,19 @@ static ssize_t sbp_tpg_attrib_store_max_reconnect_timeout(
return count; return count;
} }
static ssize_t sbp_tpg_attrib_show_max_logins_per_lun( static ssize_t sbp_tpg_attrib_max_logins_per_lun_show(struct config_item *item,
struct se_portal_group *se_tpg,
char *page) 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_tpg *tpg = container_of(se_tpg, struct sbp_tpg, se_tpg);
struct sbp_tport *tport = tpg->tport; struct sbp_tport *tport = tpg->tport;
return sprintf(page, "%d\n", tport->max_logins_per_lun); return sprintf(page, "%d\n", tport->max_logins_per_lun);
} }
static ssize_t sbp_tpg_attrib_store_max_logins_per_lun( static ssize_t sbp_tpg_attrib_max_logins_per_lun_store(struct config_item *item,
struct se_portal_group *se_tpg, const char *page, size_t count)
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_tpg *tpg = container_of(se_tpg, struct sbp_tpg, se_tpg);
struct sbp_tport *tport = tpg->tport; struct sbp_tport *tport = tpg->tport;
unsigned long val; unsigned long val;
...@@ -2330,14 +2319,14 @@ static ssize_t sbp_tpg_attrib_store_max_logins_per_lun( ...@@ -2330,14 +2319,14 @@ static ssize_t sbp_tpg_attrib_store_max_logins_per_lun(
return count; return count;
} }
TF_TPG_ATTRIB_ATTR(sbp, mgt_orb_timeout, S_IRUGO | S_IWUSR); CONFIGFS_ATTR(sbp_tpg_attrib_, mgt_orb_timeout);
TF_TPG_ATTRIB_ATTR(sbp, max_reconnect_timeout, S_IRUGO | S_IWUSR); CONFIGFS_ATTR(sbp_tpg_attrib_, max_reconnect_timeout);
TF_TPG_ATTRIB_ATTR(sbp, max_logins_per_lun, S_IRUGO | S_IWUSR); CONFIGFS_ATTR(sbp_tpg_attrib_, max_logins_per_lun);
static struct configfs_attribute *sbp_tpg_attrib_attrs[] = { static struct configfs_attribute *sbp_tpg_attrib_attrs[] = {
&sbp_tpg_attrib_mgt_orb_timeout.attr, &sbp_tpg_attrib_attr_mgt_orb_timeout,
&sbp_tpg_attrib_max_reconnect_timeout.attr, &sbp_tpg_attrib_attr_max_reconnect_timeout,
&sbp_tpg_attrib_max_logins_per_lun.attr, &sbp_tpg_attrib_attr_max_logins_per_lun,
NULL, NULL,
}; };
......
...@@ -35,8 +35,6 @@ ...@@ -35,8 +35,6 @@
#include <target/target_core_base.h> #include <target/target_core_base.h>
#include <target/target_core_fabric.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_internal.h"
#include "target_core_alua.h" #include "target_core_alua.h"
...@@ -152,17 +150,16 @@ static int target_fabric_mappedlun_unlink( ...@@ -152,17 +150,16 @@ static int target_fabric_mappedlun_unlink(
return core_dev_del_initiator_node_lun_acl(lun, lacl); return core_dev_del_initiator_node_lun_acl(lun, lacl);
} }
CONFIGFS_EATTR_STRUCT(target_fabric_mappedlun, se_lun_acl); static struct se_lun_acl *item_to_lun_acl(struct config_item *item)
#define TCM_MAPPEDLUN_ATTR(_name, _mode) \ {
static struct target_fabric_mappedlun_attribute target_fabric_mappedlun_##_name = \ return container_of(to_config_group(item), struct se_lun_acl,
__CONFIGFS_EATTR(_name, _mode, \ se_lun_group);
target_fabric_mappedlun_show_##_name, \ }
target_fabric_mappedlun_store_##_name);
static ssize_t target_fabric_mappedlun_show_write_protect( static ssize_t target_fabric_mappedlun_write_protect_show(
struct se_lun_acl *lacl, struct config_item *item, char *page)
char *page)
{ {
struct se_lun_acl *lacl = item_to_lun_acl(item);
struct se_node_acl *se_nacl = lacl->se_lun_nacl; struct se_node_acl *se_nacl = lacl->se_lun_nacl;
struct se_dev_entry *deve; struct se_dev_entry *deve;
ssize_t len = 0; ssize_t len = 0;
...@@ -178,11 +175,10 @@ static ssize_t target_fabric_mappedlun_show_write_protect( ...@@ -178,11 +175,10 @@ static ssize_t target_fabric_mappedlun_show_write_protect(
return len; return len;
} }
static ssize_t target_fabric_mappedlun_store_write_protect( static ssize_t target_fabric_mappedlun_write_protect_store(
struct se_lun_acl *lacl, struct config_item *item, const char *page, size_t count)
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_node_acl *se_nacl = lacl->se_lun_nacl;
struct se_portal_group *se_tpg = se_nacl->se_tpg; struct se_portal_group *se_tpg = se_nacl->se_tpg;
unsigned long op; unsigned long op;
...@@ -209,9 +205,12 @@ static ssize_t target_fabric_mappedlun_store_write_protect( ...@@ -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) static void target_fabric_mappedlun_release(struct config_item *item)
{ {
...@@ -222,15 +221,8 @@ 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); 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 = { static struct configfs_item_operations target_fabric_mappedlun_item_ops = {
.release = target_fabric_mappedlun_release, .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, .allow_link = target_fabric_mappedlun_link,
.drop_link = target_fabric_mappedlun_unlink, .drop_link = target_fabric_mappedlun_unlink,
}; };
...@@ -266,49 +258,12 @@ TF_CIT_SETUP(tpg_mappedlun_stat, NULL, &target_fabric_mappedlun_stat_group_ops, ...@@ -266,49 +258,12 @@ TF_CIT_SETUP(tpg_mappedlun_stat, NULL, &target_fabric_mappedlun_stat_group_ops,
/* End of tfc_tpg_mappedlun_port_cit */ /* End of tfc_tpg_mappedlun_port_cit */
/* Start of tfc_tpg_nacl_attrib_cit */ TF_CIT_SETUP_DRV(tpg_nacl_attrib, NULL, NULL);
TF_CIT_SETUP_DRV(tpg_nacl_auth, NULL, NULL);
CONFIGFS_EATTR_OPS(target_fabric_nacl_attrib, se_node_acl, acl_attrib_group); TF_CIT_SETUP_DRV(tpg_nacl_param, NULL, NULL);
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 */
/* Start of tfc_tpg_nacl_base_cit */ /* 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( static struct config_group *target_fabric_make_mappedlun(
struct config_group *group, struct config_group *group,
const char *name) const char *name)
...@@ -438,8 +393,6 @@ static void target_fabric_nacl_base_release(struct config_item *item) ...@@ -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 = { static struct configfs_item_operations target_fabric_nacl_base_item_ops = {
.release = target_fabric_nacl_base_release, .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 = { 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); ...@@ -540,8 +493,6 @@ TF_CIT_SETUP(tpg_nacl, NULL, &target_fabric_nacl_group_ops, NULL);
/* Start of tfc_tpg_np_base_cit */ /* 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) static void target_fabric_np_base_release(struct config_item *item)
{ {
struct se_tpg_np *se_tpg_np = container_of(to_config_group(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) ...@@ -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 = { static struct configfs_item_operations target_fabric_np_base_item_ops = {
.release = target_fabric_np_base_release, .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); 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); ...@@ -610,132 +559,113 @@ TF_CIT_SETUP(tpg_np, NULL, &target_fabric_np_group_ops, NULL);
/* Start of tfc_tpg_port_cit */ /* Start of tfc_tpg_port_cit */
CONFIGFS_EATTR_STRUCT(target_fabric_port, se_lun); static struct se_lun *item_to_lun(struct config_item *item)
#define TCM_PORT_ATTR(_name, _mode) \ {
static struct target_fabric_port_attribute target_fabric_port_##_name = \ return container_of(to_config_group(item), struct se_lun,
__CONFIGFS_EATTR(_name, _mode, \ lun_group);
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 ssize_t target_fabric_port_alua_tg_pt_gp_show(struct config_item *item,
* alua_tg_pt_gp char *page)
*/
static ssize_t target_fabric_port_show_attr_alua_tg_pt_gp(
struct se_lun *lun,
char *page)
{ {
struct se_lun *lun = item_to_lun(item);
if (!lun || !lun->lun_se_dev) if (!lun || !lun->lun_se_dev)
return -ENODEV; return -ENODEV;
return core_alua_show_tg_pt_gp_info(lun, page); return core_alua_show_tg_pt_gp_info(lun, page);
} }
static ssize_t target_fabric_port_store_attr_alua_tg_pt_gp( static ssize_t target_fabric_port_alua_tg_pt_gp_store(struct config_item *item,
struct se_lun *lun, const char *page, size_t count)
const char *page,
size_t count)
{ {
struct se_lun *lun = item_to_lun(item);
if (!lun || !lun->lun_se_dev) if (!lun || !lun->lun_se_dev)
return -ENODEV; return -ENODEV;
return core_alua_store_tg_pt_gp_info(lun, page, count); return core_alua_store_tg_pt_gp_info(lun, page, count);
} }
TCM_PORT_ATTR(alua_tg_pt_gp, S_IRUGO | S_IWUSR); static ssize_t target_fabric_port_alua_tg_pt_offline_show(
struct config_item *item, char *page)
/*
* alua_tg_pt_offline
*/
static ssize_t target_fabric_port_show_attr_alua_tg_pt_offline(
struct se_lun *lun,
char *page)
{ {
struct se_lun *lun = item_to_lun(item);
if (!lun || !lun->lun_se_dev) if (!lun || !lun->lun_se_dev)
return -ENODEV; return -ENODEV;
return core_alua_show_offline_bit(lun, page); return core_alua_show_offline_bit(lun, page);
} }
static ssize_t target_fabric_port_store_attr_alua_tg_pt_offline( static ssize_t target_fabric_port_alua_tg_pt_offline_store(
struct se_lun *lun, struct config_item *item, const char *page, size_t count)
const char *page,
size_t count)
{ {
struct se_lun *lun = item_to_lun(item);
if (!lun || !lun->lun_se_dev) if (!lun || !lun->lun_se_dev)
return -ENODEV; return -ENODEV;
return core_alua_store_offline_bit(lun, page, count); return core_alua_store_offline_bit(lun, page, count);
} }
TCM_PORT_ATTR(alua_tg_pt_offline, S_IRUGO | S_IWUSR); static ssize_t target_fabric_port_alua_tg_pt_status_show(
struct config_item *item, char *page)
/*
* alua_tg_pt_status
*/
static ssize_t target_fabric_port_show_attr_alua_tg_pt_status(
struct se_lun *lun,
char *page)
{ {
struct se_lun *lun = item_to_lun(item);
if (!lun || !lun->lun_se_dev) if (!lun || !lun->lun_se_dev)
return -ENODEV; return -ENODEV;
return core_alua_show_secondary_status(lun, page); return core_alua_show_secondary_status(lun, page);
} }
static ssize_t target_fabric_port_store_attr_alua_tg_pt_status( static ssize_t target_fabric_port_alua_tg_pt_status_store(
struct se_lun *lun, struct config_item *item, const char *page, size_t count)
const char *page,
size_t count)
{ {
struct se_lun *lun = item_to_lun(item);
if (!lun || !lun->lun_se_dev) if (!lun || !lun->lun_se_dev)
return -ENODEV; return -ENODEV;
return core_alua_store_secondary_status(lun, page, count); return core_alua_store_secondary_status(lun, page, count);
} }
TCM_PORT_ATTR(alua_tg_pt_status, S_IRUGO | S_IWUSR); static ssize_t target_fabric_port_alua_tg_pt_write_md_show(
struct config_item *item, char *page)
/*
* alua_tg_pt_write_md
*/
static ssize_t target_fabric_port_show_attr_alua_tg_pt_write_md(
struct se_lun *lun,
char *page)
{ {
struct se_lun *lun = item_to_lun(item);
if (!lun || !lun->lun_se_dev) if (!lun || !lun->lun_se_dev)
return -ENODEV; return -ENODEV;
return core_alua_show_secondary_write_metadata(lun, page); return core_alua_show_secondary_write_metadata(lun, page);
} }
static ssize_t target_fabric_port_store_attr_alua_tg_pt_write_md( static ssize_t target_fabric_port_alua_tg_pt_write_md_store(
struct se_lun *lun, struct config_item *item, const char *page, size_t count)
const char *page,
size_t count)
{ {
struct se_lun *lun = item_to_lun(item);
if (!lun || !lun->lun_se_dev) if (!lun || !lun->lun_se_dev)
return -ENODEV; return -ENODEV;
return core_alua_store_secondary_write_metadata(lun, page, count); 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[] = { static struct configfs_attribute *target_fabric_port_attrs[] = {
&target_fabric_port_alua_tg_pt_gp.attr, &target_fabric_port_attr_alua_tg_pt_gp,
&target_fabric_port_alua_tg_pt_offline.attr, &target_fabric_port_attr_alua_tg_pt_offline,
&target_fabric_port_alua_tg_pt_status.attr, &target_fabric_port_attr_alua_tg_pt_status,
&target_fabric_port_alua_tg_pt_write_md.attr, &target_fabric_port_attr_alua_tg_pt_write_md,
NULL, NULL,
}; };
CONFIGFS_EATTR_OPS(target_fabric_port, se_lun, lun_group);
static int target_fabric_port_link( static int target_fabric_port_link(
struct config_item *lun_ci, struct config_item *lun_ci,
struct config_item *se_dev_ci) struct config_item *se_dev_ci)
...@@ -821,8 +751,6 @@ static void target_fabric_port_release(struct config_item *item) ...@@ -821,8 +751,6 @@ static void target_fabric_port_release(struct config_item *item)
} }
static struct configfs_item_operations target_fabric_port_item_ops = { 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, .release = target_fabric_port_release,
.allow_link = target_fabric_port_link, .allow_link = target_fabric_port_link,
.drop_link = target_fabric_port_unlink, .drop_link = target_fabric_port_unlink,
...@@ -952,50 +880,11 @@ TF_CIT_SETUP(tpg_lun, NULL, &target_fabric_lun_group_ops, NULL); ...@@ -952,50 +880,11 @@ TF_CIT_SETUP(tpg_lun, NULL, &target_fabric_lun_group_ops, NULL);
/* End of tfc_tpg_lun_cit */ /* End of tfc_tpg_lun_cit */
/* Start of tfc_tpg_attrib_cit */ TF_CIT_SETUP_DRV(tpg_attrib, NULL, NULL);
TF_CIT_SETUP_DRV(tpg_auth, NULL, NULL);
CONFIGFS_EATTR_OPS(target_fabric_tpg_attrib, se_portal_group, tpg_attrib_group); TF_CIT_SETUP_DRV(tpg_param, NULL, NULL);
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 */
/* Start of tfc_tpg_base_cit */ /* 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) static void target_fabric_tpg_release(struct config_item *item)
{ {
...@@ -1009,8 +898,6 @@ 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 = { static struct configfs_item_operations target_fabric_tpg_base_item_ops = {
.release = target_fabric_tpg_release, .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); 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 = { ...@@ -1176,33 +1063,9 @@ static struct configfs_group_operations target_fabric_wwn_group_ops = {
.make_group = target_fabric_make_wwn, .make_group = target_fabric_make_wwn,
.drop_item = target_fabric_drop_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) int target_fabric_setup_cits(struct target_fabric_configfs *tf)
{ {
......
...@@ -87,6 +87,9 @@ void target_free_device(struct se_device *); ...@@ -87,6 +87,9 @@ void target_free_device(struct se_device *);
/* target_core_configfs.c */ /* target_core_configfs.c */
void target_setup_backend_cits(struct target_backend *); 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 */ /* target_core_fabric_lib.c */
int target_get_pr_transport_id_len(struct se_node_acl *nacl, int target_get_pr_transport_id_len(struct se_node_acl *nacl,
struct t10_pr_registration *pr_reg, int *format_code); struct t10_pr_registration *pr_reg, int *format_code);
......
此差异已折叠。
...@@ -36,7 +36,6 @@ ...@@ -36,7 +36,6 @@
#include <target/target_core_base.h> #include <target/target_core_base.h>
#include <target/target_core_fabric.h> #include <target/target_core_fabric.h>
#include <target/configfs_macros.h>
#include "tcm_fc.h" #include "tcm_fc.h"
......
此差异已折叠。
...@@ -44,7 +44,6 @@ ...@@ -44,7 +44,6 @@
#include <target/target_core_base.h> #include <target/target_core_base.h>
#include <target/target_core_fabric.h> #include <target/target_core_fabric.h>
#include <target/configfs_macros.h>
#include "tcm_fc.h" #include "tcm_fc.h"
......
...@@ -36,7 +36,6 @@ ...@@ -36,7 +36,6 @@
#include <target/target_core_base.h> #include <target/target_core_base.h>
#include <target/target_core_fabric.h> #include <target/target_core_fabric.h>
#include <target/configfs_macros.h>
#include "tcm_fc.h" #include "tcm_fc.h"
......
此差异已折叠。
此差异已折叠。
...@@ -838,10 +838,10 @@ USB_ETHERNET_CONFIGFS_ITEM_ATTR_QMULT(ecm); ...@@ -838,10 +838,10 @@ USB_ETHERNET_CONFIGFS_ITEM_ATTR_QMULT(ecm);
USB_ETHERNET_CONFIGFS_ITEM_ATTR_IFNAME(ecm); USB_ETHERNET_CONFIGFS_ITEM_ATTR_IFNAME(ecm);
static struct configfs_attribute *ecm_attrs[] = { static struct configfs_attribute *ecm_attrs[] = {
&f_ecm_opts_dev_addr.attr, &ecm_opts_attr_dev_addr,
&f_ecm_opts_host_addr.attr, &ecm_opts_attr_host_addr,
&f_ecm_opts_qmult.attr, &ecm_opts_attr_qmult,
&f_ecm_opts_ifname.attr, &ecm_opts_attr_ifname,
NULL, NULL,
}; };
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
...@@ -70,4 +70,10 @@ config SAMPLE_LIVEPATCH ...@@ -70,4 +70,10 @@ config SAMPLE_LIVEPATCH
Builds a sample live patch that replaces the procfs handler Builds a sample live patch that replaces the procfs handler
for /proc/cmdline to print "this has been live patched". 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 endif # SAMPLES
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册