Linux : Don't leak GLOCK when writing CellServDB
[openafs.git] / src / afs / LINUX / osi_proc.c
index 75ee013..53478bd 100644 (file)
 #include <afsconfig.h>
 #include "afs/param.h"
 
-RCSID
-    ("$Header$");
 
 #include <linux/module.h> /* early to avoid printf->printk mapping */
+#ifdef HAVE_KERNEL_LINUX_SEQ_FILE_H
+#include <linux/seq_file.h>
+#endif
 #include "afs/sysincludes.h"
 #include "afsincludes.h"
 #include "afs/nfsclient.h"
-#include "h/unistd.h"          /* For syscall numbers. */
-#include "h/mm.h"
+#include <linux/unistd.h>              /* For syscall numbers. */
+#include <linux/mm.h>
 
 #ifdef AFS_AMD64_LINUX20_ENV
 #include <asm/ia32_unistd.h>
@@ -34,10 +35,6 @@ RCSID
 #include <linux/sched.h>
 #include <linux/kernel.h>
 
-#ifdef HAVE_KERNEL_LINUX_SEQ_FILE_H
-#include <linux/seq_file.h>
-#endif
-
 struct proc_dir_entry *openafs_procfs;
 
 #ifdef HAVE_KERNEL_LINUX_SEQ_FILE_H
@@ -46,6 +43,7 @@ static void *c_start(struct seq_file *m, loff_t *pos)
        struct afs_q *cq, *tq;
        loff_t n = 0;
 
+       AFS_GLOCK();
        ObtainReadLock(&afs_xcell);
        for (cq = CellLRU.next; cq != &CellLRU; cq = tq) {
                tq = QNext(cq);
@@ -54,8 +52,9 @@ static void *c_start(struct seq_file *m, loff_t *pos)
                        break;
        }
        if (cq == &CellLRU)
-               return NULL;
+               cq = NULL;
 
+       AFS_GUNLOCK();
        return cq;
 }
 
@@ -63,18 +62,22 @@ static void *c_next(struct seq_file *m, void *p, loff_t *pos)
 {
        struct afs_q *cq = p, *tq;
 
+       AFS_GLOCK();
        (*pos)++;
        tq = QNext(cq);
 
        if (tq == &CellLRU)
-               return NULL;
+               tq = NULL;
 
+       AFS_GUNLOCK();
        return tq;
 }
 
 static void c_stop(struct seq_file *m, void *p)
 {
+        AFS_GLOCK();
        ReleaseReadLock(&afs_xcell);
+       AFS_GUNLOCK();
 }
 
 static int c_show(struct seq_file *m, void *p)
@@ -86,7 +89,7 @@ static int c_show(struct seq_file *m, void *p)
        seq_printf(m, ">%s #(%d/%d)\n", tc->cellName,
                   tc->cellNum, tc->cellIndex);
 
-       for (j = 0; j < MAXCELLHOSTS; j++) {
+       for (j = 0; j < AFS_MAXCELLHOSTS; j++) {
                afs_uint32 addr;
 
                if (!tc->cellHosts[j]) break;
@@ -279,7 +282,7 @@ length)
             }
         }
 
-        for (cnt = 0; cnt < MAXCELLHOSTS; cnt++) {
+        for (cnt = 0; cnt < AFS_MAXCELLHOSTS; cnt++) {
             if (!tc->cellHosts[cnt]) break;
             pos += 90;
             if (pos <= offset) {
@@ -331,7 +334,9 @@ osi_proc_init(void)
     entry = create_proc_entry("unixusers", 0, openafs_procfs);
     if (entry) {
        entry->proc_fops = &afs_unixuser_fops;
+#if defined(STRUCT_PROC_DIR_ENTRY_HAS_OWNER)
        entry->owner = THIS_MODULE;
+#endif
     }
     entry = create_proc_entry(PROC_CELLSERVDB_NAME, 0, openafs_procfs);
     if (entry)
@@ -339,7 +344,9 @@ osi_proc_init(void)
 #else
     entry = create_proc_info_entry(PROC_CELLSERVDB_NAME, (S_IFREG|S_IRUGO), openafs_procfs, csdbproc_info);
 #endif
+#if defined(STRUCT_PROC_DIR_ENTRY_HAS_OWNER)
     entry->owner = THIS_MODULE;
+#endif
 }
 
 void