Due to the low level nature of these patches, and because they touch so
many different parts of the kernel, a number of the subsystem
maintainers have asked me to get them in first to make merging other
trees easier.Here are a pretty large number of kobject, documentation, and driver
core patches against your 2.6.24 git tree.They can be broken down into these major areas:
- Documentation updates (language translations and fixes, as
well as kobject and kset documenatation updates.)
- major kset/kobject/ktype rework and fixes. This cleans up the
kset and kobject and ktype relationship and architecture,
making sense of things now, and good documenation and samples
are provided for others to use. Also the attributes for
kobjects are much easier to handle now. This cleaned up a LOT
of code all through the kernel, making kobjects easier to use
if you want to.
- struct bus_type has been reworked to now handle the lifetime
rules properly, as the kobject is properly dynamic.
- struct driver has also been reworked, and now the lifetime
issues are resolved.
- the block subsystem has been converted to use struct device
now, and not "raw" kobjects. This patch has been in the -mm
tree for over a year now, and finally all the issues are
worked out with it. Older distros now properly work with new
kernels, and no userspace updates are needed at all.
- nozomi driver is added. This has also been in -mm for a long
time, and many people have asked for it to go in. It is now
in good enough shape to do so.
- lots of class_device conversions to use struct device instead.
The tree is almost all cleaned up now, only SCSI and IB is the
remaining code to fix up...Please pull from:
master.kernel.org:/pub/scm/linux/kernel/git/gregkh/driver-2.6.git/All of these patches have been in the -mm tree for a number of months.
Patches will be sent as a follow-on to this message to lkml for people
to see.thanks,
greg k-h
------...
I've merged it all, but it causes lots of scary warnings:
- from the purely broken ones:
ehci_hcd: no version for "struct_module" found: kernel tainted.
- to the scary ones:
sysfs: duplicate filename 'ehci_hcd' can not be created
WARNING: at fs/sysfs/dir.c:424 sysfs_add_one()
Pid: 610, comm: insmod Tainted: GF 2.6.24-gb47711bf #28Call Trace:
[<ffffffff802bd63c>] sysfs_add_one+0x54/0xbd
[<ffffffff802bdbc0>] create_dir+0x4f/0x87
[<ffffffff802bdc2d>] sysfs_create_dir+0x35/0x4a
[<ffffffff803154c8>] kobject_get+0x12/0x17
[<ffffffff80315607>] kobject_add_internal+0xd9/0x194
[<ffffffff8031579c>] kobject_add_varg+0x54/0x61
[<ffffffff80261efe>] __alloc_pages+0x66/0x2ee
[<ffffffff80315321>] kobject_init+0x42/0x82
[<ffffffff80315843>] kobject_init_and_add+0x9a/0xa7
[<ffffffff802722c0>] __vmalloc_area_node+0x111/0x135
[<ffffffff8025546b>] mod_sysfs_init+0x6e/0x83
[<ffffffff802561e8>] sys_init_module+0xa3d/0x1833
[<ffffffff8028ebd5>] dput+0x1c/0x10b
[<ffffffff8020b3be>] system_call+0x7e/0x83and the problem seems to be that it does all these checks even for modules
that will never be loaded, because I use my own kernel, but with the
default Fedora initrd (which is trying to load modules for stuff that I
already have built in).Very annoying.
Can we please do that *after* the module loading symbol checks have run,
so that when you try to load a module that will not load, it won't
complain about these silly things?(You can probably trigger this by simply trying to load a module that was
compiled for another kernel version - it will fail fine, but in failing it
will then generate all these incorrect warnings!)Now it incorrectly taints my kernel, for no good reason.
Linus
--
Thanks Linus. I'll pass this on to the mkinitrd maintainer. We'll try to
get this sorted out for you :)Jon.
--
Ok, in looking at the code, this should also be showing up for you on a
"clean" 2.6.24 release, I didn't change anything in this code path.This is the sysfs core telling you that someone did something stupid :)
Yes, that's new, but the "error" was always there, I just made the
warning more visible to get people to pay attention to it, and find the
real errors where this happens (and it has found them, which is a good
thing.)But in this case, it doesn't look like the module loading code will
detect that we are trying to load a module that is already present until
the kobjects are set up here. It's been this way for a long time :(Rusty, any ideas of us adding a different check for "duplicate" modules
like this earlier in the load_module() function, so we don't spend so
much effort in building everything up when we don't need to?I think it's down in the apply_relocate() function where we would
finally figure out that something bad is going on here, which seems a
bit late to me.I guess we could just check the list of module names loaded when we try
to set up the kobject, that would be simple and easy.Linus, does the patch below (built tested only) fix the above call trace
noise for you? It shouldn't change the taint flag, that's a different
issue it seems.thanks,
greg k-h
---------------------
From: Greg Kroah-Hartman <gregkh@suse.de>
Subject: module: bail out of loading duplicate modules earlyThis should fix the long calltrace when trying to load a module that has
been built into the kernel allready.Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
diff --git a/kernel/module.c b/kernel/module.c
index dcb8a2c..3a76a4d 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -1210,6 +1210,7 @@ void module_remove_modinfo_attrs(struct module *mod)
int mod_sysfs_init(struct module *mod)
{
int err;
+ struct kobject *kobj;if (!module_sysfs_initialized) {
printk(KERN_ERR "%s: module sysfs not initialized\n",
@@ -1217,6 ...
module.c:1832 (in load_module)
if (find_module(mod->name)) {
err = -EEXIST;
goto free_mod;
}That's pretty early, and before this backtrace.
Even for simultaneous loads, there's a mutex which protects from here to the
list insertion.Puzzled,
Rusty.
--
My problem isn't trying to load the same module twice.
My problem is that the *driver* already exists (because it's compiled in),
and has already initialized itself, and has already registered.Then, initrd tries to load an old module for that driver.
So no simultaneous loading, no two modules, simple two *drivers* with the
same module names - but one was compiled in, and the other will fail
because it doesn't have the required linkages (ie it will failt the
modversions checks).But even before it fails the modversion checks, it apparently does various
ugly things that clash with the built-in driver.At least that seems to be the case.
Linus
--
I hate to say it, but this is user error. And it used to be that for some
drivers you'd actually end up with two in-kernel if you did that.But if even *you* don't get this right, it should finally prompt us to fix
this...Thanks,
Rusty.
--
But that doesn't catch the case here, of trying to load a module when
the code itself is already built into the kernel. For that we are
relying on the sysfs core to tell us we have a duplicate name problem,
which happens much later.Is there any test you can do sooner, or is relying on the sysfs test
acceptable?thanks,
greg k-h
--
As you pointed out, that's always been a "configure your kernel correctly,
stupid" kind of bug. Nicer would be to have a list of in-kernel "modules"
generated by the build system, but sysfs is there and it's easy to hang our
hats off...So, no objections to this with that as a FIXME, and a change so the message
says "module is already built into the kernel".Thanks,
Rusty.
--
Ok, I just never noticed, because without any warnings or oopses, it
Sadly, I'm now in the process of shutting down all my machines to prepare
for "the flight from hell(tm)", so I won't have time to check this right
now.Linus
--
Ok, I'll queue it up myself in my trees and send it to you in a few
days.Have a nice trip,
greg k-h
--
That's really wierd, I don't see that at all here just running with your
2.6.24 + my git tree and lots of USB drivers built into the kernel also
(like ehci_hcd).$ cat /proc/sys/kernel/tainted
0Odd...
$ uname -r
2.6.24-ge374a2bf-dirtyStrange, I thought that the uname id would show the git version that you
were running, but that doesn't show a valid id. But that's probably a
different issue in the build system somewhere...thanks,
greg k-h
--
But do you use an initrd that tries to load the same driver too?
I'm too lazy to want to do my own initrd. I just use the prepackaged ones
and rely on the fact that my private kernel will refuse to load modulesThat *is* the git version you're running: e374a2bf.
The "-g" is for "git" and the "-dirty" is because you have some
non-checked-in changes in addition.I works for me:
[torvalds@hp linux]$ git show --abbrev-commit -s --pretty=oneline e374a2bf
e374a2b... Kobject: fix coding style issues in kobject c filesso that looks like a valid version..
Linus
--
On Fri, 25 Jan 2008 11:11:48 -0800 (PST)
you know about "make install" right? That copies the needed files to /boot,
adds them to grub AND makes an initrd for you.. all for free ;)--
If you want to reach me at my work email, use arjan@linux.intel.com
For development, discussion and tips for power savings,
visit http://www.lesswatts.org
--
initrds generally aren't prepackaged, but generated on install (at least
with Fedora). You can regenerate them with "mkinitrd -f
/boot/initrd-2.6.24.img 2.6.24". Also, I find that "make
modules_install install" does it automatically from a kernel build.J
--
Right. I assumed that Linus was calling mkinitrd but was being bitten by
one of the occasional assumptions (I believe we make in that script)
that certain things are always modular. I just mailed the maintainer,
suggesting we screen against the one of the Modules.* files (perhaps
Modules.order might become a good candidate in due course...).Jon.
--
No. I really am not. My /etc/grub.conf looks like this:
title Linux
root (hd0,0)
kernel /vmlinuz ro root=/dev/VolGroup00/LogVol00 rhgb quiet
initrd /initrd-2.6.23.14-107.fc8.imgie I literally run the fedora initrd.
I switch kernels, not initrd's. I don't even want to know if the initrd
contains some distro-specific setup...Linus
--
The distro mkinird can reconstruct it containing your freshly built
modules (if any) and any other distro goo which needs to go in there.
/initrd-2.6.23.14-107.fc8.img doesn't come out of an rpm; its built by
an installer script when you install the kernel, and you can run the
same script on your kernels.Does you use "make modules_install install" when you build the kernel?
It just does the right thing for me under F8, including rebuilding
initrd and updating grub.conf.J
--
My wish is that distros would just boot without requiring an initrd. I
know how to make them for redhat and debian based distros, but the fact
that you can't (easily) cross-build them makes it a very tedious
construct.I can butcher the distros into booting and ignore the errors on bootup
that whine that modules are missing, but really.--
Debian is easy enough - make sure the drivers for the root
device and root fs is built-in, and you can drop the initrd.
Takes a second or two off the boot, and some more off the build.Helge Hafting
--
all it takes for me on Fedora is to boot a modular distro kernel once,
then copy the /dev to the real (persistent) /dev:mkdir /tmp2
mount /dev/sda1 /tmp2
cp -a /dev/* /tmp2/dev/and from that point on a bzImage/vmlinuz can boot up on Fedora without
any problems (as long as it has the right drivers built in), and the
initrd line can be removed from grub.conf.Ingo
--
Tried something like that once - it didn't play nice with the fact that I
have root-on-LVM, so you need an initrd to do the 'lvm vgchange -a' and get
it online.
Yeah, I usually do the same but with a bind mount, still it would be
grand if such things would not be needed.--
Agreed. But it's not likely to be a priority - all the vendors want
completely modular kernels. But now we see what Linus wants to do,
perhaps we can try to be a bit more friendly toward that. It's not
actually rocket science, after all. I was concerned that he wanted to
use the modules in the initrd, but now I see Linus, and everyone else,
just want to do what I also secretly do, and just not use an initrd.Isn't it funny. We all secretly hate using initrds ourselves :)
Jon.
--
Ah, now I get it, sorry, I'll go check that error path, not exactly a
normal one :)thanks,
greg k-h
--
No, I don't use any initrd at all.
You should just get a message saying that the version magic doesn't
match, so the initrd modules will not load. That's what happens to meAh taking the "g" off the search works, didn't realize that.
And I didn't have any unchecked in files, 'git status' shows no modified
files, but other stuff in the main directory, like patches that
shouldn't matter, but perhaps they do.
But oh well, I'm still building your tree now to try to reproduce
this...thanks,
greg k-h
--
Don't try to call the "raw" sysfs_create_file when we already have a
helper function to do this kind of work for us.Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/pci/pci-driver.c | 9 +++++++--
1 files changed, 7 insertions(+), 2 deletions(-)diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
index 6d1a216..73e3629 100644
--- a/drivers/pci/pci-driver.c
+++ b/drivers/pci/pci-driver.c
@@ -96,17 +96,21 @@ pci_create_newid_file(struct pci_driver *drv)
{
int error = 0;
if (drv->probe != NULL)
- error = sysfs_create_file(&drv->driver.kobj,
- &driver_attr_new_id.attr);
+ error = driver_create_file(&drv->driver, &driver_attr_new_id);
return error;
}+static void pci_remove_newid_file(struct pci_driver *drv)
+{
+ driver_remove_file(&drv->driver, &driver_attr_new_id);
+}
#else /* !CONFIG_HOTPLUG */
static inline void pci_free_dynids(struct pci_driver *drv) {}
static inline int pci_create_newid_file(struct pci_driver *drv)
{
return 0;
}
+static inline void pci_remove_newid_file(struct pci_driver *drv) {}
#endif/**
@@ -447,6 +451,7 @@ int __pci_register_driver(struct pci_driver *drv, struct module *owner,
void
pci_unregister_driver(struct pci_driver *drv)
{
+ pci_remove_newid_file(drv);
driver_unregister(&drv->driver);
pci_free_dynids(drv);
}
--
1.5.3.8--
Stop using kobject_register, as this way we can control the sending of
the uevent properly, after everything is properly initialized.Cc: Shaohua Li <shaohua.li@intel.com>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/cpuidle/sysfs.c | 17 +++++++++--------
1 files changed, 9 insertions(+), 8 deletions(-)diff --git a/drivers/cpuidle/sysfs.c b/drivers/cpuidle/sysfs.c
index 0f3515e..059db9c 100644
--- a/drivers/cpuidle/sysfs.c
+++ b/drivers/cpuidle/sysfs.c
@@ -300,14 +300,13 @@ int cpuidle_add_state_sysfs(struct cpuidle_device *device)
kobj->state = &device->states[i];
init_completion(&kobj->kobj_unregister);- kobj->kobj.parent = &device->kobj;
- kobj->kobj.ktype = &ktype_state_cpuidle;
- kobject_set_name(&kobj->kobj, "state%d", i);
- ret = kobject_register(&kobj->kobj);
+ ret = kobject_init_and_add(&kobj->kobj, &ktype_state_cpuidle, &device->kobj,
+ "state%d", i);
if (ret) {
kfree(kobj);
goto error_state;
}
+ kobject_uevent(&kobj->kobj, KOBJ_ADD);
device->kobjs[i] = kobj;
}@@ -339,12 +338,14 @@ int cpuidle_add_sysfs(struct sys_device *sysdev)
{
int cpu = sysdev->id;
struct cpuidle_device *dev;
+ int error;dev = per_cpu(cpuidle_devices, cpu);
- dev->kobj.parent = &sysdev->kobj;
- dev->kobj.ktype = &ktype_cpuidle;
- kobject_set_name(&dev->kobj, "%s", "cpuidle");
- return kobject_register(&dev->kobj);
+ error = kobject_init_and_add(&dev->kobj, &ktype_cpuidle, &sysdev->kobj,
+ "cpuidle");
+ if (!error)
+ kobject_uevent(&dev->kobj, KOBJ_ADD);
+ return error;
}/**
--
1.5.3.8--
Now that the old kobject_add() function is gone, rename kobject_add_ng()
to kobject_add() to clean up the namespace.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
block/elevator.c | 2 +-
block/ll_rw_blk.c | 4 ++--
drivers/base/class.c | 4 ++--
drivers/base/core.c | 6 +++---
drivers/base/driver.c | 2 +-
drivers/md/md.c | 2 +-
drivers/net/iseries_veth.c | 2 +-
drivers/uio/uio.c | 2 +-
include/linux/kobject.h | 6 +++---
lib/kobject.c | 14 +++++++-------
10 files changed, 22 insertions(+), 22 deletions(-)diff --git a/block/elevator.c b/block/elevator.c
index 5445c3c..645469a 100644
--- a/block/elevator.c
+++ b/block/elevator.c
@@ -929,7 +929,7 @@ int elv_register_queue(struct request_queue *q)
elevator_t *e = q->elevator;
int error;- error = kobject_add_ng(&e->kobj, &q->kobj, "%s", "iosched");
+ error = kobject_add(&e->kobj, &q->kobj, "%s", "iosched");
if (!error) {
struct elv_fs_entry *attr = e->elevator_type->elevator_attrs;
if (attr) {
diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c
index 8054b7d..234dd3d 100644
--- a/block/ll_rw_blk.c
+++ b/block/ll_rw_blk.c
@@ -4180,8 +4180,8 @@ int blk_register_queue(struct gendisk *disk)
if (!q || !q->request_fn)
return -ENXIO;- ret = kobject_add_ng(&q->kobj, kobject_get(&disk->dev.kobj),
- "%s", "queue");
+ ret = kobject_add(&q->kobj, kobject_get(&disk->dev.kobj),
+ "%s", "queue");
if (ret < 0)
return ret;diff --git a/drivers/base/class.c b/drivers/base/class.c
index 624b331..8e3cba2 100644
--- a/drivers/base/class.c
+++ b/drivers/base/class.c
@@ -586,8 +586,8 @@ int class_device_add(struct class_device *class_dev)
else
class_dev->kobj.parent = &parent_class->subsys.kobj;- error = kobject_add_ng(&class_dev->kobj...
Stop using kobject_register, as this way we can control the sending of
the uevent properly, after everything is properly initialized.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
arch/sh/kernel/cpu/sh4/sq.c | 11 ++++++-----
1 files changed, 6 insertions(+), 5 deletions(-)diff --git a/arch/sh/kernel/cpu/sh4/sq.c b/arch/sh/kernel/cpu/sh4/sq.c
index b22a78c..97fd9b9 100644
--- a/arch/sh/kernel/cpu/sh4/sq.c
+++ b/arch/sh/kernel/cpu/sh4/sq.c
@@ -341,17 +341,18 @@ static int __devinit sq_sysdev_add(struct sys_device *sysdev)
{
unsigned int cpu = sysdev->id;
struct kobject *kobj;
+ int error;sq_kobject[cpu] = kzalloc(sizeof(struct kobject), GFP_KERNEL);
if (unlikely(!sq_kobject[cpu]))
return -ENOMEM;kobj = sq_kobject[cpu];
- kobj->parent = &sysdev->kobj;
- kobject_set_name(kobj, "%s", "sq");
- kobj->ktype = &ktype_percpu_entry;
-
- return kobject_register(kobj);
+ error = kobject_init_and_add(kobj, &ktype_percpu_entry, &sysdev->kobj,
+ "%s", "sq");
+ if (!error)
+ kobject_uevent(kobj, KOBJ_ADD);
+ return error;
}static int __devexit sq_sysdev_remove(struct sys_device *sysdev)
--
1.5.3.8--
This converts the code to use the new kobject functions, cleaning up the
logic in doing so.Cc: Jens Axboe <axboe@kernel.dk>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
block/elevator.c | 8 ++------
1 files changed, 2 insertions(+), 6 deletions(-)diff --git a/block/elevator.c b/block/elevator.c
index e452deb..5445c3c 100644
--- a/block/elevator.c
+++ b/block/elevator.c
@@ -185,9 +185,7 @@ static elevator_t *elevator_alloc(struct request_queue *q,eq->ops = &e->ops;
eq->elevator_type = e;
- kobject_init(&eq->kobj);
- kobject_set_name(&eq->kobj, "%s", "iosched");
- eq->kobj.ktype = &elv_ktype;
+ kobject_init_ng(&eq->kobj, &elv_ktype);
mutex_init(&eq->sysfs_lock);eq->hash = kmalloc_node(sizeof(struct hlist_head) * ELV_HASH_ENTRIES,
@@ -931,9 +929,7 @@ int elv_register_queue(struct request_queue *q)
elevator_t *e = q->elevator;
int error;- e->kobj.parent = &q->kobj;
-
- error = kobject_add(&e->kobj);
+ error = kobject_add_ng(&e->kobj, &q->kobj, "%s", "iosched");
if (!error) {
struct elv_fs_entry *attr = e->elevator_type->elevator_attrs;
if (attr) {
--
1.5.3.8--
This converts the code to use the new kobject functions, cleaning up the
logic in doing so.Cc: Jens Axboe <axboe@kernel.dk>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
block/ll_rw_blk.c | 9 +++------
1 files changed, 3 insertions(+), 6 deletions(-)diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c
index 3887b2a..8054b7d 100644
--- a/block/ll_rw_blk.c
+++ b/block/ll_rw_blk.c
@@ -1862,9 +1862,7 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id)init_timer(&q->unplug_timer);
- kobject_set_name(&q->kobj, "%s", "queue");
- q->kobj.ktype = &queue_ktype;
- kobject_init(&q->kobj);
+ kobject_init_ng(&q->kobj, &queue_ktype);mutex_init(&q->sysfs_lock);
@@ -4182,9 +4180,8 @@ int blk_register_queue(struct gendisk *disk)
if (!q || !q->request_fn)
return -ENXIO;- q->kobj.parent = kobject_get(&disk->dev.kobj);
-
- ret = kobject_add(&q->kobj);
+ ret = kobject_add_ng(&q->kobj, kobject_get(&disk->dev.kobj),
+ "%s", "queue");
if (ret < 0)
return ret;--
1.5.3.8--
From: Randy Dunlap <randy.dunlap@oracle.com>
When SYSFS=n and MODULES=y, build ends with:
linux-2.6.24-rc6-mm1/drivers/base/module.c: In function 'module_add_driver':
linux-2.6.24-rc6-mm1/drivers/base/module.c:49: error: 'module_kset' undeclared (first use in this function)
make[3]: *** [drivers/base/module.o] Error 1Below is one possible fix.
Build-tested with all 4 config combinations of SYSFS & MODULES.Signed-off-by: Randy Dunlap <randy.dunlap@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/Makefile | 2 ++
drivers/base/base.h | 2 +-
2 files changed, 3 insertions(+), 1 deletions(-)diff --git a/drivers/base/Makefile b/drivers/base/Makefile
index ff26968..63e09c0 100644
--- a/drivers/base/Makefile
+++ b/drivers/base/Makefile
@@ -11,7 +11,9 @@ obj-$(CONFIG_FW_LOADER) += firmware_class.o
obj-$(CONFIG_NUMA) += node.o
obj-$(CONFIG_MEMORY_HOTPLUG_SPARSE) += memory.o
obj-$(CONFIG_SMP) += topology.o
+ifeq ($(CONFIG_SYSFS),y)
obj-$(CONFIG_MODULES) += module.o
+endif
obj-$(CONFIG_SYS_HYPERVISOR) += hypervisor.oifeq ($(CONFIG_DEBUG_DRIVER),y)
diff --git a/drivers/base/base.h b/drivers/base/base.h
index a74ceda..f7ad65a 100644
--- a/drivers/base/base.h
+++ b/drivers/base/base.h
@@ -81,7 +81,7 @@ extern int devres_release_all(struct device *dev);extern struct kset *devices_kset;
-#ifdef CONFIG_MODULES
+#if defined(CONFIG_MODULES) && defined(CONFIG_SYSFS)
extern void module_add_driver(struct module *mod, struct device_driver *drv);
extern void module_remove_driver(struct device_driver *drv);
#else
--
1.5.3.8--
_PLEASE_ fold such fixes into the patch that introduces the build bugs,
prior sending your git trees upstream! (just like Andrew does it with
all patches that come via -mm)Changes like this (and it now leaked into Linus' tree as well) kill
bisectability.Thanks.
Ingo
--
For most of these issues I do merge them together.
However, for some odd kernel configurations, like this one, I didn't, my
The odds that a "normal" person has sysfs turned off and modules
enabled, trying to bisect things, is pretty slim :)thanks,
greg k-h
--
that "slim" combination is what i use for about 25% of all my bisections
- i build, boot and stress-test randconfig configs.If i find a problem with a given .config, i do _not_ go around and
change the .config to make a bisection point work. (and the automated
bisection scripts definitely wont do it either.)so what is a 'weird config' to you is a real testing barrier for others.
And crap like that quickly mounts up. Having a buildable and bootable
kernel at every bisection point is a _must_.Please! :-)
Ingo
--
Yes, I do agree that this is important, I'll work to not let this happen
again. Especially now that I have your build scripts, I'm working on
setting up something like that myself here.thanks,
greg k-h
--
btw., Harvey Harrison has cleaned them up some more, and has told me
about KCONFIG_ALLCONFIG, which is very useful when you want to tailor
randconfig builds to different testsystems (which might have different
minimum driver requirements and different distro requirements for kernel
features). Harvey, could you send the latest version of those
auto-Kconfig cleanups?Ingo
--
Sorry, I've been a bit laid up with illness to pull out any upstreamable
pieces. Attached is the original version I sent to you that still has
the Ingo-specific need_config file. Hopefully I'll be back in action
and can finish this soon.This is functionally equivalent to Ingo's patch at:
http://people.redhat.com/mingo/auto-qa-patches/Kconfig-qa.patch
Instead, create a need_config file and invoke randconfig as:
make randconfig KCONFIG_ALLCONFIG=need_config
Signed-off-by: Harvey Harrison <harvey.harrison@gmail.com>
---
Ingo, your QA patch ends up being much smaller and works exactly the
same as long as you invoke randconfig with the above. I've included
a need_config file that has all of the options I removed from your patch
suitable for the above KCONFIG_ALLCONFIG use.Cheers,
Harvey
arch/x86/Kconfig | 74 +++++++++++++++++++++++++++++++++++
arch/x86/Kconfig.needed | 99
+++++++++++++++++++++++++++++++++++++++++++++++
drivers/atm/Kconfig | 1 +
drivers/base/core.c | 3 +
init/Kconfig | 13 ++++++
init/main.c | 56 ++++++++++++++++++++++++++
kernel/time/Kconfig | 13 ++++++
lib/Kconfig | 3 +
need_config | 85 ++++++++++++++++++++++++++++++++++++++++
9 files changed, 347 insertions(+), 0 deletions(-)diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 665e4b1..9061f77 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -164,6 +164,12 @@ config X86_TRAMPOLINEconfig KTIME_SCALAR
def_bool X86_32
+
+config BOOTPARAM_SUPPORT
+ bool "bootparam support"
+ help
+ support for boot command-line parameters via .config
+
source "init/Kconfig"menu "Processor type and features"
@@ -1204,6 +1210,66 @@ config COMPAT_VDSOIf unsure, say Y.
+config BOOTPARAM_NMI_WATCHDOG_BIT_0
+ bool "bootparam: nmi_watchdog=X default value - bit 0"
+ depends on BOOTPARAM_SUPPORT
+ help
+ NMI watchdo...
Absolutely - this is important. After several hours mucking about I just
gave up trying to bisect a 2.6.24-rc1 regression due to hitting 100% build
errors and runtime oopses during the bisection. Mainly from networking in
that case.
--
From: Cornelia Huck <cornelia.huck@de.ibm.com>
This is lot like default attributes for devices (and indeed,
a lot of the code is lifted from there).Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/driver.c | 42 +++++++++++++++++++++++++++++++++++++++++-
include/linux/device.h | 1 +
2 files changed, 42 insertions(+), 1 deletions(-)diff --git a/drivers/base/driver.c b/drivers/base/driver.c
index f94be40..e3b5840 100644
--- a/drivers/base/driver.c
+++ b/drivers/base/driver.c
@@ -142,6 +142,37 @@ void put_driver(struct device_driver * drv)
kobject_put(&drv->kobj);
}+static int driver_add_groups(struct device_driver *drv,
+ struct attribute_group **groups)
+{
+ int error = 0;
+ int i;
+
+ if (groups) {
+ for (i = 0; groups[i]; i++) {
+ error = sysfs_create_group(&drv->kobj, groups[i]);
+ if (error) {
+ while (--i >= 0)
+ sysfs_remove_group(&drv->kobj,
+ groups[i]);
+ break;
+ }
+ }
+ }
+ return error;
+}
+
+static void driver_remove_groups(struct device_driver *drv,
+ struct attribute_group **groups)
+{
+ int i;
+
+ if (groups)
+ for (i = 0; groups[i]; i++)
+ sysfs_remove_group(&drv->kobj, groups[i]);
+}
+
+
/**
* driver_register - register driver with bus
* @drv: driver to register
@@ -152,13 +183,21 @@ void put_driver(struct device_driver * drv)
*/
int driver_register(struct device_driver * drv)
{
+ int ret;
+
if ((drv->bus->probe && drv->probe) ||
(drv->bus->remove && drv->remove) ||
(drv->bus->shutdown && drv->shutdown)) {
printk(KERN_WARNING "Driver '%s' needs updating - please use bus_type methods\n", drv->name);
}
klist_init(&drv->klist_devices, NULL, NULL);
- return bus_add_driver(drv);
+ ret = bus_add_driver(drv);
+ if (ret)
+ return ret;
+ ret = driver_add_groups(drv,...
There is no need for kobject_unregister() anymore, thanks to Kay's
kobject cleanup changes, so replace all instances of it with
kobject_put().Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
kernel/ksysfs.c | 2 +-
kernel/module.c | 9 ++++-----
lib/kobject.c | 4 ++--
net/bridge/br_sysfs_br.c | 2 +-
security/inode.c | 2 +-
5 files changed, 9 insertions(+), 10 deletions(-)diff --git a/kernel/ksysfs.c b/kernel/ksysfs.c
index 1081aff..e53bc30 100644
--- a/kernel/ksysfs.c
+++ b/kernel/ksysfs.c
@@ -154,7 +154,7 @@ notes_exit:
group_exit:
sysfs_remove_group(kernel_kobj, &kernel_attr_group);
kset_exit:
- kobject_unregister(kernel_kobj);
+ kobject_put(kernel_kobj);
exit:
return error;
}
diff --git a/kernel/module.c b/kernel/module.c
index 89cd4c7..dcb8a2c 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -1257,9 +1257,8 @@ int mod_sysfs_setup(struct module *mod,
out_unreg_param:
module_param_sysfs_remove(mod);
out_unreg_holders:
- kobject_unregister(mod->holders_dir);
+ kobject_put(mod->holders_dir);
out_unreg:
- kobject_del(&mod->mkobj.kobj);
kobject_put(&mod->mkobj.kobj);
return err;
}
@@ -1269,9 +1268,9 @@ static void mod_kobject_remove(struct module *mod)
{
module_remove_modinfo_attrs(mod);
module_param_sysfs_remove(mod);
- kobject_unregister(mod->mkobj.drivers_dir);
- kobject_unregister(mod->holders_dir);
- kobject_unregister(&mod->mkobj.kobj);
+ kobject_put(mod->mkobj.drivers_dir);
+ kobject_put(mod->holders_dir);
+ kobject_put(&mod->mkobj.kobj);
}/*
diff --git a/lib/kobject.c b/lib/kobject.c
index 4fce5ca..462946e 100644
--- a/lib/kobject.c
+++ b/lib/kobject.c
@@ -664,7 +664,7 @@ struct kobject *kobject_create(void)
*
* This function creates a kset structure dynamically and registers it
* with sysfs. When you are finished with this structure, call
...
From: Jan Engelhardt <jengelh@computergmbh.de>
Signed-off-by: Jan Engelhardt <jengelh@computergmbh.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/uio/uio.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c
index 03b66fb..cc246fa 100644
--- a/drivers/uio/uio.c
+++ b/drivers/uio/uio.c
@@ -39,7 +39,7 @@ struct uio_device {static int uio_major;
static DEFINE_IDR(uio_idr);
-static struct file_operations uio_fops;
+static const struct file_operations uio_fops;/* UIO class infrastructure */
static struct uio_class {
@@ -508,7 +508,7 @@ static int uio_mmap(struct file *filep, struct vm_area_struct *vma)
}
}-static struct file_operations uio_fops = {
+static const struct file_operations uio_fops = {
.owner = THIS_MODULE,
.open = uio_open,
.release = uio_release,
--
1.5.3.8--
Am Thu, 24 Jan 2008 23:33:34 -0800
--
This converts the code to use the new kobject functions, cleaning up the
logic in doing so.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/class.c | 10 +++-------
1 files changed, 3 insertions(+), 7 deletions(-)diff --git a/drivers/base/class.c b/drivers/base/class.c
index 3ffcda7..ba6745b 100644
--- a/drivers/base/class.c
+++ b/drivers/base/class.c
@@ -546,8 +546,7 @@ static struct class_device_attribute class_uevent_attr =
void class_device_initialize(struct class_device *class_dev)
{
class_dev->kobj.kset = &class_obj_subsys;
- class_dev->kobj.ktype = &class_device_ktype;
- kobject_init(&class_dev->kobj);
+ kobject_init_ng(&class_dev->kobj, &class_device_ktype);
INIT_LIST_HEAD(&class_dev->node);
}@@ -575,16 +574,13 @@ int class_device_add(struct class_device *class_dev)
class_dev->class_id);/* first, register with generic layer. */
- error = kobject_set_name(&class_dev->kobj, "%s", class_dev->class_id);
- if (error)
- goto out2;
-
if (parent_class_dev)
class_dev->kobj.parent = &parent_class_dev->kobj;
else
class_dev->kobj.parent = &parent_class->subsys.kobj;- error = kobject_add(&class_dev->kobj);
+ error = kobject_add_ng(&class_dev->kobj, class_dev->kobj.parent,
+ "%s", class_dev->class_id);
if (error)
goto out2;--
1.5.3.8--
Now that the old kobject_init() function is gone, rename
kobject_init_ng() to kobject_init() to clean up the namespace.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
block/elevator.c | 2 +-
block/ll_rw_blk.c | 2 +-
drivers/base/class.c | 2 +-
drivers/base/core.c | 2 +-
drivers/md/md.c | 2 +-
drivers/net/iseries_veth.c | 4 ++--
drivers/uio/uio.c | 2 +-
fs/char_dev.c | 4 ++--
include/linux/kobject.h | 2 +-
lib/kobject.c | 14 +++++++-------
10 files changed, 18 insertions(+), 18 deletions(-)diff --git a/block/elevator.c b/block/elevator.c
index 645469a..f9736fb 100644
--- a/block/elevator.c
+++ b/block/elevator.c
@@ -185,7 +185,7 @@ static elevator_t *elevator_alloc(struct request_queue *q,eq->ops = &e->ops;
eq->elevator_type = e;
- kobject_init_ng(&eq->kobj, &elv_ktype);
+ kobject_init(&eq->kobj, &elv_ktype);
mutex_init(&eq->sysfs_lock);eq->hash = kmalloc_node(sizeof(struct hlist_head) * ELV_HASH_ENTRIES,
diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c
index 234dd3d..5ccec8a 100644
--- a/block/ll_rw_blk.c
+++ b/block/ll_rw_blk.c
@@ -1862,7 +1862,7 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id)init_timer(&q->unplug_timer);
- kobject_init_ng(&q->kobj, &queue_ktype);
+ kobject_init(&q->kobj, &queue_ktype);mutex_init(&q->sysfs_lock);
diff --git a/drivers/base/class.c b/drivers/base/class.c
index 8e3cba2..61fd26c 100644
--- a/drivers/base/class.c
+++ b/drivers/base/class.c
@@ -553,7 +553,7 @@ static struct class_device_attribute class_uevent_attr =
void class_device_initialize(struct class_device *class_dev)
{
class_dev->kobj.kset = &class_obj_subsys;
- kobject_init_ng(&class_dev->kobj, &class_device_ktype);
+ kobject_init(&...
From: Kay Sievers <kay.sievers@vrfy.org>
We should remove the glue directory between the class and the bus
device _after_ we sent out the 'remove' event for the device, otherwise
the parent relationship is no longer valid, and composing the path
with deleted sysfs entries will not work.Cc: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/core.c | 206 +++++++++++++++++++++++----------------------------
1 files changed, 94 insertions(+), 112 deletions(-)diff --git a/drivers/base/core.c b/drivers/base/core.c
index 22fdf32..13cae18 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -18,7 +18,7 @@
#include <linux/string.h>
#include <linux/kdev_t.h>
#include <linux/notifier.h>
-
+#include <linux/genhd.h>
#include <asm/semaphore.h>#include "base.h"
@@ -538,22 +538,20 @@ void device_initialize(struct device *dev)
}#ifdef CONFIG_SYSFS_DEPRECATED
-static struct kobject * get_device_parent(struct device *dev,
- struct device *parent)
+static struct kobject *get_device_parent(struct device *dev,
+ struct device *parent)
{
- /*
- * Set the parent to the class, not the parent device
- * for topmost devices in class hierarchy.
- * This keeps sysfs from having a symlink to make old
- * udevs happy
- */
+ /* class devices without a parent live in /sys/class/<classname>/ */
if (dev->class && (!parent || parent->class != dev->class))
return &dev->class->subsys.kobj;
+ /* all other devices keep their parent */
else if (parent)
return &parent->kobj;return NULL;
}
+
+static inline void cleanup_device_parent(struct device *dev) {}
#else
static struct kobject *virtual_device_parent(struct device *dev)
{
@@ -566,8 +564,8 @@ static struct kobject *virtual_device_parent(struct device *dev)
return virtual_dir;
}...
This patch removes the kobject, and a few other driver-core-only fields
out of struct driver and into the driver core only. Now drivers can be
safely create on the stack or statically (like they currently are.)Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/base.h | 8 +++++
drivers/base/bus.c | 71 +++++++++++++++++++++++++---------------------
drivers/base/dd.c | 24 ++++++++--------
drivers/base/driver.c | 40 +++++++++++++++++---------
drivers/base/module.c | 12 ++++----
drivers/base/platform.c | 2 +-
include/linux/device.h | 16 ++++------
7 files changed, 99 insertions(+), 74 deletions(-)diff --git a/drivers/base/base.h b/drivers/base/base.h
index 0547236..3b0f395 100644
--- a/drivers/base/base.h
+++ b/drivers/base/base.h
@@ -27,6 +27,14 @@ struct bus_type_private {
struct bus_type *bus;
};+struct driver_private {
+ struct kobject kobj;
+ struct klist klist_devices;
+ struct klist_node knode_bus;
+ struct module_kobject *mkobj;
+ struct device_driver *driver;
+};
+#define to_driver(obj) container_of(obj, struct driver_private, kobj)/* initialisation functions */
extern int devices_init(void);
diff --git a/drivers/base/bus.c b/drivers/base/bus.c
index 04d3850..aa0c986 100644
--- a/drivers/base/bus.c
+++ b/drivers/base/bus.c
@@ -3,6 +3,8 @@
*
* Copyright (c) 2002-3 Patrick Mochel
* Copyright (c) 2002-3 Open Source Development Labs
+ * Copyright (c) 2007 Greg Kroah-Hartman <gregkh@suse.de>
+ * Copyright (c) 2007 Novell Inc.
*
* This file is released under the GPLv2
*
@@ -24,7 +26,6 @@
*/#define to_drv_attr(_attr) container_of(_attr, struct driver_attribute, attr)
-#define to_driver(obj) container_of(obj, struct device_driver, kobj)static int __must_check bus_rescan_devices_helper(struct device *dev,
@@ -49,11 +50,11 @@ static ssize_t
drv_attr_show(struct kobject * kobj, struct attribute * attr, char ...
This provides a much-needed kobject and kset documentation update.
Thanks to Kay Sievers, Alan Stern, Jonathan Corbet, Randy Dunlap, Jan
Engelhardt, and others for reviewing and providing help with this
document.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
Documentation/kobject.txt | 386 +++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 386 insertions(+), 0 deletions(-)
create mode 100644 Documentation/kobject.txtdiff --git a/Documentation/kobject.txt b/Documentation/kobject.txt
new file mode 100644
index 0000000..bf3256e
--- /dev/null
+++ b/Documentation/kobject.txt
@@ -0,0 +1,386 @@
+Everything you never wanted to know about kobjects, ksets, and ktypes
+
+Greg Kroah-Hartman <gregkh@suse.de>
+
+Based on an original article by Jon Corbet for lwn.net written October 1,
+2003 and located at http://lwn.net/Articles/51437/
+
+Last updated December 19, 2007
+
+
+Part of the difficulty in understanding the driver model - and the kobject
+abstraction upon which it is built - is that there is no obvious starting
+place. Dealing with kobjects requires understanding a few different types,
+all of which make reference to each other. In an attempt to make things
+easier, we'll take a multi-pass approach, starting with vague terms and
+adding detail as we go. To that end, here are some quick definitions of
+some terms we will be working with.
+
+ - A kobject is an object of type struct kobject. Kobjects have a name
+ and a reference count. A kobject also has a parent pointer (allowing
+ objects to be arranged into hierarchies), a specific type, and,
+ usually, a representation in the sysfs virtual filesystem.
+
+ Kobjects are generally not interesting on their own; instead, they are
+ usually embedded within some other structure which contains the stuff
+ the code is really interested in.
+
+ No structure should EVER have more than one kobject embedded within it.
+ If it doe...
From: Kay Sievers <kay.sievers@vrfy.org>
This moves the block devices to /sys/class/block. It will create a
flat list of all block devices, with the disks and partitions in one
directory. For compatibility /sys/block is created and contains symlinks
to the disks./sys/class/block
|-- sda -> ../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda
|-- sda1 -> ../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1
|-- sda10 -> ../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda10
|-- sda5 -> ../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5
|-- sda6 -> ../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda6
|-- sda7 -> ../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda7
|-- sda8 -> ../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda8
|-- sda9 -> ../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda9
`-- sr0 -> ../../devices/pci0000:00/0000:00:1f.2/host1/target1:0:0/1:0:0:0/block/sr0/sys/block/
|-- sda -> ../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda
`-- sr0 -> ../devices/pci0000:00/0000:00:1f.2/host1/target1:0:0/1:0:0:0/block/sr0Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
block/genhd.c | 416 +++++++++++++++++++-------------------------
block/ll_rw_blk.c | 4 +-
drivers/base/class.c | 7 +
drivers/base/core.c | 20 ++-
drivers/block/aoe/aoeblk.c | 51 +++---
drivers/block/nbd.c | 15 +-
drivers/ide/ide-probe.c | 2 +-
drivers/md/dm.c | 4 +-
drivers/md/md.c | 8 +-
fs/block_dev.c | 8 +-
fs/partitions/check.c | 315 +++++++++++----------------------
include/linux/genhd.h | 37 +++--
init/do_mounts.c ...
Make this kobject dynamic and convert it to not use kobject_register,
which is going away.Cc: Jacob Shin <jacob.shin@amd.com>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
arch/x86/kernel/cpu/mcheck/mce_amd_64.c | 19 +++++++++----------
1 files changed, 9 insertions(+), 10 deletions(-)diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd_64.c b/arch/x86/kernel/cpu/mcheck/mce_amd_64.c
index 752fb16..2d65311 100644
--- a/arch/x86/kernel/cpu/mcheck/mce_amd_64.c
+++ b/arch/x86/kernel/cpu/mcheck/mce_amd_64.c
@@ -65,7 +65,7 @@ static struct threshold_block threshold_defaults = {
};struct threshold_bank {
- struct kobject kobj;
+ struct kobject *kobj;
struct threshold_block *blocks;
cpumask_t cpus;
};
@@ -433,7 +433,7 @@ static __cpuinit int allocate_threshold_blocks(unsigned int cpu,
per_cpu(threshold_banks, cpu)[bank]->blocks = b;kobject_set_name(&b->kobj, "misc%i", block);
- b->kobj.parent = &per_cpu(threshold_banks, cpu)[bank]->kobj;
+ b->kobj.parent = per_cpu(threshold_banks, cpu)[bank]->kobj;
b->kobj.ktype = &threshold_ktype;
err = kobject_register(&b->kobj);
if (err)
@@ -489,7 +489,7 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank)
goto out;err = sysfs_create_link(&per_cpu(device_mce, cpu).kobj,
- &b->kobj, name);
+ b->kobj, name);
if (err)
goto out;@@ -505,16 +505,15 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank)
goto out;
}- kobject_set_name(&b->kobj, "threshold_bank%i", bank);
- b->kobj.parent = &per_cpu(device_mce, cpu).kobj;
+ b->kobj = kobject_create_and_add(name, &per_cpu(device_mce, cpu).kobj);
+ if (!b->kobj)
+ goto out_free;
+
#ifndef CONFIG_SMP
b->cpus = CPU_MASK_ALL;
#else
b->cpus = per_cpu(cpu_core_map, cpu);
#endif
- err = kobject_register(&b->kobj);
-...
This is a more complex example showing how to create a kset and a ktype
and some default attributes for a group of kobjects.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
samples/kobject/Makefile | 2 +-
samples/kobject/kset-example.c | 278 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 279 insertions(+), 1 deletions(-)
create mode 100644 samples/kobject/kset-example.cdiff --git a/samples/kobject/Makefile b/samples/kobject/Makefile
index cce16e9..4a19420 100644
--- a/samples/kobject/Makefile
+++ b/samples/kobject/Makefile
@@ -1 +1 @@
-obj-$(CONFIG_SAMPLE_KOBJECT) += kobject-example.o
+obj-$(CONFIG_SAMPLE_KOBJECT) += kobject-example.o kset-example.o
diff --git a/samples/kobject/kset-example.c b/samples/kobject/kset-example.c
new file mode 100644
index 0000000..b0a1b4f
--- /dev/null
+++ b/samples/kobject/kset-example.c
@@ -0,0 +1,278 @@
+/*
+ * Sample kset and ktype implementation
+ *
+ * Copyright (C) 2004-2007 Greg Kroah-Hartman <greg@kroah.com>
+ * Copyright (C) 2007 Novell Inc.
+ *
+ * Released under the GPL version 2 only.
+ *
+ */
+#include <linux/kobject.h>
+#include <linux/string.h>
+#include <linux/sysfs.h>
+#include <linux/module.h>
+#include <linux/init.h>
+
+/*
+ * This module shows how to create a kset in sysfs called
+ * /sys/kernel/kset-example
+ * Then tree kobjects are created and assigned to this kset, "foo", "baz",
+ * and "bar". In those kobjects, attributes of the same name are also
+ * created and if an integer is written to these files, it can be later
+ * read out of it.
+ */
+
+
+/*
+ * This is our "object" that we will create a few of and register them with
+ * sysfs.
+ */
+struct foo_obj {
+ struct kobject kobj;
+ int foo;
+ int baz;
+ int bar;
+};
+#define to_foo_obj(x) container_of(x, struct foo_obj, kobj)
+
+/* a custom attribute that works just for a struct foo_obj. */
+struct foo_attribute {
+ struct...
The module driver specific code should belong in the driver core, not in
the kernel/ directory. So move this code. This is done in preparation
for some struct device_driver rework that should be confined to the
driver core code only.This also lets us keep from exporting these functions, as no external
code should ever be calling it.Thanks to Andrew Morton for the !CONFIG_MODULES fix.
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/Makefile | 1 +
drivers/base/base.h | 9 +++++
drivers/base/module.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++
include/linux/module.h | 15 --------
kernel/module.c | 87 --------------------------------------------
5 files changed, 104 insertions(+), 102 deletions(-)
create mode 100644 drivers/base/module.cdiff --git a/drivers/base/Makefile b/drivers/base/Makefile
index b39ea3f..ff26968 100644
--- a/drivers/base/Makefile
+++ b/drivers/base/Makefile
@@ -11,6 +11,7 @@ obj-$(CONFIG_FW_LOADER) += firmware_class.o
obj-$(CONFIG_NUMA) += node.o
obj-$(CONFIG_MEMORY_HOTPLUG_SPARSE) += memory.o
obj-$(CONFIG_SMP) += topology.o
+obj-$(CONFIG_MODULES) += module.o
obj-$(CONFIG_SYS_HYPERVISOR) += hypervisor.oifeq ($(CONFIG_DEBUG_DRIVER),y)
diff --git a/drivers/base/base.h b/drivers/base/base.h
index ca6d273..0547236 100644
--- a/drivers/base/base.h
+++ b/drivers/base/base.h
@@ -73,3 +73,12 @@ extern char *make_class_name(const char *name, struct kobject *kobj);
extern int devres_release_all(struct device *dev);extern struct kset *devices_kset;
+
+#ifdef CONFIG_MODULES
+extern void module_add_driver(struct module *mod, struct device_driver *drv);
+extern void module_remove_driver(struct device_driver *drv);
+#else
+static inline void module_add_driver(struct module *mod,
+ struct device_driver *drv) { }
+static inline void module_remove_driver(struct device_driver *drv) { }
+#endif
diff --git a/drivers/base/module.c b/drivers/base/module.c
new file mode 10064...
This converts the code to use the new kobject functions, cleaning up the
logic in doing so.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
kernel/module.c | 14 ++++++--------
1 files changed, 6 insertions(+), 8 deletions(-)diff --git a/kernel/module.c b/kernel/module.c
index 0ae8117..89cd4c7 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -1217,18 +1217,16 @@ int mod_sysfs_init(struct module *mod)
err = -EINVAL;
goto out;
}
- memset(&mod->mkobj.kobj, 0, sizeof(mod->mkobj.kobj));
- err = kobject_set_name(&mod->mkobj.kobj, "%s", mod->name);
- if (err)
- goto out;
- mod->mkobj.kobj.kset = module_kset;
- mod->mkobj.kobj.ktype = &module_ktype;
mod->mkobj.mod = mod;- kobject_init(&mod->mkobj.kobj);
+ memset(&mod->mkobj.kobj, 0, sizeof(mod->mkobj.kobj));
+ mod->mkobj.kobj.kset = module_kset;
+ err = kobject_init_and_add(&mod->mkobj.kobj, &module_ktype, NULL,
+ "%s", mod->name);
+ if (err)
+ kobject_put(&mod->mkobj.kobj);/* delay uevent until full sysfs population */
- err = kobject_add(&mod->mkobj.kobj);
out:
return err;
}
--
1.5.3.8--
This allows an easier way to get to the device klist associated with a
struct bus_type (you have three to choose from...) This will make it
easier to move these fields to be dynamic in a future patch.The only user of this is the PCI core which horribly abuses this
interface to rearrange the order of the pci devices. This should be
done using the existing bus device walking functions, but that's left
for future patches.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/bus.c | 6 ++++++
drivers/pci/probe.c | 11 +++++++----
include/linux/device.h | 1 +
3 files changed, 14 insertions(+), 4 deletions(-)diff --git a/drivers/base/bus.c b/drivers/base/bus.c
index 8335a10..9c9027b 100644
--- a/drivers/base/bus.c
+++ b/drivers/base/bus.c
@@ -941,6 +941,12 @@ struct kset *bus_get_kset(struct bus_type *bus)
}
EXPORT_SYMBOL_GPL(bus_get_kset);+struct klist *bus_get_device_klist(struct bus_type *bus)
+{
+ return &bus->klist_devices;
+}
+EXPORT_SYMBOL_GPL(bus_get_device_klist);
+
int __init buses_init(void)
{
bus_kset = kset_create_and_add("bus", &bus_uevent_ops, NULL);
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index c5ca313..5fd5852 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1210,16 +1210,19 @@ static void __init pci_sort_breadthfirst_klist(void)
struct klist_node *n;
struct device *dev;
struct pci_dev *pdev;
+ struct klist *device_klist;- spin_lock(&pci_bus_type.klist_devices.k_lock);
- list_for_each_safe(pos, tmp, &pci_bus_type.klist_devices.k_list) {
+ device_klist = bus_get_device_klist(&pci_bus_type);
+
+ spin_lock(&device_klist->k_lock);
+ list_for_each_safe(pos, tmp, &device_klist->k_list) {
n = container_of(pos, struct klist_node, n_node);
dev = container_of(n, struct device, knode_bus);
pdev = to_pci_dev(dev);
pci_insertion_sort_klist(pdev, &sorted_devices);
}
- list_...
This converts the code to use the new kobject functions, cleaning up the
logic in doing so.Cc: Christoph Lameter <clameter@sgi.com>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
mm/slub.c | 9 ++++-----
1 files changed, 4 insertions(+), 5 deletions(-)diff --git a/mm/slub.c b/mm/slub.c
index d26177f..5cc4b7d 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -4025,13 +4025,12 @@ static int sysfs_slab_add(struct kmem_cache *s)
name = create_unique_id(s);
}- kobject_set_name(&s->kobj, name);
s->kobj.kset = slab_kset;
- s->kobj.ktype = &slab_ktype;
- kobject_init(&s->kobj);
- err = kobject_add(&s->kobj);
- if (err)
+ err = kobject_init_and_add(&s->kobj, &slab_ktype, NULL, name);
+ if (err) {
+ kobject_put(&s->kobj);
return err;
+ }err = sysfs_create_group(&s->kobj, &slab_attr_group);
if (err)
--
1.5.3.8--
Acked-by: Christoph Lameter <clameter@sgi.com>
--
From: Cornelia Huck <cornelia.huck@de.ibm.com>
CC: Swen Schillig <swen@vnet.ibm.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/s390/scsi/zfcp_ccw.c | 14 ++++----------
drivers/s390/scsi/zfcp_ext.h | 3 +--
drivers/s390/scsi/zfcp_sysfs_driver.c | 27 ++++-----------------------
3 files changed, 9 insertions(+), 35 deletions(-)diff --git a/drivers/s390/scsi/zfcp_ccw.c b/drivers/s390/scsi/zfcp_ccw.c
index e01cbf1..86c3f65 100644
--- a/drivers/s390/scsi/zfcp_ccw.c
+++ b/drivers/s390/scsi/zfcp_ccw.c
@@ -52,6 +52,9 @@ static struct ccw_driver zfcp_ccw_driver = {
.set_offline = zfcp_ccw_set_offline,
.notify = zfcp_ccw_notify,
.shutdown = zfcp_ccw_shutdown,
+ .driver = {
+ .groups = zfcp_driver_attr_groups,
+ },
};MODULE_DEVICE_TABLE(ccw, zfcp_ccw_device_id);
@@ -251,16 +254,7 @@ zfcp_ccw_notify(struct ccw_device *ccw_device, int event)
int __init
zfcp_ccw_register(void)
{
- int retval;
-
- retval = ccw_driver_register(&zfcp_ccw_driver);
- if (retval)
- goto out;
- retval = zfcp_sysfs_driver_create_files(&zfcp_ccw_driver.driver);
- if (retval)
- ccw_driver_unregister(&zfcp_ccw_driver);
- out:
- return retval;
+ return ccw_driver_register(&zfcp_ccw_driver);
}/**
diff --git a/drivers/s390/scsi/zfcp_ext.h b/drivers/s390/scsi/zfcp_ext.h
index 8534cf0..06b1079 100644
--- a/drivers/s390/scsi/zfcp_ext.h
+++ b/drivers/s390/scsi/zfcp_ext.h
@@ -27,8 +27,7 @@
extern struct zfcp_data zfcp_data;/******************************** SYSFS *************************************/
-extern int zfcp_sysfs_driver_create_files(struct device_driver *);
-extern void zfcp_sysfs_driver_remove_files(struct device_driver *);
+extern struct attribute_group *zfcp_driver_attr_groups[];
extern int zfcp_sysfs_adapter_create_files(struct device *);
extern void zfcp_sysfs_adapter_remove_files(struct device *);
extern in...
Stop using kobject_register, as this way we can control the sending of
the uevent properly, after everything is properly initialized.Cc: Jens Axboe <axboe@kernel.dk>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/block/pktcdvd.c | 9 +++++----
1 files changed, 5 insertions(+), 4 deletions(-)diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c
index 17da699..d1ee383 100644
--- a/drivers/block/pktcdvd.c
+++ b/drivers/block/pktcdvd.c
@@ -110,17 +110,18 @@ static struct pktcdvd_kobj* pkt_kobj_create(struct pktcdvd_device *pd,
struct kobj_type* ktype)
{
struct pktcdvd_kobj *p;
+ int error;
+
p = kzalloc(sizeof(*p), GFP_KERNEL);
if (!p)
return NULL;
- kobject_set_name(&p->kobj, "%s", name);
- p->kobj.parent = parent;
- p->kobj.ktype = ktype;
p->pd = pd;
- if (kobject_register(&p->kobj) != 0) {
+ error = kobject_init_and_add(&p->kobj, ktype, parent, "%s", name);
+ if (error) {
kobject_put(&p->kobj);
return NULL;
}
+ kobject_uevent(&p->kobj, KOBJ_ADD);
return p;
}
/*
--
1.5.3.8--
Stop using kobject_register, as this way we can control the sending of
the uevent properly, after everything is properly initialized.Cc: Neil Brown <neilb@suse.de>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/md/md.c | 10 ++++++----
1 files changed, 6 insertions(+), 4 deletions(-)diff --git a/drivers/md/md.c b/drivers/md/md.c
index cef9ebd..c503086 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -3054,6 +3054,7 @@ static struct kobject *md_probe(dev_t dev, int *part, void *data)
int partitioned = (MAJOR(dev) != MD_MAJOR);
int shift = partitioned ? MdpMinorShift : 0;
int unit = MINOR(dev) >> shift;
+ int error;if (!mddev)
return NULL;
@@ -3082,12 +3083,13 @@ static struct kobject *md_probe(dev_t dev, int *part, void *data)
add_disk(disk);
mddev->gendisk = disk;
mutex_unlock(&disks_mutex);
- mddev->kobj.parent = &disk->kobj;
- kobject_set_name(&mddev->kobj, "%s", "md");
- mddev->kobj.ktype = &md_ktype;
- if (kobject_register(&mddev->kobj))
+ error = kobject_init_and_add(&mddev->kobj, &md_ktype, &disk->kobj,
+ "%s", "md");
+ if (error)
printk(KERN_WARNING "md: cannot register %s/md - name in use\n",
disk->disk_name);
+ else
+ kobject_uevent(&mddev->kobj, KOBJ_ADD);
return NULL;
}--
1.5.3.8--
This converts the code to use the new kobject functions, cleaning up the
logic in doing so.Cc: Kyle A. Lucke <klucke@us.ibm.com>
Cc: David Gibson <dwg@au1.ibm.com>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/net/iseries_veth.c | 19 ++++++-------------
1 files changed, 6 insertions(+), 13 deletions(-)diff --git a/drivers/net/iseries_veth.c b/drivers/net/iseries_veth.c
index 97bd9dc..90ff4ec 100644
--- a/drivers/net/iseries_veth.c
+++ b/drivers/net/iseries_veth.c
@@ -815,7 +815,7 @@ static int veth_init_connection(u8 rlp)
{
struct veth_lpar_connection *cnx;
struct veth_msg *msgs;
- int i, rc;
+ int i;if ( (rlp == this_lp)
|| ! HvLpConfig_doLpsCommunicateOnVirtualLan(this_lp, rlp) )
@@ -844,11 +844,7 @@ static int veth_init_connection(u8 rlp)/* This gets us 1 reference, which is held on behalf of the driver
* infrastructure. It's released at module unload. */
- kobject_init(&cnx->kobject);
- cnx->kobject.ktype = &veth_lpar_connection_ktype;
- rc = kobject_set_name(&cnx->kobject, "cnx%.2d", rlp);
- if (rc != 0)
- return rc;
+ kobject_init_ng(&cnx->kobject, &veth_lpar_connection_ktype);msgs = kcalloc(VETH_NUMBUFFERS, sizeof(struct veth_msg), GFP_KERNEL);
if (! msgs) {
@@ -1087,11 +1083,8 @@ static struct net_device * __init veth_probe_one(int vlan,
return NULL;
}- kobject_init(&port->kobject);
- port->kobject.parent = &dev->dev.kobj;
- port->kobject.ktype = &veth_port_ktype;
- kobject_set_name(&port->kobject, "veth_port");
- if (0 != kobject_add(&port->kobject))
+ kobject_init_ng(&port->kobject, &veth_port_ktype);
+ if (0 != kobject_add_ng(&port->kobject, &dev->dev.kobj, "veth_port"))
veth_error("Failed adding port for %s to sysfs.\n", dev->name);veth_info("%s attached to iSeries vlan %d (LPAR map = 0x%.4X)\n",
@@ -1711,9 +1704,9 @@ s...
This code is really really really broken. So much so that it's almost
impossible to fix with a simple patch, so just comment out the offending
registration with the kobject core, and mark the driver as broken.The problem is that the code is trying to register a "raw" struct
device, which is not allowed. struct device is only for use within the
driver model. This is being done to try to use the firmware layer which
wants a struct device. To properly fix this, use something easy, like a
platform device, which is a struct device and can be used for this kind
of thing.Cc: Mikael Starvik <starvik@axis.com>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
arch/cris/arch-v32/drivers/iop_fw_load.c | 11 +++++++++++
1 files changed, 11 insertions(+), 0 deletions(-)diff --git a/arch/cris/arch-v32/drivers/iop_fw_load.c b/arch/cris/arch-v32/drivers/iop_fw_load.c
index 11f9895..f4bdc1d 100644
--- a/arch/cris/arch-v32/drivers/iop_fw_load.c
+++ b/arch/cris/arch-v32/drivers/iop_fw_load.c
@@ -20,6 +20,9 @@#define IOP_TIMEOUT 100
+#error "This driver is broken with regard to its driver core usage."
+#error "Please contact <greg@kroah.com> for details on how to fix it properly."
+
static struct device iop_spu_device[2] = {
{ .bus_id = "iop-spu0", },
{ .bus_id = "iop-spu1", },
@@ -192,6 +195,13 @@ int iop_start_mpu(unsigned int start_addr)static int __init iop_fw_load_init(void)
{
+#if 0
+ /*
+ * static struct devices can not be added directly to sysfs by ignoring
+ * the driver model infrastructure. To fix this properly, please use
+ * the platform_bus to register these devices to be able to properly
+ * use the firmware infrastructure.
+ */
device_initialize(&iop_spu_device[0]);
kobject_set_name(&iop_spu_device[0].kobj, "iop-spu0");
kobject_add(&iop_spu_device[0].kobj);
@@ -201,6 +211,7 @@ static int __init iop_fw_load_init(void)
device_initialize(&io...
From: Cornelia Huck <cornelia.huck@de.ibm.com>
Make setup_parent() void as get_device_parent() will always return
either a valid kobject or NULL.
Introduce cleanup_glue_dir() to drop reference grabbed on "glue"
directory by get_device_parent(). Use it for cleanup in device_move()
and device_add() on errors.This should fix the refcounting problem reported in
http://marc.info/?l=linux-kernel&m=120052487909200&w=2Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Cc: Dave Young <hidave.darkstar@gmail.com>
Cc: Gabor Gombas <gombasg@sztaki.hu>
Cc: Tejun Heo <htejun@gmail.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Marcel Holtmann <marcel@holtmann.org>
Cc: David Miller <davem@davemloft.net>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/core.c | 29 ++++++++++++++---------------
1 files changed, 14 insertions(+), 15 deletions(-)diff --git a/drivers/base/core.c b/drivers/base/core.c
index d5d542d..f09dde3 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -552,6 +552,8 @@ static struct kobject *get_device_parent(struct device *dev,
}static inline void cleanup_device_parent(struct device *dev) {}
+static inline void cleanup_glue_dir(struct device *dev,
+ struct kobject *glue_dir) {}
#else
static struct kobject *virtual_device_parent(struct device *dev)
{
@@ -616,27 +618,27 @@ static struct kobject *get_device_parent(struct device *dev,
return NULL;
}-static void cleanup_device_parent(struct device *dev)
+static void cleanup_glue_dir(struct device *dev, struct kobject *glue_dir)
{
- struct kobject *glue_dir = dev->kobj.parent;
-
/* see if we live in a "glue" directory */
if (!dev->class || glue_dir->kset != &dev->class->class_dirs)
return;kobject_put(glue_dir);
}
+
+static void cleanup_device_parent(struct device *dev)
+{
+ cleanup_glue_dir(dev, dev->kobj.pa...
From: Kay Sievers <kay.sievers@vrfy.org>
Sysfs symlinks now require fully registered kobjects as a target,
otherwise the call to create a symlink will fail. Here we register
the kobject before we request the symlink in the holders directory.Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
Cc: Tejun Heo <teheo@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
kernel/module.c | 15 +++++++--------
1 files changed, 7 insertions(+), 8 deletions(-)diff --git a/kernel/module.c b/kernel/module.c
index dc4d3f5..0ae8117 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -1227,6 +1227,8 @@ int mod_sysfs_init(struct module *mod)kobject_init(&mod->mkobj.kobj);
+ /* delay uevent until full sysfs population */
+ err = kobject_add(&mod->mkobj.kobj);
out:
return err;
}
@@ -1237,11 +1239,6 @@ int mod_sysfs_setup(struct module *mod,
{
int err;- /* delay uevent until full sysfs population */
- err = kobject_add(&mod->mkobj.kobj);
- if (err)
- goto out;
-
mod->holders_dir = kobject_create_and_add("holders", &mod->mkobj.kobj);
if (!mod->holders_dir) {
err = -ENOMEM;
@@ -1266,7 +1263,6 @@ out_unreg_holders:
out_unreg:
kobject_del(&mod->mkobj.kobj);
kobject_put(&mod->mkobj.kobj);
-out:
return err;
}
#endif
@@ -1883,10 +1879,10 @@ static struct module *load_module(void __user *umod,
/* Now we've moved module, initialize linked lists, etc. */
module_unload_init(mod);- /* Initialize kobject, so we can reference it. */
+ /* add kobject, so we can reference it. */
err = mod_sysfs_init(mod);
if (err)
- goto cleanup;
+ goto free_unload;/* Set up license info based on the info section */
set_license(mod, get_modinfo(sechdrs, infoindex, "license"));
@@ -2056,6 +2052,9 @@ static struct module *load_module(void __user *umod,
arch_cleanup:
module_arch_cleanup(mod);
cleanup:
+ kobject_del(&mod->mkobj.kobj);
+ kobject_put(&a...
This converts the code to use the new kobject functions, cleaning up the
logic in doing so.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
fs/char_dev.c | 6 ++----
1 files changed, 2 insertions(+), 4 deletions(-)diff --git a/fs/char_dev.c b/fs/char_dev.c
index c3bfa76..b2dd5a0 100644
--- a/fs/char_dev.c
+++ b/fs/char_dev.c
@@ -510,9 +510,8 @@ struct cdev *cdev_alloc(void)
{
struct cdev *p = kzalloc(sizeof(struct cdev), GFP_KERNEL);
if (p) {
- p->kobj.ktype = &ktype_cdev_dynamic;
INIT_LIST_HEAD(&p->list);
- kobject_init(&p->kobj);
+ kobject_init_ng(&p->kobj, &ktype_cdev_dynamic);
}
return p;
}
@@ -529,8 +528,7 @@ void cdev_init(struct cdev *cdev, const struct file_operations *fops)
{
memset(cdev, 0, sizeof *cdev);
INIT_LIST_HEAD(&cdev->list);
- cdev->kobj.ktype = &ktype_cdev_default;
- kobject_init(&cdev->kobj);
+ kobject_init_ng(&cdev->kobj, &ktype_cdev_default);
cdev->ops = fops;
}--
1.5.3.8--
Stop using kobject_register, as this way we can control the sending of
the uevent properly, after everything is properly initialized.Cc: Matt Domsch <Matt_Domsch@dell.com>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/firmware/efivars.c | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c
index 7f9f086..b61a72f 100644
--- a/drivers/firmware/efivars.c
+++ b/drivers/firmware/efivars.c
@@ -617,16 +617,16 @@ efivar_create_sysfs_entry(unsigned long variable_name_size,
*(short_name + strlen(short_name)) = '-';
efi_guid_unparse(vendor_guid, short_name + strlen(short_name));- kobject_set_name(&new_efivar->kobj, "%s", short_name);
new_efivar->kobj.kset = vars_kset;
- new_efivar->kobj.ktype = &efivar_ktype;
- i = kobject_register(&new_efivar->kobj);
+ i = kobject_init_and_add(&new_efivar->kobj, &efivar_ktype, NULL,
+ "%s", short_name);
if (i) {
kfree(short_name);
kfree(new_efivar);
return 1;
}+ kobject_uevent(&new_efivar->kobj, KOBJ_ADD);
kfree(short_name);
short_name = NULL;--
1.5.3.8--
From: Cornelia Huck <cornelia.huck@de.ibm.com>
CC: Ursula Braun <ubraun@linux.vnet.ibm.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/s390/net/netiucv.c | 16 ++++++----------
1 files changed, 6 insertions(+), 10 deletions(-)diff --git a/drivers/s390/net/netiucv.c b/drivers/s390/net/netiucv.c
index c7ea938..d6e93f1 100644
--- a/drivers/s390/net/netiucv.c
+++ b/drivers/s390/net/netiucv.c
@@ -2089,6 +2089,11 @@ static struct attribute_group netiucv_drv_attr_group = {
.attrs = netiucv_drv_attrs,
};+static struct attribute_group *netiucv_drv_attr_groups[] = {
+ &netiucv_drv_attr_group,
+ NULL,
+};
+
static void netiucv_banner(void)
{
PRINT_INFO("NETIUCV driver initialized\n");
@@ -2113,7 +2118,6 @@ static void __exit netiucv_exit(void)
netiucv_unregister_device(dev);
}- sysfs_remove_group(&netiucv_driver.kobj, &netiucv_drv_attr_group);
driver_unregister(&netiucv_driver);
iucv_unregister(&netiucv_handler, 1);
iucv_unregister_dbf_views();
@@ -2133,6 +2137,7 @@ static int __init netiucv_init(void)
if (rc)
goto out_dbf;
IUCV_DBF_TEXT(trace, 3, __FUNCTION__);
+ netiucv_driver.groups = netiucv_drv_attr_groups;
rc = driver_register(&netiucv_driver);
if (rc) {
PRINT_ERR("NETIUCV: failed to register driver.\n");
@@ -2140,18 +2145,9 @@ static int __init netiucv_init(void)
goto out_iucv;
}- rc = sysfs_create_group(&netiucv_driver.kobj, &netiucv_drv_attr_group);
- if (rc) {
- PRINT_ERR("NETIUCV: failed to add driver attributes.\n");
- IUCV_DBF_TEXT_(setup, 2,
- "ret %d - netiucv_drv_attr_group\n", rc);
- goto out_driver;
- }
netiucv_banner();
return rc;-out_driver:
- driver_unregister(&netiucv_driver);
out_iucv:
iucv_unregister(&netiucv_handler, 1);
out_dbf:
--
1.5.3.8--
From: Dave Young <hidave.darkstar@gmail.com>
Add the following class iteration functions for driver use:
class_for_each_device
class_find_device
class_for_each_child
class_find_childSigned-off-by: Dave Young <hidave.darkstar@gmail.com>
Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/class.c | 133 ++++++++++++++++++++++++++++++++++++++++++++++++
include/linux/device.h | 9 +++-
2 files changed, 140 insertions(+), 2 deletions(-)diff --git a/drivers/base/class.c b/drivers/base/class.c
index b962a76..9f737ff 100644
--- a/drivers/base/class.c
+++ b/drivers/base/class.c
@@ -809,6 +809,139 @@ void class_device_put(struct class_device *class_dev)
kobject_put(&class_dev->kobj);
}+/**
+ * class_for_each_device - device iterator
+ * @class: the class we're iterating
+ * @data: data for the callback
+ * @fn: function to be called for each device
+ *
+ * Iterate over @class's list of devices, and call @fn for each,
+ * passing it @data.
+ *
+ * We check the return of @fn each time. If it returns anything
+ * other than 0, we break out and return that value.
+ *
+ * Note, we hold class->sem in this function, so it can not be
+ * re-acquired in @fn, otherwise it will self-deadlocking. For
+ * example, calls to add or remove class members would be verboten.
+ */
+int class_for_each_device(struct class *class, void *data,
+ int (*fn)(struct device *, void *))
+{
+ struct device *dev;
+ int error = 0;
+
+ if (!class)
+ return -EINVAL;
+ down(&class->sem);
+ list_for_each_entry(dev, &class->devices, node) {
+ dev = get_device(dev);
+ if (dev) {
+ error = fn(dev, data);
+ put_device(dev);
+ } else
+ error = -ENODEV;
+ if (error)
+ break;
+ }
+ up(&class->sem);
+
+ return error;
+}
+EXPORT_SYMBOL_GPL(class_for_each_device);
+
+/**
+ * class_find_device - device iterator for locating a particular device
...
This allows an easier way to get to the kset associated with a struct
bus_type (you have three to choose from...) This will make it easier to
move these fields to be dynamic in a future patch.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/bus.c | 6 ++++++
drivers/pci/hotplug/pci_hotplug_core.c | 5 ++++-
include/linux/device.h | 2 ++
3 files changed, 12 insertions(+), 1 deletions(-)diff --git a/drivers/base/bus.c b/drivers/base/bus.c
index 871607b..8335a10 100644
--- a/drivers/base/bus.c
+++ b/drivers/base/bus.c
@@ -935,6 +935,12 @@ int bus_unregister_notifier(struct bus_type *bus, struct notifier_block *nb)
}
EXPORT_SYMBOL_GPL(bus_unregister_notifier);+struct kset *bus_get_kset(struct bus_type *bus)
+{
+ return &bus->subsys;
+}
+EXPORT_SYMBOL_GPL(bus_get_kset);
+
int __init buses_init(void)
{
bus_kset = kset_create_and_add("bus", &bus_uevent_ops, NULL);
diff --git a/drivers/pci/hotplug/pci_hotplug_core.c b/drivers/pci/hotplug/pci_hotplug_core.c
index 0f05e6a..3606d5b 100644
--- a/drivers/pci/hotplug/pci_hotplug_core.c
+++ b/drivers/pci/hotplug/pci_hotplug_core.c
@@ -699,9 +699,12 @@ int __must_check pci_hp_change_slot_info(struct hotplug_slot *slot,
static int __init pci_hotplug_init (void)
{
int result;
+ struct kset *pci_bus_kset;
+
+ pci_bus_kset = bus_get_kset(&pci_bus_type);pci_hotplug_slots_kset = kset_create_and_add("slots", NULL,
- &pci_bus_type.subsys.kobj);
+ &pci_bus_kset->kobj);
if (!pci_hotplug_slots_kset) {
result = -ENOMEM;
err("Register subsys error\n");
diff --git a/include/linux/device.h b/include/linux/device.h
index 313e0b3..3cc13c3 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -117,6 +117,8 @@ extern int bus_unregister_notifier(struct bus_type *bus,
#define BUS_NOTIFY_UNBIND_DRIVER 0x00000004 /* driver about to be
...
Finally clean up the odd spaces and other mess in kobject.h
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
include/linux/kobject.h | 67 ++++++++++++++++++++++++-----------------------
1 files changed, 34 insertions(+), 33 deletions(-)diff --git a/include/linux/kobject.h b/include/linux/kobject.h
index 4adbe1d..caa3f41 100644
--- a/include/linux/kobject.h
+++ b/include/linux/kobject.h
@@ -3,15 +3,14 @@
*
* Copyright (c) 2002-2003 Patrick Mochel
* Copyright (c) 2002-2003 Open Source Development Labs
- * Copyright (c) 2006-2007 Greg Kroah-Hartman <greg@kroah.com>
- * Copyright (c) 2006-2007 Novell Inc.
+ * Copyright (c) 2006-2008 Greg Kroah-Hartman <greg@kroah.com>
+ * Copyright (c) 2006-2008 Novell Inc.
*
* This file is released under the GPLv2.
*
- *
* Please read Documentation/kobject.txt before using the kobject
* interface, ESPECIALLY the parts about reference counts and object
- * destructors.
+ * destructors.
*/#ifndef _KOBJECT_H_
@@ -64,20 +63,20 @@ struct kobject {
const char *name;
struct kref kref;
struct list_head entry;
- struct kobject * parent;
- struct kset * kset;
- struct kobj_type * ktype;
- struct sysfs_dirent * sd;
+ struct kobject *parent;
+ struct kset *kset;
+ struct kobj_type *ktype;
+ struct sysfs_dirent *sd;
unsigned int state_initialized:1;
unsigned int state_in_sysfs:1;
unsigned int state_add_uevent_sent:1;
unsigned int state_remove_uevent_sent:1;
};-extern int kobject_set_name(struct kobject *, const char *, ...)
- __attribute__((format(printf,2,3)));
+extern int kobject_set_name(struct kobject *kobj, const char *name, ...)
+ __attribute__((format(printf, 2, 3)));-static inline const char * kobject_name(const struct kobject * kobj)
+static inline const char *kobject_name(const struct kobject *kobj)
{
return kobj->name;
}
@@ -91,7 +90,7 @@ extern int __must_check kobject_init_and_add(struct kobject *kobj,
struct kobject *pa...
This converts the code to use the new kobject functions, cleaning up the
logic in doing so.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
kernel/params.c | 6 ++----
1 files changed, 2 insertions(+), 4 deletions(-)diff --git a/kernel/params.c b/kernel/params.c
index 97e0923..1078b14 100644
--- a/kernel/params.c
+++ b/kernel/params.c
@@ -561,11 +561,9 @@ static void __init kernel_param_sysfs_setup(const char *name,mk->mod = THIS_MODULE;
mk->kobj.kset = module_kset;
- mk->kobj.ktype = &module_ktype;
- kobject_set_name(&mk->kobj, name);
- kobject_init(&mk->kobj);
- ret = kobject_add(&mk->kobj);
+ ret = kobject_init_and_add(&mk->kobj, &module_ktype, NULL, "%s", name);
if (ret) {
+ kobject_put(&mk->kobj);
printk(KERN_ERR "Module '%s' failed to be added to sysfs, "
"error number %d\n", name, ret);
printk(KERN_ERR "The system will be unstable now.\n");
--
1.5.3.8--
The driver core debugging messages are a mess. This provides a unified
message that makes them actually useful.The format for new kobject debug messages should be:
driver/bus/class: 'OBJECT_NAME': FUNCTION_NAME: message.\nNote, the class code is not changed in this patch due to pending patches
in my queue that this would conflict with. A later patch will clean
them up.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/bus.c | 14 +++++++-------
drivers/base/core.c | 23 +++++++++++++----------
drivers/base/dd.c | 16 ++++++++--------
3 files changed, 28 insertions(+), 25 deletions(-)diff --git a/drivers/base/bus.c b/drivers/base/bus.c
index aa0c986..937fc10 100644
--- a/drivers/base/bus.c
+++ b/drivers/base/bus.c
@@ -80,7 +80,7 @@ static void driver_release(struct kobject *kobj)
{
struct driver_private *drv_priv = to_driver(kobj);- pr_debug("%s: freeing %s\n", __FUNCTION__, kobject_name(kobj));
+ pr_debug("driver: '%s': %s\n", kobject_name(kobj), __FUNCTION__);
kfree(drv_priv);
}@@ -446,7 +446,7 @@ int bus_add_device(struct device * dev)
int error = 0;if (bus) {
- pr_debug("bus %s: add device %s\n", bus->name, dev->bus_id);
+ pr_debug("bus: '%s': add device %s\n", bus->name, dev->bus_id);
error = device_add_attrs(bus, dev);
if (error)
goto out_put;
@@ -519,7 +519,7 @@ void bus_remove_device(struct device * dev)
dev->is_registered = 0;
klist_del(&dev->knode_bus);
}
- pr_debug("bus %s: remove device %s\n", dev->bus->name, dev->bus_id);
+ pr_debug("bus: '%s': remove device %s\n", dev->bus->name, dev->bus_id);
device_release_driver(dev);
bus_put(dev->bus);
}
@@ -637,7 +637,7 @@ int bus_add_driver(struct device_driver *drv)
if (!bus)
return -EINVAL;- pr_debug("bus %s: add driver %s\n", bus->name, drv->name);
+ pr_debug("bus: '%s': add driver %s\n", bus->name, drv->...
Clean up the kobject.c and kobject_uevent.c files to follow the
proper coding style rules.Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
lib/kobject.c | 139 +++++++++++++++++++++++---------------------------
lib/kobject_uevent.c | 7 +--
2 files changed, 67 insertions(+), 79 deletions(-)diff --git a/lib/kobject.c b/lib/kobject.c
index 8dc3245..1d63ead 100644
--- a/lib/kobject.c
+++ b/lib/kobject.c
@@ -18,58 +18,57 @@
#include <linux/stat.h>
#include <linux/slab.h>-/**
- * populate_dir - populate directory with attributes.
- * @kobj: object we're working on.
- *
- * Most subsystems have a set of default attributes that
- * are associated with an object that registers with them.
- * This is a helper called during object registration that
- * loops through the default attributes of the subsystem
- * and creates attributes files for them in sysfs.
+/*
+ * populate_dir - populate directory with attributes.
+ * @kobj: object we're working on.
*
+ * Most subsystems have a set of default attributes that are associated
+ * with an object that registers with them. This is a helper called during
+ * object registration that loops through the default attributes of the
+ * subsystem and creates attributes files for them in sysfs.
*/
-
-static int populate_dir(struct kobject * kobj)
+static int populate_dir(struct kobject *kobj)
{
- struct kobj_type * t = get_ktype(kobj);
- struct attribute * attr;
+ struct kobj_type *t = get_ktype(kobj);
+ struct attribute *attr;
int error = 0;
int i;
-
+
if (t && t->default_attrs) {
for (i = 0; (attr = t->default_attrs[i]) != NULL; i++) {
- if ((error = sysfs_create_file(kobj,attr)))
+ error = sysfs_create_file(kobj, attr);
+ if (error)
break;
}
}
return error;
}-static int create_dir(struct kobject * kobj)
+static int create_dir(struct kobject *kobj)
{
int error = 0;
if (kobject_name(kobj)) {
error = sysfs_create_dir(ko...
There are no in-kernel users of kobject_unregister() so it should be
removed.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
include/linux/kobject.h | 2 --
lib/kobject.c | 17 -----------------
2 files changed, 0 insertions(+), 19 deletions(-)diff --git a/include/linux/kobject.h b/include/linux/kobject.h
index be03ce8..504ac0e 100644
--- a/include/linux/kobject.h
+++ b/include/linux/kobject.h
@@ -101,8 +101,6 @@ extern struct kobject * __must_check kobject_create_and_add(const char *name,
extern int __must_check kobject_rename(struct kobject *, const char *new_name);
extern int __must_check kobject_move(struct kobject *, struct kobject *);-extern void kobject_unregister(struct kobject *);
-
extern struct kobject * kobject_get(struct kobject *);
extern void kobject_put(struct kobject *);diff --git a/lib/kobject.c b/lib/kobject.c
index 462946e..a077373 100644
--- a/lib/kobject.c
+++ b/lib/kobject.c
@@ -533,22 +533,6 @@ void kobject_del(struct kobject * kobj)
}/**
- * kobject_unregister - remove object from hierarchy and decrement refcount.
- * @kobj: object going away.
- */
-
-void kobject_unregister(struct kobject * kobj)
-{
- if (!kobj)
- return;
- pr_debug("kobject: '%s' (%p): %s\n",
- kobject_name(kobj), kobj, __FUNCTION__);
- kobject_uevent(kobj, KOBJ_REMOVE);
- kobject_del(kobj);
- kobject_put(kobj);
-}
-
-/**
* kobject_get - increment refcount for object.
* @kobj: object.
*/
@@ -877,7 +861,6 @@ struct kset *kset_create_and_add(const char *name,
}
EXPORT_SYMBOL_GPL(kset_create_and_add);-EXPORT_SYMBOL(kobject_unregister);
EXPORT_SYMBOL(kobject_get);
EXPORT_SYMBOL(kobject_put);
EXPORT_SYMBOL(kobject_del);
--
1.5.3.8--
From: Kay Sievers <kay.sievers@vrfy.org>
All kobjects require a dynamically allocated name now. We no longer
need to keep track if the name is statically assigned, we can just
unconditionally free() all kobject names on cleanup.Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
arch/arm/kernel/time.c | 4 ++--
arch/arm/mach-integrator/integrator_ap.c | 2 +-
arch/arm/mach-pxa/cm-x270.c | 2 +-
arch/arm/mach-pxa/lpd270.c | 2 +-
arch/arm/mach-pxa/lubbock.c | 2 +-
arch/arm/mach-pxa/mainstone.c | 2 +-
arch/arm/mach-s3c2410/s3c2410.c | 2 +-
arch/arm/mach-s3c2412/s3c2412.c | 2 +-
arch/arm/mach-s3c2440/mach-osiris.c | 2 +-
arch/arm/mach-s3c2443/s3c2443.c | 2 +-
arch/arm/mach-sa1100/irq.c | 2 +-
arch/arm/oprofile/common.c | 2 +-
arch/arm/plat-omap/gpio.c | 2 +-
arch/arm/plat-s3c24xx/dma.c | 2 +-
arch/arm/plat-s3c24xx/s3c244x.c | 4 ++--
arch/avr32/kernel/time.c | 2 +-
arch/mips/kernel/i8259.c | 2 +-
arch/powerpc/platforms/cell/spu_base.c | 2 +-
arch/powerpc/platforms/powermac/pic.c | 2 +-
arch/powerpc/sysdev/ipic.c | 2 +-
arch/powerpc/sysdev/mpic.c | 2 +-
arch/powerpc/sysdev/qe_lib/qe_ic.c | 2 +-
arch/ppc/syslib/ipic.c | 2 +-
arch/ppc/syslib/open_pic.c | 2 +-
arch/ppc/syslib/open_pic2.c | 2 +-
arch/s390/kernel/time.c | 2 +-
arch/sh/drivers/dma/dma-sysfs.c | 2 +-
arch/sh/kernel/time.c | 2 +-
arch/x86/kernel/apic_32.c | 2 +-
arch/x86/kernel/apic_64.c | 2 +-
arch/x86/kernel/cpu/mcheck/mce_64.c | 2 +-
arch/x86/kernel/i8237.c ...
Stop using kobject_register, as this way we can control the sending of
the uevent properly, after everything is properly initialized.Cc: Kristen Carlson Accardi <kristen.c.accardi@intel.com>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/pci/hotplug/pci_hotplug_core.c | 14 +++++++-------
1 files changed, 7 insertions(+), 7 deletions(-)diff --git a/drivers/pci/hotplug/pci_hotplug_core.c b/drivers/pci/hotplug/pci_hotplug_core.c
index 175e0c8..0f05e6a 100644
--- a/drivers/pci/hotplug/pci_hotplug_core.c
+++ b/drivers/pci/hotplug/pci_hotplug_core.c
@@ -630,19 +630,19 @@ int pci_hp_register (struct hotplug_slot *slot)
return -EINVAL;
}- kobject_set_name(&slot->kobj, "%s", slot->name);
- slot->kobj.kset = pci_hotplug_slots_kset;
- slot->kobj.ktype = &hotplug_slot_ktype;
-
/* this can fail if we have already registered a slot with the same name */
- if (kobject_register(&slot->kobj)) {
- err("Unable to register kobject");
+ slot->kobj.kset = pci_hotplug_slots_kset;
+ result = kobject_init_and_add(&slot->kobj, &hotplug_slot_ktype, NULL,
+ "%s", slot->name);
+ if (result) {
+ err("Unable to register kobject '%s'", slot->name);
return -EINVAL;
}
-
+
list_add (&slot->slot_list, &pci_hotplug_slot_list);result = fs_add_slot (slot);
+ kobject_uevent(&slot->kobj, KOBJ_ADD);
dbg ("Added slot %s to the list\n", slot->name);
return result;
}
--
1.5.3.8--
Finally clean up the odd spaces and other mess in device.h
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
include/linux/device.h | 283 +++++++++++++++++++++++++-----------------------
1 files changed, 145 insertions(+), 138 deletions(-)diff --git a/include/linux/device.h b/include/linux/device.h
index cdaf57b..1880208 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -25,7 +25,8 @@
#include <asm/device.h>#define DEVICE_NAME_SIZE 50
-#define DEVICE_NAME_HALF __stringify(20) /* Less than half to accommodate slop */
+/* DEVICE_NAME_HALF is really less than half to accommodate slop */
+#define DEVICE_NAME_HALF __stringify(20)
#define DEVICE_ID_SIZE 32
#define BUS_ID_SIZE KOBJ_NAME_LEN@@ -40,52 +41,53 @@ struct bus_type_private;
struct bus_attribute {
struct attribute attr;
- ssize_t (*show)(struct bus_type *, char * buf);
- ssize_t (*store)(struct bus_type *, const char * buf, size_t count);
+ ssize_t (*show)(struct bus_type *bus, char *buf);
+ ssize_t (*store)(struct bus_type *bus, const char *buf, size_t count);
};-#define BUS_ATTR(_name,_mode,_show,_store) \
-struct bus_attribute bus_attr_##_name = __ATTR(_name,_mode,_show,_store)
+#define BUS_ATTR(_name, _mode, _show, _store) \
+struct bus_attribute bus_attr_##_name = __ATTR(_name, _mode, _show, _store)extern int __must_check bus_create_file(struct bus_type *,
struct bus_attribute *);
extern void bus_remove_file(struct bus_type *, struct bus_attribute *);struct bus_type {
- const char * name;
- struct bus_attribute * bus_attrs;
- struct device_attribute * dev_attrs;
- struct driver_attribute * drv_attrs;
-
- int (*match)(struct device * dev, struct device_driver * drv);
- int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
- int (*probe)(struct device * dev);
- int (*remove)(struct device * dev);
- void (*shutdown)(struct device * dev);
-
- int (*suspend)(struct device * dev, pm_message_t state);
- int (*suspend_la...
The PCI bus should not be trying to declare its own attribute type.
Especially as this code could never ever be called because the driver
core overwrites the driver kobject type to be its own internal type.
Delete all of this code as it was never being used and is not correct.Also update my copyright on the file while I'm touching things there.
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/pci/pci-driver.c | 50 ++++-----------------------------------------
1 files changed, 5 insertions(+), 45 deletions(-)diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
index 73e3629..c4fa35d 100644
--- a/drivers/pci/pci-driver.c
+++ b/drivers/pci/pci-driver.c
@@ -1,6 +1,11 @@
/*
* drivers/pci/pci-driver.c
*
+ * (C) Copyright 2002-2004, 2007 Greg Kroah-Hartman <greg@kroah.com>
+ * (C) Copyright 2007 Novell Inc.
+ *
+ * Released under the GPL v2 only.
+ *
*/#include <linux/pci.h>
@@ -356,50 +361,6 @@ static void pci_device_shutdown(struct device *dev)
drv->shutdown(pci_dev);
}-#define kobj_to_pci_driver(obj) container_of(obj, struct device_driver, kobj)
-#define attr_to_driver_attribute(obj) container_of(obj, struct driver_attribute, attr)
-
-static ssize_t
-pci_driver_attr_show(struct kobject * kobj, struct attribute *attr, char *buf)
-{
- struct device_driver *driver = kobj_to_pci_driver(kobj);
- struct driver_attribute *dattr = attr_to_driver_attribute(attr);
- ssize_t ret;
-
- if (!get_driver(driver))
- return -ENODEV;
-
- ret = dattr->show ? dattr->show(driver, buf) : -EIO;
-
- put_driver(driver);
- return ret;
-}
-
-static ssize_t
-pci_driver_attr_store(struct kobject * kobj, struct attribute *attr,
- const char *buf, size_t count)
-{
- struct device_driver *driver = kobj_to_pci_driver(kobj);
- struct driver_attribute *dattr = attr_to_driver_attribute(attr);
- ssize_t ret;
-
- if (!get_driver(driver))
- return -ENODEV;
-
- ret = dattr->store ? dattr->store(driver, ...
No one is calling this anymore, so just remove it and hard-code the one
internal-use of it.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
include/linux/kobject.h | 1 -
lib/kobject.c | 13 +------------
2 files changed, 1 insertions(+), 13 deletions(-)diff --git a/include/linux/kobject.h b/include/linux/kobject.h
index 2590847..63967da 100644
--- a/include/linux/kobject.h
+++ b/include/linux/kobject.h
@@ -158,7 +158,6 @@ struct kset {
};extern void kset_init(struct kset * k);
-extern int __must_check kset_add(struct kset * k);
extern int __must_check kset_register(struct kset * k);
extern void kset_unregister(struct kset * k);
extern struct kset * __must_check kset_create_and_add(const char *name,
diff --git a/lib/kobject.c b/lib/kobject.c
index 3326281..c321f19 100644
--- a/lib/kobject.c
+++ b/lib/kobject.c
@@ -710,17 +710,6 @@ struct sysfs_ops kobj_sysfs_ops = {
};/**
- * kset_add - add a kset object to the hierarchy.
- * @k: kset.
- */
-
-int kset_add(struct kset * k)
-{
- return kobject_add_internal(&k->kobj);
-}
-
-
-/**
* kset_register - initialize and add a kset.
* @k: kset.
*/
@@ -733,7 +722,7 @@ int kset_register(struct kset * k)
return -EINVAL;kset_init(k);
- err = kset_add(k);
+ err = kobject_add_internal(&k->kobj);
if (err)
return err;
kobject_uevent(&k->kobj, KOBJ_ADD);
--
1.5.3.8--
There is no need for kobject_unregister() anymore, thanks to Kay's
kobject cleanup changes, so replace all instances of it with
kobject_put().Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
fs/configfs/mount.c | 6 +++---
fs/debugfs/inode.c | 4 ++--
fs/dlm/lockspace.c | 4 ++--
fs/ecryptfs/main.c | 4 ++--
fs/fuse/inode.c | 6 +++---
fs/gfs2/locking/dlm/sysfs.c | 2 +-
fs/gfs2/sys.c | 4 ++--
fs/partitions/check.c | 6 +++---
8 files changed, 18 insertions(+), 18 deletions(-)diff --git a/fs/configfs/mount.c b/fs/configfs/mount.c
index 54bf0db..de3b31d 100644
--- a/fs/configfs/mount.c
+++ b/fs/configfs/mount.c
@@ -150,7 +150,7 @@ static int __init configfs_init(void)
err = register_filesystem(&configfs_fs_type);
if (err) {
printk(KERN_ERR "configfs: Unable to register filesystem!\n");
- kobject_unregister(config_kobj);
+ kobject_put(config_kobj);
kmem_cache_destroy(configfs_dir_cachep);
configfs_dir_cachep = NULL;
goto out;
@@ -159,7 +159,7 @@ static int __init configfs_init(void)
err = configfs_inode_init();
if (err) {
unregister_filesystem(&configfs_fs_type);
- kobject_unregister(config_kobj);
+ kobject_put(config_kobj);
kmem_cache_destroy(configfs_dir_cachep);
configfs_dir_cachep = NULL;
}
@@ -170,7 +170,7 @@ out:
static void __exit configfs_exit(void)
{
unregister_filesystem(&configfs_fs_type);
- kobject_unregister(config_kobj);
+ kobject_put(config_kobj);
kmem_cache_destroy(configfs_dir_cachep);
configfs_dir_cachep = NULL;
configfs_inode_exit();
diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c
index 97f6381..d26e282 100644
--- a/fs/debugfs/inode.c
+++ b/fs/debugfs/inode.c
@@ -438,7 +438,7 @@ static int __init debugfs_init(void)retval = register_filesystem(&debug_fs_type);
if (retval)
- kobject_unregister(debug_kobj);
+ kobject...
Stop using kobject_register, as this way we can control the sending of
the uevent properly, after everything is properly initialized.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/sys.c | 16 ++++++----------
1 files changed, 6 insertions(+), 10 deletions(-)diff --git a/drivers/base/sys.c b/drivers/base/sys.c
index 29eadc6..47fc6eb 100644
--- a/drivers/base/sys.c
+++ b/drivers/base/sys.c
@@ -224,20 +224,15 @@ int sysdev_register(struct sys_device * sysdev)
if (!cls)
return -EINVAL;+ pr_debug("Registering sys device '%s'\n", kobject_name(&sysdev->kobj));
+
/* Make sure the kset is set */
sysdev->kobj.kset = &cls->kset;- /* But make sure we point to the right type for sysfs translation */
- sysdev->kobj.ktype = &ktype_sysdev;
- error = kobject_set_name(&sysdev->kobj, "%s%d",
- kobject_name(&cls->kset.kobj), sysdev->id);
- if (error)
- return error;
-
- pr_debug("Registering sys device '%s'\n", kobject_name(&sysdev->kobj));
-
/* Register the object */
- error = kobject_register(&sysdev->kobj);
+ error = kobject_init_and_add(&sysdev->kobj, &ktype_sysdev, NULL,
+ "%s%d", kobject_name(&cls->kset.kobj),
+ sysdev->id);if (!error) {
struct sysdev_driver * drv;
@@ -254,6 +249,7 @@ int sysdev_register(struct sys_device * sysdev)
}
mutex_unlock(&sysdev_drivers_lock);
}
+ kobject_uevent(&sysdev->kobj, KOBJ_ADD);
return error;
}--
1.5.3.8--
Don't try to call the "raw" sysfs_create_file when we already have a
helper function to do this kind of work for us.Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/usb/core/driver.c | 8 ++++----
1 files changed, 4 insertions(+), 4 deletions(-)diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c
index c51f8e9..7c3aaa9 100644
--- a/drivers/usb/core/driver.c
+++ b/drivers/usb/core/driver.c
@@ -91,8 +91,8 @@ static int usb_create_newid_file(struct usb_driver *usb_drv)
goto exit;if (usb_drv->probe != NULL)
- error = sysfs_create_file(&usb_drv->drvwrap.driver.kobj,
- &driver_attr_new_id.attr);
+ error = driver_create_file(&usb_drv->drvwrap.driver,
+ &driver_attr_new_id);
exit:
return error;
}
@@ -103,8 +103,8 @@ static void usb_remove_newid_file(struct usb_driver *usb_drv)
return;if (usb_drv->probe != NULL)
- sysfs_remove_file(&usb_drv->drvwrap.driver.kobj,
- &driver_attr_new_id.attr);
+ driver_remove_file(&usb_drv->drvwrap.driver,
+ &driver_attr_new_id);
}static void usb_free_dynids(struct usb_driver *usb_drv)
--
1.5.3.8--
This converts the code to use the new kobject functions, cleaning up the
logic in doing so.Cc: Stephen Hemminger <shemminger@linux-foundation.org>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
net/bridge/br_if.c | 10 +++-------
1 files changed, 3 insertions(+), 7 deletions(-)diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c
index dadec94..298e0f4 100644
--- a/net/bridge/br_if.c
+++ b/net/bridge/br_if.c
@@ -258,12 +258,6 @@ static struct net_bridge_port *new_nbp(struct net_bridge *br,
p->state = BR_STATE_DISABLED;
br_stp_port_timer_init(p);- kobject_init(&p->kobj);
- kobject_set_name(&p->kobj, SYSFS_BRIDGE_PORT_ATTR);
- p->kobj.ktype = &brport_ktype;
- p->kobj.parent = &(dev->dev.kobj);
- p->kobj.kset = NULL;
-
return p;
}@@ -379,7 +373,8 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)
if (IS_ERR(p))
return PTR_ERR(p);- err = kobject_add(&p->kobj);
+ err = kobject_init_and_add(&p->kobj, &brport_ktype, &(dev->dev.kobj),
+ SYSFS_BRIDGE_PORT_ATTR);
if (err)
goto err0;@@ -416,6 +411,7 @@ err2:
br_fdb_delete_by_port(br, p, 1);
err1:
kobject_del(&p->kobj);
+ return err;
err0:
kobject_put(&p->kobj);
return err;
--
1.5.3.8--
On Thu, 24 Jan 2008 23:32:45 -0800
This is fine, no issues.
--
Stephen Hemminger <stephen.hemminger@vyatta.com>
--
From: Alan Stern <stern@rowland.harvard.edu>
This patch (as1015) reverts changes that were made to the driver core
about four years ago. The intent back then was to avoid certain kinds
of invalid memory accesses by leaving kernel objects allocated as long
as any of their children were still allocated. The original and
correct approach was to wait only as long as any children were still
_registered_; that's what this patch reinstates.This fixes a problem in the SCSI core made visible by the class_device
to regular device conversion: A reference loop (scsi_device holds
reference to request_queue, which is the child of a gendisk, which is
the child of the scsi_device) prevents the data structures from being
released, even though they are deregistered okay.It's possible that this change will cause a few bugs to surface,
things that have been hidden for several years. They can be fixed
easily enough by having the child device take an explicit reference to
the parent whenever needed.Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
lib/kobject.c | 7 ++++---
1 files changed, 4 insertions(+), 3 deletions(-)diff --git a/lib/kobject.c b/lib/kobject.c
index 1015f74..493e991 100644
--- a/lib/kobject.c
+++ b/lib/kobject.c
@@ -149,12 +149,16 @@ void kobject_init(struct kobject * kobj)static void unlink(struct kobject * kobj)
{
+ struct kobject *parent = kobj->parent;
+
if (kobj->kset) {
spin_lock(&kobj->kset->list_lock);
list_del_init(&kobj->entry);
spin_unlock(&kobj->kset->list_lock);
}
+ kobj->parent = NULL;
kobject_put(kobj);
+ kobject_put(parent);
}/**
@@ -208,7 +212,6 @@ int kobject_add(struct kobject * kobj)
if (error) {
/* unlink does the kobject_put() for us */
unlink(kobj);
- kobject_put(parent);/* be noisy on error issues */
if (error == -EEXIST)
@...
Stop using kobject_register, as this way we can control the sending of
the uevent properly, after everything is properly initialized.Acked-by: Doug Thompson <dougthompson@xmission.com>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/edac/edac_device_sysfs.c | 39 +++++++++++--------------------------
drivers/edac/edac_mc_sysfs.c | 28 ++++++++------------------
drivers/edac/edac_pci_sysfs.c | 29 +++++++--------------------
3 files changed, 29 insertions(+), 67 deletions(-)diff --git a/drivers/edac/edac_device_sysfs.c b/drivers/edac/edac_device_sysfs.c
index 70b837f..10e5b19 100644
--- a/drivers/edac/edac_device_sysfs.c
+++ b/drivers/edac/edac_device_sysfs.c
@@ -246,16 +246,6 @@ int edac_device_register_sysfs_main_kobj(struct edac_device_ctl_info *edac_dev)/* Init the devices's kobject */
memset(&edac_dev->kobj, 0, sizeof(struct kobject));
- edac_dev->kobj.ktype = &ktype_device_ctrl;
-
- /* set this new device under the edac_class kobject */
- edac_dev->kobj.parent = &edac_class->kset.kobj;
-
- /* generate sysfs "..../edac/<name>" */
- debugf4("%s() set name of kobject to: %s\n", __func__, edac_dev->name);
- err = kobject_set_name(&edac_dev->kobj, "%s", edac_dev->name);
- if (err)
- goto err_out;/* Record which module 'owns' this control structure
* and bump the ref count of the module
@@ -268,12 +258,15 @@ int edac_device_register_sysfs_main_kobj(struct edac_device_ctl_info *edac_dev)
}/* register */
- err = kobject_register(&edac_dev->kobj);
+ err = kobject_init_and_add(&edac_dev->kobj, &ktype_device_ctrl,
+ &edac_class->kset.kobj,
+ "%s", edac_dev->name);
if (err) {
debugf1("%s()Failed to register '.../edac/%s'\n",
__func__, edac_dev->name);
goto err_kobj_reg;
}
+ kobject_uevent(&edac_dev->kobj, KOBJ_ADD);/* At this point, to 'free' the con...
The function is no longer used by anyone in the kernel, and it prevents
the proper sending of the kobject uevent after the needed files are set
up by the caller. kobject_init_and_add() can be used in its place.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
include/linux/kobject.h | 1 -
lib/kobject.c | 18 ------------------
2 files changed, 0 insertions(+), 19 deletions(-)diff --git a/include/linux/kobject.h b/include/linux/kobject.h
index d9d8c36..2590847 100644
--- a/include/linux/kobject.h
+++ b/include/linux/kobject.h
@@ -96,7 +96,6 @@ extern struct kobject * __must_check kobject_create_and_add(const char *name,
extern int __must_check kobject_rename(struct kobject *, const char *new_name);
extern int __must_check kobject_move(struct kobject *, struct kobject *);-extern int __must_check kobject_register(struct kobject *);
extern void kobject_unregister(struct kobject *);extern struct kobject * kobject_get(struct kobject *);
diff --git a/lib/kobject.c b/lib/kobject.c
index 4cc231c..3326281 100644
--- a/lib/kobject.c
+++ b/lib/kobject.c
@@ -220,23 +220,6 @@ static int kobject_add_internal(struct kobject *kobj)
}/**
- * kobject_register - initialize and add an object.
- * @kobj: object in question.
- */
-
-int kobject_register(struct kobject * kobj)
-{
- int error = -EINVAL;
- if (kobj) {
- kobject_init_internal(kobj);
- error = kobject_add(kobj);
- if (!error)
- kobject_uevent(kobj, KOBJ_ADD);
- }
- return error;
-}
-
-/**
* kobject_set_name_vargs - Set the name of an kobject
* @kobj: struct kobject to set the name of
* @fmt: format string used to build the name
@@ -883,7 +866,6 @@ struct kset *kset_create_and_add(const char *name,
}
EXPORT_SYMBOL_GPL(kset_create_and_add);-EXPORT_SYMBOL(kobject_register);
EXPORT_SYMBOL(kobject_unregister);
EXPORT_SYMBOL(kobject_get);
EXPORT_SYMBOL(kobject_put);
--
1.5.3.8--
Don't try to call the "raw" sysfs_create_file when we already have a
helper function to do this kind of work for us.Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/pcmcia/ds.c | 3 +--
1 files changed, 1 insertions(+), 2 deletions(-)diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c
index 5cf89a9..15c18f5 100644
--- a/drivers/pcmcia/ds.c
+++ b/drivers/pcmcia/ds.c
@@ -312,8 +312,7 @@ pcmcia_create_newid_file(struct pcmcia_driver *drv)
{
int error = 0;
if (drv->probe != NULL)
- error = sysfs_create_file(&drv->drv.kobj,
- &driver_attr_new_id.attr);
+ error = driver_create_file(&drv->drv, &driver_attr_new_id);
return error;
}--
1.5.3.8--
This converts the code to use the new kobject functions, cleaning up the
logic in doing so.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/core.c | 8 +++-----
1 files changed, 3 insertions(+), 5 deletions(-)diff --git a/drivers/base/core.c b/drivers/base/core.c
index b3a931f..beb3516 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -523,8 +523,7 @@ static void klist_children_put(struct klist_node *n)
void device_initialize(struct device *dev)
{
dev->kobj.kset = devices_kset;
- dev->kobj.ktype = &device_ktype;
- kobject_init(&dev->kobj);
+ kobject_init_ng(&dev->kobj, &device_ktype);
klist_init(&dev->klist_children, klist_children_get,
klist_children_put);
INIT_LIST_HEAD(&dev->dma_pools);
@@ -729,7 +728,7 @@ static void device_remove_class_symlinks(struct device *dev)
* This is part 2 of device_register(), though may be called
* separately _iff_ device_initialize() has been called separately.
*
- * This adds it to the kobject hierarchy via kobject_add(), adds it
+ * This adds it to the kobject hierarchy via kobject_add_ng(), adds it
* to the global and sibling lists for the device, then
* adds it to the other relevant subsystems of the driver model.
*/
@@ -760,8 +759,7 @@ int device_add(struct device *dev)
goto Error;/* first, register with generic layer. */
- kobject_set_name(&dev->kobj, "%s", dev->bus_id);
- error = kobject_add(&dev->kobj);
+ error = kobject_add_ng(&dev->kobj, dev->kobj.parent, "%s", dev->bus_id);
if (error)
goto Error;--
1.5.3.8--
Stop using kobject_register, as this way we can control the sending of
the uevent properly, after everything is properly initialized.Cc: Jacob Shin <jacob.shin@amd.com>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
arch/x86/kernel/cpu/mcheck/mce_amd_64.c | 9 +++++----
1 files changed, 5 insertions(+), 4 deletions(-)diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd_64.c b/arch/x86/kernel/cpu/mcheck/mce_amd_64.c
index 2d65311..ef15f35 100644
--- a/arch/x86/kernel/cpu/mcheck/mce_amd_64.c
+++ b/arch/x86/kernel/cpu/mcheck/mce_amd_64.c
@@ -432,10 +432,9 @@ static __cpuinit int allocate_threshold_blocks(unsigned int cpu,
else
per_cpu(threshold_banks, cpu)[bank]->blocks = b;- kobject_set_name(&b->kobj, "misc%i", block);
- b->kobj.parent = per_cpu(threshold_banks, cpu)[bank]->kobj;
- b->kobj.ktype = &threshold_ktype;
- err = kobject_register(&b->kobj);
+ err = kobject_init_and_add(&b->kobj, &threshold_ktype,
+ per_cpu(threshold_banks, cpu)[bank]->kobj,
+ "misc%i", block);
if (err)
goto out_free;
recurse:
@@ -451,6 +450,8 @@ recurse:
if (err)
goto out_free;+ kobject_uevent(&b->kobj, KOBJ_ADD);
+
return err;out_free:
--
1.5.3.8--
From: Denis Cheng <crquan@gmail.com>
LIST_HEAD has been widely used, so switch to this simpler method.
Signed-off-by: Denis Cheng <crquan@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/attribute_container.c | 9 +--------
drivers/base/base.h | 1 -
drivers/base/init.c | 1 -
3 files changed, 1 insertions(+), 10 deletions(-)diff --git a/drivers/base/attribute_container.c b/drivers/base/attribute_container.c
index 7370d7c..d4dfb97 100644
--- a/drivers/base/attribute_container.c
+++ b/drivers/base/attribute_container.c
@@ -61,7 +61,7 @@ attribute_container_classdev_to_container(struct class_device *classdev)
}
EXPORT_SYMBOL_GPL(attribute_container_classdev_to_container);-static struct list_head attribute_container_list;
+static LIST_HEAD(attribute_container_list);static DEFINE_MUTEX(attribute_container_mutex);
@@ -429,10 +429,3 @@ attribute_container_find_class_device(struct attribute_container *cont,
return cdev;
}
EXPORT_SYMBOL_GPL(attribute_container_find_class_device);
-
-int __init
-attribute_container_init(void)
-{
- INIT_LIST_HEAD(&attribute_container_list);
- return 0;
-}
diff --git a/drivers/base/base.h b/drivers/base/base.h
index 3b0f395..a74ceda 100644
--- a/drivers/base/base.h
+++ b/drivers/base/base.h
@@ -49,7 +49,6 @@ static inline int hypervisor_init(void) { return 0; }
extern int platform_bus_init(void);
extern int system_bus_init(void);
extern int cpu_dev_init(void);
-extern int attribute_container_init(void);extern int bus_add_device(struct device * dev);
extern void bus_attach_device(struct device * dev);
diff --git a/drivers/base/init.c b/drivers/base/init.c
index 3713815..1da88a1 100644
--- a/drivers/base/init.c
+++ b/drivers/base/init.c
@@ -36,5 +36,4 @@ void __init driver_init(void)
system_bus_init();
cpu_dev_init();
memory_dev_init();
- attribute_container_init();
}
--
1.5.3.8--
This isn't used by anything in the driver core, and by no one in the 204
different usages of it in the kernel tree. Remove this field so no one
gets any idea that it is needed to be used.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
include/linux/device.h | 1 -
1 files changed, 0 insertions(+), 1 deletions(-)diff --git a/include/linux/device.h b/include/linux/device.h
index a3b3ff1..313e0b3 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -51,7 +51,6 @@ extern void bus_remove_file(struct bus_type *, struct bus_attribute *);struct bus_type {
const char * name;
- struct module * owner;struct kset subsys;
struct kset *drivers_kset;
--
1.5.3.8--
There is no need for kobject_unregister() anymore, thanks to Kay's
kobject cleanup changes, so replace all instances of it with
kobject_put().Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
arch/ia64/kernel/topology.c | 9 ++++-----
arch/s390/hypfs/inode.c | 4 ++--
arch/sh/kernel/cpu/sh4/sq.c | 2 +-
arch/x86/kernel/cpu/intel_cacheinfo.c | 9 ++++-----
arch/x86/kernel/cpu/mcheck/mce_amd_64.c | 6 +++---
5 files changed, 14 insertions(+), 16 deletions(-)diff --git a/arch/ia64/kernel/topology.c b/arch/ia64/kernel/topology.c
index c4311e3..a2484fc 100644
--- a/arch/ia64/kernel/topology.c
+++ b/arch/ia64/kernel/topology.c
@@ -366,10 +366,9 @@ static int __cpuinit cache_add_dev(struct sys_device * sys_dev)
"index%1lu", i);
if (unlikely(retval)) {
for (j = 0; j < i; j++) {
- kobject_unregister(
- &(LEAF_KOBJECT_PTR(cpu,j)->kobj));
+ kobject_put(&(LEAF_KOBJECT_PTR(cpu,j)->kobj));
}
- kobject_unregister(&all_cpu_cache_info[cpu].kobj);
+ kobject_put(&all_cpu_cache_info[cpu].kobj);
cpu_cache_sysfs_exit(cpu);
break;
}
@@ -386,10 +385,10 @@ static int __cpuinit cache_remove_dev(struct sys_device * sys_dev)
unsigned long i;for (i = 0; i < all_cpu_cache_info[cpu].num_cache_leaves; i++)
- kobject_unregister(&(LEAF_KOBJECT_PTR(cpu,i)->kobj));
+ kobject_put(&(LEAF_KOBJECT_PTR(cpu,i)->kobj));if (all_cpu_cache_info[cpu].kobj.parent) {
- kobject_unregister(&all_cpu_cache_info[cpu].kobj);
+ kobject_put(&all_cpu_cache_info[cpu].kobj);
memset(&all_cpu_cache_info[cpu].kobj,
0,
sizeof(struct kobject));
diff --git a/arch/s390/hypfs/inode.c b/arch/s390/hypfs/inode.c
index 631a610..4b010ff 100644
--- a/arch/s390/hypfs/inode.c
+++ b/arch/s390/hypfs/inode.c
@@ -517,7 +517,7 @@ static int __init hypfs_init(void)
return 0;fail_filesystem:
-...
Stop using kobject_register, as this way we can control the sending of
the uevent properly, after everything is properly initialized.Cc: Ashok Raj <ashok.raj@intel.com>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
arch/x86/kernel/cpu/intel_cacheinfo.c | 15 +++++++--------
1 files changed, 7 insertions(+), 8 deletions(-)diff --git a/arch/x86/kernel/cpu/intel_cacheinfo.c b/arch/x86/kernel/cpu/intel_cacheinfo.c
index 9f530ff..3509542 100644
--- a/arch/x86/kernel/cpu/intel_cacheinfo.c
+++ b/arch/x86/kernel/cpu/intel_cacheinfo.c
@@ -733,10 +733,8 @@ static int __cpuinit cache_add_dev(struct sys_device * sys_dev)
if (unlikely(retval < 0))
return retval;- cache_kobject[cpu]->parent = &sys_dev->kobj;
- kobject_set_name(cache_kobject[cpu], "%s", "cache");
- cache_kobject[cpu]->ktype = &ktype_percpu_entry;
- retval = kobject_register(cache_kobject[cpu]);
+ retval = kobject_init_and_add(cache_kobject[cpu], &ktype_percpu_entry,
+ &sys_dev->kobj, "%s", "cache");
if (retval < 0) {
cpuid4_cache_sysfs_exit(cpu);
return retval;
@@ -746,10 +744,9 @@ static int __cpuinit cache_add_dev(struct sys_device * sys_dev)
this_object = INDEX_KOBJECT_PTR(cpu,i);
this_object->cpu = cpu;
this_object->index = i;
- this_object->kobj.parent = cache_kobject[cpu];
- kobject_set_name(&(this_object->kobj), "index%1lu", i);
- this_object->kobj.ktype = &ktype_cache;
- retval = kobject_register(&(this_object->kobj));
+ retval = kobject_init_and_add(&(this_object->kobj),
+ &ktype_cache, cache_kobject[cpu],
+ "index%1lu", i);
if (unlikely(retval)) {
for (j = 0; j < i; j++) {
kobject_unregister(
@@ -759,10 +756,12 @@ static int __cpuinit cache_add_dev(struct sys_device * sys_dev)
cpuid4_cache_sysfs_exit(cpu);
break;
}
+ kobject_uevent(&(this_object->kobj), KOBJ_ADD);
}
...
Fix up a number of coding style issues in the drivers/base/ directory
that have annoyed me over the years. checkpatch.pl is now very happy.Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/base.h | 14 +-
drivers/base/bus.c | 290 +++++++++++++++++++++++------------------------
drivers/base/class.c | 140 +++++++++++-----------
drivers/base/core.c | 203 +++++++++++++++------------------
drivers/base/dd.c | 119 ++++++++++----------
drivers/base/driver.c | 120 +++++++++-----------
drivers/base/init.c | 9 +-
drivers/base/platform.c | 233 +++++++++++++++++++-------------------
8 files changed, 545 insertions(+), 583 deletions(-)diff --git a/drivers/base/base.h b/drivers/base/base.h
index f7ad65a..c044414 100644
--- a/drivers/base/base.h
+++ b/drivers/base/base.h
@@ -50,15 +50,15 @@ extern int platform_bus_init(void);
extern int system_bus_init(void);
extern int cpu_dev_init(void);-extern int bus_add_device(struct device * dev);
-extern void bus_attach_device(struct device * dev);
-extern void bus_remove_device(struct device * dev);
+extern int bus_add_device(struct device *dev);
+extern void bus_attach_device(struct device *dev);
+extern void bus_remove_device(struct device *dev);-extern int bus_add_driver(struct device_driver *);
-extern void bus_remove_driver(struct device_driver *);
+extern int bus_add_driver(struct device_driver *drv);
+extern void bus_remove_driver(struct device_driver *drv);-extern void driver_detach(struct device_driver * drv);
-extern int driver_probe_device(struct device_driver *, struct device *);
+extern void driver_detach(struct device_driver *drv);
+extern int driver_probe_device(struct device_driver *drv, struct device *dev);extern void sysdev_shutdown(void);
extern int sysdev_suspend(pm_message_t state);
diff --git a/drivers/base/bus.c b/drivers/base/bus.c
index a377b65..f484495 100644
--- a/drivers/base/bus.c
+++ b/drivers/base/bus.c
@@ -46,10 +46,10 ...
The old kobject_init() function is on longer in use, so let us remove it
from the public scope (kset mess in the kobject.c file still uses it,
but that can be cleaned up later very simply.)Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
include/linux/kobject.h | 1 -
lib/kobject.c | 11 +++--------
2 files changed, 3 insertions(+), 9 deletions(-)diff --git a/include/linux/kobject.h b/include/linux/kobject.h
index 84c5afd..53458b6 100644
--- a/include/linux/kobject.h
+++ b/include/linux/kobject.h
@@ -78,7 +78,6 @@ static inline const char * kobject_name(const struct kobject * kobj)
return kobj->k_name;
}-extern void kobject_init(struct kobject *);
extern void kobject_init_ng(struct kobject *kobj, struct kobj_type *ktype);
extern int __must_check kobject_add(struct kobject *kobj,
struct kobject *parent,
diff --git a/lib/kobject.c b/lib/kobject.c
index 359e114..10d977b 100644
--- a/lib/kobject.c
+++ b/lib/kobject.c
@@ -124,11 +124,7 @@ char *kobject_get_path(struct kobject *kobj, gfp_t gfp_mask)
}
EXPORT_SYMBOL_GPL(kobject_get_path);-/**
- * kobject_init - initialize object.
- * @kobj: object in question.
- */
-void kobject_init(struct kobject * kobj)
+static void kobject_init_internal(struct kobject * kobj)
{
if (!kobj)
return;
@@ -232,7 +228,7 @@ int kobject_register(struct kobject * kobj)
{
int error = -EINVAL;
if (kobj) {
- kobject_init(kobj);
+ kobject_init_internal(kobj);
error = kobject_add(kobj);
if (!error)
kobject_uevent(kobj, KOBJ_ADD);
@@ -695,7 +691,7 @@ EXPORT_SYMBOL_GPL(kobject_create_and_add);void kset_init(struct kset * k)
{
- kobject_init(&k->kobj);
+ kobject_init_internal(&k->kobj);
INIT_LIST_HEAD(&k->list);
spin_lock_init(&k->list_lock);
}
@@ -887,7 +883,6 @@ struct kset *kset_create_and_add(const char *name,
}
EXPORT_SYMBOL_GPL(kset_create_and_add);-EXPORT_SYMBOL(kobje...
Stop using kobject_register, as this way we can control the sending of
the uevent properly, after everything is properly initialized.Cc: Kyle McMartin <kyle@parisc-linux.org>
Cc: Matthew Wilcox <matthew@wil.cx>
Cc: Grant Grundler <grundler@parisc-linux.org>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/parisc/pdc_stable.c | 10 +++++-----
1 files changed, 5 insertions(+), 5 deletions(-)diff --git a/drivers/parisc/pdc_stable.c b/drivers/parisc/pdc_stable.c
index 880b10b..87bc6b7 100644
--- a/drivers/parisc/pdc_stable.c
+++ b/drivers/parisc/pdc_stable.c
@@ -991,13 +991,12 @@ pdcs_register_pathentries(void)
if (err < 0)
continue;- if ((err = kobject_set_name(&entry->kobj, "%s", entry->name)))
- return err;
entry->kobj.kset = paths_kset;
- entry->kobj.ktype = &ktype_pdcspath;
- if ((err = kobject_register(&entry->kobj)))
+ err = kobject_init_and_add(&entry->kobj, &ktype_pdcspath, NULL,
+ "%s", entry->name);
+ if (err)
return err;
-
+
/* kobject is now registered */
write_lock(&entry->rw_lock);
entry->ready = 2;
@@ -1009,6 +1008,7 @@ pdcs_register_pathentries(void)
}write_unlock(&entry->rw_lock);
+ kobject_uevent(&entry->kobj, KOBJ_ADD);
}return 0;
--
1.5.3.8--
This converts the code to use the new kobject functions, cleaning up the
logic in doing so.Cc: Neil Brown <neilb@suse.de>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/md/md.c | 13 ++++---------
1 files changed, 4 insertions(+), 9 deletions(-)diff --git a/drivers/md/md.c b/drivers/md/md.c
index f79efb3..7ae9740 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -1383,16 +1383,13 @@ static int bind_rdev_to_array(mdk_rdev_t * rdev, mddev_t * mddev)
return -EBUSY;
}
bdevname(rdev->bdev,b);
- if (kobject_set_name(&rdev->kobj, "dev-%s", b) < 0)
- return -ENOMEM;
- while ( (s=strchr(rdev->kobj.k_name, '/')) != NULL)
+ while ( (s=strchr(b, '/')) != NULL)
*s = '!';
-
+
rdev->mddev = mddev;
printk(KERN_INFO "md: bind<%s>\n", b);- rdev->kobj.parent = &mddev->kobj;
- if ((err = kobject_add(&rdev->kobj)))
+ if ((err = kobject_add_ng(&rdev->kobj, &mddev->kobj, "dev-%s", b)))
goto fail;if (rdev->bdev->bd_part)
@@ -2036,9 +2033,7 @@ static mdk_rdev_t *md_import_device(dev_t newdev, int super_format, int super_mi
if (err)
goto abort_free;- rdev->kobj.parent = NULL;
- rdev->kobj.ktype = &rdev_ktype;
- kobject_init(&rdev->kobj);
+ kobject_init_ng(&rdev->kobj, &rdev_ktype);rdev->desc_nr = -1;
rdev->saved_raid_disk = -1;
--
1.5.3.8--
struct bus_type is static everywhere in the kernel. This moves the
kobject in the structure out of it, and a bunch of other private only to
the driver core fields are now moved to a private structure. This lets
us dynamically create the backing kobject properly and gives us the
chance to be able to document to users exactly how to use the struct
bus_type as there are no fields they can improperly access.Thanks to Kay for the build fixes on this patch.
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/base.h | 30 ++++++++++++-
drivers/base/bus.c | 116 ++++++++++++++++++++++++++---------------------
drivers/base/core.c | 6 +-
drivers/base/dd.c | 4 +-
drivers/base/driver.c | 2 +-
drivers/base/platform.c | 4 +-
include/linux/device.h | 12 +----
7 files changed, 104 insertions(+), 70 deletions(-)diff --git a/drivers/base/base.h b/drivers/base/base.h
index 7e309a4..ca6d273 100644
--- a/drivers/base/base.h
+++ b/drivers/base/base.h
@@ -1,6 +1,34 @@-/* initialisation functions */
+/**
+ * struct bus_type_private - structure to hold the private to the driver core portions of the bus_type structure.
+ *
+ * @subsys - the struct kset that defines this bus. This is the main kobject
+ * @drivers_kset - the list of drivers associated with this bus
+ * @devices_kset - the list of devices associated with this bus
+ * @klist_devices - the klist to iterate over the @devices_kset
+ * @klist_drivers - the klist to iterate over the @drivers_kset
+ * @bus_notifier - the bus notifier list for anything that cares about things
+ * on this bus.
+ * @bus - pointer back to the struct bus_type that this structure is associated
+ * with.
+ *
+ * This structure is the one that is the actual kobject allowing struct
+ * bus_type to be statically allocated safely. Nothing outside of the driver
+ * core should ever touch these fields.
+ */
+struct bus_type_private {
+ struct k...
Make the ipath driver use the new driver functions so that it does not
touch the sysfs portion of the driver structure.We also remove the redundant symlink from the device back to the driver,
as it is already in the sysfs tree. Any userspace tools should be using
the standard symlink, not some driver specific one.Cc: Roland Dreier <rdreier@cisco.com>
Cc: Bryan O'Sullivan <bryan.osullivan@qlogic.com>
Cc: Arthur Jones <arthur.jones@qlogic.com>
Cc: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/infiniband/hw/ehca/ehca_main.c | 13 +++++++----
drivers/infiniband/hw/ipath/ipath_driver.c | 17 +++------------
drivers/infiniband/hw/ipath/ipath_kernel.h | 3 +-
drivers/infiniband/hw/ipath/ipath_sysfs.c | 30 ++++-----------------------
4 files changed, 18 insertions(+), 45 deletions(-)diff --git a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c
index 6a56d86..c9e32b4 100644
--- a/drivers/infiniband/hw/ehca/ehca_main.c
+++ b/drivers/infiniband/hw/ehca/ehca_main.c
@@ -590,6 +590,11 @@ static struct attribute_group ehca_drv_attr_grp = {
.attrs = ehca_drv_attrs
};+static struct attribute_group *ehca_drv_attr_groups[] = {
+ &ehca_drv_attr_grp,
+ NULL,
+};
+
#define EHCA_RESOURCE_ATTR(name) \
static ssize_t ehca_show_##name(struct device *dev, \
struct device_attribute *attr, \
@@ -899,6 +904,9 @@ static struct of_platform_driver ehca_driver = {
.match_table = ehca_device_table,
.probe = ehca_probe,
.remove = ehca_remove,
+ .driver = {
+ .groups = ehca_drv_attr_groups,
+ },
};void ehca_poll_eqs(unsigned long data)
@@ -957,10 +965,6 @@ int __init ehca_module_init(void)
goto module_init2;
}- ret = sysfs_create_group(&ehca_driver.driver.kobj, &ehca_drv_attr_grp);
- if (ret) /* only complain; we can live wit...
Hey Greg,
with Linus's latest kernel v2.6.24-412-gb47711b (which includes the
patch in the email I'm replying to), I see the following when I do
"modprobe -r ib_ipath" (on a system that actually has ipath hardware):kernel BUG at fs/sysfs/group.c:74!
invalid opcode: 0000 [1] SMP
CPU 1
Modules linked in: fan ac battery ipv6 nfs lockd nfs_acl sunrpc dm_snapshot dm_mirror dm_mod loop ide_cd cdrom e1000 amd74xx generic psmouse shpchp pci_hotplug thermal ib_ipath serio_raw ehci_hcd ohci_hcd evdev button i2c_nforce2 ide_core processor ib_core k8temp i2c_core
Pid: 3975, comm: modprobe Not tainted 2.6.24 #24
RIP: 0010:[<ffffffff802bdbdb>] [<ffffffff802bdbdb>] sysfs_remove_group+0x25/0x94
RSP: 0000:ffff8101fbc33db8 EFLAGS: 00010246
RAX: 0000000000000000 RBX: 0000000000000000 RCX: ffff81007d8bc070
RDX: ffff81007d634272 RSI: ffff81007d634d00 RDI: ffffffff80503090
RBP: ffffffff880a7220 R08: 0000000000000000 R09: ffff81007d8bc070
R10: 0000000000000000 R11: 00000000fd812590 R12: ffff81007d8bc070
R13: 00007fffc6f88c80 R14: 0000000000000000 R15: 0000000000000000
FS: 00002acbe409b6e0(0000) GS:ffff81007e001a00(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
CR2: 00002acbe3e59de0 CR3: 000000007d482000 CR4: 00000000000006e0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Process modprobe (pid: 3975, threadinfo ffff8101fbc32000, task ffff8101fbead590)
Stack: 000000000e9000ff ffff81007d8bc160 ffff81007d8bc070 ffffffff88087574
ffffc20001734000 ffffc20001734000 ffffffff880a7050 ffffffff88074b26
ffffffff804bd39a ffff81007d8bc000 ffffffff880a7050 ffffffff804bd39a
Call Trace:
[<ffffffff88087574>] :ib_ipath:ipath_device_remove_group+0x20/0x42
[<ffffffff88074b26>] :ib_ipath:ipath_remove_one+0x9f/0x431
[<ffffffff803235e5>] pci_device_remove+0x24/0x47
[<ffffffff8036ec01>] __device_release_driver+0x74/0x97
[<ffffffff8036f0...
So I think it is coming from the following code in ipath_sysfs.c:
int ipath_device_create_group(struct device *dev, struct ipath_devdata *dd)
{
int ret;ret = sysfs_create_group(&dev->kobj, &dev_attr_group);
if (ret)
goto bail;ret = sysfs_create_group(&dev->kobj, &dev_counter_attr_group);
if (ret)
goto bail_attrs;sysfs_remove_group(&dev->kobj, &dev_counter_attr_group);
bail_attrs:
sysfs_remove_group(&dev->kobj, &dev_attr_group);
bail:
return ret;
}note that the success path falls through into the error path and
removes the groups it just created, which means that on initialization
the groups are already removed, so we hit the BUG on the second try to
remove the groups on module exit.And I think this chunk of your patch:
- snprintf(unit, sizeof(unit), "%02d", dd->ipath_unit);
- ret = sysfs_create_link(&dev->driver->kobj, &dev->kobj, unit);
- if (ret == 0)
- goto bail;
-was what broke it. (Note the "if (ret == 0) then skip error
unwinding" code that got deleted by mistake -- not surprising given
how hard to read that construction is)My bad for not testing -mm better. I'll queue this up to fix it:
diff --git a/drivers/infiniband/hw/ipath/ipath_sysfs.c b/drivers/infiniband/hw/ipath/ipath_sysfs.c
index aa27ca9..e2a6534 100644
--- a/drivers/infiniband/hw/ipath/ipath_sysfs.c
+++ b/drivers/infiniband/hw/ipath/ipath_sysfs.c
@@ -770,7 +770,8 @@ int ipath_device_create_group(struct device *dev, struct ipath_devdata *dd)
if (ret)
goto bail_attrs;- sysfs_remove_group(&dev->kobj, &dev_counter_attr_group);
+ return 0;
+
bail_attrs:
sysfs_remove_group(&dev->kobj, &dev_attr_group);
bail:
--
Thanks for the fix, and sorry for causing that, it was a complex error
path :)Although a BUG() for when we try to remove a file that is no longer
there seems pretty harsh, I think I'll change that to a WARN_ON() so
that people just know to fix up their code, not kill the kernel
entirely.thanks,
greg k-h
--
From: Kay Sievers <kay.sievers@vrfy.org>
We save the current state in the object itself, so we can do proper
cleanup when the last reference is dropped.If the initial reference is dropped, the object will be removed from
sysfs if needed, if an "add" event was sent, "remove" will be send, and
the allocated resources are released.This allows us to clean up some driver core usage as well as allowing us
to do other such changes to the rest of the kernel.Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/core.c | 32 ++-------
include/linux/kobject.h | 5 ++
lib/kobject.c | 170 ++++++++++++++++++++++++++--------------------
lib/kobject_uevent.c | 11 +++
4 files changed, 119 insertions(+), 99 deletions(-)diff --git a/drivers/base/core.c b/drivers/base/core.c
index 675a719..d5d542d 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -576,8 +576,8 @@ static struct kobject *get_device_parent(struct device *dev,/*
* If we have no parent, we live in "virtual".
- * Class-devices with a bus-device as parent, live
- * in a class-directory to prevent namespace collisions.
+ * Class-devices with a non class-device as parent, live
+ * in a "glue" directory to prevent namespace collisions.
*/
if (parent == NULL)
parent_kobj = virtual_device_parent(dev);
@@ -607,8 +607,7 @@ static struct kobject *get_device_parent(struct device *dev,
kobject_put(k);
return NULL;
}
- /* Do not emit a uevent, as it's not needed for this
- * "class glue" directory. */
+ /* do not emit an uevent for this simple "glue" directory */
return k;
}@@ -619,30 +618,13 @@ static struct kobject *get_device_parent(struct device *dev,
static void cleanup_device_parent(struct device *dev)
{
- struct device *d;
- int other = 0;
+ struct kobject *glue_dir = dev->kobj.parent;- if (!dev->class)
- return;
-
- /* see if ...
This is a simple kobject module, showing how to use kobj_attributes in
basic and more complex ways.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
samples/Kconfig | 10 +++
samples/Makefile | 2 +-
samples/kobject/Makefile | 1 +
samples/kobject/kobject-example.c | 137 +++++++++++++++++++++++++++++++++++++
4 files changed, 149 insertions(+), 1 deletions(-)
create mode 100644 samples/kobject/Makefile
create mode 100644 samples/kobject/kobject-example.cdiff --git a/samples/Kconfig b/samples/Kconfig
index 57bb223..74d97cc 100644
--- a/samples/Kconfig
+++ b/samples/Kconfig
@@ -13,4 +13,14 @@ config SAMPLE_MARKERS
help
This build markers example modules.+config SAMPLE_KOBJECT
+ tristate "Build kobject examples"
+ help
+ This config option will allow you to build a number of
+ different kobject sample modules showing how to use kobjects,
+ ksets, and ktypes properly.
+
+ If in doubt, say "N" here.
+
endif # SAMPLES
+
diff --git a/samples/Makefile b/samples/Makefile
index 5a4f0b6..8652d0f 100644
--- a/samples/Makefile
+++ b/samples/Makefile
@@ -1,3 +1,3 @@
# Makefile for Linux samples code-obj-$(CONFIG_SAMPLES) += markers/
+obj-$(CONFIG_SAMPLES) += markers/ kobject/
diff --git a/samples/kobject/Makefile b/samples/kobject/Makefile
new file mode 100644
index 0000000..cce16e9
--- /dev/null
+++ b/samples/kobject/Makefile
@@ -0,0 +1 @@
+obj-$(CONFIG_SAMPLE_KOBJECT) += kobject-example.o
diff --git a/samples/kobject/kobject-example.c b/samples/kobject/kobject-example.c
new file mode 100644
index 0000000..08d0d3f
--- /dev/null
+++ b/samples/kobject/kobject-example.c
@@ -0,0 +1,137 @@
+/*
+ * Sample kobject implementation
+ *
+ * Copyright (C) 2004-2007 Greg Kroah-Hartman <greg@kroah.com>
+ * Copyright (C) 2007 Novell Inc.
+ *
+ * Released under the GPL version 2 only.
+ *
+ */
+#include <linux/kobject.h>
+#include...
Stop using kobject_register for this static kobject, as it's overkill.
This way is much simpler.Cc: Len Brown <len.brown@intel.com>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/acpi/system.c | 13 ++++++-------
1 files changed, 6 insertions(+), 7 deletions(-)diff --git a/drivers/acpi/system.c b/drivers/acpi/system.c
index c22b93a..5ffe0ea 100644
--- a/drivers/acpi/system.c
+++ b/drivers/acpi/system.c
@@ -58,7 +58,7 @@ module_param_call(acpica_version, NULL, param_get_acpica_version, NULL, 0444);
FS Interface (/sys)
-------------------------------------------------------------------------- */
static LIST_HEAD(acpi_table_attr_list);
-static struct kobject tables_kobj;
+static struct kobject *tables_kobj;struct acpi_table_attr {
struct bin_attribute attr;
@@ -135,11 +135,9 @@ static int acpi_system_sysfs_init(void)
int table_index = 0;
int result;- tables_kobj.parent = acpi_kobj;
- kobject_set_name(&tables_kobj, "tables");
- result = kobject_register(&tables_kobj);
- if (result)
- return result;
+ tables_kobj = kobject_create_and_add("tables", acpi_kobj);
+ if (!tables_kobj)
+ return -ENOMEM;do {
result = acpi_get_table_by_index(table_index, &table_header);
@@ -153,7 +151,7 @@ static int acpi_system_sysfs_init(void)acpi_table_attr_init(table_attr, table_header);
result =
- sysfs_create_bin_file(&tables_kobj,
+ sysfs_create_bin_file(tables_kobj,
&table_attr->attr);
if (result) {
kfree(table_attr);
@@ -163,6 +161,7 @@ static int acpi_system_sysfs_init(void)
&acpi_table_attr_list);
}
} while (!result);
+ kobject_uevent(tables_kobj, KOBJ_ADD);return 0;
}
--
1.5.3.8--
From: Dave Young <hidave.darkstar@gmail.com>
Convert to use the class iteration api.
Signed-off-by: Dave Young <hidave.darkstar@gmail.com>
Cc: James Bottomley <James.Bottomley@hansenpartnership.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/scsi/hosts.c | 24 +++++++++++++-----------
1 files changed, 13 insertions(+), 11 deletions(-)diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
index 24271a8..6325115 100644
--- a/drivers/scsi/hosts.c
+++ b/drivers/scsi/hosts.c
@@ -429,6 +429,15 @@ void scsi_unregister(struct Scsi_Host *shost)
}
EXPORT_SYMBOL(scsi_unregister);+static int __scsi_host_match(struct class_device *cdev, void *data)
+{
+ struct Scsi_Host *p;
+ unsigned short *hostnum = (unsigned short *)data;
+
+ p = class_to_shost(cdev);
+ return p->host_no == *hostnum;
+}
+
/**
* scsi_host_lookup - get a reference to a Scsi_Host by host no
*
@@ -439,19 +448,12 @@ EXPORT_SYMBOL(scsi_unregister);
**/
struct Scsi_Host *scsi_host_lookup(unsigned short hostnum)
{
- struct class *class = &shost_class;
struct class_device *cdev;
- struct Scsi_Host *shost = ERR_PTR(-ENXIO), *p;
+ struct Scsi_Host *shost = ERR_PTR(-ENXIO);- down(&class->sem);
- list_for_each_entry(cdev, &class->children, node) {
- p = class_to_shost(cdev);
- if (p->host_no == hostnum) {
- shost = scsi_host_get(p);
- break;
- }
- }
- up(&class->sem);
+ cdev = class_find_child(&shost_class, &hostnum, __scsi_host_match);
+ if (cdev)
+ shost = scsi_host_get(class_to_shost(cdev));return shost;
}
--
1.5.3.8--
--
The iseries driver wants to hang kobjects off of its driver, so, to
preserve backwards compatibility, we need to add a call to the driver
core to allow future changes to work properly.Hopefully no one uses this function in the future and the iseries_veth
driver authors come to their senses so I can remove this hack...Cc: Dave Larson <larson1@us.ibm.com>
Cc: Santiago Leon <santil@us.ibm.com>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/driver.c | 24 ++++++++++++++++++++++++
drivers/net/iseries_veth.c | 2 +-
include/linux/device.h | 4 ++++
3 files changed, 29 insertions(+), 1 deletions(-)diff --git a/drivers/base/driver.c b/drivers/base/driver.c
index e3b5840..633ae1d 100644
--- a/drivers/base/driver.c
+++ b/drivers/base/driver.c
@@ -124,6 +124,30 @@ void driver_remove_file(struct device_driver * drv, struct driver_attribute * at/**
+ * driver_add_kobj - add a kobject below the specified driver
+ *
+ * You really don't want to do this, this is only here due to one looney
+ * iseries driver, go poke those developers if you are annoyed about
+ * this...
+ */
+int driver_add_kobj(struct device_driver *drv, struct kobject *kobj,
+ const char *fmt, ...)
+{
+ va_list args;
+ char *name;
+
+ va_start(args, fmt);
+ name = kvasprintf(GFP_KERNEL, fmt, args);
+ va_end(args);
+
+ if (!name)
+ return -ENOMEM;
+
+ return kobject_add_ng(kobj, &drv->kobj, "%s", name);
+}
+EXPORT_SYMBOL_GPL(driver_add_kobj);
+
+/**
* get_driver - increment driver reference count.
* @drv: driver.
*/
diff --git a/drivers/net/iseries_veth.c b/drivers/net/iseries_veth.c
index 90ff4ec..1a8299a 100644
--- a/drivers/net/iseries_veth.c
+++ b/drivers/net/iseries_veth.c
@@ -1705,7 +1705,7 @@ static int __init veth_module_init(void)kobj = &veth_cnx[i]->kobject;
/* If the add failes, complain but otherwise continue */
- if (0 != kobject_add_ng(kobj,...
Stop using kobject_register, as this way we can control the sending of
the uevent properly, after everything is properly initialized.Cc: Dave Larson <larson1@us.ibm.com>
Cc: Santiago Leon <santil@us.ibm.com>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/net/ibmveth.c | 10 ++++++----
1 files changed, 6 insertions(+), 4 deletions(-)diff --git a/drivers/net/ibmveth.c b/drivers/net/ibmveth.c
index 7d7758f..bee3037 100644
--- a/drivers/net/ibmveth.c
+++ b/drivers/net/ibmveth.c
@@ -1179,13 +1179,15 @@ static int __devinit ibmveth_probe(struct vio_dev *dev, const struct vio_device_for(i = 0; i<IbmVethNumBufferPools; i++) {
struct kobject *kobj = &adapter->rx_buff_pool[i].kobj;
+ int error;
+
ibmveth_init_buffer_pool(&adapter->rx_buff_pool[i], i,
pool_count[i], pool_size[i],
pool_active[i]);
- kobj->parent = &dev->dev.kobj;
- kobject_set_name(kobj, "pool%d", i);
- kobj->ktype = &ktype_veth_pool;
- kobject_register(kobj);
+ error = kobject_init_and_add(kobj, &ktype_veth_pool,
+ &dev->dev.kobj, "pool%d", i);
+ if (!error)
+ kobject_uevent(kobj, KOBJ_ADD);
}ibmveth_debug_printk("adapter @ 0x%p\n", adapter);
--
1.5.3.8--
There is no need for kobject_unregister() anymore, thanks to Kay's
kobject cleanup changes, so replace all instances of it with
kobject_put().Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/bus.c | 4 ++--
drivers/base/sys.c | 2 +-
drivers/block/pktcdvd.c | 2 +-
drivers/cpufreq/cpufreq.c | 4 +---
drivers/cpuidle/sysfs.c | 4 ++--
drivers/edac/edac_device_sysfs.c | 10 +++++-----
drivers/edac/edac_mc_sysfs.c | 12 ++++++------
drivers/edac/edac_pci_sysfs.c | 6 +++---
drivers/firmware/edd.c | 2 +-
drivers/firmware/efivars.c | 6 +++---
drivers/infiniband/core/sysfs.c | 6 +++---
drivers/md/md.c | 2 +-
drivers/net/ibmveth.c | 2 +-
drivers/parisc/pdc_stable.c | 6 +++---
drivers/pci/hotplug/pci_hotplug_core.c | 2 +-
drivers/pci/hotplug/rpadlpar_sysfs.c | 4 ++--
drivers/uio/uio.c | 8 ++++----
17 files changed, 40 insertions(+), 42 deletions(-)diff --git a/drivers/base/bus.c b/drivers/base/bus.c
index aea5793..a377b65 100644
--- a/drivers/base/bus.c
+++ b/drivers/base/bus.c
@@ -681,7 +681,7 @@ int bus_add_driver(struct device_driver *drv)
kobject_uevent(&priv->kobj, KOBJ_ADD);
return error;
out_unregister:
- kobject_unregister(&priv->kobj);
+ kobject_put(&priv->kobj);
out_put_bus:
bus_put(bus);
return error;
@@ -708,7 +708,7 @@ void bus_remove_driver(struct device_driver * drv)
pr_debug("bus: '%s': remove driver %s\n", drv->bus->name, drv->name);
driver_detach(drv);
module_remove_driver(drv);
- kobject_unregister(&drv->p->kobj);
+ kobject_put(&drv->p->kobj);
bus_put(drv->bus);
}diff --git a/drivers/base/sys.c b/drivers/base/sys.c
index 47fc6eb..e6664...
Stop using kobject_register, as this way we can control the sending of
the uevent properly, after everything is properly initialized.Cc: Matt Domsch <Matt_Domsch@dell.com>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/firmware/edd.c | 10 +++++-----
1 files changed, 5 insertions(+), 5 deletions(-)diff --git a/drivers/firmware/edd.c b/drivers/firmware/edd.c
index ddcc957..dc0b87b 100644
--- a/drivers/firmware/edd.c
+++ b/drivers/firmware/edd.c
@@ -721,13 +721,13 @@ edd_device_register(struct edd_device *edev, int i)
if (!edev)
return 1;
edd_dev_set_info(edev, i);
- kobject_set_name(&edev->kobj, "int13_dev%02x",
- 0x80 + i);
edev->kobj.kset = edd_kset;
- edev->kobj.ktype = &edd_ktype;
- error = kobject_register(&edev->kobj);
- if (!error)
+ error = kobject_init_and_add(&edev->kobj, &edd_ktype, NULL,
+ "int13_dev%02x", 0x80 + i);
+ if (!error) {
edd_populate_dir(edev);
+ kobject_uevent(&edev->kobj, KOBJ_ADD);
+ }
return error;
}--
1.5.3.8--
From: Dave Young <hidave.darkstar@gmail.com>
Convert to use the class iteration api.
Signed-off-by: Dave Young <hidave.darkstar@gmail.com>
Cc: Stefan Richter <stefanr@s5r6.in-berlin.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/ieee1394/nodemgr.c | 314 +++++++++++++++++++++++++-------------------
1 files changed, 176 insertions(+), 138 deletions(-)diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c
index 90dc75b..511e432 100644
--- a/drivers/ieee1394/nodemgr.c
+++ b/drivers/ieee1394/nodemgr.c
@@ -727,33 +727,31 @@ static int nodemgr_bus_match(struct device * dev, struct device_driver * drv)static DEFINE_MUTEX(nodemgr_serialize_remove_uds);
+static int __match_ne(struct device *dev, void *data)
+{
+ struct unit_directory *ud;
+ struct node_entry *ne = (struct node_entry *)data;
+
+ ud = container_of(dev, struct unit_directory, unit_dev);
+ return ud->ne == ne;
+}
+
static void nodemgr_remove_uds(struct node_entry *ne)
{
struct device *dev;
- struct unit_directory *tmp, *ud;
-
- /* Iteration over nodemgr_ud_class.devices has to be protected by
- * nodemgr_ud_class.sem, but device_unregister() will eventually
- * take nodemgr_ud_class.sem too. Therefore pick out one ud at a time,
- * release the semaphore, and then unregister the ud. Since this code
- * may be called from other contexts besides the knodemgrds, protect the
- * gap after release of the semaphore by nodemgr_serialize_remove_uds.
+ struct unit_directory *ud;
+
+ /* Use class_find device to iterate the devices. Since this code
+ * may be called from other contexts besides the knodemgrds,
+ * protect it by nodemgr_serialize_remove_uds.
*/
mutex_lock(&nodemgr_serialize_remove_uds);
for (;;) {
- ud = NULL;
- down(&nodemgr_ud_class.sem);
- list_for_each_entry(dev, &nodemgr_ud_class.devices, node) {
- tmp = container_of(dev, struct unit_directory,
- unit_dev);
- if (tmp->ne == ne) {
-...
From: Dave Young <hidave.darkstar@gmail.com>
Convert to use the class iteration api.
Signed-off-by: Dave Young <hidave.darkstar@gmail.com>
Cc: Alessandro Zummo <a.zummo@towertech.it>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/rtc/interface.c | 22 ++++++++++++----------
1 files changed, 12 insertions(+), 10 deletions(-)diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c
index f1e00ff..7e3ad4f 100644
--- a/drivers/rtc/interface.c
+++ b/drivers/rtc/interface.c
@@ -251,20 +251,23 @@ void rtc_update_irq(struct rtc_device *rtc,
}
EXPORT_SYMBOL_GPL(rtc_update_irq);+static int __rtc_match(struct device *dev, void *data)
+{
+ char *name = (char *)data;
+
+ if (strncmp(dev->bus_id, name, BUS_ID_SIZE) == 0)
+ return 1;
+ return 0;
+}
+
struct rtc_device *rtc_class_open(char *name)
{
struct device *dev;
struct rtc_device *rtc = NULL;- down(&rtc_class->sem);
- list_for_each_entry(dev, &rtc_class->devices, node) {
- if (strncmp(dev->bus_id, name, BUS_ID_SIZE) == 0) {
- dev = get_device(dev);
- if (dev)
- rtc = to_rtc_device(dev);
- break;
- }
- }
+ dev = class_find_device(rtc_class, name, __rtc_match);
+ if (dev)
+ rtc = to_rtc_device(dev);if (rtc) {
if (!try_module_get(rtc->owner)) {
@@ -272,7 +275,6 @@ struct rtc_device *rtc_class_open(char *name)
rtc = NULL;
}
}
- up(&rtc_class->sem);return rtc;
}
--
1.5.3.8--
Stop using kobject_register, as this way we can control the sending of
the uevent properly, after everything is properly initialized.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/bus.c | 10 ++++------
1 files changed, 4 insertions(+), 6 deletions(-)diff --git a/drivers/base/bus.c b/drivers/base/bus.c
index 937fc10..aea5793 100644
--- a/drivers/base/bus.c
+++ b/drivers/base/bus.c
@@ -643,15 +643,12 @@ int bus_add_driver(struct device_driver *drv)
if (!priv)
return -ENOMEM;- error = kobject_set_name(&priv->kobj, "%s", drv->name);
- if (error)
- goto out_put_bus;
- priv->kobj.kset = bus->p->drivers_kset;
- priv->kobj.ktype = &driver_ktype;
klist_init(&priv->klist_devices, NULL, NULL);
priv->driver = drv;
drv->p = priv;
- error = kobject_register(&priv->kobj);
+ priv->kobj.kset = bus->p->drivers_kset;
+ error = kobject_init_and_add(&priv->kobj, &driver_ktype, NULL,
+ "%s", drv->name);
if (error)
goto out_put_bus;@@ -681,6 +678,7 @@ int bus_add_driver(struct device_driver *drv)
__FUNCTION__, drv->name);
}+ kobject_uevent(&priv->kobj, KOBJ_ADD);
return error;
out_unregister:
kobject_unregister(&priv->kobj);
--
1.5.3.8--
Stop using kobject_register, as this way we can control the sending of
the uevent properly, after everything is properly initialized.Cc: Tony Luck <tony.luck@intel.com>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
arch/ia64/kernel/topology.c | 17 +++++++++--------
1 files changed, 9 insertions(+), 8 deletions(-)diff --git a/arch/ia64/kernel/topology.c b/arch/ia64/kernel/topology.c
index 14261fe..c4311e3 100644
--- a/arch/ia64/kernel/topology.c
+++ b/arch/ia64/kernel/topology.c
@@ -354,17 +354,16 @@ static int __cpuinit cache_add_dev(struct sys_device * sys_dev)
if (unlikely(retval < 0))
return retval;- all_cpu_cache_info[cpu].kobj.parent = &sys_dev->kobj;
- kobject_set_name(&all_cpu_cache_info[cpu].kobj, "%s", "cache");
- all_cpu_cache_info[cpu].kobj.ktype = &cache_ktype_percpu_entry;
- retval = kobject_register(&all_cpu_cache_info[cpu].kobj);
+ retval = kobject_init_and_add(&all_cpu_cache_info[cpu].kobj,
+ &cache_ktype_percpu_entry, &sys_dev->kobj,
+ "%s", "cache");for (i = 0; i < all_cpu_cache_info[cpu].num_cache_leaves; i++) {
this_object = LEAF_KOBJECT_PTR(cpu,i);
- this_object->kobj.parent = &all_cpu_cache_info[cpu].kobj;
- kobject_set_name(&(this_object->kobj), "index%1lu", i);
- this_object->kobj.ktype = &cache_ktype;
- retval = kobject_register(&(this_object->kobj));
+ retval = kobject_init_and_add(&(this_object->kobj),
+ &cache_ktype,
+ &all_cpu_cache_info[cpu].kobj,
+ "index%1lu", i);
if (unlikely(retval)) {
for (j = 0; j < i; j++) {
kobject_unregister(
@@ -374,7 +373,9 @@ static int __cpuinit cache_add_dev(struct sys_device * sys_dev)
cpu_cache_sysfs_exit(cpu);
break;
}
+ kobject_uevent(&(this_object->kobj), KOBJ_ADD);
}
+ kobject_uevent(&all_cpu_cache_info[cpu].kobj, KOBJ_ADD);
return retval;...
As we are replacing the documentation, it's easier to do this in a two
stage pass, delete the old file and add the new one.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
Documentation/kobject.txt | 289 ---------------------------------------------
1 files changed, 0 insertions(+), 289 deletions(-)
delete mode 100644 Documentation/kobject.txtdiff --git a/Documentation/kobject.txt b/Documentation/kobject.txt
deleted file mode 100644
index ca86a88..0000000
--- a/Documentation/kobject.txt
+++ /dev/null
@@ -1,289 +0,0 @@
-The kobject Infrastructure
-
-Patrick Mochel <mochel@osdl.org>
-
-Updated: 3 June 2003
-
-
-Copyright (c) 2003 Patrick Mochel
-Copyright (c) 2003 Open Source Development Labs
-
-
-0. Introduction
-
-The kobject infrastructure performs basic object management that larger
-data structures and subsystems can leverage, rather than reimplement
-similar functionality. This functionality primarily concerns:
-
-- Object reference counting.
-- Maintaining lists (sets) of objects.
-- Object set locking.
-- Userspace representation.
-
-The infrastructure consists of a number of object types to support
-this functionality. Their programming interfaces are described below
-in detail, and briefly here:
-
-- kobjects a simple object.
-- kset a set of objects of a certain type.
-- ktype a set of helpers for objects of a common type.
-
-
-The kobject infrastructure maintains a close relationship with the
-sysfs filesystem. Each kobject that is registered with the kobject
-core receives a directory in sysfs. Attributes about the kobject can
-then be exported. Please see Documentation/filesystems/sysfs.txt for
-more information.
-
-The kobject infrastructure provides a flexible programming interface,
-and allows kobjects and ksets to be used without being registered
-(i.e. with no sysfs representation). This is also described later.
-
-
-1. kobjects
-
-1.1 Description
-
-
-stru...
From: Randy Dunlap <randy.dunlap@oracle.com>
Make SYSFS_DEPRECATED depend on SYSFS since files that check
CONFIG_SYSFS_DEPRECATED don't check for CONFIG_SYSFS first.
Also don't prompt user about SYSFS_DEPRECATED if SYSFS=n.Signed-off-by: Randy Dunlap <randy.dunlap@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
init/Kconfig | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)diff --git a/init/Kconfig b/init/Kconfig
index b9d11a8..f5becd2 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -363,6 +363,7 @@ config CGROUP_CPUACCTconfig SYSFS_DEPRECATED
bool "Create deprecated sysfs files"
+ depends on SYSFS
default y
help
This option creates deprecated symlinks such as the
--
1.5.3.8--
From: Dave Young <hidave.darkstar@gmail.com>
Convert to use the class iteration api.
Signed-off-by: Dave Young <hidave.darkstar@gmail.com>
Cc: Anton Vorontsov <cbou@mail.ru>
Cc: David Woodhouse <dwmw2@infradead.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/power/apm_power.c | 116 +++++++++++++++++++++---------------
drivers/power/power_supply_core.c | 74 ++++++++++++-----------
2 files changed, 107 insertions(+), 83 deletions(-)diff --git a/drivers/power/apm_power.c b/drivers/power/apm_power.c
index bbf3ee1..7e29b90 100644
--- a/drivers/power/apm_power.c
+++ b/drivers/power/apm_power.c
@@ -13,6 +13,7 @@
#include <linux/power_supply.h>
#include <linux/apm-emulation.h>+static DEFINE_MUTEX(apm_mutex);
#define PSY_PROP(psy, prop, val) psy->get_property(psy, \
POWER_SUPPLY_PROP_##prop, val)@@ -23,67 +24,86 @@
static struct power_supply *main_battery;
-static void find_main_battery(void)
-{
- struct device *dev;
- struct power_supply *bat = NULL;
- struct power_supply *max_charge_bat = NULL;
- struct power_supply *max_energy_bat = NULL;
+struct find_bat_param {
+ struct power_supply *main;
+ struct power_supply *bat;
+ struct power_supply *max_charge_bat;
+ struct power_supply *max_energy_bat;
union power_supply_propval full;
- int max_charge = 0;
- int max_energy = 0;
+ int max_charge;
+ int max_energy;
+};- main_battery = NULL;
+static int __find_main_battery(struct device *dev, void *data)
+{
+ struct find_bat_param *bp = (struct find_bat_param *)data;- list_for_each_entry(dev, &power_supply_class->devices, node) {
- bat = dev_get_drvdata(dev);
+ bp->bat = dev_get_drvdata(dev);- if (bat->use_for_apm) {
- /* nice, we explicitly asked to report this battery. */
- main_battery = bat;
- return;
- }
+ if (bp->bat->use_for_apm) {
+ /* nice, we explicitly asked to report this battery. */
+ bp->main = bp->bat;
+ ...
From: Dave Young <hidave.darkstar@gmail.com>
Convert to use the class iteration api.
Signed-off-by: Dave Young <hidave.darkstar@gmail.com>
Acked-by: David Brownell <david-b@pacbell.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/spi/spi.c | 26 +++++++++++++++-----------
1 files changed, 15 insertions(+), 11 deletions(-)diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 93e9de4..682a6a4 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -485,6 +485,15 @@ void spi_unregister_master(struct spi_master *master)
}
EXPORT_SYMBOL_GPL(spi_unregister_master);+static int __spi_master_match(struct device *dev, void *data)
+{
+ struct spi_master *m;
+ u16 *bus_num = data;
+
+ m = container_of(dev, struct spi_master, dev);
+ return m->bus_num == *bus_num;
+}
+
/**
* spi_busnum_to_master - look up master associated with bus_num
* @bus_num: the master's bus number
@@ -499,17 +508,12 @@ struct spi_master *spi_busnum_to_master(u16 bus_num)
{
struct device *dev;
struct spi_master *master = NULL;
- struct spi_master *m;
-
- down(&spi_master_class.sem);
- list_for_each_entry(dev, &spi_master_class.children, node) {
- m = container_of(dev, struct spi_master, dev);
- if (m->bus_num == bus_num) {
- master = spi_master_get(m);
- break;
- }
- }
- up(&spi_master_class.sem);
+
+ dev = class_find_device(&spi_master_class, &bus_num,
+ __spi_master_match);
+ if (dev)
+ master = container_of(dev, struct spi_master, dev);
+ /* reference got in class_find_device */
return master;
}
EXPORT_SYMBOL_GPL(spi_busnum_to_master);
--
1.5.3.8--
Now that kobjects properly clean up their name structures, no matter if
they have a release function or not, we can drop this empty module
kobject release function too (it was needed prior to this because of the
way we handled static kobject names, we based the fact that if a release
function was present, then we could safely free the name string, now we
are more smart about things and only free names we have previously set.)Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
kernel/params.c | 10 ----------
1 files changed, 0 insertions(+), 10 deletions(-)diff --git a/kernel/params.c b/kernel/params.c
index 1078b14..b4da950 100644
--- a/kernel/params.c
+++ b/kernel/params.c
@@ -694,18 +694,8 @@ static struct kset_uevent_ops module_uevent_ops = {
struct kset *module_kset;
int module_sysfs_initialized;-static void module_release(struct kobject *kobj)
-{
- /*
- * Stupid empty release function to allow the memory for the kobject to
- * be properly cleaned up. This will not need to be present for 2.6.25
- * with the upcoming kobject core rework.
- */
-}
-
struct kobj_type module_ktype = {
.sysfs_ops = &module_sysfs_ops,
- .release = module_release,
};/*
--
1.5.3.8--
This converts the code to use the new kobject functions, cleaning up the
logic in doing so.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
kernel/user.c | 9 ++++-----
1 files changed, 4 insertions(+), 5 deletions(-)diff --git a/kernel/user.c b/kernel/user.c
index 7f17e6e..ab4fd70 100644
--- a/kernel/user.c
+++ b/kernel/user.c
@@ -181,13 +181,12 @@ static int uids_user_create(struct user_struct *up)
int error;memset(kobj, 0, sizeof(struct kobject));
- kobj->ktype = &uids_ktype;
kobj->kset = uids_kset;
- kobject_init(kobj);
- kobject_set_name(&up->kobj, "%d", up->uid);
- error = kobject_add(kobj);
- if (error)
+ error = kobject_init_and_add(kobj, &uids_ktype, NULL, "%d", up->uid);
+ if (error) {
+ kobject_put(kobj);
goto done;
+ }kobject_uevent(kobj, KOBJ_ADD);
done:
--
1.5.3.8--
The old kobject_add() function is on longer in use, so let us remove it
from the public scope (kset mess in the kobject.c file still uses it,
but that can be cleaned up later very simply.)Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
include/linux/kobject.h | 1 -
lib/kobject.c | 22 ++++++++--------------
2 files changed, 8 insertions(+), 15 deletions(-)diff --git a/include/linux/kobject.h b/include/linux/kobject.h
index bb68684..8b0aa71 100644
--- a/include/linux/kobject.h
+++ b/include/linux/kobject.h
@@ -80,7 +80,6 @@ static inline const char * kobject_name(const struct kobject * kobj)extern void kobject_init(struct kobject *);
extern void kobject_init_ng(struct kobject *kobj, struct kobj_type *ktype);
-extern int __must_check kobject_add(struct kobject *);
extern int __must_check kobject_add_ng(struct kobject *kobj,
struct kobject *parent,
const char *fmt, ...);
diff --git a/lib/kobject.c b/lib/kobject.c
index 493e991..d04789f 100644
--- a/lib/kobject.c
+++ b/lib/kobject.c
@@ -144,7 +144,7 @@ void kobject_init(struct kobject * kobj)
* Remove the kobject from the kset list and decrement
* its parent's refcount.
* This is separated out, so we can use it in both
- * kobject_del() and kobject_add() on error.
+ * kobject_del() and kobject_add_internal() on error.
*/static void unlink(struct kobject * kobj)
@@ -161,12 +161,7 @@ static void unlink(struct kobject * kobj)
kobject_put(parent);
}-/**
- * kobject_add - add an object to the hierarchy.
- * @kobj: object.
- */
-
-int kobject_add(struct kobject * kobj)
+static int kobject_add_internal(struct kobject *kobj)
{
int error = 0;
struct kobject * parent;
@@ -215,13 +210,13 @@ int kobject_add(struct kobject * kobj)/* be noisy on error issues */
if (error == -EEXIST)
- printk(KERN_ERR "kobject_add failed for %s with "
+ printk(KERN_ERR "%s failed for %s with "
...
Stop using kobject_register, as this way we can control the sending of
the uevent properly, after everything is properly initialized.Cc: Dominik Brodowski <linux@brodo.de>
Cc: Ashok Raj <ashok.raj@intel.com>
Cc: Jacob Shin <jacob.shin@amd.com>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/cpufreq/cpufreq.c | 8 +++-----
1 files changed, 3 insertions(+), 5 deletions(-)diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 79581fa..9e102af 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -828,11 +828,8 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
memcpy(&new_policy, policy, sizeof(struct cpufreq_policy));/* prepare interface data */
- policy->kobj.parent = &sys_dev->kobj;
- policy->kobj.ktype = &ktype_cpufreq;
- kobject_set_name(&policy->kobj, "cpufreq");
-
- ret = kobject_register(&policy->kobj);
+ ret = kobject_init_and_add(&policy->kobj, &ktype_cpufreq, &sys_dev->kobj,
+ "cpufreq");
if (ret) {
unlock_policy_rwsem_write(cpu);
goto err_out_driver_exit;
@@ -902,6 +899,7 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
goto err_out_unregister;
}+ kobject_uevent(&policy->kobj, KOBJ_ADD);
module_put(cpufreq_driver->owner);
dprintk("initialization complete\n");
cpufreq_debug_enable_ratelimit();
--
1.5.3.8--
From: Alan Stern <stern@rowland.harvard.edu>
This patch (as1013) was suggested by David Woodhouse; it fixes a race
in the driver core. If a device is unregistered at the same time as
its driver is unloaded, the driver's code pages may be unmapped while
the remove method is still running. The calls to get_driver() and
put_driver() were intended to prevent this, but they don't work if the
driver's module count has already dropped to 0.Instead, the patch keeps the device on the driver's list until after
the remove method has returned. This forces the necessary
synchronization to occur.Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/dd.c | 5 ++---
1 files changed, 2 insertions(+), 3 deletions(-)diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index 5492264..b0726eb 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -289,11 +289,10 @@ static void __device_release_driver(struct device * dev)
{
struct device_driver * drv;- drv = get_driver(dev->driver);
+ drv = dev->driver;
if (drv) {
driver_sysfs_remove(dev);
sysfs_remove_link(&dev->kobj, "driver");
- klist_remove(&dev->knode_driver);if (dev->bus)
blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
@@ -306,7 +305,7 @@ static void __device_release_driver(struct device * dev)
drv->remove(dev);
devres_release_all(dev);
dev->driver = NULL;
- put_driver(drv);
+ klist_remove(&dev->knode_driver);
}
}--
1.5.3.8--
From: Stephen Rothwell <sfr@canb.auug.org.au>
This name is just passed to platform_device_alloc which has its parameter
declared const.Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/platform.c | 2 +-
include/linux/platform_device.h | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)diff --git a/drivers/base/platform.c b/drivers/base/platform.c
index bdd59e8..48d5db4 100644
--- a/drivers/base/platform.c
+++ b/drivers/base/platform.c
@@ -360,7 +360,7 @@ EXPORT_SYMBOL_GPL(platform_device_unregister);
* the Linux driver model. In particular, when such drivers are built
* as modules, they can't be "hotplugged".
*/
-struct platform_device *platform_device_register_simple(char *name, int id,
+struct platform_device *platform_device_register_simple(const char *name, int id,
struct resource *res, unsigned int num)
{
struct platform_device *pdev;
diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h
index e808043..3261681 100644
--- a/include/linux/platform_device.h
+++ b/include/linux/platform_device.h
@@ -35,7 +35,7 @@ extern struct resource *platform_get_resource_byname(struct platform_device *, u
extern int platform_get_irq_byname(struct platform_device *, char *);
extern int platform_add_devices(struct platform_device **, int);-extern struct platform_device *platform_device_register_simple(char *, int id,
+extern struct platform_device *platform_device_register_simple(const char *, int id,
struct resource *, unsigned int);extern struct platform_device *platform_device_alloc(const char *name, int id);
--
1.5.3.8--
Stop using kobject_register, as this way we can control the sending of
the uevent properly, after everything is properly initialized.Cc: Roland Dreier <rolandd@cisco.com>
Cc: Sean Hefty <mshefty@ichips.intel.com>
Cc: Hal Rosenstock <hal.rosenstock@gmail.com>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/infiniband/core/sysfs.c | 35 +++++++++--------------------------
include/rdma/ib_verbs.h | 2 +-
2 files changed, 10 insertions(+), 27 deletions(-)diff --git a/drivers/infiniband/core/sysfs.c b/drivers/infiniband/core/sysfs.c
index 3d40506..aa81129 100644
--- a/drivers/infiniband/core/sysfs.c
+++ b/drivers/infiniband/core/sysfs.c
@@ -508,19 +508,10 @@ static int add_port(struct ib_device *device, int port_num)p->ibdev = device;
p->port_num = port_num;
- p->kobj.ktype = &port_type;- p->kobj.parent = kobject_get(&device->ports_parent);
- if (!p->kobj.parent) {
- ret = -EBUSY;
- goto err;
- }
-
- ret = kobject_set_name(&p->kobj, "%d", port_num);
- if (ret)
- goto err_put;
-
- ret = kobject_register(&p->kobj);
+ ret = kobject_init_and_add(&p->kobj, &port_type,
+ kobject_get(device->ports_parent),
+ "%d", port_num);
if (ret)
goto err_put;@@ -549,6 +540,7 @@ static int add_port(struct ib_device *device, int port_num)
list_add_tail(&p->kobj.entry, &device->port_list);
+ kobject_uevent(&p->kobj, KOBJ_ADD);
return 0;err_free_pkey:
@@ -570,9 +562,7 @@ err_remove_pma:
sysfs_remove_group(&p->kobj, &pma_group);err_put:
- kobject_put(&device->ports_parent);
-
-err:
+ kobject_put(device->ports_parent);
kfree(p);
return ret;
}
@@ -694,16 +684,9 @@ int ib_device_register_sysfs(struct ib_device *device)
goto err_unregister;
}- device->ports_parent.parent = kobject_get(&class_dev->kobj);
- if...
Stop using kobject_register, as this way we can control the sending of
the uevent properly, after everything is properly initialized.Cc: Steven Whitehouse <swhiteho@redhat.com>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
fs/dlm/lockspace.c | 26 ++++----------------------
fs/gfs2/locking/dlm/sysfs.c | 13 +++----------
fs/gfs2/sys.c | 10 +++-------
3 files changed, 10 insertions(+), 39 deletions(-)diff --git a/fs/dlm/lockspace.c b/fs/dlm/lockspace.c
index e64b0dc..b750f13 100644
--- a/fs/dlm/lockspace.c
+++ b/fs/dlm/lockspace.c
@@ -168,23 +168,6 @@ static struct kobj_type dlm_ktype = {static struct kset *dlm_kset;
-static int kobject_setup(struct dlm_ls *ls)
-{
- char lsname[DLM_LOCKSPACE_LEN];
- int error;
-
- memset(lsname, 0, DLM_LOCKSPACE_LEN);
- snprintf(lsname, DLM_LOCKSPACE_LEN, "%s", ls->ls_name);
-
- error = kobject_set_name(&ls->ls_kobj, "%s", lsname);
- if (error)
- return error;
-
- ls->ls_kobj.kset = dlm_kset;
- ls->ls_kobj.ktype = &dlm_ktype;
- return 0;
-}
-
static int do_uevent(struct dlm_ls *ls, int in)
{
int error;
@@ -545,13 +528,12 @@ static int new_lockspace(char *name, int namelen, void **lockspace,
goto out_delist;
}- error = kobject_setup(ls);
- if (error)
- goto out_stop;
-
- error = kobject_register(&ls->ls_kobj);
+ ls->ls_kobj.kset = dlm_kset;
+ error = kobject_init_and_add(&ls->ls_kobj, &dlm_ktype, NULL,
+ "%s", ls->ls_name);
if (error)
goto out_stop;
+ kobject_uevent(&ls->ls_kobj, KOBJ_ADD);/* let kobject handle freeing of ls if there's an error */
do_unreg = 1;
diff --git a/fs/gfs2/locking/dlm/sysfs.c b/fs/gfs2/locking/dlm/sysfs.c
index e5a4fbf..a7336b9 100644
--- a/fs/gfs2/locking/dlm/sysfs.c
+++ b/fs/gfs2/locking/dlm/sysfs.c
@@ -195,19 +195,12 @@ int gdlm_kobject_setup(struct gdlm_ls *ls, struct kobject *fskobj)
{
int error;
...
The kobject in the bridge code is only used for registering with sysfs,
not for any lifespan rules. This patch changes it to be only a pointer
and use the simpler api for this kind of thing.Cc: Stephen Hemminger <shemminger@linux-foundation.org>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
net/bridge/br_if.c | 2 +-
net/bridge/br_private.h | 2 +-
net/bridge/br_sysfs_br.c | 14 ++++----------
net/bridge/br_sysfs_if.c | 2 +-
4 files changed, 7 insertions(+), 13 deletions(-)diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c
index 935784f..dadec94 100644
--- a/net/bridge/br_if.c
+++ b/net/bridge/br_if.c
@@ -133,7 +133,7 @@ static void del_nbp(struct net_bridge_port *p)
struct net_bridge *br = p->br;
struct net_device *dev = p->dev;- sysfs_remove_link(&br->ifobj, dev->name);
+ sysfs_remove_link(br->ifobj, dev->name);dev_set_promiscuity(dev, -1);
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
index f666f7b..c11b554 100644
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h
@@ -124,7 +124,7 @@ struct net_bridge
struct timer_list tcn_timer;
struct timer_list topology_change_timer;
struct timer_list gc_timer;
- struct kobject ifobj;
+ struct kobject *ifobj;
};extern struct notifier_block br_device_notifier;
diff --git a/net/bridge/br_sysfs_br.c b/net/bridge/br_sysfs_br.c
index 3312e8f..4e7f91f 100644
--- a/net/bridge/br_sysfs_br.c
+++ b/net/bridge/br_sysfs_br.c
@@ -426,16 +426,10 @@ int br_sysfs_addbr(struct net_device *dev)
goto out2;
}-
- kobject_set_name(&br->ifobj, SYSFS_BRIDGE_PORT_SUBDIR);
- br->ifobj.ktype = NULL;
- br->ifobj.kset = NULL;
- br->ifobj.parent = brobj;
-
- err = kobject_register(&br->ifobj);
- if (err) {
+ br->ifobj = kobject_create_and_add(SYSFS_BRIDGE_PORT_SUBDIR, brobj);
+ if (!br->ifobj) {
pr_info("%s: can't add kobject (directory)...
On Thu, 24 Jan 2008 23:32:17 -0800
Okay, but where is the new kobject freed?
--
Stephen Hemminger <stephen.hemminger@vyatta.com>
--
In the call to kobject_unregister(), which has then later in the series
been converted to a call to kobject_put().thanks,
greg k-h
--
Hm, working on LDD 3.1? :-)
--
No, unfortunatly :(
Actually, the documentation that was written in this patch series, would
be good to replace the existing kobject documentation in LDD 3. But
it's a bit hard to just replace a chapter at a time in a book that is
already published, we really don't have the mechanism in place for such
a thing...thanks,
greg k-h
--
The uio kobject code is "wierd". This patch should hopefully fix it up
to be sane and not leak memory anymore.Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Benedikt Spranger <b.spranger@linutronix.de>
Signed-off-by: Hans J. Koch <hjk@linutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/uio/uio.c | 91 +++++++++++++++++++++++---------------------
include/linux/uio_driver.h | 6 ++-
2 files changed, 52 insertions(+), 45 deletions(-)diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c
index 606aae7..acc387d 100644
--- a/drivers/uio/uio.c
+++ b/drivers/uio/uio.c
@@ -34,7 +34,7 @@ struct uio_device {
wait_queue_head_t wait;
int vma_count;
struct uio_info *info;
- struct kset map_attr_kset;
+ struct kobject *map_dir;
};static int uio_major;
@@ -51,47 +51,48 @@ static struct uio_class {
* attributes
*/-static struct attribute attr_addr = {
- .name = "addr",
- .mode = S_IRUGO,
+struct uio_map {
+ struct kobject kobj;
+ struct uio_mem *mem;
};
+#define to_map(map) container_of(map, struct uio_map, kobj)-static struct attribute attr_size = {
- .name = "size",
- .mode = S_IRUGO,
-};-static struct attribute* map_attrs[] = {
- &attr_addr, &attr_size, NULL
-};
-
-static ssize_t map_attr_show(struct kobject *kobj, struct attribute *attr,
+static ssize_t map_attr_show(struct kobject *kobj, struct kobj_attribute *attr,
char *buf)
{
- struct uio_mem *mem = container_of(kobj, struct uio_mem, kobj);
+ struct uio_map *map = to_map(kobj);
+ struct uio_mem *mem = map->mem;- if (strncmp(attr->name,"addr",4) == 0)
+ if (strncmp(attr->attr.name, "addr", 4) == 0)
return sprintf(buf, "0x%lx\n", mem->addr);- if (strncmp(attr->name,"size",4) == 0)
+ if (strncmp(attr->attr.name, "size", 4) == 0)
return sprintf(buf, "0x%lx\n", mem->size);return -ENODEV;
}-static void map_att...
The kobject debugging messages are a mess. This provides a unified
message that makes them actually useful.The format for new kobject debug messages should be:
kobject: 'KOBJECT_NAME' (ADDRESS): FUNCTION_NAME: message.\nCc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
lib/kobject.c | 23 +++++++++++++++--------
lib/kobject_uevent.c | 20 ++++++++++++++------
2 files changed, 29 insertions(+), 14 deletions(-)diff --git a/lib/kobject.c b/lib/kobject.c
index 4d52b6f..1015f74 100644
--- a/lib/kobject.c
+++ b/lib/kobject.c
@@ -95,7 +95,8 @@ static void fill_kobj_path(struct kobject *kobj, char *path, int length)
*(path + --length) = '/';
}- pr_debug("%s: path = '%s'\n",__FUNCTION__,path);
+ pr_debug("kobject: '%s' (%p): %s: path = '%s'\n", kobject_name(kobj),
+ kobj, __FUNCTION__,path);
}/**
@@ -171,15 +172,17 @@ int kobject_add(struct kobject * kobj)
if (!kobj->k_name)
kobject_set_name(kobj, "NO_NAME");
if (!*kobj->k_name) {
- pr_debug("kobject attempted to be registered with no name!\n");
+ pr_debug("kobject (%p) attempted to be registered with no "
+ "name!\n", kobj);
WARN_ON(1);
kobject_put(kobj);
return -EINVAL;
}
parent = kobject_get(kobj->parent);- pr_debug("kobject %s: registering. parent: %s, set: %s\n",
- kobject_name(kobj), parent ? kobject_name(parent) : "<NULL>",
+ pr_debug("kobject: '%s' (%p): %s: parent: '%s', set: '%s'\n",
+ kobject_name(kobj), kobj, __FUNCTION__,
+ parent ? kobject_name(parent) : "<NULL>",
kobj->kset ? kobject_name(&kobj->kset->kobj) : "<NULL>" );if (kobj->kset) {
@@ -560,7 +563,8 @@ void kobject_unregister(struct kobject * kobj)
{
if (!kobj)
return;
- pr_debug("kobject %s: unregistering\n",kobject_name(kobj));
+ pr_debug("kobject: '%s' (%p): %s\n",
+ kobject_name(kobj), kobj, __FUNCTION__);
kobject_uevent(kobj, KOBJ_REMOVE);
kobject_del(kobj...
kobject_init should not be grabing any references, but only initializing
the object. This patch fixes this, and makes the lock hold-time shorter
for when a kset is present in the kobject.The current kernel tree has been audited to verify that this change
should be safe.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
lib/kobject.c | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)diff --git a/lib/kobject.c b/lib/kobject.c
index 7919c32..4d52b6f 100644
--- a/lib/kobject.c
+++ b/lib/kobject.c
@@ -133,7 +133,6 @@ void kobject_init(struct kobject * kobj)
return;
kref_init(&kobj->kref);
INIT_LIST_HEAD(&kobj->entry);
- kobj->kset = kset_get(kobj->kset);
}@@ -184,7 +183,7 @@ int kobject_add(struct kobject * kobj)
kobj->kset ? kobject_name(&kobj->kset->kobj) : "<NULL>" );if (kobj->kset) {
- spin_lock(&kobj->kset->list_lock);
+ kobj->kset = kset_get(kobj->kset);if (!parent) {
parent = kobject_get(&kobj->kset->kobj);
@@ -196,7 +195,8 @@ int kobject_add(struct kobject * kobj)
kobject_get(parent);
}- list_add_tail(&kobj->entry,&kobj->kset->list);
+ spin_lock(&kobj->kset->list_lock);
+ list_add_tail(&kobj->entry, &kobj->kset->list);
spin_unlock(&kobj->kset->list_lock);
kobj->parent = parent;
}
--
1.5.3.8--
/sys/power should not be a kset, that's overkill. This patch renames it
to power_kset and fixes up all usages of it in the tree.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
arch/arm/mach-omap1/pm.c | 2 +-
arch/powerpc/platforms/pseries/power.c | 10 +++++-----
include/linux/kobject.h | 4 ++--
kernel/power/disk.c | 2 +-
kernel/power/main.c | 8 ++++----
5 files changed, 13 insertions(+), 13 deletions(-)diff --git a/arch/arm/mach-omap1/pm.c b/arch/arm/mach-omap1/pm.c
index 63edafb..d9805e3 100644
--- a/arch/arm/mach-omap1/pm.c
+++ b/arch/arm/mach-omap1/pm.c
@@ -719,7 +719,7 @@ static int __init omap_pm_init(void)
omap_pm_init_proc();
#endif- error = sysfs_create_file(&power_kset->kobj, &sleep_while_idle_attr);
+ error = sysfs_create_file(power_kobj, &sleep_while_idle_attr);
if (error)
printk(KERN_ERR "sysfs_create_file failed: %d\n", error);diff --git a/arch/powerpc/platforms/pseries/power.c b/arch/powerpc/platforms/pseries/power.c
index 90706cf..e95fc15 100644
--- a/arch/powerpc/platforms/pseries/power.c
+++ b/arch/powerpc/platforms/pseries/power.c
@@ -53,7 +53,7 @@ static struct kobj_attribute auto_poweron_attr =
__ATTR(auto_poweron, 0644, auto_poweron_show, auto_poweron_store);#ifndef CONFIG_PM
-struct kset *power_kset;
+struct kobject *power_kobj;static struct attribute *g[] = {
&auto_poweron_attr.attr,
@@ -66,16 +66,16 @@ static struct attribute_group attr_group = {static int __init pm_init(void)
{
- power_kset = kset_create_and_add("power", NULL, NULL);
- if (!power_kset)
+ power_kobj = kobject_create_and_add("power", NULL);
+ if (!power_kobj)
return -ENOMEM;
- return sysfs_create_group(&power_kset->kobj, &attr_group);
+ return sysfs_create_group(power_kobj, &attr_group);
}
core_initcall(pm_init);
#else
static int __init apo_pm_ini...
device_shutdown does not need to be in a separate file. Move it into
the driver core file where it belongs.This also moves us one more step closer to making devices_kset static,
now only the crazy sysdevs are keeping that from happening...Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/core.c | 20 ++++++++++++++++++-
drivers/base/power/Makefile | 1 -
drivers/base/power/shutdown.c | 43 -----------------------------------------
3 files changed, 19 insertions(+), 45 deletions(-)
delete mode 100644 drivers/base/power/shutdown.cdiff --git a/drivers/base/core.c b/drivers/base/core.c
index d2de2d5..b3a931f 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -1415,5 +1415,23 @@ out:
put_device(dev);
return error;
}
-
EXPORT_SYMBOL_GPL(device_move);
+
+/**
+ * device_shutdown - call ->shutdown() on each device to shutdown.
+ */
+void device_shutdown(void)
+{
+ struct device * dev, *devn;
+
+ list_for_each_entry_safe_reverse(dev, devn, &devices_kset->list,
+ kobj.entry) {
+ if (dev->bus && dev->bus->shutdown) {
+ dev_dbg(dev, "shutdown\n");
+ dev->bus->shutdown(dev);
+ } else if (dev->driver && dev->driver->shutdown) {
+ dev_dbg(dev, "shutdown\n");
+ dev->driver->shutdown(dev);
+ }
+ }
+}
diff --git a/drivers/base/power/Makefile b/drivers/base/power/Makefile
index 44504e6..06a86fe 100644
--- a/drivers/base/power/Makefile
+++ b/drivers/base/power/Makefile
@@ -1,4 +1,3 @@
-obj-y := shutdown.o
obj-$(CONFIG_PM) += sysfs.o
obj-$(CONFIG_PM_SLEEP) += main.o
obj-$(CONFIG_PM_TRACE) += trace.o
diff --git a/drivers/base/power/shutdown.c b/drivers/base/power/shutdown.c
deleted file mode 100644
index 5b6bc16..0000000
--- a/drivers/base/power/shutdown.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * shutdown.c - power management functions for the device tree.
- *
- * Copyright (c) 2002-3 Patrick Mochel
- * 2002-3 Open Source Development...
shutdown.c had some stuff it did not need, including a duplicate extern
in the power.h file. This cleans up all of that.Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/power/power.h | 7 -------
drivers/base/power/shutdown.c | 5 -----
2 files changed, 0 insertions(+), 12 deletions(-)diff --git a/drivers/base/power/power.h b/drivers/base/power/power.h
index 10c2084..6f0dfca 100644
--- a/drivers/base/power/power.h
+++ b/drivers/base/power/power.h
@@ -1,10 +1,3 @@
-/*
- * shutdown.c
- */
-
-extern void device_shutdown(void);
-
-
#ifdef CONFIG_PM_SLEEP/*
diff --git a/drivers/base/power/shutdown.c b/drivers/base/power/shutdown.c
index f51cbc1..5b6bc16 100644
--- a/drivers/base/power/shutdown.c
+++ b/drivers/base/power/shutdown.c
@@ -12,10 +12,6 @@
#include <asm/semaphore.h>#include "../base.h"
-#include "power.h"
-
-#define to_dev(node) container_of(node, struct device, kobj.entry)
-/**
* We handle system devices differently - we suspend and shut them
@@ -45,4 +41,3 @@ void device_shutdown(void)
}
}
}
-
--
1.5.3.8--
Using a kset for this simple directory is an overkill.
Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Thibaut VARENE <varenet@parisc-linux.org>
Cc: Matthew Wilcox <matthew@wil.cx>
Cc: Grant Grundler <grundler@parisc-linux.org>
Cc: Kyle McMartin <kyle@parisc-linux.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/parisc/pdc_stable.c | 16 ++++++++--------
1 files changed, 8 insertions(+), 8 deletions(-)diff --git a/drivers/parisc/pdc_stable.c b/drivers/parisc/pdc_stable.c
index ef1a353..880b10b 100644
--- a/drivers/parisc/pdc_stable.c
+++ b/drivers/parisc/pdc_stable.c
@@ -960,7 +960,7 @@ static struct attribute_group pdcs_attr_group = {
.attrs = pdcs_subsys_attrs,
};-static struct kset *stable_kset;
+static struct kobject *stable_kobj;
static struct kset *paths_kset;/**
@@ -1058,18 +1058,18 @@ pdc_stable_init(void)
/* the actual result is 16 bits away */
pdcs_osid = (u16)(result >> 16);- /* For now we'll register the stable kset within this driver */
- stable_kset = kset_create_and_add("stable", NULL, firmware_kobj);
- if (!stable_kset) {
+ /* For now we'll register the directory at /sys/firmware/stable */
+ stable_kobj = kobject_create_and_add("stable", firmware_kobj);
+ if (!stable_kobj) {
rc = -ENOMEM;
goto fail_firmreg;
}/* Don't forget the root entries */
- error = sysfs_create_group(&stable_kset->kobj, pdcs_attr_group);
+ error = sysfs_create_group(stable_kobj, pdcs_attr_group);/* register the paths kset as a child of the stable kset */
- paths_kset = kset_create_and_add("paths", NULL, &stable_kset->kobj);
+ paths_kset = kset_create_and_add("paths", NULL, stable_kobj);
if (!paths_kset) {
rc = -ENOMEM;
goto fail_ksetreg;
@@ -1086,7 +1086,7 @@ fail_pdcsreg:
kset_unregister(paths_kset);fail_ksetreg:
- kset_unregister(stable_kset);
+ kobject_unregister(stable_kobj);fail_firmreg:
printk(KERN_INFO PDCS_PREFIX " bailing out\n")...
Using a kset for this simple directory is an overkill.
Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Matt Domsch <Matt_Domsch@dell.com>
Cc: Matt Tolentino <matthew.e.tolentino@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/firmware/efivars.c | 18 ++++++++----------
1 files changed, 8 insertions(+), 10 deletions(-)diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c
index d1ad481..7f9f086 100644
--- a/drivers/firmware/efivars.c
+++ b/drivers/firmware/efivars.c
@@ -573,7 +573,7 @@ static struct attribute_group efi_subsys_attr_group = {static struct kset *vars_kset;
-static struct kset *efi_kset;
+static struct kobject *efi_kobj;/*
* efivar_create_sysfs_entry()
@@ -665,17 +665,15 @@ efivars_init(void)
printk(KERN_INFO "EFI Variables Facility v%s %s\n", EFIVARS_VERSION,
EFIVARS_DATE);- /*
- * For now we'll register the efi subsys within this driver
- */
- efi_kset = kset_create_and_add("efi", NULL, firmware_kobj);
- if (!efi_kset) {
+ /* For now we'll register the efi directory at /sys/firmware/efi */
+ efi_kobj = kobject_create_and_add("efi", firmware_kobj);
+ if (!efi_kobj) {
printk(KERN_ERR "efivars: Firmware registration failed.\n");
error = -ENOMEM;
goto out_free;
}- vars_kset = kset_create_and_add("vars", NULL, &efi_kset->kobj);
+ vars_kset = kset_create_and_add("vars", NULL, efi_kobj);
if (!vars_kset) {
printk(KERN_ERR "efivars: Subsystem registration failed.\n");
error = -ENOMEM;
@@ -725,7 +723,7 @@ efivars_init(void)
" due to error %d\n", error);/* Don't forget the systab entry */
- error = sysfs_create_group(&efi_kset->kobj, &efi_subsys_attr_group);
+ error = sysfs_create_group(efi_kobj, &efi_subsys_attr_group);
if (error)
printk(KERN_ERR "efivars: Sysfs attribute export failed with error %d.\n", error);
else
@@ -734,7 +732,7 @@ efivars_init(void)
kset_unregister(vars_kset);out_firmware_un...
Using a kset for this trivial directory is an overkill.
Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Mike Halcrow <mhalcrow@us.ibm.com>
Cc: Phillip Hellewell <phillip@hellewell.homeip.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
fs/ecryptfs/main.c | 14 +++++++-------
1 files changed, 7 insertions(+), 7 deletions(-)diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c
index d984eac..4f13321 100644
--- a/fs/ecryptfs/main.c
+++ b/fs/ecryptfs/main.c
@@ -734,7 +734,7 @@ static int ecryptfs_init_kmem_caches(void)
return 0;
}-static struct kset *ecryptfs_kset;
+static struct kobject *ecryptfs_kobj;static ssize_t version_show(struct kobject *kobj,
struct kobj_attribute *attr, char *buff)
@@ -757,17 +757,17 @@ static int do_sysfs_registration(void)
{
int rc;- ecryptfs_kset = kset_create_and_add("ecryptfs", NULL, fs_kobj);
- if (!ecryptfs_kset) {
+ ecryptfs_kobj = kobject_create_and_add("ecryptfs", fs_kobj);
+ if (!ecryptfs_kobj) {
printk(KERN_ERR "Unable to create ecryptfs kset\n");
rc = -ENOMEM;
goto out;
}
- rc = sysfs_create_group(&ecryptfs_kset->kobj, &attr_group);
+ rc = sysfs_create_group(ecryptfs_kobj, &attr_group);
if (rc) {
printk(KERN_ERR
"Unable to create ecryptfs version attributes\n");
- kset_unregister(ecryptfs_kset);
+ kobject_unregister(ecryptfs_kobj);
}
out:
return rc;
@@ -775,8 +775,8 @@ out:static void do_sysfs_unregistration(void)
{
- sysfs_remove_group(&ecryptfs_kset->kobj, &attr_group);
- kset_unregister(ecryptfs_kset);
+ sysfs_remove_group(ecryptfs_kobj, &attr_group);
+ kobject_unregister(ecryptfs_kobj);
}static int __init ecryptfs_init(void)
--
1.5.3.8--
rpadlpar pci hotplug driver was doing some pretty bad stuff with the
sysfs files. This cleans up the logic to be sane and gets rid of the
gratuitous kset that is not needed for a simple directory like this.Note, this patch is not even build tested, let alone run-time tested.
Someone with access to this hardware and can test would be greatly
appreciated.Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: John Rose <johnrose@austin.ibm.com>
Cc: Badari Pulavarty <pbadari@gmail.com>
Cc: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/pci/hotplug/rpadlpar_sysfs.c | 112 +++++++++++++---------------------
1 files changed, 43 insertions(+), 69 deletions(-)diff --git a/drivers/pci/hotplug/rpadlpar_sysfs.c b/drivers/pci/hotplug/rpadlpar_sysfs.c
index 5c3ddb6..9cde367 100644
--- a/drivers/pci/hotplug/rpadlpar_sysfs.c
+++ b/drivers/pci/hotplug/rpadlpar_sysfs.c
@@ -23,44 +23,13 @@#define MAX_DRC_NAME_LEN 64
-/* Store return code of dlpar operation in attribute struct */
-struct dlpar_io_attr {
- int rc;
- struct attribute attr;
- ssize_t (*store)(struct dlpar_io_attr *dlpar_attr, const char *buf,
- size_t nbytes);
-};-/* Common show callback for all attrs, display the return code
- * of the dlpar op */
-static ssize_t
-dlpar_attr_show(struct kobject * kobj, struct attribute * attr, char * buf)
-{
- struct dlpar_io_attr *dlpar_attr = container_of(attr,
- struct dlpar_io_attr, attr);
- return sprintf(buf, "%d\n", dlpar_attr->rc);
-}
-
-static ssize_t
-dlpar_attr_store(struct kobject * kobj, struct attribute * attr,
- const char *buf, size_t nbytes)
-{
- struct dlpar_io_attr *dlpar_attr = container_of(attr,
- struct dlpar_io_attr, attr);
- return dlpar_attr->store ?
- dlpar_attr->store(dlpar_attr, buf, nbytes) : -EIO;
-}
-
-static struct sysfs_ops dlpar_attr_sysfs_ops = {
- .show = dlpar_attr_show,
- .store = dlpar_attr_store,
-};
-
-static ssize_t ...
These functions are no longer used and are the last remants of the old
subsystem crap. So delete them for good.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/bus.c | 6 +++---
drivers/base/class.c | 4 ++--
include/linux/kobject.h | 3 ---
lib/kobject.c | 13 -------------
4 files changed, 5 insertions(+), 21 deletions(-)diff --git a/drivers/base/bus.c b/drivers/base/bus.c
index 6796d3e..871607b 100644
--- a/drivers/base/bus.c
+++ b/drivers/base/bus.c
@@ -854,7 +854,7 @@ int bus_register(struct bus_type * bus)
bus->subsys.kobj.kset = bus_kset;
bus->subsys.kobj.ktype = &bus_ktype;- retval = subsystem_register(&bus->subsys);
+ retval = kset_register(&bus->subsys);
if (retval)
goto out;@@ -900,7 +900,7 @@ bus_drivers_fail:
bus_devices_fail:
bus_remove_file(bus, &bus_attr_uevent);
bus_uevent_fail:
- subsystem_unregister(&bus->subsys);
+ kset_unregister(&bus->subsys);
out:
return retval;
}
@@ -920,7 +920,7 @@ void bus_unregister(struct bus_type * bus)
kset_unregister(bus->drivers_kset);
kset_unregister(bus->devices_kset);
bus_remove_file(bus, &bus_attr_uevent);
- subsystem_unregister(&bus->subsys);
+ kset_unregister(&bus->subsys);
}int bus_register_notifier(struct bus_type *bus, struct notifier_block *nb)
diff --git a/drivers/base/class.c b/drivers/base/class.c
index 304f90e..3ffcda7 100644
--- a/drivers/base/class.c
+++ b/drivers/base/class.c
@@ -152,7 +152,7 @@ int class_register(struct class * cls)
cls->subsys.kobj.kset = class_kset;
cls->subsys.kobj.ktype = &class_ktype;- error = subsystem_register(&cls->subsys);
+ error = kset_register(&cls->subsys);
if (!error) {
error = add_class_attrs(class_get(cls));
class_put(cls);
@@ -164,7 +164,7 @@ void class_unregister(struct class * cls)
{
pr_debug("device class '%s': ...
kernel_kset does not need to be a kset, but a much simpler kobject now
that we have kobj_attributes.We also rename kernel_kset to kernel_kobj to catch all users of this
symbol with a build error instead of an easy-to-ignore build warning.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
fs/configfs/mount.c | 2 +-
fs/debugfs/inode.c | 2 +-
fs/dlm/lockspace.c | 2 +-
fs/gfs2/locking/dlm/sysfs.c | 2 +-
include/linux/kobject.h | 4 ++--
kernel/ksysfs.c | 18 +++++++++---------
kernel/user.c | 2 +-
mm/slub.c | 3 +--
security/inode.c | 2 +-
9 files changed, 18 insertions(+), 19 deletions(-)diff --git a/fs/configfs/mount.c b/fs/configfs/mount.c
index c4ee7f0..54bf0db 100644
--- a/fs/configfs/mount.c
+++ b/fs/configfs/mount.c
@@ -140,7 +140,7 @@ static int __init configfs_init(void)
if (!configfs_dir_cachep)
goto out;- config_kobj = kobject_create_and_add("config", &kernel_kset->kobj);
+ config_kobj = kobject_create_and_add("config", kernel_kobj);
if (!config_kobj) {
kmem_cache_destroy(configfs_dir_cachep);
configfs_dir_cachep = NULL;
diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c
index 5ce92c3..97f6381 100644
--- a/fs/debugfs/inode.c
+++ b/fs/debugfs/inode.c
@@ -432,7 +432,7 @@ static int __init debugfs_init(void)
{
int retval;- debug_kobj = kobject_create_and_add("debug", &kernel_kset->kobj);
+ debug_kobj = kobject_create_and_add("debug", kernel_kobj);
if (!debug_kobj)
return -EINVAL;diff --git a/fs/dlm/lockspace.c b/fs/dlm/lockspace.c
index 0828beb..e64b0dc 100644
--- a/fs/dlm/lockspace.c
+++ b/fs/dlm/lockspace.c
@@ -223,7 +223,7 @@ int dlm_lockspace_init(void)
INIT_LIST_HEAD(&lslist);
spin_lock_init(&lslist_lock);- dlm_kset = kset_create_and_add("dlm", NULL, &kernel_kset->kobj);
+ dlm_kset = kset_create_and_add("dlm...
This macro is no longer used. ksets should be created dynamically with
a call to kset_create_and_add() not declared statically.Yes, there are 5 remaining static struct kset usages in the kernel tree,
but they will be fixed up soon.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/class.c | 11 +++++++++--
include/linux/kobject.h | 6 ------
2 files changed, 9 insertions(+), 8 deletions(-)diff --git a/drivers/base/class.c b/drivers/base/class.c
index d8a92c6..304f90e 100644
--- a/drivers/base/class.c
+++ b/drivers/base/class.c
@@ -453,8 +453,15 @@ static struct kset_uevent_ops class_uevent_ops = {
.uevent = class_uevent,
};-static decl_subsys(class_obj, &class_uevent_ops);
-
+/*
+ * DO NOT copy how this is created, kset_create_and_add() should be
+ * called, but this is a hold-over from the old-way and will be deleted
+ * entirely soon.
+ */
+static struct kset class_obj_subsys = {
+ .kobj = { .k_name = "class_obj", },
+ .uevent_ops = &class_uevent_ops,
+};static int class_device_add_attrs(struct class_device * cd)
{
diff --git a/include/linux/kobject.h b/include/linux/kobject.h
index 673623f..9da3523 100644
--- a/include/linux/kobject.h
+++ b/include/linux/kobject.h
@@ -198,12 +198,6 @@ extern struct kobject * kset_find_obj(struct kset *, const char *);
#define set_kset_name(str) .kset = { .kobj = { .k_name = str } }-#define decl_subsys(_name,_uevent_ops) \
-struct kset _name##_subsys = { \
- .kobj = { .k_name = __stringify(_name) }, \
- .uevent_ops =_uevent_ops, \
-}
-
/* The global /sys/kernel/ kset for people to chain off of */
extern struct kset *kernel_kset;
/* The global /sys/hypervisor/ kobject for people to chain off of */
--
1.5.3.8--
Dynamically create the kset instead of declaring it statically. We also
rename block_subsys to block_kset to catch all users of this symbol
with a build error instead of an easy-to-ignore build warning.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
block/genhd.c | 34 ++++++++++++++++------------------
fs/partitions/check.c | 6 +++---
2 files changed, 19 insertions(+), 21 deletions(-)diff --git a/block/genhd.c b/block/genhd.c
index 32227b7..69aa738 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -17,7 +17,8 @@
#include <linux/buffer_head.h>
#include <linux/mutex.h>-struct kset block_subsys;
+struct kset *block_kset;
+static struct kset_uevent_ops block_uevent_ops;
static DEFINE_MUTEX(block_subsys_lock);/*
@@ -221,7 +222,7 @@ void __init printk_all_partitions(void)mutex_lock(&block_subsys_lock);
/* For each block device... */
- list_for_each_entry(sgp, &block_subsys.list, kobj.entry) {
+ list_for_each_entry(sgp, &block_kset->list, kobj.entry) {
char buf[BDEVNAME_SIZE];
/*
* Don't show empty devices or things that have been surpressed
@@ -270,7 +271,7 @@ static void *part_start(struct seq_file *part, loff_t *pos)
loff_t l = *pos;mutex_lock(&block_subsys_lock);
- list_for_each(p, &block_subsys.list)
+ list_for_each(p, &block_kset->list)
if (!l--)
return list_entry(p, struct gendisk, kobj.entry);
return NULL;
@@ -280,7 +281,7 @@ static void *part_next(struct seq_file *part, void *v, loff_t *pos)
{
struct list_head *p = ((struct gendisk *)v)->kobj.entry.next;
++*pos;
- return p==&block_subsys.list ? NULL :
+ return p==&block_kset->list ? NULL :
list_entry(p, struct gendisk, kobj.entry);
}@@ -295,7 +296,7 @@ static int show_partition(struct seq_file *part, void *v)
int n;
char buf[BDEVNAME_SIZE];- if (&sgp->kobj.entry == block_subsys.list.next)
+ if (&sgp-&...
Dynamically create the kset instead of declaring it statically.
Also use the new kobj_attribute which cleans up this file a _lot_.
Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Mark Fasheh <mark.fasheh@oracle.com>
Cc: Kurt Hackel <kurt.hackel@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
fs/ocfs2/cluster/masklog.c | 4 +-
fs/ocfs2/cluster/sys.c | 83 +++++++++++--------------------------------
2 files changed, 23 insertions(+), 64 deletions(-)diff --git a/fs/ocfs2/cluster/masklog.c b/fs/ocfs2/cluster/masklog.c
index dead319..23c732f 100644
--- a/fs/ocfs2/cluster/masklog.c
+++ b/fs/ocfs2/cluster/masklog.c
@@ -146,7 +146,7 @@ static struct kset mlog_kset = {
.kobj = {.ktype = &mlog_ktype},
};-int mlog_sys_init(struct kset *o2cb_subsys)
+int mlog_sys_init(struct kset *o2cb_kset)
{
int i = 0;@@ -157,7 +157,7 @@ int mlog_sys_init(struct kset *o2cb_subsys)
mlog_attr_ptrs[i] = NULL;kobject_set_name(&mlog_kset.kobj, "logmask");
- mlog_kset.kobj.kset = o2cb_subsys;
+ mlog_kset.kobj.kset = o2cb_kset;
return kset_register(&mlog_kset);
}diff --git a/fs/ocfs2/cluster/sys.c b/fs/ocfs2/cluster/sys.c
index 880d013..a4b0773 100644
--- a/fs/ocfs2/cluster/sys.c
+++ b/fs/ocfs2/cluster/sys.c
@@ -28,96 +28,55 @@
#include <linux/module.h>
#include <linux/kobject.h>
#include <linux/sysfs.h>
+#include <linux/fs.h>#include "ocfs2_nodemanager.h"
#include "masklog.h"
#include "sys.h"-struct o2cb_attribute {
- struct attribute attr;
- ssize_t (*show)(char *buf);
- ssize_t (*store)(const char *buf, size_t count);
-};
-
-#define O2CB_ATTR(_name, _mode, _show, _store) \
-struct o2cb_attribute o2cb_attr_##_name = __ATTR(_name, _mode, _show, _store)
-
-#define to_o2cb_attr(_attr) container_of(_attr, struct o2cb_attribute, attr)-static ssize_t o2cb_interface_revision_show(char *buf)
+static ssize_t version_show(struct kobject *kobj, struct kobj_attribute *...
Acked-by: Mark Fasheh <mark.fasheh@oracle.com>
--
Mark Fasheh
Principal Software Developer, Oracle
mark.fasheh@oracle.com
--
There is no firmware "subsystem" it's just a directory in /sys that
other portions of the kernel want to hook into. So make it a kobject
not a kset to help alivate anyone who tries to do some odd kset-like
things with this.Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
arch/s390/kernel/ipl.c | 8 ++++----
drivers/acpi/bus.c | 2 +-
drivers/base/firmware.c | 8 ++++----
drivers/firmware/edd.c | 2 +-
drivers/firmware/efivars.c | 2 +-
drivers/parisc/pdc_stable.c | 2 +-
include/linux/kobject.h | 4 ++--
7 files changed, 14 insertions(+), 14 deletions(-)diff --git a/arch/s390/kernel/ipl.c b/arch/s390/kernel/ipl.c
index c8179fc..b97694f 100644
--- a/arch/s390/kernel/ipl.c
+++ b/arch/s390/kernel/ipl.c
@@ -855,7 +855,7 @@ static int __init ipl_init(void)
{
int rc;- ipl_kset = kset_create_and_add("ipl", NULL, &firmware_kset->kobj);
+ ipl_kset = kset_create_and_add("ipl", NULL, firmware_kobj);
if (!ipl_kset)
return -ENOMEM;
switch (ipl_info.type) {
@@ -974,7 +974,7 @@ static int __init reipl_init(void)
{
int rc;- reipl_kset = kset_create_and_add("reipl", NULL, &firmware_kset->kobj);
+ reipl_kset = kset_create_and_add("reipl", NULL, firmware_kobj);
if (!reipl_kset)
return -ENOMEM;
rc = sysfs_create_file(&reipl_kset->kobj, &reipl_type_attr.attr);
@@ -1063,7 +1063,7 @@ static int __init dump_init(void)
{
int rc;- dump_kset = kset_create_and_add("dump", NULL, &firmware_kset->kobj);
+ dump_kset = kset_create_and_add("dump", NULL, firmware_kobj);
if (!dump_kset)
return -ENOMEM;
rc = sysfs_create_file(&dump_kset->kobj, &dump_type_attr);
@@ -1086,7 +1086,7 @@ static int __init shutdown_actions_init(void)
int rc;shutdown_actions_kset = kset_create_and_add("shutdown_actions", NULL,
- &firmware_kset->kobj);
+ ...
These functions are no longer called or needed, so we can remove them.
As I rewrote the whole firmware.c file, add my copyright.
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/firmware.c | 19 ++-----------------
include/linux/device.h | 5 -----
2 files changed, 2 insertions(+), 22 deletions(-)diff --git a/drivers/base/firmware.c b/drivers/base/firmware.c
index c7f635b..9efff48 100644
--- a/drivers/base/firmware.c
+++ b/drivers/base/firmware.c
@@ -3,11 +3,11 @@
*
* Copyright (c) 2002-3 Patrick Mochel
* Copyright (c) 2002-3 Open Source Development Labs
+ * Copyright (c) 2007 Greg Kroah-Hartman <gregkh@suse.de>
+ * Copyright (c) 2007 Novell Inc.
*
* This file is released under the GPLv2
- *
*/
-
#include <linux/kobject.h>
#include <linux/module.h>
#include <linux/init.h>
@@ -18,18 +18,6 @@
struct kset *firmware_kset;
EXPORT_SYMBOL_GPL(firmware_kset);-int firmware_register(struct kset *s)
-{
- s->kobj.kset = firmware_kset;
- s->kobj.ktype = NULL;
- return subsystem_register(s);
-}
-
-void firmware_unregister(struct kset *s)
-{
- subsystem_unregister(s);
-}
-
int __init firmware_init(void)
{
firmware_kset = kset_create_and_add("firmware", NULL, NULL);
@@ -37,6 +25,3 @@ int __init firmware_init(void)
return -ENOMEM;
return 0;
}
-
-EXPORT_SYMBOL_GPL(firmware_register);
-EXPORT_SYMBOL_GPL(firmware_unregister);
diff --git a/include/linux/device.h b/include/linux/device.h
index 110ace0..a3b3ff1 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -555,11 +555,6 @@ extern void device_shutdown(void);
/* drivers/base/sys.c */
extern void sysdev_shutdown(void);-
-/* drivers/base/firmware.c */
-extern int __must_check firmware_register(struct kset *);
-extern void firmware_unregister(struct kset *);
-
/* debugging and troubleshooting/diagnostic helpers. */
extern const char *dev_driver_string(str...
We don't need a kset here, a simple kobject will do just fine, so
dynamically create the kobject and use it.Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Len Brown <lenb@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/acpi/bus.c | 11 ++++++-----
drivers/acpi/system.c | 2 +-
include/acpi/acpi_bus.h | 2 +-
3 files changed, 8 insertions(+), 7 deletions(-)diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
index 7c172d9..e550da6 100644
--- a/drivers/acpi/bus.c
+++ b/drivers/acpi/bus.c
@@ -743,7 +743,7 @@ static int __init acpi_bus_init(void)
return -ENODEV;
}-decl_subsys(acpi, NULL);
+struct kobject *acpi_kobj;static int __init acpi_init(void)
{
@@ -755,10 +755,11 @@ static int __init acpi_init(void)
return -ENODEV;
}- result = firmware_register(&acpi_subsys);
- if (result < 0)
- printk(KERN_WARNING "%s: firmware_register error: %d\n",
- __FUNCTION__, result);
+ acpi_kobj = kobject_create_and_add("acpi", &firmware_kset->kobj);
+ if (!acpi_kobj) {
+ printk(KERN_WARNING "%s: kset create error\n", __FUNCTION__);
+ acpi_kobj = NULL;
+ }result = acpi_bus_init();
diff --git a/drivers/acpi/system.c b/drivers/acpi/system.c
index edee280..c22b93a 100644
--- a/drivers/acpi/system.c
+++ b/drivers/acpi/system.c
@@ -135,7 +135,7 @@ static int acpi_system_sysfs_init(void)
int table_index = 0;
int result;- tables_kobj.parent = &acpi_subsys.kobj;
+ tables_kobj.parent = acpi_kobj;
kobject_set_name(&tables_kobj, "tables");
result = kobject_register(&tables_kobj);
if (result)
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index 7b74b60..fb7171b 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -319,7 +319,7 @@ struct acpi_bus_event {
u32 data;
};-extern struct kset acpi_subsys;
+extern struct kobject *acpi_kobj;
extern int acpi_bus_generate_netlink_event(const char*, const char*, u8, int);
/*
...
Dynamically create the kset instead of declaring it statically.
Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Matt Domsch <Matt_Domsch@dell.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/firmware/edd.c | 14 +++++++-------
1 files changed, 7 insertions(+), 7 deletions(-)diff --git a/drivers/firmware/edd.c b/drivers/firmware/edd.c
index fc567fa..f07f370 100644
--- a/drivers/firmware/edd.c
+++ b/drivers/firmware/edd.c
@@ -631,7 +631,7 @@ static struct kobj_type edd_ktype = {
.default_attrs = def_attrs,
};-static decl_subsys(edd, NULL);
+static struct kset *edd_kset;/**
@@ -723,7 +723,7 @@ edd_device_register(struct edd_device *edev, int i)
edd_dev_set_info(edev, i);
kobject_set_name(&edev->kobj, "int13_dev%02x",
0x80 + i);
- edev->kobj.kset = &edd_subsys;
+ edev->kobj.kset = edd_kset;
edev->kobj.ktype = &edd_ktype;
error = kobject_register(&edev->kobj);
if (!error)
@@ -756,9 +756,9 @@ edd_init(void)
return 1;
}- rc = firmware_register(&edd_subsys);
- if (rc)
- return rc;
+ edd_kset = kset_create_and_add("edd", NULL, &firmware_kset->kobj);
+ if (!edd_kset)
+ return -ENOMEM;for (i = 0; i < edd_num_devices() && !rc; i++) {
edev = kzalloc(sizeof (*edev), GFP_KERNEL);
@@ -774,7 +774,7 @@ edd_init(void)
}if (rc)
- firmware_unregister(&edd_subsys);
+ kset_unregister(edd_kset);
return rc;
}@@ -788,7 +788,7 @@ edd_exit(void)
if ((edev = edd_devices[i]))
edd_device_unregister(edev);
}
- firmware_unregister(&edd_subsys);
+ kset_unregister(edd_kset);
}late_initcall(edd_init);
--
1.5.3.8--
From: Kay Sievers <kay.sievers@vrfy.org>
Remove the no longer needed subsys_attributes, they are all converted to
the more sensical kobj_attributes.There is no longer a magic fallback in sysfs attribute operations, all
kobjects which create simple attributes need explicitely a ktype
assigned, which tells the core what was intended here.Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
fs/sysfs/file.c | 63 +++++++---------------------------------------
include/linux/kobject.h | 9 ------
lib/kobject.c | 21 ---------------
3 files changed, 10 insertions(+), 83 deletions(-)diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c
index 387a636..8acf82b 100644
--- a/fs/sysfs/file.c
+++ b/fs/sysfs/file.c
@@ -20,43 +20,6 @@#include "sysfs.h"
-#define to_sattr(a) container_of(a,struct subsys_attribute, attr)
-
-/*
- * Subsystem file operations.
- * These operations allow subsystems to have files that can be
- * read/written.
- */
-static ssize_t
-subsys_attr_show(struct kobject * kobj, struct attribute * attr, char * page)
-{
- struct kset *kset = to_kset(kobj);
- struct subsys_attribute * sattr = to_sattr(attr);
- ssize_t ret = -EIO;
-
- if (sattr->show)
- ret = sattr->show(kset, page);
- return ret;
-}
-
-static ssize_t
-subsys_attr_store(struct kobject * kobj, struct attribute * attr,
- const char * page, size_t count)
-{
- struct kset *kset = to_kset(kobj);
- struct subsys_attribute * sattr = to_sattr(attr);
- ssize_t ret = -EIO;
-
- if (sattr->store)
- ret = sattr->store(kset, page, count);
- return ret;
-}
-
-static struct sysfs_ops subsys_sysfs_ops = {
- .show = subsys_attr_show,
- .store = subsys_attr_store,
-};
-
/*
* There's one sysfs_buffer for each open file and one
* sysfs_open_dirent for each sysfs_dirent with one or more open
@@ -354,29 +317,23 @@ static int sysfs_open_file(struct inode *inode, struct file *file)
...
Dynamically create the kset instead of declaring it statically.
This makes the kobject attributes now work properly that I broke in the
previous patch.Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Thibaut VARENE <varenet@parisc-linux.org>
Cc: Matthew Wilcox <matthew@wil.cx>
Cc: Grant Grundler <grundler@parisc-linux.org>
Cc: Kyle McMartin <kyle@parisc-linux.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/parisc/pdc_stable.c | 38 +++++++++++++++++++++-----------------
1 files changed, 21 insertions(+), 17 deletions(-)diff --git a/drivers/parisc/pdc_stable.c b/drivers/parisc/pdc_stable.c
index e1b9cba..4444834 100644
--- a/drivers/parisc/pdc_stable.c
+++ b/drivers/parisc/pdc_stable.c
@@ -960,8 +960,8 @@ static struct attribute_group pdcs_attr_group = {
.attrs = pdcs_subsys_attrs,
};-static decl_subsys(paths, NULL);
-static decl_subsys(stable, NULL);
+static struct kset *stable_kset;
+static struct kset *paths_kset;/**
* pdcs_register_pathentries - Prepares path entries kobjects for sysfs usage.
@@ -993,7 +993,7 @@ pdcs_register_pathentries(void)if ((err = kobject_set_name(&entry->kobj, "%s", entry->name)))
return err;
- entry->kobj.kset = &paths_subsys;
+ entry->kobj.kset = paths_kset;
entry->kobj.ktype = &ktype_pdcspath;
if ((err = kobject_register(&entry->kobj)))
return err;
@@ -1058,19 +1058,24 @@ pdc_stable_init(void)
/* the actual result is 16 bits away */
pdcs_osid = (u16)(result >> 16);- /* For now we'll register the stable subsys within this driver */
- if ((rc = firmware_register(&stable_subsys)))
+ /* For now we'll register the stable kset within this driver */
+ stable_kset = kset_create_and_add("stable", NULL, &firmware_kset->kobj);
+ if (!stable_kset) {
+ rc = -ENOMEM;
goto fail_firmreg;
+ }/* Don't forget the root entries */
- error = sysfs_create_group(&stable_subsys.kobj, pdcs_attr_grou...
This makes the code a bit simpler and and gets us one step closer to
deleting the deprecated subsys_attr code.NOTE, this needs the next patch in the series in order to work properly.
This will build, but the sysfs files will not properly operate.Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Thibaut VARENE <varenet@parisc-linux.org>
Cc: Matthew Wilcox <matthew@wil.cx>
Cc: Grant Grundler <grundler@parisc-linux.org>
Cc: Kyle McMartin <kyle@parisc-linux.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/parisc/pdc_stable.c | 147 ++++++++++++++++++++----------------------
1 files changed, 70 insertions(+), 77 deletions(-)diff --git a/drivers/parisc/pdc_stable.c b/drivers/parisc/pdc_stable.c
index 1382be6..e1b9cba 100644
--- a/drivers/parisc/pdc_stable.c
+++ b/drivers/parisc/pdc_stable.c
@@ -120,7 +120,7 @@ struct pdcspath_entry pdcspath_entry_##_name = { \
};#define PDCS_ATTR(_name, _mode, _show, _store) \
-struct subsys_attribute pdcs_attr_##_name = { \
+struct kobj_attribute pdcs_attr_##_name = { \
.attr = {.name = __stringify(_name), .mode = _mode}, \
.show = _show, \
.store = _store, \
@@ -523,15 +523,15 @@ static struct pdcspath_entry *pdcspath_entries[] = {/**
* pdcs_size_read - Stable Storage size output.
- * @kset: An allocated and populated struct kset. We don't use it tho.
* @buf: The output buffer to write to.
*/
-static ssize_t
-pdcs_size_read(struct kset *kset, char *buf)
+static ssize_t pdcs_size_read(struct kobject *kobj,
+ struct kobj_attribute *attr,
+ char *buf)
{
char *out = buf;- if (!kset || !buf)
+ if (!buf)
return -EINVAL;/* show the size of the stable storage */
@@ -542,17 +542,17 @@ pdcs_size_read(struct kset *kset, char *buf)/**
* pdcs_auto_read - Stable Storage autoboot/search flag output.
- * @kset: An allocated and populated struct kset. We don't use it tho.
* @buf: The output buffer to write to.
* @knob: The PF_AUTOB...
Dynamically create the kset instead of declaring it statically.
This makes the kobject attributes now work properly that I broke in the
previous patch.Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Michael Holzheu <holzheu@de.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Volker Sameske <sameske@de.ibm.com>
Cc: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
arch/s390/kernel/ipl.c | 73 ++++++++++++++++++++++++-----------------------
1 files changed, 37 insertions(+), 36 deletions(-)diff --git a/arch/s390/kernel/ipl.c b/arch/s390/kernel/ipl.c
index 50be9d0..c8179fc 100644
--- a/arch/s390/kernel/ipl.c
+++ b/arch/s390/kernel/ipl.c
@@ -426,7 +426,7 @@ static struct attribute_group ipl_unknown_attr_group = {
.attrs = ipl_unknown_attrs,
};-static decl_subsys(ipl, NULL);
+static struct kset *ipl_kset;/*
* reipl section
@@ -602,7 +602,7 @@ static ssize_t reipl_type_store(struct kobject *kobj,
static struct kobj_attribute reipl_type_attr =
__ATTR(reipl_type, 0644, reipl_type_show, reipl_type_store);-static decl_subsys(reipl, NULL);
+static struct kset *reipl_kset;/*
* dump section
@@ -699,13 +699,13 @@ static ssize_t dump_type_store(struct kobject *kobj,
static struct kobj_attribute dump_type_attr =
__ATTR(dump_type, 0644, dump_type_show, dump_type_store);-static decl_subsys(dump, NULL);
+static struct kset *dump_kset;/*
* Shutdown actions section
*/-static decl_subsys(shutdown_actions, NULL);
+static struct kset *shutdown_actions_kset;/* on panic */
@@ -830,23 +830,23 @@ static int __init ipl_register_fcp_files(void)
{
int rc;- rc = sysfs_create_group(&ipl_subsys.kobj,
+ rc = sysfs_create_group(&ipl_kset->kobj,
&ipl_fcp_attr_group);
if (rc)
goto out;
- rc = sysfs_create_bin_file(&ipl_subsys.kobj,
+ rc = sysfs_create_bin_file(&ipl_kset->kobj,
&ipl_parameter_at...
Could you please merge this and the previous patch before it goes
upstream? Having an intermediate state where things are broken
will cause pain and additional work in case of bisecting.
Thanks!
--
It will not cause a build error (see the previous patch for details.)
The sysfs files will not properly show the correct data, that is all.The odds that you will hit this in a 'git bisect' is VERY low, and the
previous patch states that the files are now broken, so there should not
be any confusion regarding any user that might run across this.thanks,
greg k-h
--
The odds are very low, as long as not more patch sets come up which
introduce intermediate broken kernels.
What exactly is the advantage of breaking the kernel with patch 1 and
then fix it again with patch 2 instead of doing the straight forward
conversions all with one patch?
--
I was trying to do one logical thing at a time with this driver as I did
not have the hardware to test, and I could not even build the code at
the time.In looking more closer, I think the 084 patch might still work properly,
but I can't guarantee it as the the default kobject parent might not be
pointing to the correct attribute at the time. I know 085 fixes this to
be sure that it will work properly.It helped in reviewing this code by the other s390 developers to have
this in at least 2 pieces, to try to untangle the mess of sysfs files,
ksets, and other attrocities that you all have grown into over the
years.So again, I'm sorry if this happens to break your run-time tests when
doing a 'git bisect', but as I explicitly stated it did in the patch, I
think everyone is properly forwarned :)This core rework was tough to do, there was a reason no one had done it
before. Now it is cleaner, smaller, able to be understood by at least
one active kernel developer, if not more, and it's documented, with
working examples. If the downside of this effort is only this one thing
(note that others are finally finding real bugs...) I'll be very happy.thanks,
greg k-h
--
This makes the code a bit simpler and and gets us one step closer to
deleting the deprecated subsys_attr code.NOTE, this needs the next patch in the series in order to work properly.
This will build, but the sysfs files will not properly operate.Thanks to Cornelia for the build fix on this patch.
Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Michael Holzheu <holzheu@de.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Volker Sameske <sameske@de.ibm.com>
Cc: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
arch/s390/kernel/ipl.c | 80 ++++++++++++++++++++++++++++-------------------
1 files changed, 48 insertions(+), 32 deletions(-)diff --git a/arch/s390/kernel/ipl.c b/arch/s390/kernel/ipl.c
index cae793a..50be9d0 100644
--- a/arch/s390/kernel/ipl.c
+++ b/arch/s390/kernel/ipl.c
@@ -162,22 +162,25 @@ EXPORT_SYMBOL_GPL(diag308);
/* SYSFS */#define DEFINE_IPL_ATTR_RO(_prefix, _name, _format, _value) \
-static ssize_t sys_##_prefix##_##_name##_show(struct kset *kset, \
+static ssize_t sys_##_prefix##_##_name##_show(struct kobject *kobj, \
+ struct kobj_attribute *attr, \
char *page) \
{ \
return sprintf(page, _format, _value); \
} \
-static struct subsys_attribute sys_##_prefix##_##_name##_attr = \
+static struct kobj_attribute sys_##_prefix##_##_name##_attr = \
__ATTR(_name, S_IRUGO, sys_##_prefix##_##_name##_show, NULL);#define DEFINE_IPL_ATTR_RW(_prefix, _name, _fmt_out, _fmt_in, _value) \
-static ssize_t sys_##_prefix##_##_name##_show(struct kset *kset, \
+static ssize_t sys_##_prefix##_##_name##_show(struct kobject *kobj, \
+ struct kobj_attribute *attr, \
char *page) \
{ \
return sprintf(page, _fmt_out, \
(unsigned long long) _value); \
} \
-static ssize_t sys_##_prefix##_##_name##_store(struct kset *kset, \
+static ssize_t sys_##_prefix##_##_name##_store(struct kobject *kobj, \
...
This makes the code a bit simpler and and gets us one step closer to
deleting the deprecated subsys_attr code.Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Manish Ahuja <mahuja@us.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
arch/powerpc/platforms/pseries/power.c | 20 ++++++++------------
1 files changed, 8 insertions(+), 12 deletions(-)diff --git a/arch/powerpc/platforms/pseries/power.c b/arch/powerpc/platforms/pseries/power.c
index c36febe..90706cf 100644
--- a/arch/powerpc/platforms/pseries/power.c
+++ b/arch/powerpc/platforms/pseries/power.c
@@ -28,13 +28,15 @@unsigned long rtas_poweron_auto; /* default and normal state is 0 */
-static ssize_t auto_poweron_show(struct kset *kset, char *buf)
+static ssize_t auto_poweron_show(struct kobject *kobj,
+ struct kobj_attribute *attr, char *buf)
{
return sprintf(buf, "%lu\n", rtas_poweron_auto);
}-static ssize_t
-auto_poweron_store(struct kset *kset, const char *buf, size_t n)
+static ssize_t auto_poweron_store(struct kobject *kobj,
+ struct kobj_attribute *attr,
+ const char *buf, size_t n)
{
int ret;
unsigned long ups_restart;
@@ -47,14 +49,8 @@ auto_poweron_store(struct kset *kset, const char *buf, size_t n)
return -EINVAL;
}-static struct subsys_attribute auto_poweron_attr = {
- .attr = {
- .name = __stringify(auto_poweron),
- .mode = 0644,
- },
- .show = auto_poweron_show,
- .store = auto_poweron_store,
-};
+static struct kobj_attribute auto_poweron_attr =
+ __ATTR(auto_poweron, 0644, auto_poweron_show, auto_poweron_store);#ifndef CONFIG_PM
struct kset *power_kset;
@@ -79,7 +75,7 @@ core_initcall(pm_init);
#else
static int __init apo_pm_init(void)
{
- return (subsys_create_file(power_kset, &auto_poweron_attr));
+ return (sysfs_create_file(&power_kset->kobj, &auto_poweron_attr));
}
__initcall(apo_pm_init);
#endif
--
1.5.3.8--
...
This makes the code a bit simpler and and gets us one step closer to
deleting the deprecated subsys_attr code.Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Dirk Behme <dirk.behme@de.bosch.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
arch/arm/mach-omap1/pm.c | 22 ++++++++--------------
1 files changed, 8 insertions(+), 14 deletions(-)diff --git a/arch/arm/mach-omap1/pm.c b/arch/arm/mach-omap1/pm.c
index 402113c..63edafb 100644
--- a/arch/arm/mach-omap1/pm.c
+++ b/arch/arm/mach-omap1/pm.c
@@ -69,14 +69,14 @@ static unsigned int mpui1610_sleep_save[MPUI1610_SLEEP_SAVE_SIZE];static unsigned short enable_dyn_sleep = 1;
-static ssize_t omap_pm_sleep_while_idle_show(struct kset *kset, char *buf)
+static ssize_t idle_show(struct kobject *kobj, struct kobj_attribute *attr,
+ char *buf)
{
return sprintf(buf, "%hu\n", enable_dyn_sleep);
}-static ssize_t omap_pm_sleep_while_idle_store(struct kset *kset,
- const char * buf,
- size_t n)
+static ssize_t idle_store(struct kobject *kobj, struct kobj_attribute *attr,
+ const char * buf, size_t n)
{
unsigned short value;
if (sscanf(buf, "%hu", &value) != 1 ||
@@ -88,14 +88,8 @@ static ssize_t omap_pm_sleep_while_idle_store(struct kset *kset,
return n;
}-static struct subsys_attribute sleep_while_idle_attr = {
- .attr = {
- .name = __stringify(sleep_while_idle),
- .mode = 0644,
- },
- .show = omap_pm_sleep_while_idle_show,
- .store = omap_pm_sleep_while_idle_store,
-};
+static struct kobj_attribute sleep_while_idle_attr =
+ __ATTR(sleep_while_idle, 0644, idle_show, idle_store);static void (*omap_sram_idle)(void) = NULL;
static void (*omap_sram_suspend)(unsigned long r0, unsigned long r1) = NULL;
@@ -725,9 +719,9 @@ static int __init omap_pm_init(void)
omap_pm_init_proc();
#endif- error = subsys_create_file(power_kset, &sleep_while_idle_attr);
+ error = sysfs_create_file(&power_kset->kobj, &sleep_while_idl...
Dynamically create the kset instead of declaring it statically.
Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Matt Domsch <Matt_Domsch@dell.com>
Cc: Matt Tolentino <matthew.e.tolentino@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/firmware/efivars.c | 22 ++++++++++------------
1 files changed, 10 insertions(+), 12 deletions(-)diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c
index 018ca1c..e17cd81 100644
--- a/drivers/firmware/efivars.c
+++ b/drivers/firmware/efivars.c
@@ -572,7 +572,7 @@ static struct attribute_group efi_subsys_attr_group = {
};-static decl_subsys(vars, NULL);
+static struct kset *vars_kset;
static struct kset *efi_kset;/*
@@ -618,7 +618,7 @@ efivar_create_sysfs_entry(unsigned long variable_name_size,
efi_guid_unparse(vendor_guid, short_name + strlen(short_name));kobject_set_name(&new_efivar->kobj, "%s", short_name);
- new_efivar->kobj.kset = &vars_subsys;
+ new_efivar->kobj.kset = vars_kset;
new_efivar->kobj.ktype = &efivar_ktype;
i = kobject_register(&new_efivar->kobj);
if (i) {
@@ -675,12 +675,10 @@ efivars_init(void)
goto out_free;
}- vars_subsys.kobj.kset = efi_kset;
-
- error = subsystem_register(&vars_subsys);
-
- if (error) {
- printk(KERN_ERR "efivars: Subsystem registration failed with error %d.\n", error);
+ vars_kset = kset_create_and_add("vars", NULL, &efi_kset->kobj);
+ if (!vars_kset) {
+ printk(KERN_ERR "efivars: Subsystem registration failed.\n");
+ error = -ENOMEM;
goto out_firmware_unregister;
}@@ -715,12 +713,12 @@ efivars_init(void)
* Now add attributes to allow creation of new vars
* and deletion of existing ones...
*/
- error = sysfs_create_bin_file(&vars_subsys.kobj,
+ error = sysfs_create_bin_file(&vars_kset->kobj,
&var_subsys_attr_new_var);
if (error)
printk(KERN_ERR "efivars: unable to create new_var sysfs file"
...
Dynamically create the kset instead of declaring it statically.
Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Matt Domsch <Matt_Domsch@dell.com>
Cc: Matt Tolentino <matthew.e.tolentino@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/firmware/efivars.c | 19 +++++++++----------
1 files changed, 9 insertions(+), 10 deletions(-)diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c
index ebc3853..018ca1c 100644
--- a/drivers/firmware/efivars.c
+++ b/drivers/firmware/efivars.c
@@ -573,7 +573,7 @@ static struct attribute_group efi_subsys_attr_group = {static decl_subsys(vars, NULL);
-static decl_subsys(efi, NULL);
+static struct kset *efi_kset;/*
* efivar_create_sysfs_entry()
@@ -668,15 +668,14 @@ efivars_init(void)
/*
* For now we'll register the efi subsys within this driver
*/
-
- error = firmware_register(&efi_subsys);
-
- if (error) {
- printk(KERN_ERR "efivars: Firmware registration failed with error %d.\n", error);
+ efi_kset = kset_create_and_add("efi", NULL, &firmware_kset->kobj);
+ if (!efi_kset) {
+ printk(KERN_ERR "efivars: Firmware registration failed.\n");
+ error = -ENOMEM;
goto out_free;
}- vars_subsys.kobj.kset = &efi_subsys;
+ vars_subsys.kobj.kset = efi_kset;error = subsystem_register(&vars_subsys);
@@ -728,7 +727,7 @@ efivars_init(void)
" due to error %d\n", error);/* Don't forget the systab entry */
- error = sysfs_create_group(&efi_subsys.kobj, &efi_subsys_attr_group);
+ error = sysfs_create_group(&efi_kset->kobj, &efi_subsys_attr_group);
if (error)
printk(KERN_ERR "efivars: Sysfs attribute export failed with error %d.\n", error);
else
@@ -737,7 +736,7 @@ efivars_init(void)
subsystem_unregister(&vars_subsys);out_firmware_unregister:
- firmware_unregister(&efi_subsys);
+ kset_unregister(efi_kset);out_free:
kfree(variable_name);
@@ -758,7 +757,7 @@ efivars_exit(...
Dynamically create the kset instead of declaring it statically.
Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Matt Domsch <Matt_Domsch@dell.com>
Cc: Matt Tolentino <matthew.e.tolentino@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/firmware/efivars.c | 22 ++++++++++------------
1 files changed, 10 insertions(+), 12 deletions(-)diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c
index 018ca1c..e17cd81 100644
--- a/drivers/firmware/efivars.c
+++ b/drivers/firmware/efivars.c
@@ -572,7 +572,7 @@ static struct attribute_group efi_subsys_attr_group = {
};-static decl_subsys(vars, NULL);
+static struct kset *vars_kset;
static struct kset *efi_kset;/*
@@ -618,7 +618,7 @@ efivar_create_sysfs_entry(unsigned long variable_name_size,
efi_guid_unparse(vendor_guid, short_name + strlen(short_name));kobject_set_name(&new_efivar->kobj, "%s", short_name);
- new_efivar->kobj.kset = &vars_subsys;
+ new_efivar->kobj.kset = vars_kset;
new_efivar->kobj.ktype = &efivar_ktype;
i = kobject_register(&new_efivar->kobj);
if (i) {
@@ -675,12 +675,10 @@ efivars_init(void)
goto out_free;
}- vars_subsys.kobj.kset = efi_kset;
-
- error = subsystem_register(&vars_subsys);
-
- if (error) {
- printk(KERN_ERR "efivars: Subsystem registration failed with error %d.\n", error);
+ vars_kset = kset_create_and_add("vars", NULL, &efi_kset->kobj);
+ if (!vars_kset) {
+ printk(KERN_ERR "efivars: Subsystem registration failed.\n");
+ error = -ENOMEM;
goto out_firmware_unregister;
}@@ -715,12 +713,12 @@ efivars_init(void)
* Now add attributes to allow creation of new vars
* and deletion of existing ones...
*/
- error = sysfs_create_bin_file(&vars_subsys.kobj,
+ error = sysfs_create_bin_file(&vars_kset->kobj,
&var_subsys_attr_new_var);
if (error)
printk(KERN_ERR "efivars: unable to create new_var sysfs file"
...
Dynamically create the kset instead of declaring it statically.
Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Matt Domsch <Matt_Domsch@dell.com>
Cc: Matt Tolentino <matthew.e.tolentino@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/firmware/efivars.c | 19 +++++++++----------
1 files changed, 9 insertions(+), 10 deletions(-)diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c
index ebc3853..018ca1c 100644
--- a/drivers/firmware/efivars.c
+++ b/drivers/firmware/efivars.c
@@ -573,7 +573,7 @@ static struct attribute_group efi_subsys_attr_group = {static decl_subsys(vars, NULL);
-static decl_subsys(efi, NULL);
+static struct kset *efi_kset;/*
* efivar_create_sysfs_entry()
@@ -668,15 +668,14 @@ efivars_init(void)
/*
* For now we'll register the efi subsys within this driver
*/
-
- error = firmware_register(&efi_subsys);
-
- if (error) {
- printk(KERN_ERR "efivars: Firmware registration failed with error %d.\n", error);
+ efi_kset = kset_create_and_add("efi", NULL, &firmware_kset->kobj);
+ if (!efi_kset) {
+ printk(KERN_ERR "efivars: Firmware registration failed.\n");
+ error = -ENOMEM;
goto out_free;
}- vars_subsys.kobj.kset = &efi_subsys;
+ vars_subsys.kobj.kset = efi_kset;error = subsystem_register(&vars_subsys);
@@ -728,7 +727,7 @@ efivars_init(void)
" due to error %d\n", error);/* Don't forget the systab entry */
- error = sysfs_create_group(&efi_subsys.kobj, &efi_subsys_attr_group);
+ error = sysfs_create_group(&efi_kset->kobj, &efi_subsys_attr_group);
if (error)
printk(KERN_ERR "efivars: Sysfs attribute export failed with error %d.\n", error);
else
@@ -737,7 +736,7 @@ efivars_init(void)
subsystem_unregister(&vars_subsys);out_firmware_unregister:
- firmware_unregister(&efi_subsys);
+ kset_unregister(efi_kset);out_free:
kfree(variable_name);
@@ -758,7 +757,7 @@ efivars_exit(...
From: TripleX Chung <triplex@zh-kernel.org>
Signed-off-by: TripleX Chung <triplex@zh-kernel.org>
Signed-off-by: Li Yang <leo@zh-kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
Documentation/zh_CN/SubmittingPatches | 416 +++++++++++++++++++++++++++++++++
1 files changed, 416 insertions(+), 0 deletions(-)
create mode 100644 Documentation/zh_CN/SubmittingPatchesdiff --git a/Documentation/zh_CN/SubmittingPatches b/Documentation/zh_CN/SubmittingPatches
new file mode 100644
index 0000000..985c92e
--- /dev/null
+++ b/Documentation/zh_CN/SubmittingPatches
@@ -0,0 +1,416 @@
+Chinese translated version of Documentation/SubmittingPatches
+
+If you have any comment or update to the content, please contact the
+original document maintainer directly. However, if you have a problem
+communicating in English you can also ask the Chinese maintainer for
+help. Contact the Chinese maintainer if this translation is outdated
+or if there is a problem with the translation.
+
+Chinese maintainer: TripleX Chung <triplex@zh-kernel.org>
+---------------------------------------------------------------------
+Documentation/SubmittingPatches
From: Li Yang <leo@zh-kernel.org>
Rephrase the introduction as suggested by Jesper Juhl.
Signed-off-by: Li Yang <leo@zh-kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
Documentation/zh_CN/HOWTO | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)diff --git a/Documentation/zh_CN/HOWTO b/Documentation/zh_CN/HOWTO
index c8660da..79d1c3c 100644
--- a/Documentation/zh_CN/HOWTO
+++ b/Documentation/zh_CN/HOWTO
@@ -1,10 +1,10 @@
From: Li Yang <leo@zh-kernel.org>
Update translation for commit be3884943674f8ee7656b1d8b71c087ec900c836.
Signed-off-by: Li Yang <leo@zh-kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
Documentation/zh_CN/HOWTO | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)diff --git a/Documentation/zh_CN/HOWTO b/Documentation/zh_CN/HOWTO
index 48fc67b..c8660da 100644
--- a/Documentation/zh_CN/HOWTO
+++ b/Documentation/zh_CN/HOWTO
@@ -218,6 +218,8 @@ kernel.org
Dynamically create the kset instead of declaring it statically.
Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Matt Domsch <Matt_Domsch@dell.com>
Cc: Matt Tolentino <matthew.e.tolentino@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/firmware/efivars.c | 22 ++++++++++------------
1 files changed, 10 insertions(+), 12 deletions(-)diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c
index 018ca1c..e17cd81 100644
--- a/drivers/firmware/efivars.c
+++ b/drivers/firmware/efivars.c
@@ -572,7 +572,7 @@ static struct attribute_group efi_subsys_attr_group = {
};-static decl_subsys(vars, NULL);
+static struct kset *vars_kset;
static struct kset *efi_kset;/*
@@ -618,7 +618,7 @@ efivar_create_sysfs_entry(unsigned long variable_name_size,
efi_guid_unparse(vendor_guid, short_name + strlen(short_name));kobject_set_name(&new_efivar->kobj, "%s", short_name);
- new_efivar->kobj.kset = &vars_subsys;
+ new_efivar->kobj.kset = vars_kset;
new_efivar->kobj.ktype = &efivar_ktype;
i = kobject_register(&new_efivar->kobj);
if (i) {
@@ -675,12 +675,10 @@ efivars_init(void)
goto out_free;
}- vars_subsys.kobj.kset = efi_kset;
-
- error = subsystem_register(&vars_subsys);
-
- if (error) {
- printk(KERN_ERR "efivars: Subsystem registration failed with error %d.\n", error);
+ vars_kset = kset_create_and_add("vars", NULL, &efi_kset->kobj);
+ if (!vars_kset) {
+ printk(KERN_ERR "efivars: Subsystem registration failed.\n");
+ error = -ENOMEM;
goto out_firmware_unregister;
}@@ -715,12 +713,12 @@ efivars_init(void)
* Now add attributes to allow creation of new vars
* and deletion of existing ones...
*/
- error = sysfs_create_bin_file(&vars_subsys.kobj,
+ error = sysfs_create_bin_file(&vars_kset->kobj,
&var_subsys_attr_new_var);
if (error)
printk(KERN_ERR "efivars: unable to create new_var sysfs file"
...
Dynamically create the kset instead of declaring it statically.
Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Matt Domsch <Matt_Domsch@dell.com>
Cc: Matt Tolentino <matthew.e.tolentino@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/firmware/efivars.c | 19 +++++++++----------
1 files changed, 9 insertions(+), 10 deletions(-)diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c
index ebc3853..018ca1c 100644
--- a/drivers/firmware/efivars.c
+++ b/drivers/firmware/efivars.c
@@ -573,7 +573,7 @@ static struct attribute_group efi_subsys_attr_group = {static decl_subsys(vars, NULL);
-static decl_subsys(efi, NULL);
+static struct kset *efi_kset;/*
* efivar_create_sysfs_entry()
@@ -668,15 +668,14 @@ efivars_init(void)
/*
* For now we'll register the efi subsys within this driver
*/
-
- error = firmware_register(&efi_subsys);
-
- if (error) {
- printk(KERN_ERR "efivars: Firmware registration failed with error %d.\n", error);
+ efi_kset = kset_create_and_add("efi", NULL, &firmware_kset->kobj);
+ if (!efi_kset) {
+ printk(KERN_ERR "efivars: Firmware registration failed.\n");
+ error = -ENOMEM;
goto out_free;
}- vars_subsys.kobj.kset = &efi_subsys;
+ vars_subsys.kobj.kset = efi_kset;error = subsystem_register(&vars_subsys);
@@ -728,7 +727,7 @@ efivars_init(void)
" due to error %d\n", error);/* Don't forget the systab entry */
- error = sysfs_create_group(&efi_subsys.kobj, &efi_subsys_attr_group);
+ error = sysfs_create_group(&efi_kset->kobj, &efi_subsys_attr_group);
if (error)
printk(KERN_ERR "efivars: Sysfs attribute export failed with error %d.\n", error);
else
@@ -737,7 +736,7 @@ efivars_init(void)
subsystem_unregister(&vars_subsys);out_firmware_unregister:
- firmware_unregister(&efi_subsys);
+ kset_unregister(efi_kset);out_free:
kfree(variable_name);
@@ -758,7 +757,7 @@ efivars_exit(...
Needed for future firmware subsystem cleanups.
In the end, the firmware_register/unregister functions will be deleted
entirely, but we need this symbol so that subsystems can migrate over.Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Matt Domsch <Matt_Domsch@dell.com>
Cc: Matt Tolentino <matthew.e.tolentino@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/firmware.c | 3 ++-
include/linux/kobject.h | 2 ++
2 files changed, 4 insertions(+), 1 deletions(-)diff --git a/drivers/base/firmware.c b/drivers/base/firmware.c
index 6a4e494..c7f635b 100644
--- a/drivers/base/firmware.c
+++ b/drivers/base/firmware.c
@@ -15,7 +15,8 @@#include "base.h"
-static struct kset *firmware_kset;
+struct kset *firmware_kset;
+EXPORT_SYMBOL_GPL(firmware_kset);int firmware_register(struct kset *s)
{
diff --git a/include/linux/kobject.h b/include/linux/kobject.h
index e694261..29dc444 100644
--- a/include/linux/kobject.h
+++ b/include/linux/kobject.h
@@ -210,6 +210,8 @@ extern struct kset *kernel_kset;
extern struct kobject *hypervisor_kobj;
/* The global /sys/power/ kset for people to chain off of */
extern struct kset *power_kset;
+/* The global /sys/firmware/ kset for people to chain off of */
+extern struct kset *firmware_kset;extern int __must_check subsystem_register(struct kset *);
extern void subsystem_unregister(struct kset *);
--
1.5.3.8--
This cleans up a lot of code and gets rid of a unneeded macro, and gets
us one step closer to deleting the deprecated subsys_attr code.Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Matt Domsch <Matt_Domsch@dell.com>
Cc: Matt Tolentino <matthew.e.tolentino@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/firmware/efivars.c | 35 ++++++++++++++---------------------
1 files changed, 14 insertions(+), 21 deletions(-)diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c
index 82183c2..ebc3853 100644
--- a/drivers/firmware/efivars.c
+++ b/drivers/firmware/efivars.c
@@ -129,13 +129,6 @@ struct efivar_attribute {
};-#define EFI_ATTR(_name, _mode, _show, _store) \
-struct subsys_attribute efi_attr_##_name = { \
- .attr = {.name = __stringify(_name), .mode = _mode}, \
- .show = _show, \
- .store = _store, \
-};
-
#define EFIVAR_ATTR(_name, _mode, _show, _store) \
struct efivar_attribute efivar_attr_##_name = { \
.attr = {.name = __stringify(_name), .mode = _mode}, \
@@ -540,12 +533,12 @@ static struct bin_attribute var_subsys_attr_del_var = {
* Let's not leave out systab information that snuck into
* the efivars driver
*/
-static ssize_t
-systab_read(struct kset *kset, char *buf)
+static ssize_t systab_show(struct kobject *kobj,
+ struct kobj_attribute *attr, char *buf)
{
char *str = buf;- if (!kset || !buf)
+ if (!kobj || !buf)
return -EINVAL;if (efi.mps != EFI_INVALID_TABLE_ADDR)
@@ -566,13 +559,19 @@ systab_read(struct kset *kset, char *buf)
return str - buf;
}-static EFI_ATTR(systab, 0400, systab_read, NULL);
+static struct kobj_attribute efi_attr_systab =
+ __ATTR(systab, 0400, systab_show, NULL);-static struct subsys_attribute *efi_subsys_attrs[] = {
- &efi_attr_systab,
+static struct attribute *efi_subsys_attrs[] = {
+ &efi_attr_systab.attr,
NULL, /* maybe more in the future? */
};+static struct attribute_group efi_subsys_attr_grou...
These files should not be "normal" sysfs files as they really are binary
ones. This patch makes them binary files and saves code in doing so.Cc: Kay Sievers <kay.sievers@vrfy.org>
Tested-by: Matt Domsch <Matt_Domsch@dell.com>
Cc: Matt Tolentino <matthew.e.tolentino@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/firmware/efivars.c | 51 +++++++++++++++++++------------------------
1 files changed, 23 insertions(+), 28 deletions(-)diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c
index 06ecdb9..82183c2 100644
--- a/drivers/firmware/efivars.c
+++ b/drivers/firmware/efivars.c
@@ -143,13 +143,6 @@ struct efivar_attribute efivar_attr_##_name = { \
.store = _store, \
};-#define VAR_SUBSYS_ATTR(_name, _mode, _show, _store) \
-struct subsys_attribute var_subsys_attr_##_name = { \
- .attr = {.name = __stringify(_name), .mode = _mode}, \
- .show = _show, \
- .store = _store, \
-};
-
#define to_efivar_attr(_attr) container_of(_attr, struct efivar_attribute, attr)
#define to_efivar_entry(obj) container_of(obj, struct efivar_entry, kobj)@@ -408,12 +401,6 @@ static struct kobj_type efivar_ktype = {
.default_attrs = def_attrs,
};-static ssize_t
-dummy(struct kset *kset, char *buf)
-{
- return -ENODEV;
-}
-
static inline void
efivar_unregister(struct efivar_entry *var)
{
@@ -421,8 +408,9 @@ efivar_unregister(struct efivar_entry *var)
}-static ssize_t
-efivar_create(struct kset *kset, const char *buf, size_t count)
+static ssize_t efivar_create(struct kobject *kobj,
+ struct bin_attribute *bin_attr,
+ char *buf, loff_t pos, size_t count)
{
struct efi_variable *new_var = (struct efi_variable *)buf;
struct efivar_entry *search_efivar, *n;
@@ -479,8 +467,9 @@ efivar_create(struct kset *kset, const char *buf, size_t count)
return count;
}-static ssize_t
-efivar_delete(struct kset *kset, const char *buf, size_t count)
+static ssize_t efivar_delete(st...
This file violates the one-value-per-file sysfs rule.
If you all want it added back, please do something like a per-feature
file to show what is present and what isn't.Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Mike Halcrow <mhalcrow@us.ibm.com>
Cc: Phillip Hellewell <phillip@hellewell.homeip.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
fs/ecryptfs/main.c | 43 -------------------------------------------
1 files changed, 0 insertions(+), 43 deletions(-)diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c
index 6ded37b..d984eac 100644
--- a/fs/ecryptfs/main.c
+++ b/fs/ecryptfs/main.c
@@ -744,51 +744,8 @@ static ssize_t version_show(struct kobject *kobj,static struct kobj_attribute version_attr = __ATTR_RO(version);
-static struct ecryptfs_version_str_map_elem {
- u32 flag;
- char *str;
-} ecryptfs_version_str_map[] = {
- {ECRYPTFS_VERSIONING_PASSPHRASE, "passphrase"},
- {ECRYPTFS_VERSIONING_PUBKEY, "pubkey"},
- {ECRYPTFS_VERSIONING_PLAINTEXT_PASSTHROUGH, "plaintext passthrough"},
- {ECRYPTFS_VERSIONING_POLICY, "policy"},
- {ECRYPTFS_VERSIONING_XATTR, "metadata in extended attribute"},
- {ECRYPTFS_VERSIONING_MULTKEY, "multiple keys per file"}
-};
-
-static ssize_t version_str_show(struct kobject *kobj,
- struct kobj_attribute *attr, char *buff)
-{
- int i;
- int remaining = PAGE_SIZE;
- int total_written = 0;
-
- buff[0] = '\0';
- for (i = 0; i < ARRAY_SIZE(ecryptfs_version_str_map); i++) {
- int entry_size;
-
- if (!(ECRYPTFS_VERSIONING_MASK
- & ecryptfs_version_str_map[i].flag))
- continue;
- entry_size = strlen(ecryptfs_version_str_map[i].str);
- if ((entry_size + 2) > remaining)
- goto out;
- memcpy(buff, ecryptfs_version_str_map[i].str, entry_size);
- buff[entry_size++] = '\n';
- buff[entry_size] = '\0';
- buff += entry_size;
- total_written += entry_size;
- remaining -= entry_size;
- }
-out:
- return total_written;
-}
-
-static struct kobj_attribute version_attr_s...
It's not really good policy to rip out ABIs found in release kernels
like this, even if the motivation is sound.IMO "don't break ABIs" rule is far more important than a
one-value-per-file sysfs rule.Jeff
--
Normally I would agree, but this file is just so bad, it's not even
funny. I could not find any userspace tools or documentation that used
it, and the ecryptfs developers never responded to any of my emails
concerning it.The information is still present, just in a different file, so no
Just another example of why people need to document this kind of thing
in Documentation/ABI/ which prevents such atrocities from ever being
created in the first place...thanks,
greg k-h
--
The version_str handle is only there as a potential convenience for
users who need to figure out what their module can and cannot do. I
mentioned it in an article in LJ last year. It does not need to be
there for any tools to work right, and I do not think that anyone
really cares about it at this point, so I have no problem with just
ripping it out.Mike
--
Cool, well ignore my objection then...
Jeff
--
From: Kay Sievers <kay.sievers@vrfy.org>
Clean up the use of ksets and kobjects. Kobjects are instances of
objects (like struct user_info), ksets are collections of objects of a
similar type (like the uids directory containing the user_info directories).
So, use kobjects for the user_info directories, and a kset for the "uids"
directory.On object cleanup, the final kobject_put() was missing.
Cc: Dhaval Giani <dhaval@linux.vnet.ibm.com>
Cc: Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
include/linux/sched.h | 9 +---
kernel/ksysfs.c | 7 +--
kernel/user.c | 104 ++++++++++++++++++++++++-------------------------
3 files changed, 55 insertions(+), 65 deletions(-)diff --git a/include/linux/sched.h b/include/linux/sched.h
index cc14656..d6eacda 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -552,18 +552,13 @@ struct user_struct {
#ifdef CONFIG_FAIR_USER_SCHED
struct task_group *tg;
#ifdef CONFIG_SYSFS
- struct kset kset;
- struct subsys_attribute user_attr;
+ struct kobject kobj;
struct work_struct work;
#endif
#endif
};-#ifdef CONFIG_FAIR_USER_SCHED
-extern int uids_kobject_init(void);
-#else
-static inline int uids_kobject_init(void) { return 0; }
-#endif
+extern int uids_sysfs_init(void);extern struct user_struct *find_user(uid_t);
diff --git a/kernel/ksysfs.c b/kernel/ksysfs.c
index dd0f9e7..45e6465 100644
--- a/kernel/ksysfs.c
+++ b/kernel/ksysfs.c
@@ -141,11 +141,8 @@ static int __init ksysfs_init(void)
goto group_exit;
}- /*
- * Create "/sys/kernel/uids" directory and corresponding root user's
- * directory under it.
- */
- error = uids_kobject_init();
+ /* create the /sys/kernel/uids/ directory */
+ error = uids_sysfs_init();
if (error)
goto notes_exit;diff --git a/kernel/user.c b/kernel/user.c
index 80f1116..5a106f3 100644
--- a/...
From: Kay Sievers <kay.sievers@vrfy.org>
Switch all dynamically created ksets, that export simple attributes,
to kobj_attribute from subsys_attribute. Struct subsys_attribute will
be removed.Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
Cc: Mike Halcrow <mhalcrow@us.ibm.com>
Cc: Phillip Hellewell <phillip@hellewell.homeip.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
fs/ecryptfs/main.c | 10 ++++++----
kernel/ksysfs.c | 35 +++++++++++++++++++++--------------
kernel/power/disk.c | 18 ++++++++++++------
kernel/power/main.c | 12 ++++++++----
kernel/power/power.h | 2 +-
lib/kobject.c | 10 ++++++----
6 files changed, 54 insertions(+), 33 deletions(-)diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c
index bdeac38..6ded37b 100644
--- a/fs/ecryptfs/main.c
+++ b/fs/ecryptfs/main.c
@@ -736,12 +736,13 @@ static int ecryptfs_init_kmem_caches(void)static struct kset *ecryptfs_kset;
-static ssize_t version_show(struct kset *kset, char *buff)
+static ssize_t version_show(struct kobject *kobj,
+ struct kobj_attribute *attr, char *buff)
{
return snprintf(buff, PAGE_SIZE, "%d\n", ECRYPTFS_VERSIONING_MASK);
}-static struct subsys_attribute version_attr = __ATTR_RO(version);
+static struct kobj_attribute version_attr = __ATTR_RO(version);static struct ecryptfs_version_str_map_elem {
u32 flag;
@@ -755,7 +756,8 @@ static struct ecryptfs_version_str_map_elem {
{ECRYPTFS_VERSIONING_MULTKEY, "multiple keys per file"}
};-static ssize_t version_str_show(struct kset *kset, char *buff)
+static ssize_t version_str_show(struct kobject *kobj,
+ struct kobj_attribute *attr, char *buff)
{
int i;
int remaining = PAGE_SIZE;
@@ -782,7 +784,7 @@ out:
return total_written;
}-static struct subsys_attribute version_attr_str = __ATTR_RO(version_str);
+static struct kobj_attribute version_attr_str = __ATTR_RO(version_str);static struct attribute *attributes[] = {...
From: Kay Sievers <kay.sievers@vrfy.org>
Add kobj_sysfs_ops to replace subsys_sysfs_ops. There is no
need for special kset operations, we want to be able to use
simple attribute operations at any kobject, not only ksets.The whole concept of any default sysfs attribute operations
will go away with the upcoming removal of subsys_sysfs_ops.Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
include/linux/kobject.h | 10 ++++++++++
lib/kobject.c | 29 +++++++++++++++++++++++++++++
2 files changed, 39 insertions(+), 0 deletions(-)diff --git a/include/linux/kobject.h b/include/linux/kobject.h
index a6dd669..e694261 100644
--- a/include/linux/kobject.h
+++ b/include/linux/kobject.h
@@ -126,6 +126,16 @@ struct kset_uevent_ops {
struct kobj_uevent_env *env);
};+struct kobj_attribute {
+ struct attribute attr;
+ ssize_t (*show)(struct kobject *kobj, struct kobj_attribute *attr,
+ char *buf);
+ ssize_t (*store)(struct kobject *kobj, struct kobj_attribute *attr,
+ const char *buf, size_t count);
+};
+
+extern struct sysfs_ops kobj_sysfs_ops;
+
/**
* struct kset - a set of kobjects of a specific type, belonging to a specific subsystem.
*
diff --git a/lib/kobject.c b/lib/kobject.c
index 67c3d38..1c343fe 100644
--- a/lib/kobject.c
+++ b/lib/kobject.c
@@ -697,6 +697,35 @@ void kset_init(struct kset * k)
spin_lock_init(&k->list_lock);
}+/* default kobject attribute operations */
+static ssize_t kobj_attr_show(struct kobject *kobj, struct attribute *attr,
+ char *buf)
+{
+ struct kobj_attribute *kattr;
+ ssize_t ret = -EIO;
+
+ kattr = container_of(attr, struct kobj_attribute, attr);
+ if (kattr->show)
+ ret = kattr->show(kobj, kattr, buf);
+ return ret;
+}
+
+static ssize_t kobj_attr_store(struct kobject *kobj, struct attribute *attr,
+ const char *buf, size_t count)
+{
+ struct kobj_attribute *kattr;
+ ssize_t ret = -...
Dynamically create the kset instead of declaring it statically.
Having 3 static kobjects in one structure is not only foolish, but ripe
for nasty race conditions if handled improperly. We also rename the
field to catch any potential users of it (not that there should be
outside of the driver core...)Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/bus.c | 15 ++++++++-------
drivers/base/driver.c | 2 +-
include/linux/device.h | 2 +-
3 files changed, 10 insertions(+), 9 deletions(-)diff --git a/drivers/base/bus.c b/drivers/base/bus.c
index b23eeb2..6796d3e 100644
--- a/drivers/base/bus.c
+++ b/drivers/base/bus.c
@@ -638,7 +638,7 @@ int bus_add_driver(struct device_driver *drv)
error = kobject_set_name(&drv->kobj, "%s", drv->name);
if (error)
goto out_put_bus;
- drv->kobj.kset = &bus->drivers;
+ drv->kobj.kset = bus->drivers_kset;
drv->kobj.ktype = &driver_ktype;
error = kobject_register(&drv->kobj);
if (error)
@@ -869,11 +869,12 @@ int bus_register(struct bus_type * bus)
goto bus_devices_fail;
}- kobject_set_name(&bus->drivers.kobj, "drivers");
- bus->drivers.kobj.parent = &bus->subsys.kobj;
- retval = kset_register(&bus->drivers);
- if (retval)
+ bus->drivers_kset = kset_create_and_add("drivers", NULL,
+ &bus->subsys.kobj);
+ if (!bus->drivers_kset) {
+ retval = -ENOMEM;
goto bus_drivers_fail;
+ }klist_init(&bus->klist_devices, klist_devices_get, klist_devices_put);
klist_init(&bus->klist_drivers, NULL, NULL);
@@ -893,7 +894,7 @@ int bus_register(struct bus_type * bus)
bus_attrs_fail:
remove_probe_files(bus);
bus_probe_files_fail:
- kset_unregister(&bus->drivers);
+ kset_unregister(bus->drivers_kset);
bus_drivers_fail:
kset_unregister(bus->devices_kset);
bus_devices_fail:
@@ -916,7 +917,7 @@ void bus_unregister(struct bus_t...
Dynamically create the kset instead of declaring it statically.
Having 3 static kobjects in one structure is not only foolish, but ripe
for nasty race conditions if handled improperly. We also rename the
field to catch any potential users of it (not that there should be
outside of the driver core...)Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/bus.c | 19 ++++++++++---------
include/linux/device.h | 2 +-
2 files changed, 11 insertions(+), 10 deletions(-)diff --git a/drivers/base/bus.c b/drivers/base/bus.c
index e3b1010..b23eeb2 100644
--- a/drivers/base/bus.c
+++ b/drivers/base/bus.c
@@ -449,7 +449,7 @@ int bus_add_device(struct device * dev)
error = device_add_attrs(bus, dev);
if (error)
goto out_put;
- error = sysfs_create_link(&bus->devices.kobj,
+ error = sysfs_create_link(&bus->devices_kset->kobj,
&dev->kobj, dev->bus_id);
if (error)
goto out_id;
@@ -466,7 +466,7 @@ int bus_add_device(struct device * dev)
out_deprecated:
sysfs_remove_link(&dev->kobj, "subsystem");
out_subsys:
- sysfs_remove_link(&bus->devices.kobj, dev->bus_id);
+ sysfs_remove_link(&bus->devices_kset->kobj, dev->bus_id);
out_id:
device_remove_attrs(bus, dev);
out_put:
@@ -512,7 +512,7 @@ void bus_remove_device(struct device * dev)
if (dev->bus) {
sysfs_remove_link(&dev->kobj, "subsystem");
remove_deprecated_bus_links(dev);
- sysfs_remove_link(&dev->bus->devices.kobj, dev->bus_id);
+ sysfs_remove_link(&dev->bus->devices_kset->kobj, dev->bus_id);
device_remove_attrs(dev->bus, dev);
if (dev->is_registered) {
dev->is_registered = 0;
@@ -862,11 +862,12 @@ int bus_register(struct bus_type * bus)
if (retval)
goto bus_uevent_fail;- kobject_set_name(&bus->devices.kobj, "devices");
- bus->devices.kobj.parent = &bus->subsys.kobj;
- ...
Dynamically create the kset instead of declaring it statically. We also
rename power_subsys to power_kset to catch all users of the variable and
we properly export it so that people don't have to guess that it really
is present in the system.The pseries code is wierd, why is it createing /sys/power if CONFIG_PM
is disabled? Oh well, stupid big boxes ignoring config options...Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
arch/arm/mach-omap1/pm.c | 3 +--
arch/powerpc/platforms/pseries/power.c | 14 ++++++--------
include/linux/kobject.h | 2 ++
kernel/power/disk.c | 2 +-
kernel/power/main.c | 11 +++++------
kernel/power/power.h | 2 --
6 files changed, 15 insertions(+), 19 deletions(-)diff --git a/arch/arm/mach-omap1/pm.c b/arch/arm/mach-omap1/pm.c
index 3bf01e2..402113c 100644
--- a/arch/arm/mach-omap1/pm.c
+++ b/arch/arm/mach-omap1/pm.c
@@ -97,7 +97,6 @@ static struct subsys_attribute sleep_while_idle_attr = {
.store = omap_pm_sleep_while_idle_store,
};-extern struct kset power_subsys;
static void (*omap_sram_idle)(void) = NULL;
static void (*omap_sram_suspend)(unsigned long r0, unsigned long r1) = NULL;@@ -726,7 +725,7 @@ static int __init omap_pm_init(void)
omap_pm_init_proc();
#endif- error = subsys_create_file(&power_subsys, &sleep_while_idle_attr);
+ error = subsys_create_file(power_kset, &sleep_while_idle_attr);
if (error)
printk(KERN_ERR "subsys_create_file failed: %d\n", error);diff --git a/arch/powerpc/platforms/pseries/power.c b/arch/powerpc/platforms/pseries/power.c
index 08d7a50..c36febe 100644
--- a/arch/powerpc/platforms/pseries/power.c
+++ b/arch/powerpc/platforms/pseries/power.c
@@ -57,7 +57,7 @@ static struct subsys_attribute auto_poweron_attr = {
};#ifndef CONFIG_PM
-decl_subsys(power, NULL);
+struct kset *power_kset;static struc...
Dynamically create the kset instead of declaring it statically. We also
rename module_subsys to module_kset to catch all users of the variable.Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
include/linux/module.h | 4 +++-
kernel/module.c | 7 +++----
kernel/params.c | 29 +++++++++--------------------
3 files changed, 15 insertions(+), 25 deletions(-)diff --git a/include/linux/module.h b/include/linux/module.h
index 2cbc0b8..fbe930b 100644
--- a/include/linux/module.h
+++ b/include/linux/module.h
@@ -574,7 +574,9 @@ struct device_driver;
#ifdef CONFIG_SYSFS
struct module;-extern struct kset module_subsys;
+extern struct kset *module_kset;
+extern struct kobj_type module_ktype;
+extern int module_sysfs_initialized;int mod_sysfs_init(struct module *mod);
int mod_sysfs_setup(struct module *mod,
diff --git a/kernel/module.c b/kernel/module.c
index 5514277..d03fcd9 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -47,8 +47,6 @@
#include <asm/cacheflush.h>
#include <linux/license.h>-extern int module_sysfs_initialized;
-
#if 0
#define DEBUGP printk
#else
@@ -1223,7 +1221,8 @@ int mod_sysfs_init(struct module *mod)
err = kobject_set_name(&mod->mkobj.kobj, "%s", mod->name);
if (err)
goto out;
- mod->mkobj.kobj.kset = &module_subsys;
+ mod->mkobj.kobj.kset = module_kset;
+ mod->mkobj.kobj.ktype = &module_ktype;
mod->mkobj.mod = mod;kobject_init(&mod->mkobj.kobj);
@@ -2539,7 +2538,7 @@ void module_add_driver(struct module *mod, struct device_driver *drv)
struct kobject *mkobj;/* Lookup built-in module entry in /sys/modules */
- mkobj = kset_find_obj(&module_subsys, drv->mod_name);
+ mkobj = kset_find_obj(module_kset, drv->mod_name);
if (mkobj) {
mk = container_of(mkobj, struct module_kobject, kobj);
/* remember our module structure */
diff --git a/kernel/params.c ...
/sys/kernel is where these things should go.
Also updated the documentation and tool that used this directory.Cc: Kay Sievers <kay.sievers@vrfy.org>
Acked-by: Christoph Lameter <clameter@sgi.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
Documentation/vm/slabinfo.c | 2 +-
Documentation/vm/slub.txt | 2 +-
mm/slub.c | 3 ++-
3 files changed, 4 insertions(+), 3 deletions(-)diff --git a/Documentation/vm/slabinfo.c b/Documentation/vm/slabinfo.c
index 7047696..488c1f3 100644
--- a/Documentation/vm/slabinfo.c
+++ b/Documentation/vm/slabinfo.c
@@ -1021,7 +1021,7 @@ void read_slab_dir(void)
char *t;
int count;- if (chdir("/sys/slab"))
+ if (chdir("/sys/kernel/slab"))
fatal("SYSFS support for SLUB not active\n");dir = opendir(".");
diff --git a/Documentation/vm/slub.txt b/Documentation/vm/slub.txt
index d17f324..dcf8bcf 100644
--- a/Documentation/vm/slub.txt
+++ b/Documentation/vm/slub.txt
@@ -63,7 +63,7 @@ In case you forgot to enable debugging on the kernel command line: It is
possible to enable debugging manually when the kernel is up. Look at the
contents of:-/sys/slab/<slab name>/
+/sys/kernel/slab/<slab name>/Look at the writable files. Writing 1 to them will enable the
corresponding debug option. All options can be set on a slab that does
diff --git a/mm/slub.c b/mm/slub.c
index 886131c..b6c7946 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -4091,7 +4091,8 @@ static int __init slab_sysfs_init(void)
struct kmem_cache *s;
int err;- slab_kset = kset_create_and_add("slab", &slab_uevent_ops, NULL);
+ slab_kset = kset_create_and_add("slab", &slab_uevent_ops,
+ &kernel_kset->kobj);
if (!slab_kset) {
printk(KERN_ERR "Cannot register slab subsystem.\n");
return -ENOSYS;
--
1.5.3.8--
Dynamically create the kset instead of declaring it statically.
Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Christoph Lameter <clameter@sgi.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
mm/slub.c | 15 +++++++--------
1 files changed, 7 insertions(+), 8 deletions(-)diff --git a/mm/slub.c b/mm/slub.c
index 40bdf41..886131c 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -3962,7 +3962,7 @@ static struct kset_uevent_ops slab_uevent_ops = {
.filter = uevent_filter,
};-static decl_subsys(slab, &slab_uevent_ops);
+static struct kset *slab_kset;#define ID_STR_LENGTH 64
@@ -4015,7 +4015,7 @@ static int sysfs_slab_add(struct kmem_cache *s)
* This is typically the case for debug situations. In that
* case we can catch duplicate names easily.
*/
- sysfs_remove_link(&slab_subsys.kobj, s->name);
+ sysfs_remove_link(&slab_kset->kobj, s->name);
name = s->name;
} else {
/*
@@ -4026,7 +4026,7 @@ static int sysfs_slab_add(struct kmem_cache *s)
}kobject_set_name(&s->kobj, name);
- s->kobj.kset = &slab_subsys;
+ s->kobj.kset = slab_kset;
s->kobj.ktype = &slab_ktype;
kobject_init(&s->kobj);
err = kobject_add(&s->kobj);
@@ -4071,9 +4071,8 @@ static int sysfs_slab_alias(struct kmem_cache *s, const char *name)
/*
* If we have a leftover link then remove it.
*/
- sysfs_remove_link(&slab_subsys.kobj, name);
- return sysfs_create_link(&slab_subsys.kobj,
- &s->kobj, name);
+ sysfs_remove_link(&slab_kset->kobj, name);
+ return sysfs_create_link(&slab_kset->kobj, &s->kobj, name);
}al = kmalloc(sizeof(struct saved_alias), GFP_KERNEL);
@@ -4092,8 +4091,8 @@ static int __init slab_sysfs_init(void)
struct kmem_cache *s;
int err;- err = subsystem_register(&slab_subsys);
- if (err) {
+ slab_kset = kset_create_and_add("slab", &slab_uevent_ops, NULL);
+ if (!slab_kset) {
pri...
Cannot see anything wrong (but then sysfs is mainly a mystery to
me)Acked-by: Christoph Lameter <clameter@sgi.com>
--
Dynamically create the kset instead of declaring it statically.
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/sys.c | 27 +++++++++++----------------
1 files changed, 11 insertions(+), 16 deletions(-)diff --git a/drivers/base/sys.c b/drivers/base/sys.c
index 7693c95..29eadc6 100644
--- a/drivers/base/sys.c
+++ b/drivers/base/sys.c
@@ -126,19 +126,16 @@ void sysdev_class_remove_file(struct sysdev_class *c,
}
EXPORT_SYMBOL_GPL(sysdev_class_remove_file);-/*
- * declare system_subsys
- */
-static decl_subsys(system, NULL);
+static struct kset *system_kset;int sysdev_class_register(struct sysdev_class * cls)
{
pr_debug("Registering sysdev class '%s'\n",
kobject_name(&cls->kset.kobj));
INIT_LIST_HEAD(&cls->drivers);
- cls->kset.kobj.parent = &system_subsys.kobj;
+ cls->kset.kobj.parent = &system_kset->kobj;
cls->kset.kobj.ktype = &ktype_sysdev_class;
- cls->kset.kobj.kset = &system_subsys;
+ cls->kset.kobj.kset = system_kset;
return kset_register(&cls->kset);
}@@ -297,8 +294,7 @@ void sysdev_shutdown(void)
pr_debug("Shutting Down System Devices\n");mutex_lock(&sysdev_drivers_lock);
- list_for_each_entry_reverse(cls, &system_subsys.list,
- kset.kobj.entry) {
+ list_for_each_entry_reverse(cls, &system_kset->list, kset.kobj.entry) {
struct sys_device * sysdev;pr_debug("Shutting down type '%s':\n",
@@ -360,9 +356,7 @@ int sysdev_suspend(pm_message_t state)pr_debug("Suspending System Devices\n");
- list_for_each_entry_reverse(cls, &system_subsys.list,
- kset.kobj.entry) {
-
+ list_for_each_entry_reverse(cls, &system_kset->list, kset.kobj.entry) {
pr_debug("Suspending type '%s':\n",
kobject_name(&cls->kset.kobj));@@ -413,8 +407,7 @@ aux_driver:
}/* resume other classes */
- list_for_each_entry_continue(cls, &system_sub...
We don't need a kset here, a simple kobject will do just fine, so
dynamically create the kobject and use it.Thanks to Cornelia for the build fix.
Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Michael Holzheu <holzheu@de.ibm.com>
Cc: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
arch/s390/hypfs/inode.c | 13 +++++++------
1
