From mboxrd@z Thu Jan 1 00:00:00 1970 From: "majianpeng" Subject: proc:Add a reference of module when proc_reg_file opened Date: Sun, 26 Feb 2012 14:34:48 +0800 Message-ID: <201202261434450622160@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Cc: "linux-fsdevel" To: "viro" Return-path: Received: from mail-iy0-f174.google.com ([209.85.210.174]:63720 "EHLO mail-iy0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750820Ab2BZGeF (ORCPT ); Sun, 26 Feb 2012 01:34:05 -0500 Received: by iazz13 with SMTP id z13so1918207iaz.19 for ; Sat, 25 Feb 2012 22:34:04 -0800 (PST) Sender: linux-fsdevel-owner@vger.kernel.org List-ID: >>From 49b46362bf3221a259bfc73105ad041376b66878 Mon Sep 17 00:00:00 2001 From: majianpeng 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 --- 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