Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3da127fa authored by Lars Ellenberg's avatar Lars Ellenberg Committed by Philipp Reisner
Browse files

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: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: default avatarLars Ellenberg <lars.ellenberg@linbit.com>
parent c507f46f
Loading
Loading
Loading
Loading
+11 −2
Original line number Original line Diff line number Diff line
@@ -34,6 +34,7 @@
#include "drbd_int.h"
#include "drbd_int.h"


static int drbd_proc_open(struct inode *inode, struct file *file);
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;
struct proc_dir_entry *drbd_proc;
@@ -42,7 +43,7 @@ const struct file_operations drbd_proc_fops = {
	.open		= drbd_proc_open,
	.open		= drbd_proc_open,
	.read		= seq_read,
	.read		= seq_read,
	.llseek		= seq_lseek,
	.llseek		= seq_lseek,
	.release	= single_release,
	.release	= drbd_proc_release,
};
};


void seq_printf_with_thousands_grouping(struct seq_file *seq, long v)
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)
static int drbd_proc_open(struct inode *inode, struct file *file)
{
{
	if (try_module_get(THIS_MODULE))
		return single_open(file, drbd_seq_show, PDE(inode)->data);
		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 */
/* PROC FS stuff end */