These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / staging / lustre / lustre / obdclass / lprocfs_status.c
index c171c6c..333ac7d 100644 (file)
@@ -40,7 +40,6 @@
 
 #define DEBUG_SUBSYSTEM S_CLASS
 
-
 #include "../include/obd_class.h"
 #include "../include/lprocfs_status.h"
 #include "../include/lustre/lustre_idl.h"
@@ -221,8 +220,6 @@ int lprocfs_write_frac_helper(const char __user *buffer, unsigned long count,
 }
 EXPORT_SYMBOL(lprocfs_write_frac_helper);
 
-#if defined (CONFIG_PROC_FS)
-
 static int lprocfs_no_percpu_stats;
 module_param(lprocfs_no_percpu_stats, int, 0644);
 MODULE_PARM_DESC(lprocfs_no_percpu_stats, "Do not alloc percpu data for lprocfs stats");
@@ -243,11 +240,11 @@ EXPORT_SYMBOL(lprocfs_seq_release);
 
 /* lprocfs API calls */
 
-struct proc_dir_entry *lprocfs_add_simple(struct proc_dir_entry *root,
-                                    char *name, void *data,
-                                    struct file_operations *fops)
+struct dentry *ldebugfs_add_simple(struct dentry *root,
+                                  char *name, void *data,
+                                  struct file_operations *fops)
 {
-       struct proc_dir_entry *proc;
+       struct dentry *entry;
        umode_t mode = 0;
 
        if (root == NULL || name == NULL || fops == NULL)
@@ -257,64 +254,26 @@ struct proc_dir_entry *lprocfs_add_simple(struct proc_dir_entry *root,
                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);
+       entry = debugfs_create_file(name, mode, root, data, fops);
+       if (IS_ERR_OR_NULL(entry)) {
+               CERROR("LprocFS: No memory to create <debugfs> entry %s", name);
+               return entry ?: ERR_PTR(-ENOMEM);
        }
-       return proc;
-}
-EXPORT_SYMBOL(lprocfs_add_simple);
-
-struct proc_dir_entry *lprocfs_add_symlink(const char *name,
-                       struct proc_dir_entry *parent, const char *format, ...)
-{
-       struct proc_dir_entry *entry;
-       char *dest;
-       va_list ap;
-
-       if (parent == NULL || format == NULL)
-               return NULL;
-
-       OBD_ALLOC_WAIT(dest, MAX_STRING_SIZE + 1);
-       if (dest == NULL)
-               return NULL;
-
-       va_start(ap, format);
-       vsnprintf(dest, MAX_STRING_SIZE, format, ap);
-       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);
-
-       OBD_FREE(dest, MAX_STRING_SIZE + 1);
        return entry;
 }
-EXPORT_SYMBOL(lprocfs_add_symlink);
+EXPORT_SYMBOL(ldebugfs_add_simple);
 
 static struct file_operations lprocfs_generic_fops = { };
 
-/**
- * Add /proc entries.
- *
- * \param root [in]  The parent proc entry on which new entry will be added.
- * \param list [in]  Array of proc entries to be added.
- * \param data [in]  The argument to be passed when entries read/write routines
- *                are called through /proc file.
- *
- * \retval 0   on success
- *      < 0 on error
- */
-int lprocfs_add_vars(struct proc_dir_entry *root, struct lprocfs_vars *list,
-                    void *data)
+int ldebugfs_add_vars(struct dentry *parent,
+                     struct lprocfs_vars *list,
+                     void *data)
 {
-       if (root == NULL || list == NULL)
+       if (IS_ERR_OR_NULL(parent) || IS_ERR_OR_NULL(list))
                return -EINVAL;
 
        while (list->name != NULL) {
-               struct proc_dir_entry *proc;
+               struct dentry *entry;
                umode_t mode = 0;
 
                if (list->proc_mode != 0000) {
@@ -325,54 +284,50 @@ int lprocfs_add_vars(struct proc_dir_entry *root, struct lprocfs_vars *list,
                        if (list->fops->write)
                                mode |= 0200;
                }
-               proc = proc_create_data(list->name, mode, root,
-                                       list->fops ?: &lprocfs_generic_fops,
-                                       list->data ?: data);
-               if (proc == NULL)
-                       return -ENOMEM;
+               entry = debugfs_create_file(list->name, mode, parent,
+                                           list->data ?: data,
+                                           list->fops ?: &lprocfs_generic_fops
+                                          );
+               if (IS_ERR_OR_NULL(entry))
+                       return entry ? PTR_ERR(entry) : -ENOMEM;
                list++;
        }
        return 0;
 }
-EXPORT_SYMBOL(lprocfs_add_vars);
+EXPORT_SYMBOL(ldebugfs_add_vars);
 
-void lprocfs_remove(struct proc_dir_entry **rooth)
+void ldebugfs_remove(struct dentry **entryp)
 {
-       proc_remove(*rooth);
-       *rooth = NULL;
+       debugfs_remove_recursive(*entryp);
+       *entryp = NULL;
 }
-EXPORT_SYMBOL(lprocfs_remove);
+EXPORT_SYMBOL(ldebugfs_remove);
 
-void lprocfs_remove_proc_entry(const char *name, struct proc_dir_entry *parent)
+struct dentry *ldebugfs_register(const char *name,
+                                struct dentry *parent,
+                                struct lprocfs_vars *list, void *data)
 {
-       LASSERT(parent != NULL);
-       remove_proc_entry(name, parent);
-}
-EXPORT_SYMBOL(lprocfs_remove_proc_entry);
+       struct dentry *entry;
 
-struct proc_dir_entry *lprocfs_register(const char *name,
-                                       struct proc_dir_entry *parent,
-                                       struct lprocfs_vars *list, void *data)
-{
-       struct proc_dir_entry *entry;
-
-       entry = proc_mkdir(name, parent);
-       if (entry == NULL) {
-               entry = ERR_PTR(-ENOMEM);
+       entry = debugfs_create_dir(name, parent);
+       if (IS_ERR_OR_NULL(entry)) {
+               entry = entry ?: ERR_PTR(-ENOMEM);
                goto out;
        }
 
-       if (list != NULL) {
-               int rc = lprocfs_add_vars(entry, list, data);
+       if (!IS_ERR_OR_NULL(list)) {
+               int rc;
+
+               rc = ldebugfs_add_vars(entry, list, data);
                if (rc != 0) {
-                       lprocfs_remove(&entry);
+                       debugfs_remove(entry);
                        entry = ERR_PTR(rc);
                }
        }
 out:
        return entry;
 }
-EXPORT_SYMBOL(lprocfs_register);
+EXPORT_SYMBOL(ldebugfs_register);
 
 /* Generic callbacks */
 int lprocfs_rd_uint(struct seq_file *m, void *data)
@@ -402,78 +357,37 @@ int lprocfs_wr_uint(struct file *file, const char __user *buffer,
 }
 EXPORT_SYMBOL(lprocfs_wr_uint);
 
-int lprocfs_rd_u64(struct seq_file *m, void *data)
-{
-       seq_printf(m, "%llu\n", *(__u64 *)data);
-       return 0;
-}
-EXPORT_SYMBOL(lprocfs_rd_u64);
-
-int lprocfs_rd_atomic(struct seq_file *m, void *data)
-{
-       atomic_t *atom = data;
-       LASSERT(atom != NULL);
-       seq_printf(m, "%d\n", atomic_read(atom));
-       return 0;
-}
-EXPORT_SYMBOL(lprocfs_rd_atomic);
-
-int lprocfs_wr_atomic(struct file *file, const char __user *buffer,
-                     unsigned long count, void *data)
+static ssize_t uuid_show(struct kobject *kobj, struct attribute *attr,
+                        char *buf)
 {
-       atomic_t *atm = data;
-       int val = 0;
-       int rc;
+       struct obd_device *obd = container_of(kobj, struct obd_device,
+                                             obd_kobj);
 
-       rc = lprocfs_write_helper(buffer, count, &val);
-       if (rc < 0)
-               return rc;
-
-       if (val <= 0)
-               return -ERANGE;
-
-       atomic_set(atm, val);
-       return count;
+       return sprintf(buf, "%s\n", obd->obd_uuid.uuid);
 }
-EXPORT_SYMBOL(lprocfs_wr_atomic);
+LUSTRE_RO_ATTR(uuid);
 
-int lprocfs_rd_uuid(struct seq_file *m, void *data)
+static ssize_t blocksize_show(struct kobject *kobj, struct attribute *attr,
+                             char *buf)
 {
-       struct obd_device *obd = data;
-
-       LASSERT(obd != NULL);
-       seq_printf(m, "%s\n", obd->obd_uuid.uuid);
-       return 0;
-}
-EXPORT_SYMBOL(lprocfs_rd_uuid);
-
-int lprocfs_rd_name(struct seq_file *m, void *data)
-{
-       struct obd_device *dev = data;
-
-       LASSERT(dev != NULL);
-       seq_printf(m, "%s\n", dev->obd_name);
-       return 0;
-}
-EXPORT_SYMBOL(lprocfs_rd_name);
-
-int lprocfs_rd_blksize(struct seq_file *m, void *data)
-{
-       struct obd_device *obd = data;
+       struct obd_device *obd = container_of(kobj, struct obd_device,
+                                             obd_kobj);
        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)
-               seq_printf(m, "%u\n", osfs.os_bsize);
+               return sprintf(buf, "%u\n", osfs.os_bsize);
 
        return rc;
 }
-EXPORT_SYMBOL(lprocfs_rd_blksize);
+LUSTRE_RO_ATTR(blocksize);
 
-int lprocfs_rd_kbytestotal(struct seq_file *m, void *data)
+static ssize_t kbytestotal_show(struct kobject *kobj, struct attribute *attr,
+                               char *buf)
 {
-       struct obd_device *obd = data;
+       struct obd_device *obd = container_of(kobj, struct obd_device,
+                                             obd_kobj);
        struct obd_statfs  osfs;
        int rc = obd_statfs(NULL, obd->obd_self_export, &osfs,
                            cfs_time_shift_64(-OBD_STATFS_CACHE_SECONDS),
@@ -485,16 +399,18 @@ int lprocfs_rd_kbytestotal(struct seq_file *m, void *data)
                while (blk_size >>= 1)
                        result <<= 1;
 
-               seq_printf(m, "%llu\n", result);
+               return sprintf(buf, "%llu\n", result);
        }
 
        return rc;
 }
-EXPORT_SYMBOL(lprocfs_rd_kbytestotal);
+LUSTRE_RO_ATTR(kbytestotal);
 
-int lprocfs_rd_kbytesfree(struct seq_file *m, void *data)
+static ssize_t kbytesfree_show(struct kobject *kobj, struct attribute *attr,
+                              char *buf)
 {
-       struct obd_device *obd = data;
+       struct obd_device *obd = container_of(kobj, struct obd_device,
+                                             obd_kobj);
        struct obd_statfs  osfs;
        int rc = obd_statfs(NULL, obd->obd_self_export, &osfs,
                            cfs_time_shift_64(-OBD_STATFS_CACHE_SECONDS),
@@ -506,16 +422,18 @@ int lprocfs_rd_kbytesfree(struct seq_file *m, void *data)
                while (blk_size >>= 1)
                        result <<= 1;
 
-               seq_printf(m, "%llu\n", result);
+               return sprintf(buf, "%llu\n", result);
        }
 
        return rc;
 }
-EXPORT_SYMBOL(lprocfs_rd_kbytesfree);
+LUSTRE_RO_ATTR(kbytesfree);
 
-int lprocfs_rd_kbytesavail(struct seq_file *m, void *data)
+static ssize_t kbytesavail_show(struct kobject *kobj, struct attribute *attr,
+                               char *buf)
 {
-       struct obd_device *obd = data;
+       struct obd_device *obd = container_of(kobj, struct obd_device,
+                                             obd_kobj);
        struct obd_statfs  osfs;
        int rc = obd_statfs(NULL, obd->obd_self_export, &osfs,
                            cfs_time_shift_64(-OBD_STATFS_CACHE_SECONDS),
@@ -527,49 +445,57 @@ int lprocfs_rd_kbytesavail(struct seq_file *m, void *data)
                while (blk_size >>= 1)
                        result <<= 1;
 
-               seq_printf(m, "%llu\n", result);
+               return sprintf(buf, "%llu\n", result);
        }
 
        return rc;
 }
-EXPORT_SYMBOL(lprocfs_rd_kbytesavail);
+LUSTRE_RO_ATTR(kbytesavail);
 
-int lprocfs_rd_filestotal(struct seq_file *m, void *data)
+static ssize_t filestotal_show(struct kobject *kobj, struct attribute *attr,
+                              char *buf)
 {
-       struct obd_device *obd = data;
+       struct obd_device *obd = container_of(kobj, struct obd_device,
+                                             obd_kobj);
        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)
-               seq_printf(m, "%llu\n", osfs.os_files);
+               return sprintf(buf, "%llu\n", osfs.os_files);
 
        return rc;
 }
-EXPORT_SYMBOL(lprocfs_rd_filestotal);
+LUSTRE_RO_ATTR(filestotal);
 
-int lprocfs_rd_filesfree(struct seq_file *m, void *data)
+static ssize_t filesfree_show(struct kobject *kobj, struct attribute *attr,
+                             char *buf)
 {
-       struct obd_device *obd = data;
+       struct obd_device *obd = container_of(kobj, struct obd_device,
+                                             obd_kobj);
        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)
-               seq_printf(m, "%llu\n", osfs.os_ffree);
+               return sprintf(buf, "%llu\n", osfs.os_ffree);
 
        return rc;
 }
-EXPORT_SYMBOL(lprocfs_rd_filesfree);
+LUSTRE_RO_ATTR(filesfree);
 
 int lprocfs_rd_server_uuid(struct seq_file *m, void *data)
 {
        struct obd_device *obd = data;
        struct obd_import *imp;
        char *imp_state_name = NULL;
+       int rc;
 
        LASSERT(obd != NULL);
-       LPROCFS_CLIMP_CHECK(obd);
+       rc = lprocfs_climp_check(obd);
+       if (rc)
+               return rc;
+
        imp = obd->u.cli.cl_import;
        imp_state_name = ptlrpc_import_state_name(imp->imp_state);
        seq_printf(m, "%s\t%s%s\n",
@@ -586,10 +512,14 @@ int lprocfs_rd_conn_uuid(struct seq_file *m, void *data)
 {
        struct obd_device *obd = data;
        struct ptlrpc_connection *conn;
+       int rc;
 
        LASSERT(obd != NULL);
 
-       LPROCFS_CLIMP_CHECK(obd);
+       rc = lprocfs_climp_check(obd);
+       if (rc)
+               return rc;
+
        conn = obd->u.cli.cl_import->imp_connection;
        if (conn && obd->u.cli.cl_import)
                seq_printf(m, "%s\n", conn->c_remote_uuid.uuid);
@@ -665,6 +595,7 @@ static int obd_import_flags2str(struct obd_import *imp, struct seq_file *m)
        flag2str(pingable, first);
        return 0;
 }
+
 #undef flags2str
 
 static void obd_connect_seq_flags2str(struct seq_file *m, __u64 flags, char *sep)
@@ -687,17 +618,22 @@ static void obd_connect_seq_flags2str(struct seq_file *m, __u64 flags, char *sep
 
 int lprocfs_rd_import(struct seq_file *m, void *data)
 {
+       char                            nidstr[LNET_NIDSTR_SIZE];
        struct lprocfs_counter          ret;
        struct lprocfs_counter_header   *header;
-       struct obd_device               *obd    = (struct obd_device *)data;
+       struct obd_device               *obd    = data;
        struct obd_import               *imp;
        struct obd_import_conn          *conn;
        int                             j;
        int                             k;
        int                             rw      = 0;
+       int                             rc;
 
        LASSERT(obd != NULL);
-       LPROCFS_CLIMP_CHECK(obd);
+       rc = lprocfs_climp_check(obd);
+       if (rc)
+               return rc;
+
        imp = obd->u.cli.cl_import;
 
        seq_printf(m,
@@ -724,18 +660,20 @@ int lprocfs_rd_import(struct seq_file *m, void *data)
        spin_lock(&imp->imp_lock);
        j = 0;
        list_for_each_entry(conn, &imp->imp_conn_list, oic_item) {
-               seq_printf(m, "%s%s", j ? ", " : "",
-                          libcfs_nid2str(conn->oic_conn->c_peer.nid));
+               libcfs_nid2str_r(conn->oic_conn->c_peer.nid,
+                                nidstr, sizeof(nidstr));
+               seq_printf(m, "%s%s", j ? ", " : "", nidstr);
                j++;
        }
+       libcfs_nid2str_r(imp->imp_connection->c_peer.nid,
+                        nidstr, sizeof(nidstr));
        seq_printf(m,
                      "]\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_connection == NULL ? "<none>" : nidstr,
                      imp->imp_conn_cnt,
                      imp->imp_generation,
                      atomic_read(&imp->imp_inval_count));
@@ -749,6 +687,7 @@ int lprocfs_rd_import(struct seq_file *m, void *data)
        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
@@ -795,6 +734,7 @@ int lprocfs_rd_import(struct seq_file *m, void *data)
                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;
                        seq_printf(m,
@@ -810,6 +750,7 @@ int lprocfs_rd_import(struct seq_file *m, void *data)
                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;
                        seq_printf(m,
@@ -831,12 +772,15 @@ EXPORT_SYMBOL(lprocfs_rd_import);
 
 int lprocfs_rd_state(struct seq_file *m, void *data)
 {
-       struct obd_device *obd = (struct obd_device *)data;
+       struct obd_device *obd = data;
        struct obd_import *imp;
-       int j, k;
+       int j, k, rc;
 
        LASSERT(obd != NULL);
-       LPROCFS_CLIMP_CHECK(obd);
+       rc = lprocfs_climp_check(obd);
+       if (rc)
+               return rc;
+
        imp = obd->u.cli.cl_import;
 
        seq_printf(m, "current_state: %s\n",
@@ -848,9 +792,8 @@ int lprocfs_rd_state(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",
-                             ish->ish_time,
-                             ptlrpc_import_state_name(ish->ish_state));
+               seq_printf(m, " - [%lld, %s]\n", (s64)ish->ish_time,
+                          ptlrpc_import_state_name(ish->ish_state));
        }
 
        LPROCFS_CLIMP_EXIT(obd);
@@ -861,6 +804,7 @@ EXPORT_SYMBOL(lprocfs_rd_state);
 int lprocfs_at_hist_helper(struct seq_file *m, struct adaptive_timeout *at)
 {
        int i;
+
        for (i = 0; i < AT_BINS; i++)
                seq_printf(m, "%3u ", at->at_hist[i]);
        seq_printf(m, "\n");
@@ -871,30 +815,33 @@ EXPORT_SYMBOL(lprocfs_at_hist_helper);
 /* See also ptlrpc_lprocfs_rd_timeouts */
 int lprocfs_rd_timeouts(struct seq_file *m, void *data)
 {
-       struct obd_device *obd = (struct obd_device *)data;
+       struct obd_device *obd = data;
        struct obd_import *imp;
        unsigned int cur, worst;
-       time_t now, worstt;
+       time64_t now, worstt;
        struct dhms ts;
-       int i;
+       int i, rc;
 
        LASSERT(obd != NULL);
-       LPROCFS_CLIMP_CHECK(obd);
+       rc = lprocfs_climp_check(obd);
+       if (rc)
+               return rc;
+
        imp = obd->u.cli.cl_import;
 
-       now = get_seconds();
+       now = ktime_get_real_seconds();
 
        /* Some network health info for kicks */
        s2dhms(&ts, now - imp->imp_last_reply_time);
-       seq_printf(m, "%-10s : %ld, "DHMS_FMT" ago\n",
-                      "last reply", imp->imp_last_reply_time, DHMS_VARS(&ts));
+       seq_printf(m, "%-10s : %lld, " DHMS_FMT " ago\n",
+                  "last reply", (s64)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);
-       seq_printf(m, "%-10s : cur %3u  worst %3u (at %ld, "DHMS_FMT" ago) ",
-                      "network", cur, worst, worstt, DHMS_VARS(&ts));
+       seq_printf(m, "%-10s : cur %3u  worst %3u (at %lld, " DHMS_FMT " ago) ",
+                  "network", cur, worst, (s64)worstt, DHMS_VARS(&ts));
        lprocfs_at_hist_helper(m, &imp->imp_at.iat_net_latency);
 
        for (i = 0; i < IMP_AT_MAX_PORTALS; i++) {
@@ -904,9 +851,9 @@ int lprocfs_rd_timeouts(struct seq_file *m, void *data)
                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);
-               seq_printf(m, "portal %-2d  : cur %3u  worst %3u (at %ld, "
-                              DHMS_FMT" ago) ", imp->imp_at.iat_portal[i],
-                              cur, worst, worstt, DHMS_VARS(&ts));
+               seq_printf(m, "portal %-2d  : cur %3u  worst %3u (at %lld, "
+                          DHMS_FMT " ago) ", imp->imp_at.iat_portal[i],
+                          cur, worst, (s64)worstt, DHMS_VARS(&ts));
                lprocfs_at_hist_helper(m, &imp->imp_at.iat_service_estimate[i]);
        }
 
@@ -919,8 +866,12 @@ int lprocfs_rd_connect_flags(struct seq_file *m, void *data)
 {
        struct obd_device *obd = data;
        __u64 flags;
+       int rc;
+
+       rc = lprocfs_climp_check(obd);
+       if (rc)
+               return rc;
 
-       LPROCFS_CLIMP_CHECK(obd);
        flags = obd->u.cli.cl_import->imp_connect_data.ocd_connect_flags;
        seq_printf(m, "flags=%#llx\n", flags);
        obd_connect_seq_flags2str(m, flags, "\n");
@@ -930,43 +881,62 @@ int lprocfs_rd_connect_flags(struct seq_file *m, void *data)
 }
 EXPORT_SYMBOL(lprocfs_rd_connect_flags);
 
-int lprocfs_rd_num_exports(struct seq_file *m, void *data)
-{
-       struct obd_device *obd = data;
-
-       LASSERT(obd != NULL);
-       seq_printf(m, "%u\n", obd->obd_num_exports);
-       return 0;
-}
-EXPORT_SYMBOL(lprocfs_rd_num_exports);
+static struct attribute *obd_def_attrs[] = {
+       &lustre_attr_blocksize.attr,
+       &lustre_attr_kbytestotal.attr,
+       &lustre_attr_kbytesfree.attr,
+       &lustre_attr_kbytesavail.attr,
+       &lustre_attr_filestotal.attr,
+       &lustre_attr_filesfree.attr,
+       &lustre_attr_uuid.attr,
+       NULL,
+};
 
-int lprocfs_rd_numrefs(struct seq_file *m, void *data)
+static void obd_sysfs_release(struct kobject *kobj)
 {
-       struct obd_type *class = (struct obd_type *) data;
+       struct obd_device *obd = container_of(kobj, struct obd_device,
+                                             obd_kobj);
 
-       LASSERT(class != NULL);
-       seq_printf(m, "%d\n", class->typ_refcnt);
-       return 0;
+       complete(&obd->obd_kobj_unregister);
 }
-EXPORT_SYMBOL(lprocfs_rd_numrefs);
 
-int lprocfs_obd_setup(struct obd_device *obd, struct lprocfs_vars *list)
+static struct kobj_type obd_ktype = {
+       .default_attrs  = obd_def_attrs,
+       .sysfs_ops      = &lustre_sysfs_ops,
+       .release        = obd_sysfs_release,
+};
+
+int lprocfs_obd_setup(struct obd_device *obd, struct lprocfs_vars *list,
+                     struct attribute_group *attrs)
 {
        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);
+       init_completion(&obd->obd_kobj_unregister);
+       rc = kobject_init_and_add(&obd->obd_kobj, &obd_ktype,
+                                 obd->obd_type->typ_kobj,
+                                 "%s", obd->obd_name);
+       if (rc)
+               return rc;
+
+       if (attrs) {
+               rc = sysfs_create_group(&obd->obd_kobj, attrs);
+               if (rc) {
+                       kobject_put(&obd->obd_kobj);
+                       return rc;
+               }
+       }
+
+       obd->obd_debugfs_entry = ldebugfs_register(obd->obd_name,
+                                                  obd->obd_type->typ_debugfs_entry,
+                                                  list, obd);
+       if (IS_ERR_OR_NULL(obd->obd_debugfs_entry)) {
+               rc = obd->obd_debugfs_entry ? PTR_ERR(obd->obd_debugfs_entry)
+                                           : -ENOMEM;
                CERROR("error %d setting up lprocfs for %s\n",
                       rc, obd->obd_name);
-               obd->obd_proc_entry = NULL;
+               obd->obd_debugfs_entry = NULL;
        }
+
        return rc;
 }
 EXPORT_SYMBOL(lprocfs_obd_setup);
@@ -975,58 +945,16 @@ int lprocfs_obd_cleanup(struct obd_device *obd)
 {
        if (!obd)
                return -EINVAL;
-       if (obd->obd_proc_exports_entry) {
-               /* Should be no exports left */
-               lprocfs_remove(&obd->obd_proc_exports_entry);
-               obd->obd_proc_exports_entry = NULL;
-       }
-       if (obd->obd_proc_entry) {
-               lprocfs_remove(&obd->obd_proc_entry);
-               obd->obd_proc_entry = NULL;
-       }
-       return 0;
-}
-EXPORT_SYMBOL(lprocfs_obd_cleanup);
-
-static void lprocfs_free_client_stats(struct nid_stat *client_stat)
-{
-       CDEBUG(D_CONFIG, "stat %p - data %p/%p\n", client_stat,
-              client_stat->nid_proc, client_stat->nid_stats);
 
-       LASSERTF(atomic_read(&client_stat->nid_exp_ref_count) == 0,
-                "nid %s:count %d\n", libcfs_nid2str(client_stat->nid),
-                atomic_read(&client_stat->nid_exp_ref_count));
+       if (!IS_ERR_OR_NULL(obd->obd_debugfs_entry))
+               ldebugfs_remove(&obd->obd_debugfs_entry);
 
-       if (client_stat->nid_proc)
-               lprocfs_remove(&client_stat->nid_proc);
+       kobject_put(&obd->obd_kobj);
+       wait_for_completion(&obd->obd_kobj_unregister);
 
-       if (client_stat->nid_stats)
-               lprocfs_free_stats(&client_stat->nid_stats);
-
-       if (client_stat->nid_ldlm_stats)
-               lprocfs_free_stats(&client_stat->nid_ldlm_stats);
-
-       OBD_FREE_PTR(client_stat);
-       return;
-
-}
-
-void lprocfs_free_per_client_stats(struct obd_device *obd)
-{
-       struct cfs_hash *hash = obd->obd_nid_stats_hash;
-       struct nid_stat *stat;
-
-       /* we need extra list - because hash_exit called to early */
-       /* not need locking because all clients is died */
-       while (!list_empty(&obd->obd_nid_stats)) {
-               stat = list_entry(obd->obd_nid_stats.next,
-                                     struct nid_stat, nid_list);
-               list_del_init(&stat->nid_list);
-               cfs_hash_del(hash, &stat->nid, &stat->nid_hash);
-               lprocfs_free_client_stats(stat);
-       }
+       return 0;
 }
-EXPORT_SYMBOL(lprocfs_free_per_client_stats);
+EXPORT_SYMBOL(lprocfs_obd_cleanup);
 
 int lprocfs_stats_alloc_one(struct lprocfs_stats *stats, unsigned int cpuid)
 {
@@ -1107,7 +1035,7 @@ struct lprocfs_stats *lprocfs_alloc_stats(unsigned int num,
                        goto fail;
                stats->ls_biggest_alloc_num = 1;
        } else if ((flags & LPROCFS_STATS_FLAG_IRQ_SAFE) != 0) {
-               /* alloc all percpu data, currently only obd_memory use this */
+               /* alloc all percpu data */
                for (i = 0; i < num_entry; ++i)
                        if (lprocfs_stats_alloc_one(stats, i) < 0)
                                goto fail;
@@ -1215,11 +1143,12 @@ static int lprocfs_stats_seq_show(struct seq_file *p, void *v)
        int                              idx    = *(loff_t *)v;
 
        if (idx == 0) {
-               struct timeval now;
-               do_gettimeofday(&now);
-               seq_printf(p, "%-25s %lu.%lu secs.usecs\n",
+               struct timespec64 now;
+
+               ktime_get_real_ts64(&now);
+               seq_printf(p, "%-25s %llu.%9lu secs.usecs\n",
                           "snapshot_time",
-                          now.tv_sec, (unsigned long)now.tv_usec);
+                          (s64)now.tv_sec, (unsigned long)now.tv_nsec);
        }
 
        hdr = &stats->ls_cnt_header[idx];
@@ -1257,8 +1186,10 @@ static int lprocfs_stats_seq_open(struct inode *inode, struct file *file)
        rc = seq_open(file, &lprocfs_stats_seq_sops);
        if (rc)
                return rc;
+
        seq = file->private_data;
-       seq->private = PDE_DATA(inode);
+       seq->private = inode->i_private;
+
        return 0;
 }
 
@@ -1271,20 +1202,21 @@ struct file_operations lprocfs_stats_seq_fops = {
        .release = lprocfs_seq_release,
 };
 
-int lprocfs_register_stats(struct proc_dir_entry *root, const char *name,
+int ldebugfs_register_stats(struct dentry *parent, const char *name,
                           struct lprocfs_stats *stats)
 {
-       struct proc_dir_entry *entry;
-       LASSERT(root != NULL);
+       struct dentry *entry;
 
-       entry = proc_create_data(name, 0644, root,
-                                &lprocfs_stats_seq_fops, stats);
-       if (entry == NULL)
-               return -ENOMEM;
+       LASSERT(!IS_ERR_OR_NULL(parent));
+
+       entry = debugfs_create_file(name, 0644, parent, stats,
+                                   &lprocfs_stats_seq_fops);
+       if (IS_ERR_OR_NULL(entry))
+               return entry ? PTR_ERR(entry) : -ENOMEM;
 
        return 0;
 }
-EXPORT_SYMBOL(lprocfs_register_stats);
+EXPORT_SYMBOL(ldebugfs_register_stats);
 
 void lprocfs_counter_init(struct lprocfs_stats *stats, int index,
                          unsigned conf, const char *name, const char *units)
@@ -1322,462 +1254,8 @@ void lprocfs_counter_init(struct lprocfs_stats *stats, int index,
 }
 EXPORT_SYMBOL(lprocfs_counter_init);
 
-#define LPROCFS_OBD_OP_INIT(base, stats, op)                          \
-do {                                                                  \
-       unsigned int coffset = base + OBD_COUNTER_OFFSET(op);         \
-       LASSERT(coffset < stats->ls_num);                                 \
-       lprocfs_counter_init(stats, coffset, 0, #op, "reqs");         \
-} while (0)
-
-void lprocfs_init_ops_stats(int num_private_stats, struct lprocfs_stats *stats)
-{
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, iocontrol);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, get_info);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, set_info_async);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, attach);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, detach);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, setup);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, precleanup);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, cleanup);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, process_config);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, postrecov);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, add_conn);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, del_conn);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, connect);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, reconnect);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, disconnect);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, fid_init);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, fid_fini);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, fid_alloc);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, statfs);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, statfs_async);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, packmd);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, unpackmd);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, preallocate);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, create);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, destroy);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, setattr);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, setattr_async);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, getattr);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, getattr_async);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, adjust_kms);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, preprw);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, commitrw);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, find_cbdata);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, init_export);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, destroy_export);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, import_event);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, notify);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, health_check);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, get_uuid);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, quotacheck);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, quotactl);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, pool_new);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, pool_rem);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, pool_add);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, pool_del);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, getref);
-       LPROCFS_OBD_OP_INIT(num_private_stats, stats, putref);
-}
-EXPORT_SYMBOL(lprocfs_init_ops_stats);
-
-int lprocfs_alloc_obd_stats(struct obd_device *obd, unsigned num_private_stats)
-{
-       struct lprocfs_stats *stats;
-       unsigned int num_stats;
-       int rc, i;
-
-       LASSERT(obd->obd_stats == NULL);
-       LASSERT(obd->obd_proc_entry != NULL);
-       LASSERT(obd->obd_cntr_base == 0);
-
-       num_stats = ((int)sizeof(*obd->obd_type->typ_dt_ops) / sizeof(void *)) +
-               num_private_stats - 1 /* o_owner */;
-       stats = lprocfs_alloc_stats(num_stats, 0);
-       if (stats == NULL)
-               return -ENOMEM;
-
-       lprocfs_init_ops_stats(num_private_stats, stats);
-
-       for (i = num_private_stats; i < num_stats; i++) {
-               /* If this LBUGs, it is likely that an obd
-                * operation was added to struct obd_ops in
-                * <obd.h>, and that the corresponding line item
-                * LPROCFS_OBD_OP_INIT(.., .., opname)
-                * is missing from the list above. */
-               LASSERTF(stats->ls_cnt_header[i].lc_name != NULL,
-                        "Missing obd_stat initializer obd_op operation at offset %d.\n",
-                        i - num_private_stats);
-       }
-       rc = lprocfs_register_stats(obd->obd_proc_entry, "stats", stats);
-       if (rc < 0) {
-               lprocfs_free_stats(&stats);
-       } else {
-               obd->obd_stats  = stats;
-               obd->obd_cntr_base = num_private_stats;
-       }
-       return rc;
-}
-EXPORT_SYMBOL(lprocfs_alloc_obd_stats);
-
-void lprocfs_free_obd_stats(struct obd_device *obd)
-{
-       if (obd->obd_stats)
-               lprocfs_free_stats(&obd->obd_stats);
-}
-EXPORT_SYMBOL(lprocfs_free_obd_stats);
-
-#define LPROCFS_MD_OP_INIT(base, stats, op)                         \
-do {                                                               \
-       unsigned int coffset = base + MD_COUNTER_OFFSET(op);        \
-       LASSERT(coffset < stats->ls_num);                              \
-       lprocfs_counter_init(stats, coffset, 0, #op, "reqs");      \
-} while (0)
-
-void lprocfs_init_mps_stats(int num_private_stats, struct lprocfs_stats *stats)
-{
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, getstatus);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, null_inode);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, find_cbdata);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, close);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, create);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, done_writing);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, enqueue);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, getattr);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, getattr_name);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, intent_lock);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, link);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, rename);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, is_subdir);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, setattr);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, sync);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, readpage);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, unlink);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, setxattr);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, getxattr);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, init_ea_size);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, get_lustre_md);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, free_lustre_md);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, set_open_replay_data);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, clear_open_replay_data);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, set_lock_data);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, lock_match);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, cancel_unused);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, renew_capa);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, unpack_capa);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, get_remote_perm);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, intent_getattr_async);
-       LPROCFS_MD_OP_INIT(num_private_stats, stats, revalidate_lock);
-}
-EXPORT_SYMBOL(lprocfs_init_mps_stats);
-
-int lprocfs_alloc_md_stats(struct obd_device *obd,
-                          unsigned num_private_stats)
-{
-       struct lprocfs_stats *stats;
-       unsigned int num_stats;
-       int rc, i;
-
-       LASSERT(obd->md_stats == NULL);
-       LASSERT(obd->obd_proc_entry != NULL);
-       LASSERT(obd->md_cntr_base == 0);
-
-       num_stats = 1 + MD_COUNTER_OFFSET(revalidate_lock) +
-                   num_private_stats;
-       stats = lprocfs_alloc_stats(num_stats, 0);
-       if (stats == NULL)
-               return -ENOMEM;
-
-       lprocfs_init_mps_stats(num_private_stats, stats);
-
-       for (i = num_private_stats; i < num_stats; i++) {
-               if (stats->ls_cnt_header[i].lc_name == NULL) {
-                       CERROR("Missing md_stat initializer md_op operation at offset %d. Aborting.\n",
-                              i - num_private_stats);
-                       LBUG();
-               }
-       }
-       rc = lprocfs_register_stats(obd->obd_proc_entry, "md_stats", stats);
-       if (rc < 0) {
-               lprocfs_free_stats(&stats);
-       } else {
-               obd->md_stats  = stats;
-               obd->md_cntr_base = num_private_stats;
-       }
-       return rc;
-}
-EXPORT_SYMBOL(lprocfs_alloc_md_stats);
-
-void lprocfs_free_md_stats(struct obd_device *obd)
-{
-       struct lprocfs_stats *stats = obd->md_stats;
-
-       if (stats != NULL) {
-               obd->md_stats = NULL;
-               obd->md_cntr_base = 0;
-               lprocfs_free_stats(&stats);
-       }
-}
-EXPORT_SYMBOL(lprocfs_free_md_stats);
-
-void lprocfs_init_ldlm_stats(struct lprocfs_stats *ldlm_stats)
-{
-       lprocfs_counter_init(ldlm_stats,
-                            LDLM_ENQUEUE - LDLM_FIRST_OPC,
-                            0, "ldlm_enqueue", "reqs");
-       lprocfs_counter_init(ldlm_stats,
-                            LDLM_CONVERT - LDLM_FIRST_OPC,
-                            0, "ldlm_convert", "reqs");
-       lprocfs_counter_init(ldlm_stats,
-                            LDLM_CANCEL - LDLM_FIRST_OPC,
-                            0, "ldlm_cancel", "reqs");
-       lprocfs_counter_init(ldlm_stats,
-                            LDLM_BL_CALLBACK - LDLM_FIRST_OPC,
-                            0, "ldlm_bl_callback", "reqs");
-       lprocfs_counter_init(ldlm_stats,
-                            LDLM_CP_CALLBACK - LDLM_FIRST_OPC,
-                            0, "ldlm_cp_callback", "reqs");
-       lprocfs_counter_init(ldlm_stats,
-                            LDLM_GL_CALLBACK - LDLM_FIRST_OPC,
-                            0, "ldlm_gl_callback", "reqs");
-}
-EXPORT_SYMBOL(lprocfs_init_ldlm_stats);
-
-int lprocfs_exp_print_uuid(struct cfs_hash *hs, struct cfs_hash_bd *bd,
-                          struct hlist_node *hnode, void *data)
-
-{
-       struct obd_export *exp = cfs_hash_object(hs, hnode);
-       struct seq_file *m = (struct seq_file *)data;
-
-       if (exp->exp_nid_stats)
-               seq_printf(m, "%s\n", obd_uuid2str(&exp->exp_client_uuid));
-
-       return 0;
-}
-
-static int
-lproc_exp_uuid_seq_show(struct seq_file *m, void *unused)
-{
-       struct nid_stat *stats = (struct nid_stat *)m->private;
-       struct obd_device *obd = stats->nid_obd;
-
-       cfs_hash_for_each_key(obd->obd_nid_hash, &stats->nid,
-                             lprocfs_exp_print_uuid, m);
-       return 0;
-}
-
-LPROC_SEQ_FOPS_RO(lproc_exp_uuid);
-
-struct exp_hash_cb_data {
-       struct seq_file *m;
-       bool            first;
-};
-
-int lprocfs_exp_print_hash(struct cfs_hash *hs, struct cfs_hash_bd *bd,
-                          struct hlist_node *hnode, void *cb_data)
-
-{
-       struct exp_hash_cb_data *data = (struct exp_hash_cb_data *)cb_data;
-       struct obd_export       *exp = cfs_hash_object(hs, hnode);
-
-       if (exp->exp_lock_hash != NULL) {
-               if (data->first) {
-                       cfs_hash_debug_header(data->m);
-                       data->first = false;
-               }
-               cfs_hash_debug_str(hs, data->m);
-       }
-
-       return 0;
-}
-
-static int
-lproc_exp_hash_seq_show(struct seq_file *m, void *unused)
-{
-       struct nid_stat *stats = (struct nid_stat *)m->private;
-       struct obd_device *obd = stats->nid_obd;
-       struct exp_hash_cb_data cb_data = {
-               .m = m,
-               .first = true
-       };
-
-       cfs_hash_for_each_key(obd->obd_nid_hash, &stats->nid,
-                             lprocfs_exp_print_hash, &cb_data);
-       return 0;
-}
-
-LPROC_SEQ_FOPS_RO(lproc_exp_hash);
-
-int lprocfs_nid_stats_clear_read(struct seq_file *m, void *data)
-{
-       seq_printf(m, "%s\n",
-                  "Write into this file to clear all nid stats and stale nid entries");
-       return 0;
-}
-EXPORT_SYMBOL(lprocfs_nid_stats_clear_read);
-
-static int lprocfs_nid_stats_clear_write_cb(void *obj, void *data)
-{
-       struct nid_stat *stat = obj;
-
-       CDEBUG(D_INFO, "refcnt %d\n", atomic_read(&stat->nid_exp_ref_count));
-       if (atomic_read(&stat->nid_exp_ref_count) == 1) {
-               /* object has only hash references. */
-               spin_lock(&stat->nid_obd->obd_nid_lock);
-               list_move(&stat->nid_list, data);
-               spin_unlock(&stat->nid_obd->obd_nid_lock);
-               return 1;
-       }
-       /* we has reference to object - only clear data*/
-       if (stat->nid_stats)
-               lprocfs_clear_stats(stat->nid_stats);
-
-       return 0;
-}
-
-int lprocfs_nid_stats_clear_write(struct file *file, const char *buffer,
-                                 unsigned long count, void *data)
-{
-       struct obd_device *obd = (struct obd_device *)data;
-       struct nid_stat *client_stat;
-       LIST_HEAD(free_list);
-
-       cfs_hash_cond_del(obd->obd_nid_stats_hash,
-                         lprocfs_nid_stats_clear_write_cb, &free_list);
-
-       while (!list_empty(&free_list)) {
-               client_stat = list_entry(free_list.next, struct nid_stat,
-                                            nid_list);
-               list_del_init(&client_stat->nid_list);
-               lprocfs_free_client_stats(client_stat);
-       }
-
-       return count;
-}
-EXPORT_SYMBOL(lprocfs_nid_stats_clear_write);
-
-int lprocfs_exp_setup(struct obd_export *exp, lnet_nid_t *nid, int *newnid)
-{
-       struct nid_stat *new_stat, *old_stat;
-       struct obd_device *obd = NULL;
-       struct proc_dir_entry *entry;
-       char *buffer = NULL;
-       int rc = 0;
-
-       *newnid = 0;
-
-       if (!exp || !exp->exp_obd || !exp->exp_obd->obd_proc_exports_entry ||
-           !exp->exp_obd->obd_nid_stats_hash)
-               return -EINVAL;
-
-       /* not test against zero because eric say:
-        * You may only test nid against another nid, or LNET_NID_ANY.
-        * Anything else is nonsense.*/
-       if (!nid || *nid == LNET_NID_ANY)
-               return 0;
-
-       obd = exp->exp_obd;
-
-       CDEBUG(D_CONFIG, "using hash %p\n", obd->obd_nid_stats_hash);
-
-       OBD_ALLOC_PTR(new_stat);
-       if (new_stat == NULL)
-               return -ENOMEM;
-
-       new_stat->nid          = *nid;
-       new_stat->nid_obd          = exp->exp_obd;
-       /* we need set default refcount to 1 to balance obd_disconnect */
-       atomic_set(&new_stat->nid_exp_ref_count, 1);
-
-       old_stat = cfs_hash_findadd_unique(obd->obd_nid_stats_hash,
-                                          nid, &new_stat->nid_hash);
-       CDEBUG(D_INFO, "Found stats %p for nid %s - ref %d\n",
-              old_stat, libcfs_nid2str(*nid),
-              atomic_read(&new_stat->nid_exp_ref_count));
-
-       /* We need to release old stats because lprocfs_exp_cleanup() hasn't
-        * been and will never be called. */
-       if (exp->exp_nid_stats) {
-               nidstat_putref(exp->exp_nid_stats);
-               exp->exp_nid_stats = NULL;
-       }
-
-       /* Return -EALREADY here so that we know that the /proc
-        * entry already has been created */
-       if (old_stat != new_stat) {
-               exp->exp_nid_stats = old_stat;
-               rc = -EALREADY;
-               goto destroy_new;
-       }
-       /* not found - create */
-       OBD_ALLOC(buffer, LNET_NIDSTR_SIZE);
-       if (buffer == NULL) {
-               rc = -ENOMEM;
-               goto destroy_new;
-       }
-
-       memcpy(buffer, libcfs_nid2str(*nid), LNET_NIDSTR_SIZE);
-       new_stat->nid_proc = lprocfs_register(buffer,
-                                             obd->obd_proc_exports_entry,
-                                             NULL, NULL);
-       OBD_FREE(buffer, LNET_NIDSTR_SIZE);
-
-       if (IS_ERR(new_stat->nid_proc)) {
-               CERROR("Error making export directory for nid %s\n",
-                      libcfs_nid2str(*nid));
-               rc = PTR_ERR(new_stat->nid_proc);
-               new_stat->nid_proc = NULL;
-               goto destroy_new_ns;
-       }
-
-       entry = lprocfs_add_simple(new_stat->nid_proc, "uuid",
-                                  new_stat, &lproc_exp_uuid_fops);
-       if (IS_ERR(entry)) {
-               CWARN("Error adding the NID stats file\n");
-               rc = PTR_ERR(entry);
-               goto destroy_new_ns;
-       }
-
-       entry = lprocfs_add_simple(new_stat->nid_proc, "hash",
-                                  new_stat, &lproc_exp_hash_fops);
-       if (IS_ERR(entry)) {
-               CWARN("Error adding the hash file\n");
-               rc = PTR_ERR(entry);
-               goto destroy_new_ns;
-       }
-
-       exp->exp_nid_stats = new_stat;
-       *newnid = 1;
-       /* protect competitive add to list, not need locking on destroy */
-       spin_lock(&obd->obd_nid_lock);
-       list_add(&new_stat->nid_list, &obd->obd_nid_stats);
-       spin_unlock(&obd->obd_nid_lock);
-
-       return rc;
-
-destroy_new_ns:
-       if (new_stat->nid_proc != NULL)
-               lprocfs_remove(&new_stat->nid_proc);
-       cfs_hash_del(obd->obd_nid_stats_hash, nid, &new_stat->nid_hash);
-
-destroy_new:
-       nidstat_putref(new_stat);
-       OBD_FREE_PTR(new_stat);
-       return rc;
-}
-EXPORT_SYMBOL(lprocfs_exp_setup);
-
 int lprocfs_exp_cleanup(struct obd_export *exp)
 {
-       struct nid_stat *stat = exp->exp_nid_stats;
-
-       if (!stat || !exp->exp_obd)
-               return 0;
-
-       nidstat_putref(exp->exp_nid_stats);
-       exp->exp_nid_stats = NULL;
-
        return 0;
 }
 EXPORT_SYMBOL(lprocfs_exp_cleanup);
@@ -1831,31 +1309,6 @@ int lprocfs_write_helper(const char __user *buffer, unsigned long count,
 }
 EXPORT_SYMBOL(lprocfs_write_helper);
 
-int lprocfs_seq_read_frac_helper(struct seq_file *m, long val, int mult)
-{
-       long decimal_val, frac_val;
-
-       decimal_val = val / mult;
-       seq_printf(m, "%ld", decimal_val);
-       frac_val = val % mult;
-
-       if (frac_val > 0) {
-               frac_val *= 100;
-               frac_val /= mult;
-       }
-       if (frac_val > 0) {
-               /* Three cases: x0, xx, 0x */
-               if ((frac_val % 10) != 0)
-                       seq_printf(m, ".%ld", frac_val);
-               else
-                       seq_printf(m, ".%ld", frac_val / 10);
-       }
-
-       seq_printf(m, "\n");
-       return 0;
-}
-EXPORT_SYMBOL(lprocfs_seq_read_frac_helper);
-
 int lprocfs_write_u64_helper(const char __user *buffer, unsigned long count,
                             __u64 *val)
 {
@@ -1890,6 +1343,7 @@ int lprocfs_write_frac_u64_helper(const char *buffer, unsigned long count,
 
        if (*end == '.') {
                int i;
+
                pbuf = end + 1;
 
                /* need to limit frac_d to a __u32 */
@@ -1972,35 +1426,35 @@ char *lprocfs_find_named_value(const char *buffer, const char *name,
 }
 EXPORT_SYMBOL(lprocfs_find_named_value);
 
-int lprocfs_seq_create(struct proc_dir_entry *parent,
+int ldebugfs_seq_create(struct dentry *parent,
                       const char *name,
                       umode_t mode,
                       const struct file_operations *seq_fops,
                       void *data)
 {
-       struct proc_dir_entry *entry;
+       struct dentry *entry;
 
        /* Disallow secretly (un)writable entries. */
        LASSERT((seq_fops->write == NULL) == ((mode & 0222) == 0));
-       entry = proc_create_data(name, mode, parent, seq_fops, data);
 
-       if (entry == NULL)
-               return -ENOMEM;
+       entry = debugfs_create_file(name, mode, parent, data, seq_fops);
+       if (IS_ERR_OR_NULL(entry))
+               return entry ? PTR_ERR(entry) : -ENOMEM;
 
        return 0;
 }
-EXPORT_SYMBOL(lprocfs_seq_create);
+EXPORT_SYMBOL(ldebugfs_seq_create);
 
-int lprocfs_obd_seq_create(struct obd_device *dev,
-                          const char *name,
-                          umode_t mode,
-                          const struct file_operations *seq_fops,
-                          void *data)
+int ldebugfs_obd_seq_create(struct obd_device *dev,
+                           const char *name,
+                           umode_t mode,
+                           const struct file_operations *seq_fops,
+                           void *data)
 {
-       return lprocfs_seq_create(dev->obd_proc_entry, name,
-                                 mode, seq_fops, data);
+       return ldebugfs_seq_create(dev->obd_debugfs_entry, name,
+                                  mode, seq_fops, data);
 }
-EXPORT_SYMBOL(lprocfs_obd_seq_create);
+EXPORT_SYMBOL(ldebugfs_obd_seq_create);
 
 void lprocfs_oh_tally(struct obd_histogram *oh, unsigned int value)
 {
@@ -2043,17 +1497,24 @@ void lprocfs_oh_clear(struct obd_histogram *oh)
 }
 EXPORT_SYMBOL(lprocfs_oh_clear);
 
-int lprocfs_obd_rd_max_pages_per_rpc(struct seq_file *m, void *data)
+static ssize_t lustre_attr_show(struct kobject *kobj,
+                               struct attribute *attr, char *buf)
 {
-       struct obd_device *dev = data;
-       struct client_obd *cli = &dev->u.cli;
+       struct lustre_attr *a = container_of(attr, struct lustre_attr, attr);
+
+       return a->show ? a->show(kobj, attr, buf) : 0;
+}
 
-       client_obd_list_lock(&cli->cl_loi_list_lock);
-       seq_printf(m, "%d\n", cli->cl_max_pages_per_rpc);
-       client_obd_list_unlock(&cli->cl_loi_list_lock);
+static ssize_t lustre_attr_store(struct kobject *kobj, struct attribute *attr,
+                                const char *buf, size_t len)
+{
+       struct lustre_attr *a = container_of(attr, struct lustre_attr, attr);
 
-       return 0;
+       return a->store ? a->store(kobj, attr, buf, len) : len;
 }
-EXPORT_SYMBOL(lprocfs_obd_rd_max_pages_per_rpc);
 
-#endif
+const struct sysfs_ops lustre_sysfs_ops = {
+       .show  = lustre_attr_show,
+       .store = lustre_attr_store,
+};
+EXPORT_SYMBOL_GPL(lustre_sysfs_ops);