From: "majianpeng" <majianpeng@gmail.com>
To: "viro" <viro@zeniv.linux.org.uk>
Cc: "linux-fsdevel" <linux-fsdevel@vger.kernel.org>
Subject: proc:Add a reference of module when proc_reg_file opened
Date: Sun, 26 Feb 2012 14:34:48 +0800 [thread overview]
Message-ID: <201202261434450622160@gmail.com> (raw)
>From 49b46362bf3221a259bfc73105ad041376b66878 Mon Sep 17 00:00:00 2001
From: majianpeng <majianpeng@gmail.com>
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@gmail.com>
---
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
next reply other threads:[~2012-02-26 6:34 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-26 6:34 majianpeng [this message]
2012-02-26 7:50 ` proc:Add a reference of module when proc_reg_file opened Al Viro
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201202261434450622160@gmail.com \
--to=majianpeng@gmail.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.