drbd: increase module count on /proc/drbd access
authorLars Ellenberg <lars.ellenberg@linbit.com>
Wed, 24 Nov 2010 09:33:02 +0000 (10:33 +0100)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Thu, 10 Mar 2011 10:35:11 +0000 (11:35 +0100)
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>
drivers/block/drbd/drbd_proc.c

index 49d817cfe865bbdedbb8d0381739c26ce45cd7bc..efba62cd2e5829bcbe3c25283677e02a95657257 100644 (file)
@@ -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 */