From: Nathan Lynch <nathanl@austin.ibm.com>
To: Greg KH <greg@kroah.com>
Cc: lkml <linux-kernel@vger.kernel.org>
Subject: [RFC/PATCH] add support for sysdev class attributes
Date: Fri, 07 Jan 2005 16:28:12 -0600 [thread overview]
Message-ID: <1105136891.13391.20.camel@pants.austin.ibm.com> (raw)
Hi Greg,
Would you consider a patch such as the one below which adds support for
sysdev class attributes? I would like to have this for doing cpu add
and remove on ppc64 (for "probing" and removing cpus on partitioned
machines). I think the memory hotplug people probably will want it,
too, eventually.
Signed-off-by: Nathan Lynch <nathanl@austin.ibm.com>
---
diff -puN drivers/base/sys.c~sysdev_class-attr-support drivers/base/sys.c
--- linux-2.6.10-bk10/drivers/base/sys.c~sysdev_class-attr-support 2005-01-07 16:17:11.000000000 -0600
+++ linux-2.6.10-bk10-nathanl/drivers/base/sys.c 2005-01-07 16:17:11.000000000 -0600
@@ -76,6 +76,41 @@ void sysdev_remove_file(struct sys_devic
EXPORT_SYMBOL_GPL(sysdev_create_file);
EXPORT_SYMBOL_GPL(sysdev_remove_file);
+#define to_sysdev_class(k) container_of(to_kset(k), struct sysdev_class, kset)
+#define to_sysdev_class_attr(a) container_of(a, struct sysdev_class_attribute, attr)
+
+static ssize_t
+sysdev_class_show(struct kobject * kobj, struct attribute * attr, char * buffer)
+{
+ struct sysdev_class * sysdev_class = to_sysdev_class(kobj);
+ struct sysdev_class_attribute * sysdev_class_attr = to_sysdev_class_attr(attr);
+
+ if (sysdev_class_attr->show)
+ return sysdev_class_attr->show(sysdev_class, buffer);
+ return 0;
+}
+
+static ssize_t
+sysdev_class_store(struct kobject * kobj, struct attribute * attr,
+ const char * buffer, size_t count)
+{
+ struct sysdev_class * sysdev_class = to_sysdev_class(kobj);
+ struct sysdev_class_attribute * sysdev_class_attr = to_sysdev_class_attr(attr);
+
+ if (sysdev_class_attr->store)
+ return sysdev_class_attr->store(sysdev_class, buffer, count);
+ return 0;
+}
+
+static struct sysfs_ops sysdev_class_sysfs_ops = {
+ .show = sysdev_class_show,
+ .store = sysdev_class_store,
+};
+
+static struct kobj_type sysdev_class_ktype = {
+ .sysfs_ops = &sysdev_class_sysfs_ops,
+};
+
/*
* declare system_subsys
*/
@@ -88,6 +123,12 @@ int sysdev_class_register(struct sysdev_
INIT_LIST_HEAD(&cls->drivers);
cls->kset.subsys = &system_subsys;
kset_set_kset_s(cls, system_subsys);
+
+ /* I'm not going to claim to understand this; see
+ * fs/sysfs/file::check_perm for how sysfs_ops are selected
+ */
+ cls->kset.kobj.ktype = &sysdev_class_ktype;
+
return kset_register(&cls->kset);
}
@@ -98,6 +139,19 @@ void sysdev_class_unregister(struct sysd
kset_unregister(&cls->kset);
}
+int sysdev_class_create_file(struct sysdev_class *s, struct sysdev_class_attribute *a)
+{
+ return sysfs_create_file(&s->kset.kobj, &a->attr);
+}
+
+
+void sysdev_class_remove_file(struct sysdev_class *s, struct sysdev_class_attribute *a)
+{
+ sysfs_remove_file(&s->kset.kobj, &a->attr);
+}
+
+EXPORT_SYMBOL_GPL(sysdev_class_create_file);
+EXPORT_SYMBOL_GPL(sysdev_class_remove_file);
EXPORT_SYMBOL_GPL(sysdev_class_register);
EXPORT_SYMBOL_GPL(sysdev_class_unregister);
diff -puN include/linux/sysdev.h~sysdev_class-attr-support include/linux/sysdev.h
--- linux-2.6.10-bk10/include/linux/sysdev.h~sysdev_class-attr-support 2005-01-07 16:17:11.000000000 -0600
+++ linux-2.6.10-bk10-nathanl/include/linux/sysdev.h 2005-01-07 16:18:02.000000000 -0600
@@ -40,6 +40,21 @@ struct sysdev_class {
extern int sysdev_class_register(struct sysdev_class *);
extern void sysdev_class_unregister(struct sysdev_class *);
+struct sysdev_class_attribute {
+ struct attribute attr;
+ ssize_t (*show)(struct sysdev_class *, char *);
+ ssize_t (*store)(struct sysdev_class *, const char *, size_t);
+};
+
+#define SYSDEV_CLASS_ATTR(_name,_mode,_show,_store) \
+struct sysdev_class_attribute attr_##_name = { \
+ .attr = {.name = __stringify(_name), .mode = _mode }, \
+ .show = _show, \
+ .store = _store, \
+};
+
+extern int sysdev_class_create_file(struct sysdev_class *, struct sysdev_class_attribute *);
+extern void sysdev_class_remove_file(struct sysdev_class *, struct sysdev_class_attribute *);
/**
* Auxillary system device drivers.
_
next reply other threads:[~2005-01-07 22:38 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-01-07 22:28 Nathan Lynch [this message]
2005-01-08 5:07 ` [RFC/PATCH] add support for sysdev class attributes Greg KH
2005-01-10 15:58 ` Nathan Lynch
2005-01-11 19:29 ` Greg KH
2005-01-18 4:02 ` Nathan Lynch
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=1105136891.13391.20.camel@pants.austin.ibm.com \
--to=nathanl@austin.ibm.com \
--cc=greg@kroah.com \
--cc=linux-kernel@vger.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).