Messages in this thread Patch in this message | | | Date | Tue, 06 Nov 2007 18:06:39 +0900 | From | Tejun Heo <> | Subject | Re: pktcdvd oops |
| |
[Greg cc'd]
Peter Osterlund wrote: > On Mon, 5 Nov 2007, Jens Axboe wrote: > >> Hi Peter, >> >> You don't seem to have a bugzilla account, so could not reassign to you. >> See http://bugzilla.kernel.org/show_bug.cgi?id=9294 > > Problem is repeatable on my computer. It dies in __module_get() on this > line: > > BUG_ON(module_refcount(module) == 0); > > I think this is because commit 7b595756ec1f49e0049a9e01a1298d53a7faaa15, > which states: "Note that with this change, userland holding a sysfs node > does not prevent the backing module from being unloaded." > > Unfortunately, I don't know how this sysfs stuff is supposed to work, > and therefore don't know how to fix the problem.
Does this fix the problem?
-- tejun diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c index a8130a4..a5ee213 100644 --- a/drivers/block/pktcdvd.c +++ b/drivers/block/pktcdvd.c @@ -358,10 +358,19 @@ static ssize_t class_pktcdvd_store_add(struct class *c, const char *buf, size_t count) { unsigned int major, minor; + if (sscanf(buf, "%u:%u", &major, &minor) == 2) { + /* pkt_setup_dev() expects caller to hold reference to self */ + if (!try_module_get(THIS_MODULE)) + return -ENODEV; + pkt_setup_dev(MKDEV(major, minor), NULL); + + module_put(THIS_MODULE); + return count; } + return -EINVAL; } | |