diff options
author | Patrick Caulfield <pcaulfie@redhat.com> | 2006-11-02 14:41:23 +0000 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2006-11-06 09:01:07 -0500 |
commit | ba542e3b92f9ea7c482ae56b68b9122eebc53a39 (patch) | |
tree | 22ab000c6d5aca9d0c34ef68b8901048628672ed /fs | |
parent | 26d83dedf61d26d85f10bc34b92f4de7660fd746 (diff) | |
download | lwn-ba542e3b92f9ea7c482ae56b68b9122eebc53a39.tar.gz lwn-ba542e3b92f9ea7c482ae56b68b9122eebc53a39.zip |
[DLM] Fix kref_put oops
This patch fixes the recounting on the lockspace kobject. Previously the lockspace was freed while userspace could have had a
reference to one of its sysfs files, causing an oops in kref_put.
Now the lockspace kfree is moved into the kobject release() function
Signed-Off-By: Patrick Caulfield <pcaulfie@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/dlm/lockspace.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/fs/dlm/lockspace.c b/fs/dlm/lockspace.c index 109333c8ecb9..499ee1156365 100644 --- a/fs/dlm/lockspace.c +++ b/fs/dlm/lockspace.c @@ -143,6 +143,12 @@ static ssize_t dlm_attr_store(struct kobject *kobj, struct attribute *attr, return a->store ? a->store(ls, buf, len) : len; } +static void lockspace_kobj_release(struct kobject *k) +{ + struct dlm_ls *ls = container_of(k, struct dlm_ls, ls_kobj); + kfree(ls); +} + static struct sysfs_ops dlm_attr_ops = { .show = dlm_attr_show, .store = dlm_attr_store, @@ -151,6 +157,7 @@ static struct sysfs_ops dlm_attr_ops = { static struct kobj_type dlm_ktype = { .default_attrs = dlm_attrs, .sysfs_ops = &dlm_attr_ops, + .release = lockspace_kobj_release, }; static struct kset dlm_kset = { @@ -678,7 +685,7 @@ static int release_lockspace(struct dlm_ls *ls, int force) dlm_clear_members_gone(ls); kfree(ls->ls_node_array); kobject_unregister(&ls->ls_kobj); - kfree(ls); + /* The ls structure will be freed when the kobject is done with */ mutex_lock(&ls_lock); ls_count--; |