linux-warning-reduction-20090318
[openafs.git] / src / afs / LINUX / osi_proc.c
index 7b378e2..3f340de 100644 (file)
@@ -18,6 +18,9 @@ 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"
@@ -34,10 +37,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 +45,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 +54,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 +64,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;
 
+       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)
@@ -317,9 +322,16 @@ void
 osi_proc_init(void)
 {
     struct proc_dir_entry *entry;
-
+#if !defined(EXPORTED_PROC_ROOT_FS)
+    char path[64];
+#endif
+    
+#if defined(EXPORTED_PROC_ROOT_FS)
     openafs_procfs = proc_mkdir(PROC_FSDIRNAME, proc_root_fs);
-
+#else
+    sprintf(path, "fs/%s", PROC_FSDIRNAME);
+    openafs_procfs = proc_mkdir(path, NULL);
+#endif
 #ifdef HAVE_KERNEL_LINUX_SEQ_FILE_H
     entry = create_proc_entry("unixusers", 0, openafs_procfs);
     if (entry) {
@@ -338,9 +350,18 @@ osi_proc_init(void)
 void
 osi_proc_clean(void)
 {
+#if !defined(EXPORTED_PROC_ROOT_FS)
+    char path[64];
+#endif
+
     remove_proc_entry(PROC_CELLSERVDB_NAME, openafs_procfs);
 #ifdef HAVE_KERNEL_LINUX_SEQ_FILE_H
     remove_proc_entry("unixusers", openafs_procfs);
 #endif
+#if defined(EXPORTED_PROC_ROOT_FS)
     remove_proc_entry(PROC_FSDIRNAME, proc_root_fs);
+#else
+    sprintf(path, "fs/%s", PROC_FSDIRNAME);
+    remove_proc_entry(path, NULL);
+#endif
 }