All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stefan Achatz <stefan_achatz@web.de>
To: Greg Kroah-Hartman <gregkh@suse.de>,
	"Eric W. Biederman" <ebiederm@aristanetworks.com>,
	"Serge E. Hallyn" <serue@us.ibm.com>, Tejun Heo <tj@kernel.org>,
	Jiri Kosina <jkosina@suse.cz>
Subject: [PATCH 1/2] sysfs: Introducing sysfs_create_bin_group()
Date: Fri, 12 Nov 2010 19:18:38 +0100	[thread overview]
Message-ID: <1289585918.2629.12.camel@neuromancer> (raw)

Implemented group functions for easier creation of multiple binary sysfs
attributes similar to existing attribute_group handling functions.
The code reuses struct attribute_group instead of inventing a new struct
binary_attribute_group.

Signed-off-by: Stefan Achatz <erazor_de@users.sourceforge.net>
---
 fs/sysfs/group.c      |   76 ++++++++++++++++++++++++++++++++++++------------
 include/linux/sysfs.h |   11 +++++++
 2 files changed, 68 insertions(+), 19 deletions(-)

diff --git a/fs/sysfs/group.c b/fs/sysfs/group.c
index 442f34f..841baed 100644
--- a/fs/sysfs/group.c
+++ b/fs/sysfs/group.c
@@ -27,7 +27,7 @@ static void remove_files(struct sysfs_dirent *dir_sd, struct kobject *kobj,
 }
 
 static int create_files(struct sysfs_dirent *dir_sd, struct kobject *kobj,
-			const struct attribute_group *grp, int update)
+			const struct attribute_group *grp, int update, int type)
 {
 	struct attribute *const* attr;
 	int error = 0, i;
@@ -45,7 +45,7 @@ static int create_files(struct sysfs_dirent *dir_sd, struct kobject *kobj,
 			if (!mode)
 				continue;
 		}
-		error = sysfs_add_file_mode(dir_sd, *attr, SYSFS_KOBJ_ATTR,
+		error = sysfs_add_file_mode(dir_sd, *attr, type,
 					    (*attr)->mode | mode);
 		if (unlikely(error))
 			break;
@@ -57,7 +57,7 @@ static int create_files(struct sysfs_dirent *dir_sd, struct kobject *kobj,
 
 
 static int internal_create_group(struct kobject *kobj, int update,
-				 const struct attribute_group *grp)
+				 const struct attribute_group *grp, int type)
 {
 	struct sysfs_dirent *sd;
 	int error;
@@ -75,7 +75,7 @@ static int internal_create_group(struct kobject *kobj, int update,
 	} else
 		sd = kobj->sd;
 	sysfs_get(sd);
-	error = create_files(sd, kobj, grp, update);
+	error = create_files(sd, kobj, grp, update, type);
 	if (error) {
 		if (grp->name)
 			sysfs_remove_subdir(sd);
@@ -97,9 +97,16 @@ static int internal_create_group(struct kobject *kobj, int update,
 int sysfs_create_group(struct kobject *kobj,
 		       const struct attribute_group *grp)
 {
-	return internal_create_group(kobj, 0, grp);
+	return internal_create_group(kobj, 0, grp, SYSFS_KOBJ_ATTR);
 }
 
+int sysfs_create_bin_group(struct kobject *kobj,
+			   const struct attribute_group *grp)
+{
+	return internal_create_group(kobj, 0, grp, SYSFS_KOBJ_BIN_ATTR);
+}
+EXPORT_SYMBOL_GPL(sysfs_create_bin_group);
+
 /**
  * sysfs_update_group - given a directory kobject, create an attribute group
  * @kobj:	The kobject to create the group on
@@ -120,10 +127,15 @@ int sysfs_create_group(struct kobject *kobj,
 int sysfs_update_group(struct kobject *kobj,
 		       const struct attribute_group *grp)
 {
-	return internal_create_group(kobj, 1, grp);
+	return internal_create_group(kobj, 1, grp, SYSFS_KOBJ_ATTR);
 }
 
-
+int sysfs_update_bin_group(struct kobject *kobj,
+			   const struct attribute_group *grp)
+{
+	return internal_create_group(kobj, 1, grp, SYSFS_KOBJ_BIN_ATTR);
+}
+EXPORT_SYMBOL_GPL(sysfs_update_bin_group);
 
 void sysfs_remove_group(struct kobject * kobj, 
 			const struct attribute_group * grp)
@@ -148,17 +160,15 @@ void sysfs_remove_group(struct kobject * kobj,
 	sysfs_put(sd);
 }
 
-/**
- * sysfs_merge_group - merge files into a pre-existing attribute group.
- * @kobj:	The kobject containing the group.
- * @grp:	The files to create and the attribute group they belong to.
- *
- * This function returns an error if the group doesn't exist or any of the
- * files already exist in that group, in which case none of the new files
- * are created.
- */
-int sysfs_merge_group(struct kobject *kobj,
-		       const struct attribute_group *grp)
+void sysfs_remove_bin_group(struct kobject * kobj,
+			    const struct attribute_group * grp)
+{
+	sysfs_remove_group(kobj, grp);
+}
+EXPORT_SYMBOL_GPL(sysfs_remove_bin_group);
+
+int internal_merge_group(struct kobject *kobj,
+		       const struct attribute_group *grp, int type)
 {
 	struct sysfs_dirent *dir_sd;
 	int error = 0;
@@ -173,7 +183,7 @@ int sysfs_merge_group(struct kobject *kobj,
 		return -ENOENT;
 
 	for ((i = 0, attr = grp->attrs); *attr && !error; (++i, ++attr))
-		error = sysfs_add_file(dir_sd, *attr, SYSFS_KOBJ_ATTR);
+		error = sysfs_add_file(dir_sd, *attr, type);
 	if (error) {
 		while (--i >= 0)
 			sysfs_hash_and_remove(dir_sd, NULL, (*--attr)->name);
@@ -182,8 +192,30 @@ int sysfs_merge_group(struct kobject *kobj,
 
 	return error;
 }
+
+/**
+ * sysfs_merge_group - merge files into a pre-existing attribute group.
+ * @kobj:	The kobject containing the group.
+ * @grp:	The files to create and the attribute group they belong to.
+ *
+ * This function returns an error if the group doesn't exist or any of the
+ * files already exist in that group, in which case none of the new files
+ * are created.
+ */
+int sysfs_merge_group(struct kobject *kobj,
+		       const struct attribute_group *grp)
+{
+	return internal_merge_group(kobj, grp, SYSFS_KOBJ_ATTR);
+}
 EXPORT_SYMBOL_GPL(sysfs_merge_group);
 
+int sysfs_merge_bin_group(struct kobject *kobj,
+			  const struct attribute_group *grp)
+{
+	return internal_merge_group(kobj, grp, SYSFS_KOBJ_BIN_ATTR);
+}
+EXPORT_SYMBOL_GPL(sysfs_merge_bin_group);
+
 /**
  * sysfs_unmerge_group - remove files from a pre-existing attribute group.
  * @kobj:	The kobject containing the group.
@@ -207,6 +239,12 @@ void sysfs_unmerge_group(struct kobject *kobj,
 }
 EXPORT_SYMBOL_GPL(sysfs_unmerge_group);
 
+void sysfs_unmerge_bin_group(struct kobject *kobj,
+			     const struct attribute_group *grp)
+{
+	sysfs_unmerge_group(kobj, grp);
+}
+EXPORT_SYMBOL_GPL(sysfs_unmerge_bin_group);
 
 EXPORT_SYMBOL_GPL(sysfs_create_group);
 EXPORT_SYMBOL_GPL(sysfs_update_group);
diff --git a/include/linux/sysfs.h b/include/linux/sysfs.h
index 30b8815..653b0b0 100644
--- a/include/linux/sysfs.h
+++ b/include/linux/sysfs.h
@@ -169,6 +169,17 @@ int sysfs_merge_group(struct kobject *kobj,
 void sysfs_unmerge_group(struct kobject *kobj,
 		       const struct attribute_group *grp);
 
+int sysfs_create_bin_group(struct kobject *kobj,
+			   const struct attribute_group *grp);
+int sysfs_update_bin_group(struct kobject *kobj,
+			   const struct attribute_group *grp);
+void sysfs_remove_bin_group(struct kobject * kobj,
+			const struct attribute_group * grp);
+int sysfs_merge_bin_group(struct kobject *kobj,
+		       const struct attribute_group *grp);
+void sysfs_unmerge_bin_group(struct kobject *kobj,
+		       const struct attribute_group *grp);
+
 void sysfs_notify(struct kobject *kobj, const char *dir, const char *attr);
 void sysfs_notify_dirent(struct sysfs_dirent *sd);
 struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd,
-- 
1.7.2.3




WARNING: multiple messages have this Message-ID (diff)
From: Stefan Achatz <stefan_achatz@web.de>
To: Greg Kroah-Hartman <gregkh@suse.de>,
	"Eric W. Biederman" <ebiederm@aristanetworks.com>,
	"Serge E. Hallyn" <serue@us.ibm.com>, Tejun Heo <tj@kernel.org>,
	Jiri Kosina <jkosina@suse.cz>,
	linux-input@vger.kernel.org, linux-kernel@vger.kernel.org,
	Dmitry Torokhov <dmitry.torokhov@gmail.com>,
	Benjamin Thery <benjamin.thery@bull.net>
Subject: [PATCH 1/2] sysfs: Introducing sysfs_create_bin_group()
Date: Fri, 12 Nov 2010 19:18:38 +0100	[thread overview]
Message-ID: <1289585918.2629.12.camel@neuromancer> (raw)

Implemented group functions for easier creation of multiple binary sysfs
attributes similar to existing attribute_group handling functions.
The code reuses struct attribute_group instead of inventing a new struct
binary_attribute_group.

Signed-off-by: Stefan Achatz <erazor_de@users.sourceforge.net>
---
 fs/sysfs/group.c      |   76 ++++++++++++++++++++++++++++++++++++------------
 include/linux/sysfs.h |   11 +++++++
 2 files changed, 68 insertions(+), 19 deletions(-)

diff --git a/fs/sysfs/group.c b/fs/sysfs/group.c
index 442f34f..841baed 100644
--- a/fs/sysfs/group.c
+++ b/fs/sysfs/group.c
@@ -27,7 +27,7 @@ static void remove_files(struct sysfs_dirent *dir_sd, struct kobject *kobj,
 }
 
 static int create_files(struct sysfs_dirent *dir_sd, struct kobject *kobj,
-			const struct attribute_group *grp, int update)
+			const struct attribute_group *grp, int update, int type)
 {
 	struct attribute *const* attr;
 	int error = 0, i;
@@ -45,7 +45,7 @@ static int create_files(struct sysfs_dirent *dir_sd, struct kobject *kobj,
 			if (!mode)
 				continue;
 		}
-		error = sysfs_add_file_mode(dir_sd, *attr, SYSFS_KOBJ_ATTR,
+		error = sysfs_add_file_mode(dir_sd, *attr, type,
 					    (*attr)->mode | mode);
 		if (unlikely(error))
 			break;
@@ -57,7 +57,7 @@ static int create_files(struct sysfs_dirent *dir_sd, struct kobject *kobj,
 
 
 static int internal_create_group(struct kobject *kobj, int update,
-				 const struct attribute_group *grp)
+				 const struct attribute_group *grp, int type)
 {
 	struct sysfs_dirent *sd;
 	int error;
@@ -75,7 +75,7 @@ static int internal_create_group(struct kobject *kobj, int update,
 	} else
 		sd = kobj->sd;
 	sysfs_get(sd);
-	error = create_files(sd, kobj, grp, update);
+	error = create_files(sd, kobj, grp, update, type);
 	if (error) {
 		if (grp->name)
 			sysfs_remove_subdir(sd);
@@ -97,9 +97,16 @@ static int internal_create_group(struct kobject *kobj, int update,
 int sysfs_create_group(struct kobject *kobj,
 		       const struct attribute_group *grp)
 {
-	return internal_create_group(kobj, 0, grp);
+	return internal_create_group(kobj, 0, grp, SYSFS_KOBJ_ATTR);
 }
 
+int sysfs_create_bin_group(struct kobject *kobj,
+			   const struct attribute_group *grp)
+{
+	return internal_create_group(kobj, 0, grp, SYSFS_KOBJ_BIN_ATTR);
+}
+EXPORT_SYMBOL_GPL(sysfs_create_bin_group);
+
 /**
  * sysfs_update_group - given a directory kobject, create an attribute group
  * @kobj:	The kobject to create the group on
@@ -120,10 +127,15 @@ int sysfs_create_group(struct kobject *kobj,
 int sysfs_update_group(struct kobject *kobj,
 		       const struct attribute_group *grp)
 {
-	return internal_create_group(kobj, 1, grp);
+	return internal_create_group(kobj, 1, grp, SYSFS_KOBJ_ATTR);
 }
 
-
+int sysfs_update_bin_group(struct kobject *kobj,
+			   const struct attribute_group *grp)
+{
+	return internal_create_group(kobj, 1, grp, SYSFS_KOBJ_BIN_ATTR);
+}
+EXPORT_SYMBOL_GPL(sysfs_update_bin_group);
 
 void sysfs_remove_group(struct kobject * kobj, 
 			const struct attribute_group * grp)
@@ -148,17 +160,15 @@ void sysfs_remove_group(struct kobject * kobj,
 	sysfs_put(sd);
 }
 
-/**
- * sysfs_merge_group - merge files into a pre-existing attribute group.
- * @kobj:	The kobject containing the group.
- * @grp:	The files to create and the attribute group they belong to.
- *
- * This function returns an error if the group doesn't exist or any of the
- * files already exist in that group, in which case none of the new files
- * are created.
- */
-int sysfs_merge_group(struct kobject *kobj,
-		       const struct attribute_group *grp)
+void sysfs_remove_bin_group(struct kobject * kobj,
+			    const struct attribute_group * grp)
+{
+	sysfs_remove_group(kobj, grp);
+}
+EXPORT_SYMBOL_GPL(sysfs_remove_bin_group);
+
+int internal_merge_group(struct kobject *kobj,
+		       const struct attribute_group *grp, int type)
 {
 	struct sysfs_dirent *dir_sd;
 	int error = 0;
@@ -173,7 +183,7 @@ int sysfs_merge_group(struct kobject *kobj,
 		return -ENOENT;
 
 	for ((i = 0, attr = grp->attrs); *attr && !error; (++i, ++attr))
-		error = sysfs_add_file(dir_sd, *attr, SYSFS_KOBJ_ATTR);
+		error = sysfs_add_file(dir_sd, *attr, type);
 	if (error) {
 		while (--i >= 0)
 			sysfs_hash_and_remove(dir_sd, NULL, (*--attr)->name);
@@ -182,8 +192,30 @@ int sysfs_merge_group(struct kobject *kobj,
 
 	return error;
 }
+
+/**
+ * sysfs_merge_group - merge files into a pre-existing attribute group.
+ * @kobj:	The kobject containing the group.
+ * @grp:	The files to create and the attribute group they belong to.
+ *
+ * This function returns an error if the group doesn't exist or any of the
+ * files already exist in that group, in which case none of the new files
+ * are created.
+ */
+int sysfs_merge_group(struct kobject *kobj,
+		       const struct attribute_group *grp)
+{
+	return internal_merge_group(kobj, grp, SYSFS_KOBJ_ATTR);
+}
 EXPORT_SYMBOL_GPL(sysfs_merge_group);
 
+int sysfs_merge_bin_group(struct kobject *kobj,
+			  const struct attribute_group *grp)
+{
+	return internal_merge_group(kobj, grp, SYSFS_KOBJ_BIN_ATTR);
+}
+EXPORT_SYMBOL_GPL(sysfs_merge_bin_group);
+
 /**
  * sysfs_unmerge_group - remove files from a pre-existing attribute group.
  * @kobj:	The kobject containing the group.
@@ -207,6 +239,12 @@ void sysfs_unmerge_group(struct kobject *kobj,
 }
 EXPORT_SYMBOL_GPL(sysfs_unmerge_group);
 
+void sysfs_unmerge_bin_group(struct kobject *kobj,
+			     const struct attribute_group *grp)
+{
+	sysfs_unmerge_group(kobj, grp);
+}
+EXPORT_SYMBOL_GPL(sysfs_unmerge_bin_group);
 
 EXPORT_SYMBOL_GPL(sysfs_create_group);
 EXPORT_SYMBOL_GPL(sysfs_update_group);
diff --git a/include/linux/sysfs.h b/include/linux/sysfs.h
index 30b8815..653b0b0 100644
--- a/include/linux/sysfs.h
+++ b/include/linux/sysfs.h
@@ -169,6 +169,17 @@ int sysfs_merge_group(struct kobject *kobj,
 void sysfs_unmerge_group(struct kobject *kobj,
 		       const struct attribute_group *grp);
 
+int sysfs_create_bin_group(struct kobject *kobj,
+			   const struct attribute_group *grp);
+int sysfs_update_bin_group(struct kobject *kobj,
+			   const struct attribute_group *grp);
+void sysfs_remove_bin_group(struct kobject * kobj,
+			const struct attribute_group * grp);
+int sysfs_merge_bin_group(struct kobject *kobj,
+		       const struct attribute_group *grp);
+void sysfs_unmerge_bin_group(struct kobject *kobj,
+		       const struct attribute_group *grp);
+
 void sysfs_notify(struct kobject *kobj, const char *dir, const char *attr);
 void sysfs_notify_dirent(struct sysfs_dirent *sd);
 struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd,
-- 
1.7.2.3




             reply	other threads:[~2010-11-12 18:18 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-11-12 18:18 Stefan Achatz [this message]
2010-11-12 18:18 ` [PATCH 1/2] sysfs: Introducing sysfs_create_bin_group() Stefan Achatz
2010-11-12 18:57 ` Dmitry Torokhov
2010-11-12 19:29 ` Greg KH
2010-11-12 19:38   ` Dmitry Torokhov
2010-11-12 19:50     ` Greg KH
2010-11-12 20:02       ` Dmitry Torokhov
2010-11-15 13:49         ` Jiri Kosina
2010-11-15 13:51           ` Jiri Kosina

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1289585918.2629.12.camel@neuromancer \
    --to=stefan_achatz@web.de \
    --cc=ebiederm@aristanetworks.com \
    --cc=gregkh@suse.de \
    --cc=jkosina@suse.cz \
    --cc=serue@us.ibm.com \
    --cc=tj@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.