>From 49b46362bf3221a259bfc73105ad041376b66878 Mon Sep 17 00:00:00 2001 From: majianpeng <majianpeng@xxxxxxxxx> Date: Sun, 26 Feb 2012 22:19:51 +0800 Subject: [PATCH] proc:Add a reference of module when proc_reg_file opened. If struct file_operations of a regular file in procfs defined in module and defined .owner = THIS_MODULE,open this file must get a reference of module. Signed-off-by: majianpeng <majianpeng@xxxxxxxxx> --- fs/proc/inode.c | 13 +++++++++++-- 1 files changed, 11 insertions(+), 2 deletions(-) diff --git a/fs/proc/inode.c b/fs/proc/inode.c index 84fd323..78dbb03 100644 --- a/fs/proc/inode.c +++ b/fs/proc/inode.c @@ -317,6 +317,7 @@ static int proc_reg_open(struct inode *inode, struct file *file) int (*open)(struct inode *, struct file *); int (*release)(struct inode *, struct file *); struct pde_opener *pdeo; + const struct file_operations *fops; /* * What for, you ask? Well, we can have open, rmmod, remove_proc_entry @@ -339,7 +340,12 @@ static int proc_reg_open(struct inode *inode, struct file *file) return -ENOENT; } pde->pde_users++; - open = pde->proc_fops->open; + /* + *If proc_fops defined in module and used .owner = THIS_MODULE,so open must + *get a reference of module. + */ + fops = fops_get(pde->proc_fops); + open = fops->open; release = pde->proc_fops->release; spin_unlock(&pde->pde_unload_lock); @@ -354,8 +360,10 @@ static int proc_reg_open(struct inode *inode, struct file *file) /* Strictly for "too late" ->release in proc_reg_release(). */ pdeo->release = release; list_add(&pdeo->lh, &pde->pde_openers); - } else + } else { + fops_put(pde->proc_fops); kfree(pdeo); + } __pde_users_dec(pde); spin_unlock(&pde->pde_unload_lock); return rv; @@ -402,6 +410,7 @@ static int proc_reg_release(struct inode *inode, struct file *file) } pde->pde_users++; release = pde->proc_fops->release; + fops_put(pde->proc_fops); if (pdeo) { list_del(&pdeo->lh); kfree(pdeo); -- 1.7.5.4 -------------- majianpeng 2012-02-26 -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html