Whamcloud - gitweb
LU-5275 lprocfs: reduce scope of params_tree.h
[fs/lustre-release.git] / lustre / obdclass / lprocfs_status.c
index e894f33..259b79c 100644 (file)
@@ -27,7 +27,7 @@
  * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2013, Intel Corporation.
+ * Copyright (c) 2011, 2014, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -40,9 +40,6 @@
 
 #define DEBUG_SUBSYSTEM S_CLASS
 
-#ifndef __KERNEL__
-#include <liblustre.h>
-#endif
 
 #include <obd_class.h>
 #include <lprocfs_status.h>
@@ -70,49 +67,23 @@ EXPORT_SYMBOL(lprocfs_seq_release);
 
 struct proc_dir_entry *
 lprocfs_add_simple(struct proc_dir_entry *root, char *name,
-#ifndef HAVE_ONLY_PROCFS_SEQ
-                  read_proc_t *read_proc, write_proc_t *write_proc,
-#endif
                   void *data, const struct file_operations *fops)
 {
        struct proc_dir_entry *proc;
        mode_t mode = 0;
 
-        if (root == NULL || name == NULL)
+       if (root == NULL || name == NULL || fops == NULL)
                 return ERR_PTR(-EINVAL);
 
-       if (!fops) {
-#ifndef HAVE_ONLY_PROCFS_SEQ
-               if (read_proc)
-                       mode = 0444;
-               if (write_proc)
-                       mode |= 0200;
-
-               LPROCFS_WRITE_ENTRY();
-               proc = create_proc_entry(name, mode, root);
-               if (!proc) {
-                       CERROR("LprocFS: No memory to create /proc entry %s", name);
-                       LPROCFS_WRITE_EXIT();
-                       return ERR_PTR(-ENOMEM);
-               }
-               proc->read_proc = read_proc;
-               proc->write_proc = write_proc;
-               proc->data = data;
-               LPROCFS_WRITE_EXIT();
-#else
-               return ERR_PTR(-EINVAL);
-#endif
-       } else {
-               if (fops->read)
-                       mode = 0444;
-               if (fops->write)
-                       mode |= 0200;
-               proc = proc_create_data(name, mode, root, fops, data);
-               if (!proc) {
-                       CERROR("LprocFS: No memory to create /proc entry %s",
-                              name);
-                       return ERR_PTR(-ENOMEM);
-               }
+       if (fops->read)
+               mode = 0444;
+       if (fops->write)
+               mode |= 0200;
+       proc = proc_create_data(name, mode, root, fops, data);
+       if (!proc) {
+               CERROR("LprocFS: No memory to create /proc entry %s\n",
+                      name);
+               return ERR_PTR(-ENOMEM);
        }
         return proc;
 }
@@ -137,9 +108,9 @@ struct proc_dir_entry *lprocfs_add_symlink(const char *name,
         va_end(ap);
 
         entry = proc_symlink(name, parent, dest);
-        if (entry == NULL)
-                CERROR("LprocFS: Could not create symbolic link from %s to %s",
-                        name, dest);
+       if (entry == NULL)
+               CERROR("LprocFS: Could not create symbolic link from "
+                      "%s to %s\n", name, dest);
 
         OBD_FREE(dest, MAX_STRING_SIZE + 1);
         return entry;
@@ -153,26 +124,29 @@ static const struct file_operations lprocfs_generic_fops = { };
 ssize_t
 lprocfs_fops_read(struct file *f, char __user *buf, size_t size, loff_t *ppos)
 {
-        struct proc_dir_entry *dp = PDE(f->f_dentry->d_inode);
-        char *page, *start = NULL;
-        int rc = 0, eof = 1, count;
+       struct inode *inode = f->f_dentry->d_inode;
+       struct proc_dir_entry *dp = PDE(inode);
+       char *page, *start = NULL;
+       int rc, eof = 1, count;
 
        if (*ppos >= PAGE_CACHE_SIZE)
-                return 0;
+               return 0;
 
-        page = (char *)__get_free_page(GFP_KERNEL);
-        if (page == NULL)
-                return -ENOMEM;
+       page = (char *)__get_free_page(GFP_KERNEL);
+       if (page == NULL)
+               return -ENOMEM;
 
-       if (LPROCFS_ENTRY_CHECK(dp)) {
-                rc = -ENOENT;
-                goto out;
-        }
+       rc = LPROCFS_ENTRY_CHECK(inode);
+       if (rc < 0)
+               goto out;
 
-        OBD_FAIL_TIMEOUT(OBD_FAIL_LPROC_REMOVE, 10);
-        if (dp->read_proc)
+       OBD_FAIL_TIMEOUT(OBD_FAIL_LPROC_REMOVE, 10);
+       if (dp->read_proc != NULL)
                rc = dp->read_proc(page, &start, *ppos, PAGE_CACHE_SIZE,
-                                   &eof, dp->data);
+                                  &eof, dp->data);
+       else
+               rc = 0;
+
         if (rc <= 0)
                 goto out;
 
@@ -206,14 +180,20 @@ ssize_t
 lprocfs_fops_write(struct file *f, const char __user *buf, size_t size,
                   loff_t *ppos)
 {
-        struct proc_dir_entry *dp = PDE(f->f_dentry->d_inode);
-        int rc = -EIO;
+       struct inode *inode = f->f_dentry->d_inode;
+       struct proc_dir_entry *dp = PDE(inode);
+       int rc;
 
-       if (LPROCFS_ENTRY_CHECK(dp))
-                return -ENOENT;
-        if (dp->write_proc)
-                rc = dp->write_proc(f, buf, size, dp->data);
-        return rc;
+       rc = LPROCFS_ENTRY_CHECK(inode);
+       if (rc < 0)
+               return rc;
+
+       if (dp->write_proc != NULL)
+               rc = dp->write_proc(f, buf, size, dp->data);
+       else
+               rc = -EIO;
+
+       return rc;
 }
 
 static struct file_operations lprocfs_generic_fops = {
@@ -313,9 +293,9 @@ static int __lprocfs_add_vars(struct proc_dir_entry *root,
                         OBD_FREE(pathcopy, pathsize);
 
                 if (cur_root == NULL || proc == NULL) {
-                        CERROR("LprocFS: No memory to create /proc entry %s",
-                               list->name);
-                        GOTO(out, rc = -ENOMEM);
+                       CERROR("LprocFS: No memory to create /proc entry %s\n",
+                              list->name);
+                       GOTO(out, rc = -ENOMEM);
                 }
 
                 if (list->fops)
@@ -387,7 +367,7 @@ lprocfs_seq_add_vars(struct proc_dir_entry *root, struct lprocfs_seq_vars *list,
 EXPORT_SYMBOL(lprocfs_seq_add_vars);
 
 #ifndef HAVE_ONLY_PROCFS_SEQ
-void lprocfs_remove_nolock(struct proc_dir_entry **proot)
+static void lprocfs_remove_nolock(struct proc_dir_entry **proot)
 {
        struct proc_dir_entry *root = *proot;
        struct proc_dir_entry *temp = root;
@@ -527,7 +507,10 @@ lprocfs_seq_register(const char *name, struct proc_dir_entry *parent,
        struct proc_dir_entry *newchild;
 
        newchild = proc_mkdir(name, parent);
-       if (newchild != NULL && list != NULL) {
+       if (newchild == NULL)
+               return ERR_PTR(-ENOMEM);
+
+       if (list != NULL) {
                int rc = lprocfs_seq_add_vars(newchild, list, data);
                if (rc) {
                        lprocfs_remove(&newchild);
@@ -545,7 +528,7 @@ int lprocfs_uint_seq_show(struct seq_file *m, void *data)
 }
 EXPORT_SYMBOL(lprocfs_uint_seq_show);
 
-int lprocfs_wr_uint(struct file *file, const char *buffer,
+int lprocfs_wr_uint(struct file *file, const char __user *buffer,
                     unsigned long count, void *data)
 {
         unsigned *p = data;
@@ -565,7 +548,7 @@ int lprocfs_wr_uint(struct file *file, const char *buffer,
 }
 EXPORT_SYMBOL(lprocfs_wr_uint);
 
-ssize_t lprocfs_uint_seq_write(struct file *file, const char *buffer,
+ssize_t lprocfs_uint_seq_write(struct file *file, const char __user *buffer,
                               size_t count, loff_t *off)
 {
        int *data = ((struct seq_file *)file->private_data)->private;
@@ -595,7 +578,7 @@ int lprocfs_atomic_seq_show(struct seq_file *m, void *data)
 EXPORT_SYMBOL(lprocfs_atomic_seq_show);
 
 ssize_t
-lprocfs_atomic_seq_write(struct file *file, const char *buffer,
+lprocfs_atomic_seq_write(struct file *file, const char __user *buffer,
                        size_t count, loff_t *off)
 {
        atomic_t *atm = ((struct seq_file *)file->private_data)->private;
@@ -812,12 +795,14 @@ EXPORT_SYMBOL(lprocfs_stats_collect);
 /**
  * Append a space separated list of current set flags to str.
  */
-#define flag2seqstr(flag)                                              \
+#define flag2str(flag)                                         \
        do {                                                            \
-               if (imp->imp_##flag)                                    \
+               if (imp->imp_##flag) {                                  \
                        seq_printf(m, "%s" #flag, first ? "" : ", ");   \
+                       first = false;                                  \
+               }                                                       \
        } while (0)
-static int obd_import_flags2seqstr(struct obd_import *imp, struct seq_file *m)
+static void obd_import_flags2str(struct obd_import *imp, struct seq_file *m)
 {
        bool first = true;
 
@@ -826,13 +811,19 @@ static int obd_import_flags2seqstr(struct obd_import *imp, struct seq_file *m)
                first = false;
        }
 
-       flag2seqstr(invalid);
-       flag2seqstr(deactive);
-       flag2seqstr(replayable);
-       flag2seqstr(pingable);
-       return 0;
+       flag2str(invalid);
+       flag2str(deactive);
+       flag2str(replayable);
+       flag2str(delayed_recovery);
+       flag2str(no_lock_replay);
+       flag2str(vbr_failed);
+       flag2str(pingable);
+       flag2str(resend_replay);
+       flag2str(no_pinger_recover);
+       flag2str(need_mne_swab);
+       flag2str(connect_tried);
 }
-#undef flags2seqstr
+#undef flag2str
 
 static const char *obd_connect_names[] = {
        "read_only",
@@ -893,6 +884,8 @@ static const char *obd_connect_names[] = {
        "unknown",
        "unlink_close",
        "unknown",
+       "dir_stripe",
+       "unknown",
        NULL
 };
 
@@ -910,7 +903,7 @@ static void obd_connect_seq_flags2str(struct seq_file *m, __u64 flags, char *sep
                }
        }
        if (flags & ~(mask - 1))
-               seq_printf(m, "%sunknown flags "LPX64,
+               seq_printf(m, "%sunknown_"LPX64,
                           first ? "" : sep, flags & ~(mask - 1));
 }
 
@@ -926,7 +919,7 @@ int obd_connect_flags2str(char *page, int count, __u64 flags, char *sep)
        }
        if (flags & ~(mask - 1))
                ret += snprintf(page + ret, count - ret,
-                               "%sunknown flags "LPX64,
+                               "%sunknown_"LPX64,
                                ret ? sep : "", flags & ~(mask - 1));
        return ret;
 }
@@ -1003,20 +996,20 @@ int lprocfs_import_seq_show(struct seq_file *m, void *data)
                      "    name: %s\n"
                      "    target: %s\n"
                      "    state: %s\n"
-                     "    connect_flags: [",
+                     "    connect_flags: [ ",
                      obd->obd_name,
                      obd2cli_tgt(obd),
                      ptlrpc_import_state_name(imp->imp_state));
        obd_connect_seq_flags2str(m, imp->imp_connect_data.ocd_connect_flags,
                                        ", ");
-       seq_printf(m, "]\n");
+       seq_printf(m, " ]\n");
        obd_connect_data_seqprint(m, ocd);
-       seq_printf(m, "    import_flags: [");
-       obd_import_flags2seqstr(imp, m);
+       seq_printf(m, "    import_flags: [ ");
+       obd_import_flags2str(imp, m);
 
-       seq_printf(m, "]\n"
+       seq_printf(m, " ]\n"
                      "    connection:\n"
-                     "       failover_nids: [");
+                     "       failover_nids: [ ");
        spin_lock(&imp->imp_lock);
        j = 0;
        list_for_each_entry(conn, &imp->imp_conn_list, oic_item) {
@@ -1024,7 +1017,7 @@ int lprocfs_import_seq_show(struct seq_file *m, void *data)
                           libcfs_nid2str(conn->oic_conn->c_peer.nid));
                j++;
        }
-       seq_printf(m, "]\n"
+       seq_printf(m, " ]\n"
                      "       current_connection: %s\n"
                      "       connection_attempts: %u\n"
                      "       generation: %u\n"
@@ -1137,7 +1130,7 @@ int lprocfs_state_seq_show(struct seq_file *m, void *data)
                        &imp->imp_state_hist[(k + j) % IMP_STATE_HIST_LEN];
                if (ish->ish_state == 0)
                        continue;
-               seq_printf(m, " - ["CFS_TIME_T", %s]\n",
+               seq_printf(m, " - [ "CFS_TIME_T", %s ]\n",
                           ish->ish_time,
                ptlrpc_import_state_name(ish->ish_state));
        }
@@ -1219,555 +1212,8 @@ int lprocfs_connect_flags_seq_show(struct seq_file *m, void *data)
 }
 EXPORT_SYMBOL(lprocfs_connect_flags_seq_show);
 
-#ifndef HAVE_ONLY_PROCFS_SEQ
-
-int lprocfs_rd_uint(char *page, char **start, off_t off,
-                   int count, int *eof, void *data)
-{
-       unsigned int *temp = data;
-       return snprintf(page, count, "%u\n", *temp);
-}
-EXPORT_SYMBOL(lprocfs_rd_uint);
-
-int lprocfs_rd_u64(char *page, char **start, off_t off,
-                   int count, int *eof, void *data)
-{
-        LASSERT(data != NULL);
-        *eof = 1;
-        return snprintf(page, count, LPU64"\n", *(__u64 *)data);
-}
-EXPORT_SYMBOL(lprocfs_rd_u64);
-
-int lprocfs_rd_atomic(char *page, char **start, off_t off,
-                   int count, int *eof, void *data)
-{
-       atomic_t *atom = data;
-        LASSERT(atom != NULL);
-        *eof = 1;
-       return snprintf(page, count, "%d\n", atomic_read(atom));
-}
-EXPORT_SYMBOL(lprocfs_rd_atomic);
-
-int lprocfs_wr_atomic(struct file *file, const char *buffer,
-                      unsigned long count, void *data)
-{
-       atomic_t *atm = data;
-        int val = 0;
-        int rc;
-
-        rc = lprocfs_write_helper(buffer, count, &val);
-        if (rc < 0)
-                return rc;
-
-        if (val <= 0)
-                return -ERANGE;
-
-       atomic_set(atm, val);
-        return count;
-}
-EXPORT_SYMBOL(lprocfs_wr_atomic);
-
-int lprocfs_rd_uuid(char *page, char **start, off_t off, int count,
-                    int *eof, void *data)
-{
-        struct obd_device *obd = data;
-
-        LASSERT(obd != NULL);
-        *eof = 1;
-        return snprintf(page, count, "%s\n", obd->obd_uuid.uuid);
-}
-EXPORT_SYMBOL(lprocfs_rd_uuid);
-
-int lprocfs_rd_name(char *page, char **start, off_t off, int count,
-                    int *eof, void *data)
-{
-        struct obd_device *dev = data;
-
-        LASSERT(dev != NULL);
-        *eof = 1;
-        return snprintf(page, count, "%s\n", dev->obd_name);
-}
-EXPORT_SYMBOL(lprocfs_rd_name);
-
-int lprocfs_rd_blksize(char *page, char **start, off_t off, int count,
-                       int *eof, void *data)
-{
-        struct obd_device *obd = data;
-        struct obd_statfs  osfs;
-        int rc = obd_statfs(NULL, obd->obd_self_export, &osfs,
-                            cfs_time_shift_64(-OBD_STATFS_CACHE_SECONDS),
-                            OBD_STATFS_NODELAY);
-        if (!rc) {
-                *eof = 1;
-                rc = snprintf(page, count, "%u\n", osfs.os_bsize);
-        }
-        return rc;
-}
-EXPORT_SYMBOL(lprocfs_rd_blksize);
-
-int lprocfs_rd_kbytestotal(char *page, char **start, off_t off, int count,
-                           int *eof, void *data)
-{
-        struct obd_device *obd = data;
-        struct obd_statfs  osfs;
-        int rc = obd_statfs(NULL, obd->obd_self_export, &osfs,
-                            cfs_time_shift_64(-OBD_STATFS_CACHE_SECONDS),
-                            OBD_STATFS_NODELAY);
-        if (!rc) {
-                __u32 blk_size = osfs.os_bsize >> 10;
-                __u64 result = osfs.os_blocks;
-
-                while (blk_size >>= 1)
-                        result <<= 1;
-
-                *eof = 1;
-                rc = snprintf(page, count, LPU64"\n", result);
-        }
-        return rc;
-}
-EXPORT_SYMBOL(lprocfs_rd_kbytestotal);
-
-int lprocfs_rd_kbytesfree(char *page, char **start, off_t off, int count,
-                          int *eof, void *data)
-{
-        struct obd_device *obd = data;
-        struct obd_statfs  osfs;
-        int rc = obd_statfs(NULL, obd->obd_self_export, &osfs,
-                            cfs_time_shift_64(-OBD_STATFS_CACHE_SECONDS),
-                            OBD_STATFS_NODELAY);
-        if (!rc) {
-                __u32 blk_size = osfs.os_bsize >> 10;
-                __u64 result = osfs.os_bfree;
-
-                while (blk_size >>= 1)
-                        result <<= 1;
-
-                *eof = 1;
-                rc = snprintf(page, count, LPU64"\n", result);
-        }
-        return rc;
-}
-EXPORT_SYMBOL(lprocfs_rd_kbytesfree);
-
-int lprocfs_rd_kbytesavail(char *page, char **start, off_t off, int count,
-                           int *eof, void *data)
-{
-        struct obd_device *obd = data;
-        struct obd_statfs  osfs;
-        int rc = obd_statfs(NULL, obd->obd_self_export, &osfs,
-                            cfs_time_shift_64(-OBD_STATFS_CACHE_SECONDS),
-                            OBD_STATFS_NODELAY);
-        if (!rc) {
-                __u32 blk_size = osfs.os_bsize >> 10;
-                __u64 result = osfs.os_bavail;
-
-                while (blk_size >>= 1)
-                        result <<= 1;
-
-                *eof = 1;
-                rc = snprintf(page, count, LPU64"\n", result);
-        }
-        return rc;
-}
-EXPORT_SYMBOL(lprocfs_rd_kbytesavail);
-
-int lprocfs_rd_filestotal(char *page, char **start, off_t off, int count,
-                          int *eof, void *data)
-{
-        struct obd_device *obd = data;
-        struct obd_statfs  osfs;
-        int rc = obd_statfs(NULL, obd->obd_self_export, &osfs,
-                            cfs_time_shift_64(-OBD_STATFS_CACHE_SECONDS),
-                            OBD_STATFS_NODELAY);
-        if (!rc) {
-                *eof = 1;
-                rc = snprintf(page, count, LPU64"\n", osfs.os_files);
-        }
-
-        return rc;
-}
-EXPORT_SYMBOL(lprocfs_rd_filestotal);
-
-int lprocfs_rd_filesfree(char *page, char **start, off_t off, int count,
-                         int *eof, void *data)
-{
-        struct obd_device *obd = data;
-        struct obd_statfs  osfs;
-        int rc = obd_statfs(NULL, obd->obd_self_export, &osfs,
-                            cfs_time_shift_64(-OBD_STATFS_CACHE_SECONDS),
-                            OBD_STATFS_NODELAY);
-        if (!rc) {
-                *eof = 1;
-                rc = snprintf(page, count, LPU64"\n", osfs.os_ffree);
-        }
-        return rc;
-}
-EXPORT_SYMBOL(lprocfs_rd_filesfree);
-
-int lprocfs_rd_server_uuid(char *page, char **start, off_t off, int count,
-                           int *eof, void *data)
-{
-        struct obd_device *obd = data;
-        struct obd_import *imp;
-        char *imp_state_name = NULL;
-        int rc = 0;
-
-        LASSERT(obd != NULL);
-        LPROCFS_CLIMP_CHECK(obd);
-        imp = obd->u.cli.cl_import;
-        imp_state_name = ptlrpc_import_state_name(imp->imp_state);
-        *eof = 1;
-        rc = snprintf(page, count, "%s\t%s%s\n",
-                      obd2cli_tgt(obd), imp_state_name,
-                      imp->imp_deactive ? "\tDEACTIVATED" : "");
-
-        LPROCFS_CLIMP_EXIT(obd);
-        return rc;
-}
-EXPORT_SYMBOL(lprocfs_rd_server_uuid);
-
-int lprocfs_rd_conn_uuid(char *page, char **start, off_t off, int count,
-                         int *eof,  void *data)
-{
-        struct obd_device *obd = data;
-        struct ptlrpc_connection *conn;
-        int rc = 0;
-
-        LASSERT(obd != NULL);
-
-        LPROCFS_CLIMP_CHECK(obd);
-        conn = obd->u.cli.cl_import->imp_connection;
-        *eof = 1;
-        if (conn && obd->u.cli.cl_import) {
-                rc = snprintf(page, count, "%s\n",
-                              conn->c_remote_uuid.uuid);
-        } else {
-                rc = snprintf(page, count, "%s\n", "<none>");
-        }
-
-        LPROCFS_CLIMP_EXIT(obd);
-        return rc;
-}
-EXPORT_SYMBOL(lprocfs_rd_conn_uuid);
-
-/**
- * Append a space separated list of current set flags to str.
- */
-#define flag2str(flag) \
-        if (imp->imp_##flag && max - len > 0) \
-             len += snprintf(str + len, max - len, "%s" #flag, len ? ", " : "");
-static int obd_import_flags2str(struct obd_import *imp, char *str, int max)
-{
-        int len = 0;
-
-        if (imp->imp_obd->obd_no_recov)
-                len += snprintf(str, max - len, "no_recov");
-
-        flag2str(invalid);
-        flag2str(deactive);
-        flag2str(replayable);
-        flag2str(pingable);
-        return len;
-}
-#undef flags2str
-
-int lprocfs_rd_import(char *page, char **start, off_t off, int count,
-                      int *eof, void *data)
-{
-       struct lprocfs_counter          ret;
-       struct lprocfs_counter_header   *header;
-       struct obd_device               *obd    = (struct obd_device *)data;
-       struct obd_import               *imp;
-       struct obd_import_conn          *conn;
-       int                             i;
-       int                             j;
-       int                             k;
-       int                             rw      = 0;
-
-        LASSERT(obd != NULL);
-        LPROCFS_CLIMP_CHECK(obd);
-        imp = obd->u.cli.cl_import;
-        *eof = 1;
-
-        i = snprintf(page, count,
-                     "import:\n"
-                     "    name: %s\n"
-                     "    target: %s\n"
-                     "    state: %s\n"
-                     "    instance: %u\n"
-                     "    connect_flags: [",
-                     obd->obd_name,
-                     obd2cli_tgt(obd),
-                     ptlrpc_import_state_name(imp->imp_state),
-                     imp->imp_connect_data.ocd_instance);
-        i += obd_connect_flags2str(page + i, count - i,
-                                   imp->imp_connect_data.ocd_connect_flags,
-                                   ", ");
-        i += snprintf(page + i, count - i,
-                      "]\n"
-                      "    import_flags: [");
-        i += obd_import_flags2str(imp, page + i, count - i);
-
-        i += snprintf(page + i, count - i,
-                      "]\n"
-                      "    connection:\n"
-                      "       failover_nids: [");
-       spin_lock(&imp->imp_lock);
-        j = 0;
-       list_for_each_entry(conn, &imp->imp_conn_list, oic_item) {
-                i += snprintf(page + i, count - i, "%s%s", j ? ", " : "",
-                              libcfs_nid2str(conn->oic_conn->c_peer.nid));
-                j++;
-        }
-       i += snprintf(page + i, count - i,
-                     "]\n"
-                     "       current_connection: %s\n"
-                     "       connection_attempts: %u\n"
-                     "       generation: %u\n"
-                     "       in-progress_invalidations: %u\n",
-                     imp->imp_connection == NULL ? "<none>" :
-                             libcfs_nid2str(imp->imp_connection->c_peer.nid),
-                     imp->imp_conn_cnt,
-                     imp->imp_generation,
-                     atomic_read(&imp->imp_inval_count));
-       spin_unlock(&imp->imp_lock);
-
-       if (obd->obd_svc_stats == NULL)
-               goto out_climp;
-
-       header = &obd->obd_svc_stats->ls_cnt_header[PTLRPC_REQWAIT_CNTR];
-        lprocfs_stats_collect(obd->obd_svc_stats, PTLRPC_REQWAIT_CNTR, &ret);
-        if (ret.lc_count != 0) {
-                /* first argument to do_div MUST be __u64 */
-                __u64 sum = ret.lc_sum;
-                do_div(sum, ret.lc_count);
-                ret.lc_sum = sum;
-        } else
-                ret.lc_sum = 0;
-        i += snprintf(page + i, count - i,
-                      "    rpcs:\n"
-                      "       inflight: %u\n"
-                      "       unregistering: %u\n"
-                      "       timeouts: %u\n"
-                      "       avg_waittime: "LPU64" %s\n",
-                     atomic_read(&imp->imp_inflight),
-                     atomic_read(&imp->imp_unregistering),
-                     atomic_read(&imp->imp_timeouts),
-                     ret.lc_sum, header->lc_units);
-
-        k = 0;
-        for(j = 0; j < IMP_AT_MAX_PORTALS; j++) {
-                if (imp->imp_at.iat_portal[j] == 0)
-                        break;
-                k = max_t(unsigned int, k,
-                          at_get(&imp->imp_at.iat_service_estimate[j]));
-        }
-        i += snprintf(page + i, count - i,
-                      "    service_estimates:\n"
-                      "       services: %u sec\n"
-                      "       network: %u sec\n",
-                      k,
-                      at_get(&imp->imp_at.iat_net_latency));
-
-        i += snprintf(page + i, count - i,
-                      "    transactions:\n"
-                      "       last_replay: "LPU64"\n"
-                      "       peer_committed: "LPU64"\n"
-                      "       last_checked: "LPU64"\n",
-                      imp->imp_last_replay_transno,
-                      imp->imp_peer_committed_transno,
-                      imp->imp_last_transno_checked);
-
-        /* avg data rates */
-        for (rw = 0; rw <= 1; rw++) {
-                lprocfs_stats_collect(obd->obd_svc_stats,
-                                      PTLRPC_LAST_CNTR + BRW_READ_BYTES + rw,
-                                      &ret);
-                if (ret.lc_sum > 0 && ret.lc_count > 0) {
-                        /* first argument to do_div MUST be __u64 */
-                        __u64 sum = ret.lc_sum;
-                        do_div(sum, ret.lc_count);
-                        ret.lc_sum = sum;
-                        i += snprintf(page + i, count - i,
-                                      "    %s_data_averages:\n"
-                                      "       bytes_per_rpc: "LPU64"\n",
-                                      rw ? "write" : "read",
-                                      ret.lc_sum);
-                }
-                k = (int)ret.lc_sum;
-                j = opcode_offset(OST_READ + rw) + EXTRA_MAX_OPCODES;
-               header = &obd->obd_svc_stats->ls_cnt_header[j];
-                lprocfs_stats_collect(obd->obd_svc_stats, j, &ret);
-                if (ret.lc_sum > 0 && ret.lc_count != 0) {
-                        /* first argument to do_div MUST be __u64 */
-                        __u64 sum = ret.lc_sum;
-                        do_div(sum, ret.lc_count);
-                        ret.lc_sum = sum;
-                        i += snprintf(page + i, count - i,
-                                      "       %s_per_rpc: "LPU64"\n",
-                                     header->lc_units, ret.lc_sum);
-                        j = (int)ret.lc_sum;
-                        if (j > 0)
-                                i += snprintf(page + i, count - i,
-                                              "       MB_per_sec: %u.%.02u\n",
-                                              k / j, (100 * k / j) % 100);
-                }
-        }
-
-out_climp:
-        LPROCFS_CLIMP_EXIT(obd);
-        return i;
-}
-EXPORT_SYMBOL(lprocfs_rd_import);
-
-int lprocfs_rd_state(char *page, char **start, off_t off, int count,
-                      int *eof, void *data)
-{
-        struct obd_device *obd = (struct obd_device *)data;
-        struct obd_import *imp;
-        int i, j, k;
-
-        LASSERT(obd != NULL);
-        LPROCFS_CLIMP_CHECK(obd);
-        imp = obd->u.cli.cl_import;
-        *eof = 1;
-
-        i = snprintf(page, count, "current_state: %s\n",
-                     ptlrpc_import_state_name(imp->imp_state));
-        i += snprintf(page + i, count - i,
-                      "state_history:\n");
-        k = imp->imp_state_hist_idx;
-        for (j = 0; j < IMP_STATE_HIST_LEN; j++) {
-                struct import_state_hist *ish =
-                        &imp->imp_state_hist[(k + j) % IMP_STATE_HIST_LEN];
-                if (ish->ish_state == 0)
-                        continue;
-                i += snprintf(page + i, count - i, " - ["CFS_TIME_T", %s]\n",
-                              ish->ish_time,
-                              ptlrpc_import_state_name(ish->ish_state));
-        }
-
-        LPROCFS_CLIMP_EXIT(obd);
-        return i;
-}
-EXPORT_SYMBOL(lprocfs_rd_state);
-
-int lprocfs_at_hist_helper(char *page, int count, int rc,
-                           struct adaptive_timeout *at)
-{
-        int i;
-        for (i = 0; i < AT_BINS; i++)
-                rc += snprintf(page + rc, count - rc, "%3u ", at->at_hist[i]);
-        rc += snprintf(page + rc, count - rc, "\n");
-        return rc;
-}
-EXPORT_SYMBOL(lprocfs_at_hist_helper);
-
-/* See also ptlrpc_lprocfs_rd_timeouts */
-int lprocfs_rd_timeouts(char *page, char **start, off_t off, int count,
-                        int *eof, void *data)
-{
-        struct obd_device *obd = (struct obd_device *)data;
-        struct obd_import *imp;
-        unsigned int cur, worst;
-        time_t now, worstt;
-        struct dhms ts;
-        int i, rc = 0;
-
-        LASSERT(obd != NULL);
-        LPROCFS_CLIMP_CHECK(obd);
-        imp = obd->u.cli.cl_import;
-        *eof = 1;
-
-        now = cfs_time_current_sec();
-
-        /* Some network health info for kicks */
-        s2dhms(&ts, now - imp->imp_last_reply_time);
-        rc += snprintf(page + rc, count - rc,
-                       "%-10s : %ld, "DHMS_FMT" ago\n",
-                       "last reply", imp->imp_last_reply_time, DHMS_VARS(&ts));
-
-        cur = at_get(&imp->imp_at.iat_net_latency);
-        worst = imp->imp_at.iat_net_latency.at_worst_ever;
-        worstt = imp->imp_at.iat_net_latency.at_worst_time;
-        s2dhms(&ts, now - worstt);
-        rc += snprintf(page + rc, count - rc,
-                       "%-10s : cur %3u  worst %3u (at %ld, "DHMS_FMT" ago) ",
-                       "network", cur, worst, worstt, DHMS_VARS(&ts));
-        rc = lprocfs_at_hist_helper(page, count, rc,
-                                    &imp->imp_at.iat_net_latency);
-
-        for(i = 0; i < IMP_AT_MAX_PORTALS; i++) {
-                if (imp->imp_at.iat_portal[i] == 0)
-                        break;
-                cur = at_get(&imp->imp_at.iat_service_estimate[i]);
-                worst = imp->imp_at.iat_service_estimate[i].at_worst_ever;
-                worstt = imp->imp_at.iat_service_estimate[i].at_worst_time;
-                s2dhms(&ts, now - worstt);
-                rc += snprintf(page + rc, count - rc,
-                               "portal %-2d  : cur %3u  worst %3u (at %ld, "
-                               DHMS_FMT" ago) ", imp->imp_at.iat_portal[i],
-                               cur, worst, worstt, DHMS_VARS(&ts));
-                rc = lprocfs_at_hist_helper(page, count, rc,
-                                          &imp->imp_at.iat_service_estimate[i]);
-        }
-
-        LPROCFS_CLIMP_EXIT(obd);
-        return rc;
-}
-EXPORT_SYMBOL(lprocfs_rd_timeouts);
-
-int lprocfs_rd_connect_flags(char *page, char **start, off_t off,
-                             int count, int *eof, void *data)
-{
-        struct obd_device *obd = data;
-        __u64 flags;
-        int ret = 0;
-
-        LPROCFS_CLIMP_CHECK(obd);
-        flags = obd->u.cli.cl_import->imp_connect_data.ocd_connect_flags;
-        ret = snprintf(page, count, "flags="LPX64"\n", flags);
-        ret += obd_connect_flags2str(page + ret, count - ret, flags, "\n");
-        ret += snprintf(page + ret, count - ret, "\n");
-        LPROCFS_CLIMP_EXIT(obd);
-        return ret;
-}
-EXPORT_SYMBOL(lprocfs_rd_connect_flags);
-
-int lprocfs_rd_numrefs(char *page, char **start, off_t off, int count,
-                       int *eof, void *data)
-{
-        struct obd_type *class = (struct obd_type*) data;
-
-        LASSERT(class != NULL);
-        *eof = 1;
-        return snprintf(page, count, "%d\n", class->typ_refcnt);
-}
-EXPORT_SYMBOL(lprocfs_rd_numrefs);
-
-int lprocfs_obd_setup(struct obd_device *obd, struct lprocfs_vars *list)
-{
-       int rc = 0;
-
-       LASSERT(obd != NULL);
-       LASSERT(obd->obd_magic == OBD_DEVICE_MAGIC);
-       LASSERT(obd->obd_type->typ_procroot != NULL);
-
-       obd->obd_proc_entry = lprocfs_register(obd->obd_name,
-                                              obd->obd_type->typ_procroot,
-                                              list, obd);
-       if (IS_ERR(obd->obd_proc_entry)) {
-               rc = PTR_ERR(obd->obd_proc_entry);
-               CERROR("error %d setting up lprocfs for %s\n",rc,obd->obd_name);
-               obd->obd_proc_entry = NULL;
-       }
-       return rc;
-}
-EXPORT_SYMBOL(lprocfs_obd_setup);
-#endif
-
 int
-lprocfs_seq_obd_setup(struct obd_device *obd)
+lprocfs_obd_setup(struct obd_device *obd)
 {
        int rc = 0;
 
@@ -1785,7 +1231,7 @@ lprocfs_seq_obd_setup(struct obd_device *obd)
        }
        return rc;
 }
-EXPORT_SYMBOL(lprocfs_seq_obd_setup);
+EXPORT_SYMBOL(lprocfs_obd_setup);
 
 int lprocfs_obd_cleanup(struct obd_device *obd)
 {
@@ -1954,8 +1400,9 @@ void lprocfs_clear_stats(struct lprocfs_stats *stats)
 }
 EXPORT_SYMBOL(lprocfs_clear_stats);
 
-static ssize_t lprocfs_stats_seq_write(struct file *file, const char *buf,
-                                       size_t len, loff_t *off)
+static ssize_t lprocfs_stats_seq_write(struct file *file,
+                                      const char __user *buf,
+                                      size_t len, loff_t *off)
 {
         struct seq_file *seq = file->private_data;
         struct lprocfs_stats *stats = seq->private;
@@ -2028,7 +1475,7 @@ out:
        return (rc < 0) ? rc : 0;
 }
 
-struct seq_operations lprocfs_stats_seq_sops = {
+static const struct seq_operations lprocfs_stats_seq_sops = {
        .start  = lprocfs_stats_seq_start,
        .stop   = lprocfs_stats_seq_stop,
        .next   = lprocfs_stats_seq_next,
@@ -2040,10 +1487,10 @@ static int lprocfs_stats_seq_open(struct inode *inode, struct file *file)
        struct seq_file *seq;
        int rc;
 
-#ifndef HAVE_ONLY_PROCFS_SEQ
-       if (LPROCFS_ENTRY_CHECK(PDE(inode)))
-               return -ENOENT;
-#endif
+       rc = LPROCFS_ENTRY_CHECK(inode);
+       if (rc < 0)
+               return rc;
+
        rc = seq_open(file, &lprocfs_stats_seq_sops);
        if (rc)
                return rc;
@@ -2052,7 +1499,7 @@ static int lprocfs_stats_seq_open(struct inode *inode, struct file *file)
        return 0;
 }
 
-struct file_operations lprocfs_stats_seq_fops = {
+static const struct file_operations lprocfs_stats_seq_fops = {
         .owner   = THIS_MODULE,
         .open    = lprocfs_stats_seq_open,
         .read    = seq_read,
@@ -2289,14 +1736,14 @@ __s64 lprocfs_read_helper(struct lprocfs_counter *lc,
 }
 EXPORT_SYMBOL(lprocfs_read_helper);
 
-int lprocfs_write_helper(const char *buffer, unsigned long count,
+int lprocfs_write_helper(const char __user *buffer, unsigned long count,
                          int *val)
 {
         return lprocfs_write_frac_helper(buffer, count, val, 1);
 }
 EXPORT_SYMBOL(lprocfs_write_helper);
 
-int lprocfs_write_frac_helper(const char *buffer, unsigned long count,
+int lprocfs_write_frac_helper(const char __user *buffer, unsigned long count,
                               int *val, int mult)
 {
         char kernbuf[20], *end, *pbuf;
@@ -2419,14 +1866,16 @@ int lprocfs_seq_read_frac_helper(struct seq_file *m, long val, int mult)
 }
 EXPORT_SYMBOL(lprocfs_seq_read_frac_helper);
 
-int lprocfs_write_u64_helper(const char *buffer, unsigned long count,__u64 *val)
+int lprocfs_write_u64_helper(const char __user *buffer, unsigned long count,
+                            __u64 *val)
 {
         return lprocfs_write_frac_u64_helper(buffer, count, val, 1);
 }
 EXPORT_SYMBOL(lprocfs_write_u64_helper);
 
-int lprocfs_write_frac_u64_helper(const char *buffer, unsigned long count,
-                              __u64 *val, int mult)
+int lprocfs_write_frac_u64_helper(const char __user *buffer,
+                                 unsigned long count,
+                                 __u64 *val, int mult)
 {
         char kernbuf[22], *end, *pbuf;
         __u64 whole, frac = 0, units;
@@ -2479,7 +1928,7 @@ int lprocfs_write_frac_u64_helper(const char *buffer, unsigned long count,
                }
        }
         /* Specified units override the multiplier */
-        if (units)
+       if (units > 1)
                 mult = mult < 0 ? -units : units;
 
         frac *= mult;
@@ -2609,16 +2058,17 @@ void lprocfs_oh_clear(struct obd_histogram *oh)
 EXPORT_SYMBOL(lprocfs_oh_clear);
 
 int lprocfs_obd_rd_max_pages_per_rpc(char *page, char **start, off_t off,
-                                     int count, int *eof, void *data)
+                                    int count, int *eof, void *data)
 {
-        struct obd_device *dev = data;
-        struct client_obd *cli = &dev->u.cli;
-        int rc;
+       struct obd_device *dev = data;
+       struct client_obd *cli = &dev->u.cli;
+       int rc;
 
-        client_obd_list_lock(&cli->cl_loi_list_lock);
-        rc = snprintf(page, count, "%d\n", cli->cl_max_pages_per_rpc);
-        client_obd_list_unlock(&cli->cl_loi_list_lock);
-        return rc;
+       spin_lock(&cli->cl_loi_list_lock);
+       rc = snprintf(page, count, "%d\n", cli->cl_max_pages_per_rpc);
+       spin_unlock(&cli->cl_loi_list_lock);
+
+       return rc;
 }
 EXPORT_SYMBOL(lprocfs_obd_rd_max_pages_per_rpc);
 
@@ -2628,9 +2078,9 @@ int lprocfs_obd_max_pages_per_rpc_seq_show(struct seq_file *m, void *data)
        struct client_obd *cli = &dev->u.cli;
        int rc;
 
-       client_obd_list_lock(&cli->cl_loi_list_lock);
+       spin_lock(&cli->cl_loi_list_lock);
        rc = seq_printf(m, "%d\n", cli->cl_max_pages_per_rpc);
-       client_obd_list_unlock(&cli->cl_loi_list_lock);
+       spin_unlock(&cli->cl_loi_list_lock);
        return rc;
 }
 EXPORT_SYMBOL(lprocfs_obd_max_pages_per_rpc_seq_show);