* Kay Sievers <[EMAIL PROTECTED]> wrote: > > > > > + sa->attr.owner = NULL; > > > > > sa->attr.name = name; > > > > > > > > i'm wondering why doesnt this affect 2.6.23 and later? Does sysfs > > > > initialize the owner field to NULL automatically? > > > > > > Attibutes do not have an owner anymore: > > > http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=7b595756ec1f49e0049a9e01a1298d53a7faaa15 > > > > This one also fails to apply properly at the exact same place has > > Ingo's previously posted patch. Would need to backport his one. > > It depends on a completely reworked sysfs logic, I don't think it > makes any sense to backport that.
well, if it fixes a live bug in a still supported stable kernel release... Vincent, could you try to just get rid of all actual uses of se->attr.owner, within fs/sysfs/*.c? Something like the patch below. (totally untested - might be fatally broken as well) Ingo --- fs/sysfs/bin.c | 7 ------- fs/sysfs/file.c | 13 ------------- 2 files changed, 20 deletions(-) Index: linux-cfs-2.6.22.13.q/fs/sysfs/bin.c =================================================================== --- linux-cfs-2.6.22.13.q.orig/fs/sysfs/bin.c +++ linux-cfs-2.6.22.13.q/fs/sysfs/bin.c @@ -125,11 +125,6 @@ static int open(struct inode * inode, st if (!kobj || !attr) goto Done; - /* Grab the module reference for this attribute if we have one */ - error = -ENODEV; - if (!try_module_get(attr->attr.owner)) - goto Done; - error = -EACCES; if ((file->f_mode & FMODE_WRITE) && !(attr->write || attr->mmap)) goto Error; @@ -145,7 +140,6 @@ static int open(struct inode * inode, st goto Done; Error: - module_put(attr->attr.owner); Done: if (error) kobject_put(kobj); @@ -159,7 +153,6 @@ static int release(struct inode * inode, u8 * buffer = file->private_data; kobject_put(kobj); - module_put(attr->attr.owner); kfree(buffer); return 0; } Index: linux-cfs-2.6.22.13.q/fs/sysfs/file.c =================================================================== --- linux-cfs-2.6.22.13.q.orig/fs/sysfs/file.c +++ linux-cfs-2.6.22.13.q/fs/sysfs/file.c @@ -257,12 +257,6 @@ static int sysfs_open_file(struct inode if (!kobj || !attr) goto Einval; - /* Grab the module reference for this attribute if we have one */ - if (!try_module_get(attr->owner)) { - error = -ENODEV; - goto Done; - } - /* if the kobject has no ktype, then we assume that it is a subsystem * itself, and use ops for it. */ @@ -332,7 +326,6 @@ static int sysfs_open_file(struct inode goto Done; Eaccess: error = -EACCES; - module_put(attr->owner); Done: if (error) kobject_put(kobj); @@ -343,14 +336,12 @@ static int sysfs_release(struct inode * { struct kobject * kobj = to_kobj(filp->f_path.dentry->d_parent); struct attribute * attr = to_attr(filp->f_path.dentry); - struct module * owner = attr->owner; struct sysfs_buffer * buffer = filp->private_data; if (buffer) remove_from_collection(buffer, inode); kobject_put(kobj); /* After this point, attr should not be accessed. */ - module_put(owner); if (buffer) { if (buffer->page) @@ -615,7 +606,6 @@ static void sysfs_schedule_callback_work (ss->func)(ss->data); kobject_put(ss->kobj); - module_put(ss->owner); kfree(ss); } @@ -644,11 +634,8 @@ int sysfs_schedule_callback(struct kobje { struct sysfs_schedule_callback_struct *ss; - if (!try_module_get(owner)) - return -ENODEV; ss = kmalloc(sizeof(*ss), GFP_KERNEL); if (!ss) { - module_put(owner); return -ENOMEM; } kobject_get(kobj); -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/