Whamcloud - gitweb
LU-7733 ptlrpc: print times in microseconds
[fs/lustre-release.git] / lustre / ptlrpc / lproc_ptlrpc.c
index 720d580..82fe468 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, 2015, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -35,9 +35,6 @@
  */
 #define DEBUG_SUBSYSTEM S_CLASS
 
-#ifndef __KERNEL__
-# include <liblustre.h>
-#endif
 
 #include <obd_support.h>
 #include <obd.h>
@@ -48,7 +45,7 @@
 #include "ptlrpc_internal.h"
 
 
-struct ll_rpc_opcode {
+static struct ll_rpc_opcode {
      __u32       opcode;
      const char *opname;
 } ll_rpc_opcode_table[LUSTRE_MAX_OPCODES] = {
@@ -73,6 +70,7 @@ struct ll_rpc_opcode {
         { OST_QUOTACHECK,   "ost_quotacheck" },
         { OST_QUOTACTL,     "ost_quotactl" },
         { OST_QUOTA_ADJUST_QUNIT, "ost_quota_adjust_qunit" },
+       { OST_LADVISE,      "ost_ladvise" },
         { MDS_GETATTR,      "mds_getattr" },
         { MDS_GETATTR_NAME, "mds_getattr_lock" },
         { MDS_CLOSE,        "mds_close" },
@@ -80,7 +78,7 @@ struct ll_rpc_opcode {
         { MDS_READPAGE,     "mds_readpage" },
         { MDS_CONNECT,      "mds_connect" },
         { MDS_DISCONNECT,   "mds_disconnect" },
-        { MDS_GETSTATUS,    "mds_getstatus" },
+       { MDS_GET_ROOT,     "mds_get_root" },
         { MDS_STATFS,       "mds_statfs" },
         { MDS_PIN,          "mds_pin" },
         { MDS_UNPIN,        "mds_unpin" },
@@ -137,10 +135,12 @@ struct ll_rpc_opcode {
         { SEC_CTX_FINI,     "sec_ctx_fini" },
        { FLD_QUERY,        "fld_query" },
        { FLD_READ,         "fld_read" },
-       { UPDATE_OBJ,       "update_obj" },
+       { OUT_UPDATE,       "out_update" },
+       { LFSCK_NOTIFY,     "lfsck_notify" },
+       { LFSCK_QUERY,      "lfsck_query" },
 };
 
-struct ll_eopcode {
+static struct ll_eopcode {
      __u32       opcode;
      const char *opname;
 } ll_eopcode_table[EXTRA_LAST_OPC] = {
@@ -179,13 +179,14 @@ const char *ll_opcode2str(__u32 opcode)
         return ll_rpc_opcode_table[offset].opname;
 }
 
-const char* ll_eopcode2str(__u32 opcode)
+static const char *ll_eopcode2str(__u32 opcode)
 {
         LASSERT(ll_eopcode_table[opcode].opcode == opcode);
         return ll_eopcode_table[opcode].opname;
 }
-#ifdef LPROCFS
-void ptlrpc_lprocfs_register(struct proc_dir_entry *root, char *dir,
+
+#ifdef CONFIG_PROC_FS
+static void ptlrpc_lprocfs_register(struct proc_dir_entry *root, char *dir,
                              char *name, struct proc_dir_entry **procroot_ret,
                              struct lprocfs_stats **stats_ret)
 {
@@ -203,7 +204,7 @@ void ptlrpc_lprocfs_register(struct proc_dir_entry *root, char *dir,
                 return;
 
         if (dir) {
-               svc_procroot = lprocfs_seq_register(dir, root, NULL, NULL);
+               svc_procroot = lprocfs_register(dir, root, NULL, NULL);
                 if (IS_ERR(svc_procroot)) {
                         lprocfs_free_stats(&svc_stats);
                         return;
@@ -268,7 +269,8 @@ ptlrpc_lprocfs_req_history_len_seq_show(struct seq_file *m, void *v)
        ptlrpc_service_for_each_part(svcpt, i, svc)
                total += svcpt->scp_hist_nrqbds;
 
-       return seq_printf(m, "%d\n", total);
+       seq_printf(m, "%d\n", total);
+       return 0;
 }
 LPROC_SEQ_FOPS_RO(ptlrpc_lprocfs_req_history_len);
 
@@ -283,40 +285,43 @@ ptlrpc_lprocfs_req_history_max_seq_show(struct seq_file *m, void *n)
        ptlrpc_service_for_each_part(svcpt, i, svc)
                total += svc->srv_hist_nrqbds_cpt_max;
 
-       return seq_printf(m, "%d\n", total);
+       seq_printf(m, "%d\n", total);
+       return 0;
 }
 
 static ssize_t
-ptlrpc_lprocfs_req_history_max_seq_write(struct file *file, const char *buffer,
+ptlrpc_lprocfs_req_history_max_seq_write(struct file *file,
+                                        const char __user *buffer,
                                         size_t count, loff_t *off)
 {
-       struct seq_file         *m = file->private_data;
-       struct ptlrpc_service   *svc = m->private;
-       int                     bufpages;
-       int                     val;
-       int                     rc;
+       struct seq_file *m = file->private_data;
+       struct ptlrpc_service *svc = m->private;
+       int bufpages;
+       __s64 val;
+       int rc;
 
-       rc = lprocfs_write_helper(buffer, count, &val);
-        if (rc < 0)
-                return rc;
+       rc = lprocfs_str_to_s64(buffer, count, &val);
+       if (rc < 0)
+               return rc;
 
-        if (val < 0)
-                return -ERANGE;
+       if (val < 0 || val > INT_MAX)
+               return -ERANGE;
 
-        /* This sanity check is more of an insanity check; we can still
-         * hose a kernel by allowing the request history to grow too
-         * far. */
+       /* This sanity check is more of an insanity check; we can still
+        * hose a kernel by allowing the request history to grow too
+        * far. */
        bufpages = (svc->srv_buf_size + PAGE_CACHE_SIZE - 1) >>
                                                        PAGE_CACHE_SHIFT;
        if (val > totalram_pages/(2 * bufpages))
-                return -ERANGE;
+               return -ERANGE;
 
        spin_lock(&svc->srv_lock);
 
        if (val == 0)
                svc->srv_hist_nrqbds_cpt_max = 0;
        else
-               svc->srv_hist_nrqbds_cpt_max = max(1, (val / svc->srv_ncpts));
+               svc->srv_hist_nrqbds_cpt_max =
+                       max(1, ((int)val / svc->srv_ncpts));
 
        spin_unlock(&svc->srv_lock);
 
@@ -329,18 +334,20 @@ ptlrpc_lprocfs_threads_min_seq_show(struct seq_file *m, void *n)
 {
        struct ptlrpc_service *svc = m->private;
 
-       return seq_printf(m, "%d\n",
-                         svc->srv_nthrs_cpt_init * svc->srv_ncpts);
+       seq_printf(m, "%d\n",
+                  svc->srv_nthrs_cpt_init * svc->srv_ncpts);
+       return 0;
 }
 
 static ssize_t
-ptlrpc_lprocfs_threads_min_seq_write(struct file *file, const char *buffer,
-                                       size_t count, loff_t *off)
+ptlrpc_lprocfs_threads_min_seq_write(struct file *file,
+                                    const char __user *buffer,
+                                    size_t count, loff_t *off)
 {
-       struct seq_file         *m = file->private_data;
-       struct ptlrpc_service   *svc = m->private;
-       int     val;
-       int     rc = lprocfs_write_helper(buffer, count, &val);
+       struct seq_file *m = file->private_data;
+       struct ptlrpc_service *svc = m->private;
+       __s64 val;
+       int rc = lprocfs_str_to_s64(buffer, count, &val);
 
        if (rc < 0)
                return rc;
@@ -354,7 +361,7 @@ ptlrpc_lprocfs_threads_min_seq_write(struct file *file, const char *buffer,
                return -ERANGE;
        }
 
-       svc->srv_nthrs_cpt_init = val / svc->srv_ncpts;
+       svc->srv_nthrs_cpt_init = (int)val / svc->srv_ncpts;
 
        spin_unlock(&svc->srv_lock);
 
@@ -373,7 +380,8 @@ ptlrpc_lprocfs_threads_started_seq_show(struct seq_file *m, void *n)
        ptlrpc_service_for_each_part(svcpt, i, svc)
                total += svcpt->scp_nthrs_running;
 
-       return seq_printf(m, "%d\n", total);
+       seq_printf(m, "%d\n", total);
+       return 0;
 }
 LPROC_SEQ_FOPS_RO(ptlrpc_lprocfs_threads_started);
 
@@ -382,18 +390,20 @@ ptlrpc_lprocfs_threads_max_seq_show(struct seq_file *m, void *n)
 {
        struct ptlrpc_service *svc = m->private;
 
-       return seq_printf(m, "%d\n",
-                         svc->srv_nthrs_cpt_limit * svc->srv_ncpts);
+       seq_printf(m, "%d\n",
+                  svc->srv_nthrs_cpt_limit * svc->srv_ncpts);
+       return 0;
 }
 
 static ssize_t
-ptlrpc_lprocfs_threads_max_seq_write(struct file *file, const char *buffer,
+ptlrpc_lprocfs_threads_max_seq_write(struct file *file,
+                                    const char __user *buffer,
                                     size_t count, loff_t *off)
 {
-       struct seq_file         *m = file->private_data;
-       struct ptlrpc_service   *svc = m->private;
-       int     val;
-       int     rc = lprocfs_write_helper(buffer, count, &val);
+       struct seq_file *m = file->private_data;
+       struct ptlrpc_service *svc = m->private;
+       __s64 val;
+       int rc = lprocfs_str_to_s64(buffer, count, &val);
 
        if (rc < 0)
                return rc;
@@ -407,7 +417,7 @@ ptlrpc_lprocfs_threads_max_seq_write(struct file *file, const char *buffer,
                return -ERANGE;
        }
 
-       svc->srv_nthrs_cpt_limit = val / svc->srv_ncpts;
+       svc->srv_nthrs_cpt_limit = (int)val / svc->srv_ncpts;
 
        spin_unlock(&svc->srv_lock);
 
@@ -416,12 +426,6 @@ ptlrpc_lprocfs_threads_max_seq_write(struct file *file, const char *buffer,
 LPROC_SEQ_FOPS(ptlrpc_lprocfs_threads_max);
 
 /**
- * \addtogoup nrs
- * @{
- */
-extern struct nrs_core nrs_core;
-
-/**
  * Translates \e ptlrpc_nrs_pol_state values to human-readable strings.
  *
  * \param[in] state The policy state
@@ -457,9 +461,11 @@ void nrs_policy_get_info_locked(struct ptlrpc_nrs_policy *policy,
 {
        LASSERT(policy != NULL);
        LASSERT(info != NULL);
-       LASSERT(spin_is_locked(&policy->pol_nrs->nrs_lock));
+       assert_spin_locked(&policy->pol_nrs->nrs_lock);
 
+       LASSERT(sizeof(info->pi_arg) == sizeof(policy->pol_arg));
        memcpy(info->pi_name, policy->pol_desc->pd_name, NRS_POL_NAME_MAX);
+       memcpy(info->pi_arg, policy->pol_arg, sizeof(policy->pol_arg));
 
        info->pi_fallback    = !!(policy->pol_flags & PTLRPC_NRS_FL_FALLBACK);
        info->pi_state       = policy->pol_state;
@@ -518,8 +524,8 @@ again:
 
                pol_idx = 0;
 
-               cfs_list_for_each_entry(policy, &nrs->nrs_policy_list,
-                                       pol_list) {
+               list_for_each_entry(policy, &nrs->nrs_policy_list,
+                                   pol_list) {
                        LASSERT(pol_idx < num_pols);
 
                        nrs_policy_get_info_locked(policy, &tmp);
@@ -530,6 +536,8 @@ again:
                        if (i == 0) {
                                memcpy(infos[pol_idx].pi_name, tmp.pi_name,
                                       NRS_POL_NAME_MAX);
+                               memcpy(infos[pol_idx].pi_arg, tmp.pi_arg,
+                                      sizeof(tmp.pi_arg));
                                memcpy(&infos[pol_idx].pi_state, &tmp.pi_state,
                                       sizeof(tmp.pi_state));
                                infos[pol_idx].pi_fallback = tmp.pi_fallback;
@@ -541,6 +549,9 @@ again:
                                LASSERT(strncmp(infos[pol_idx].pi_name,
                                                tmp.pi_name,
                                                NRS_POL_NAME_MAX) == 0);
+                               LASSERT(strncmp(infos[pol_idx].pi_arg,
+                                               tmp.pi_arg,
+                                               sizeof(tmp.pi_arg)) == 0);
                                /**
                                 * Not asserting ptlrpc_nrs_pol_info::pi_state,
                                 * because it may be different between
@@ -593,16 +604,23 @@ again:
                   "high_priority_requests:");
 
        for (pol_idx = 0; pol_idx < num_pols; pol_idx++) {
-               seq_printf(m, "  - name: %s\n"
-                             "    state: %s\n"
-                             "    fallback: %s\n"
-                             "    queued: %-20d\n"
-                             "    active: %-20d\n\n",
-                             infos[pol_idx].pi_name,
-                             nrs_state2str(infos[pol_idx].pi_state),
-                             infos[pol_idx].pi_fallback ? "yes" : "no",
-                             (int)infos[pol_idx].pi_req_queued,
-                             (int)infos[pol_idx].pi_req_started);
+               if (strlen(infos[pol_idx].pi_arg) > 0)
+                       seq_printf(m, "  - name: %s %s\n",
+                                  infos[pol_idx].pi_name,
+                                  infos[pol_idx].pi_arg);
+               else
+                       seq_printf(m, "  - name: %s\n",
+                                  infos[pol_idx].pi_name);
+
+
+               seq_printf(m, "    state: %s\n"
+                          "    fallback: %s\n"
+                          "    queued: %-20d\n"
+                          "    active: %-20d\n\n",
+                          nrs_state2str(infos[pol_idx].pi_state),
+                          infos[pol_idx].pi_fallback ? "yes" : "no",
+                          (int)infos[pol_idx].pi_req_queued,
+                          (int)infos[pol_idx].pi_req_started);
        }
 
        if (!hp && nrs_svc_has_hp(svc)) {
@@ -641,7 +659,7 @@ out:
  * regular and high-priority (if the service has one) NRS head.
  */
 static ssize_t
-ptlrpc_lprocfs_nrs_seq_write(struct file *file, const char *buffer,
+ptlrpc_lprocfs_nrs_seq_write(struct file *file, const char __user *buffer,
                             size_t count, loff_t *off)
 {
        struct seq_file                *m = file->private_data;
@@ -730,12 +748,12 @@ struct ptlrpc_srh_iterator {
        struct ptlrpc_request   *srhi_req;
 };
 
-int
+static int
 ptlrpc_lprocfs_svc_req_history_seek(struct ptlrpc_service_part *svcpt,
                                    struct ptlrpc_srh_iterator *srhi,
                                    __u64 seq)
 {
-       cfs_list_t              *e;
+       struct list_head        *e;
        struct ptlrpc_request   *req;
 
        if (srhi->srhi_req != NULL &&
@@ -751,7 +769,7 @@ ptlrpc_lprocfs_svc_req_history_seek(struct ptlrpc_service_part *svcpt,
                         "%s:%d: seek seq "LPU64", request seq "LPU64"\n",
                         svcpt->scp_service->srv_name, svcpt->scp_cpt,
                         srhi->srhi_seq, srhi->srhi_req->rq_history_seq);
-               LASSERTF(!cfs_list_empty(&svcpt->scp_hist_reqs),
+               LASSERTF(!list_empty(&svcpt->scp_hist_reqs),
                         "%s:%d: seek offset "LPU64", request seq "LPU64", "
                         "last culled "LPU64"\n",
                         svcpt->scp_service->srv_name, svcpt->scp_cpt,
@@ -763,7 +781,7 @@ ptlrpc_lprocfs_svc_req_history_seek(struct ptlrpc_service_part *svcpt,
        }
 
        while (e != &svcpt->scp_hist_reqs) {
-                req = cfs_list_entry(e, struct ptlrpc_request, rq_history_list);
+               req = list_entry(e, struct ptlrpc_request, rq_history_list);
 
                 if (req->rq_history_seq >= seq) {
                         srhi->srhi_seq = req->rq_history_seq;
@@ -945,27 +963,41 @@ static int ptlrpc_lprocfs_svc_req_history_show(struct seq_file *s, void *iter)
 
        rc = ptlrpc_lprocfs_svc_req_history_seek(svcpt, srhi, srhi->srhi_seq);
 
-        if (rc == 0) {
-                req = srhi->srhi_req;
-
-                /* Print common req fields.
-                 * CAVEAT EMPTOR: we're racing with the service handler
-                 * here.  The request could contain any old crap, so you
-                 * must be just as careful as the service's request
-                 * parser. Currently I only print stuff here I know is OK
-                 * to look at coz it was set up in request_in_callback()!!! */
-                seq_printf(s, LPD64":%s:%s:x"LPU64":%d:%s:%ld:%lds(%+lds) ",
-                           req->rq_history_seq, libcfs_nid2str(req->rq_self),
-                           libcfs_id2str(req->rq_peer), req->rq_xid,
-                           req->rq_reqlen, ptlrpc_rqphase2str(req),
-                           req->rq_arrival_time.tv_sec,
-                           req->rq_sent - req->rq_arrival_time.tv_sec,
-                           req->rq_sent - req->rq_deadline);
+       if (rc == 0) {
+               struct timespec arrival, sent, arrivaldiff;
+               char nidstr[LNET_NIDSTR_SIZE];
+
+               req = srhi->srhi_req;
+
+               libcfs_nid2str_r(req->rq_self, nidstr, sizeof(nidstr));
+               arrival.tv_sec = req->rq_arrival_time.tv_sec;
+               arrival.tv_nsec =
+                       req->rq_arrival_time.tv_usec * NSEC_PER_USEC;
+               sent.tv_sec = req->rq_sent;
+               sent.tv_nsec = 0;
+               arrivaldiff = timespec_sub(sent, arrival);
+
+               /* Print common req fields.
+                * CAVEAT EMPTOR: we're racing with the service handler
+                * here.  The request could contain any old crap, so you
+                * must be just as careful as the service's request
+                * parser. Currently I only print stuff here I know is OK
+                * to look at coz it was set up in request_in_callback()!!! */
+               seq_printf(s, LPD64":%s:%s:x"LPU64":%d:%s:"
+                          "%ld.%06ld:%ld.%06lds(%+ld.0s) ",
+                          req->rq_history_seq, nidstr,
+                          libcfs_id2str(req->rq_peer), req->rq_xid,
+                          req->rq_reqlen, ptlrpc_rqphase2str(req),
+                          req->rq_arrival_time.tv_sec,
+                          req->rq_arrival_time.tv_usec,
+                          arrivaldiff.tv_sec,
+                          arrivaldiff.tv_nsec / NSEC_PER_USEC,
+                          req->rq_sent - req->rq_deadline);
                if (svc->srv_ops.so_req_printer == NULL)
                        seq_printf(s, "\n");
                else
                        svc->srv_ops.so_req_printer(s, srhi->srhi_req);
-        }
+       }
 
        spin_unlock(&svcpt->scp_lock);
        return rc;
@@ -983,7 +1015,10 @@ ptlrpc_lprocfs_svc_req_history_open(struct inode *inode, struct file *file)
        struct seq_file *seqf;
        int             rc;
 
-       LPROCFS_ENTRY_CHECK(PDE(inode));
+       rc = LPROCFS_ENTRY_CHECK(inode);
+       if (rc < 0)
+               return rc;
+
        rc = seq_open(file, &sops);
        if (rc)
                return rc;
@@ -1020,7 +1055,7 @@ static int ptlrpc_lprocfs_timeouts_seq_show(struct seq_file *m, void *n)
                           DHMS_FMT" ago) ", "service",
                           cur, worst, worstt, DHMS_VARS(&ts));
 
-               lprocfs_seq_at_hist_helper(m, &svcpt->scp_at_estimate);
+               lprocfs_at_hist_helper(m, &svcpt->scp_at_estimate);
        }
 
        return 0;
@@ -1030,23 +1065,24 @@ LPROC_SEQ_FOPS_RO(ptlrpc_lprocfs_timeouts);
 static int ptlrpc_lprocfs_hp_ratio_seq_show(struct seq_file *m, void *v)
 {
        struct ptlrpc_service *svc = m->private;
-       return seq_printf(m, "%d\n", svc->srv_hpreq_ratio);
+       seq_printf(m, "%d\n", svc->srv_hpreq_ratio);
+       return 0;
 }
 
 static ssize_t
-ptlrpc_lprocfs_hp_ratio_seq_write(struct file *file, const char *buffer,
+ptlrpc_lprocfs_hp_ratio_seq_write(struct file *file, const char __user *buffer,
                                  size_t count, loff_t *off)
 {
-       struct seq_file         *m = file->private_data;
-       struct ptlrpc_service   *svc = m->private;
-       int     rc;
-       int     val;
+       struct seq_file *m = file->private_data;
+       struct ptlrpc_service *svc = m->private;
+       int rc;
+       __s64 val;
 
-       rc = lprocfs_write_helper(buffer, count, &val);
+       rc = lprocfs_str_to_s64(buffer, count, &val);
        if (rc < 0)
                return rc;
 
-       if (val < 0)
+       if (val < 0 || val > INT_MAX)
                return -ERANGE;
 
        spin_lock(&svc->srv_lock);
@@ -1060,7 +1096,7 @@ LPROC_SEQ_FOPS(ptlrpc_lprocfs_hp_ratio);
 void ptlrpc_lprocfs_register_service(struct proc_dir_entry *entry,
                                      struct ptlrpc_service *svc)
 {
-       struct lprocfs_seq_vars lproc_vars[] = {
+       struct lprocfs_vars lproc_vars[] = {
                { .name = "high_priority_ratio",
                  .fops = &ptlrpc_lprocfs_hp_ratio_fops,
                  .data = svc },
@@ -1103,7 +1139,7 @@ void ptlrpc_lprocfs_register_service(struct proc_dir_entry *entry,
        if (svc->srv_procroot == NULL)
                return;
 
-       lprocfs_seq_add_vars(svc->srv_procroot, lproc_vars, NULL);
+       lprocfs_add_vars(svc->srv_procroot, lproc_vars, NULL);
 
        rc = lprocfs_seq_create(svc->srv_procroot, "req_history",
                                0400, &req_history_fops, svc);
@@ -1180,139 +1216,8 @@ void ptlrpc_lprocfs_unregister_obd(struct obd_device *obd)
 }
 EXPORT_SYMBOL(ptlrpc_lprocfs_unregister_obd);
 
-#ifndef HAVE_ONLY_PROCFS_SEQ
-int lprocfs_wr_ping(struct file *file, const char *buffer,
-                    unsigned long count, void *data)
-{
-        struct obd_device     *obd = data;
-        struct ptlrpc_request *req;
-        int                    rc;
-        ENTRY;
-
-        LPROCFS_CLIMP_CHECK(obd);
-        req = ptlrpc_prep_ping(obd->u.cli.cl_import);
-        LPROCFS_CLIMP_EXIT(obd);
-        if (req == NULL)
-                RETURN(-ENOMEM);
-
-        req->rq_send_state = LUSTRE_IMP_FULL;
-
-        rc = ptlrpc_queue_wait(req);
-
-        ptlrpc_req_finished(req);
-        if (rc >= 0)
-                RETURN(count);
-        RETURN(rc);
-}
-EXPORT_SYMBOL(lprocfs_wr_ping);
-
-int lprocfs_wr_import(struct file *file, const char *buffer,
-                      unsigned long count, void *data)
-{
-        struct obd_device *obd = data;
-        struct obd_import *imp = obd->u.cli.cl_import;
-        char *kbuf = NULL;
-        char *uuid;
-        char *ptr;
-        int do_reconn = 1;
-        const char prefix[] = "connection=";
-        const int prefix_len = sizeof(prefix) - 1;
-
-       if (count > PAGE_CACHE_SIZE - 1 || count <= prefix_len)
-                return -EINVAL;
-
-        OBD_ALLOC(kbuf, count + 1);
-        if (kbuf == NULL)
-                return -ENOMEM;
-
-       if (copy_from_user(kbuf, buffer, count))
-                GOTO(out, count = -EFAULT);
-
-        kbuf[count] = 0;
-
-        /* only support connection=uuid::instance now */
-        if (strncmp(prefix, kbuf, prefix_len) != 0)
-                GOTO(out, count = -EINVAL);
-
-        uuid = kbuf + prefix_len;
-        ptr = strstr(uuid, "::");
-        if (ptr) {
-                __u32 inst;
-                char *endptr;
-
-                *ptr = 0;
-                do_reconn = 0;
-                ptr += strlen("::");
-                inst = simple_strtol(ptr, &endptr, 10);
-                if (*endptr) {
-                        CERROR("config: wrong instance # %s\n", ptr);
-                } else if (inst != imp->imp_connect_data.ocd_instance) {
-                        CDEBUG(D_INFO, "IR: %s is connecting to an obsoleted "
-                               "target(%u/%u), reconnecting...\n",
-                               imp->imp_obd->obd_name,
-                               imp->imp_connect_data.ocd_instance, inst);
-                        do_reconn = 1;
-                } else {
-                        CDEBUG(D_INFO, "IR: %s has already been connecting to "
-                               "new target(%u)\n",
-                               imp->imp_obd->obd_name, inst);
-                }
-        }
-
-        if (do_reconn)
-                ptlrpc_recover_import(imp, uuid, 1);
-
-out:
-        OBD_FREE(kbuf, count + 1);
-        return count;
-}
-EXPORT_SYMBOL(lprocfs_wr_import);
-
-int lprocfs_rd_pinger_recov(char *page, char **start, off_t off,
-                            int count, int *eof, void *data)
-{
-        struct obd_device *obd = data;
-        struct obd_import *imp = obd->u.cli.cl_import;
-        int rc;
-
-        LPROCFS_CLIMP_CHECK(obd);
-        rc = snprintf(page, count, "%d\n", !imp->imp_no_pinger_recover);
-        LPROCFS_CLIMP_EXIT(obd);
-
-        return rc;
-}
-EXPORT_SYMBOL(lprocfs_rd_pinger_recov);
-
-int lprocfs_wr_pinger_recov(struct file *file, const char *buffer,
-                      unsigned long count, void *data)
-{
-        struct obd_device *obd = data;
-        struct client_obd *cli = &obd->u.cli;
-        struct obd_import *imp = cli->cl_import;
-        int rc, val;
-
-        rc = lprocfs_write_helper(buffer, count, &val);
-        if (rc < 0)
-                return rc;
-
-        if (val != 0 && val != 1)
-                return -ERANGE;
-
-        LPROCFS_CLIMP_CHECK(obd);
-       spin_lock(&imp->imp_lock);
-       imp->imp_no_pinger_recover = !val;
-       spin_unlock(&imp->imp_lock);
-       LPROCFS_CLIMP_EXIT(obd);
-
-       return count;
-
-}
-EXPORT_SYMBOL(lprocfs_wr_pinger_recov);
-
-#endif /* HAVE_ONLY_PROCFS_SEQ */
-
 ssize_t
-lprocfs_ping_seq_write(struct file *file, const char *buffer,
+lprocfs_ping_seq_write(struct file *file, const char __user *buffer,
                       size_t count, loff_t *off)
 {
        struct seq_file         *m = file->private_data;
@@ -1343,8 +1248,8 @@ EXPORT_SYMBOL(lprocfs_ping_seq_write);
  * "echo connection=192.168.0.1@tcp0::instance > .../import".
  */
 ssize_t
-lprocfs_import_seq_write(struct file *file, const char *buffer, size_t count,
-                        loff_t *off)
+lprocfs_import_seq_write(struct file *file, const char __user *buffer,
+                        size_t count, loff_t *off)
 {
        struct seq_file   *m    = file->private_data;
        struct obd_device *obd  = m->private;
@@ -1380,7 +1285,7 @@ lprocfs_import_seq_write(struct file *file, const char *buffer, size_t count,
 
                *ptr = 0;
                do_reconn = 0;
-               ptr += strlen("::");
+               ptr += 2; /* Skip :: */
                inst = simple_strtol(ptr, &endptr, 10);
                if (*endptr) {
                        CERROR("config: wrong instance # %s\n", ptr);
@@ -1410,26 +1315,26 @@ int lprocfs_pinger_recov_seq_show(struct seq_file *m, void *n)
 {
        struct obd_device *obd = m->private;
        struct obd_import *imp = obd->u.cli.cl_import;
-       int rc;
 
        LPROCFS_CLIMP_CHECK(obd);
-       rc = seq_printf(m, "%d\n", !imp->imp_no_pinger_recover);
+       seq_printf(m, "%d\n", !imp->imp_no_pinger_recover);
        LPROCFS_CLIMP_EXIT(obd);
-       return rc;
+       return 0;
 }
 EXPORT_SYMBOL(lprocfs_pinger_recov_seq_show);
 
 ssize_t
-lprocfs_pinger_recov_seq_write(struct file *file, const char *buffer,
+lprocfs_pinger_recov_seq_write(struct file *file, const char __user *buffer,
                               size_t count, loff_t *off)
 {
-       struct seq_file   *m    = file->private_data;
-       struct obd_device *obd  = m->private;
-       struct client_obd *cli  = &obd->u.cli;
-       struct obd_import *imp  = cli->cl_import;
-       int rc, val;
+       struct seq_file *m = file->private_data;
+       struct obd_device *obd = m->private;
+       struct client_obd *cli = &obd->u.cli;
+       struct obd_import *imp = cli->cl_import;
+       int rc;
+       __s64 val;
 
-       rc = lprocfs_write_helper(buffer, count, &val);
+       rc = lprocfs_str_to_s64(buffer, count, &val);
        if (rc < 0)
                return rc;
 
@@ -1445,4 +1350,4 @@ lprocfs_pinger_recov_seq_write(struct file *file, const char *buffer,
 }
 EXPORT_SYMBOL(lprocfs_pinger_recov_seq_write);
 
-#endif /* LPROCFS */
+#endif /* CONFIG_PROC_FS */