drbd: increase module count on /proc/drbd access
If someone holds /proc/drbd open, previously rmmod would "succeed" in starting the unload, but then block on remove_proc_entry, leading to a situation where the lsmod does not show drbd anymore, but /proc/drbd being still there (but no longer accessible). I'd rather have rmmod fail up front in this case. Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
This commit is contained in:
parent
c507f46f26
commit
3da127fa88
|
@ -34,6 +34,7 @@
|
|||
#include "drbd_int.h"
|
||||
|
||||
static int drbd_proc_open(struct inode *inode, struct file *file);
|
||||
static int drbd_proc_release(struct inode *inode, struct file *file);
|
||||
|
||||
|
||||
struct proc_dir_entry *drbd_proc;
|
||||
|
@ -42,7 +43,7 @@ const struct file_operations drbd_proc_fops = {
|
|||
.open = drbd_proc_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
.release = drbd_proc_release,
|
||||
};
|
||||
|
||||
void seq_printf_with_thousands_grouping(struct seq_file *seq, long v)
|
||||
|
@ -304,7 +305,15 @@ static int drbd_seq_show(struct seq_file *seq, void *v)
|
|||
|
||||
static int drbd_proc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, drbd_seq_show, PDE(inode)->data);
|
||||
if (try_module_get(THIS_MODULE))
|
||||
return single_open(file, drbd_seq_show, PDE(inode)->data);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static int drbd_proc_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
module_put(THIS_MODULE);
|
||||
return single_release(inode, file);
|
||||
}
|
||||
|
||||
/* PROC FS stuff end */
|
||||
|
|
Loading…
Reference in New Issue