[PARPORT] Re: More info on 104 oops [probably procfs bug]


Andrea Arcangeli (arcangeli@mbox.queen.it)
Sun, 7 Jun 1998 22:03:31 +0200 (CEST)


On Sun, 7 Jun 1998, Bill Hawes wrote:

>Andrea Arcangeli wrote:
>
>> Did you remember if your shall was leaving in /proc/parport while you
>> rmmoded parport? If so this is a procfs bug that I reported some time ago
>> and it' s reproducible from evey module that register a directory
>> somewhere in /proc.
>
>Hi Andrea,
>
>Quite a while back I added a mechanism to /proc so that modules can have
>their use counts incremented when a /proc directory is being referenced. This
>prevents the problems with having a module removed while a shell or other
>application is sitting in the module's /proc directory.

I wasn' t aware of that.

>The way it works is that the module defines a fill_inode function that gets
>called when an inode is used or unused by /proc. This function then
>increments or decrements the mod use count as appropriate.
>
>
>See the binfmt_misc modules for details ... it's easy to add support, just a
>few lines of code. But since /proc does provide the support for use count
>callbacks, any bugs due to modules being removed prematurely should be
>attributed to the module, not to /proc.

Yes, if so I was wrong...

Here the patch against 2.1.104 that fix the parport-procfs bug, seems to
works like a charm, thanks Bill!

This patch should be applyed to the mainstream kernel, Linus.

--- linux/drivers/misc/parport_procfs.c 1998/06/07 19:46:54 1.1
+++ linux/drivers/misc/parport_procfs.c 1998/06/07 19:52:26
@@ -229,10 +229,31 @@
         return ent;
 }
 
+#ifdef MODULE
+/*
+ * This is called as the fill_inode function when an inode
+ * is going into (fill = 1) or out of service (fill = 0).
+ * We use it here to manage the module use counts.
+ *
+ * Note: only the top-level directory needs to do this; if
+ * a lower level is referenced, the parent will be as well.
+ */
+static void parport_procfs_modcount(struct inode *inode, int fill)
+{
+ if (fill)
+ inc_parport_count();
+ else
+ dec_parport_count();
+}
+#endif
 
 int parport_proc_init(void)
 {
         base = new_proc_entry("parport", S_IFDIR, &proc_root,PROC_PARPORT);
+
+#ifdef MODULE
+ base->fill_inode = &parport_procfs_modcount;
+#endif
 
         if (base == NULL) {
                 printk(KERN_ERR "Unable to initialise /proc/parport.\n");

Andrea[s] Arcangeli

-- To unsubscribe, send mail to: linux-parport-request@torque.net --
-- with the single word "unsubscribe" in the body of the message. --



This archive was generated by hypermail 2.0b3 on Wed 30 Dec 1998 - 10:17:49 EST