PROC(GRANTED_RES,       res,            norep),
 };
 
+static unsigned int nlm_version4_counts[ARRAY_SIZE(nlm4_procedures)];
 const struct rpc_version nlm_version4 = {
        .number         = 4,
        .nrprocs        = ARRAY_SIZE(nlm4_procedures),
        .procs          = nlm4_procedures,
+       .counts         = nlm_version4_counts,
 };
 
        PROC(GRANTED_RES,       res,            norep),
 };
 
+static unsigned int nlm_version1_counts[ARRAY_SIZE(nlm_procedures)];
 static const struct rpc_version        nlm_version1 = {
        .number         = 1,
        .nrprocs        = ARRAY_SIZE(nlm_procedures),
        .procs          = nlm_procedures,
+       .counts         = nlm_version1_counts,
 };
 
+static unsigned int nlm_version3_counts[ARRAY_SIZE(nlm_procedures)];
 static const struct rpc_version        nlm_version3 = {
        .number         = 3,
        .nrprocs        = ARRAY_SIZE(nlm_procedures),
        .procs          = nlm_procedures,
+       .counts         = nlm_version3_counts,
 };
 
 static const struct rpc_version        *nlm_versions[] = {
 
        },
 };
 
+static unsigned int nsm_version1_counts[ARRAY_SIZE(nsm_procedures)];
 static const struct rpc_version nsm_version1 = {
        .number         = 1,
        .nrprocs        = ARRAY_SIZE(nsm_procedures),
-       .procs          = nsm_procedures
+       .procs          = nsm_procedures,
+       .counts         = nsm_version1_counts,
 };
 
 static const struct rpc_version *nsm_version[] = {
 
        },
 };
 
-
+static unsigned int mnt_counts[ARRAY_SIZE(mnt_procedures)];
 static const struct rpc_version mnt_version1 = {
        .number         = 1,
        .nrprocs        = ARRAY_SIZE(mnt_procedures),
        .procs          = mnt_procedures,
+       .counts         = mnt_counts,
 };
 
+static unsigned int mnt3_counts[ARRAY_SIZE(mnt_procedures)];
 static const struct rpc_version mnt_version3 = {
        .number         = 3,
        .nrprocs        = ARRAY_SIZE(mnt3_procedures),
        .procs          = mnt3_procedures,
+       .counts         = mnt3_counts,
 };
 
 static const struct rpc_version *mnt_version[] = {
 
        PROC(STATFS,    fhandle,        statfsres,      0),
 };
 
+static unsigned int nfs_version2_counts[ARRAY_SIZE(nfs_procedures)];
 const struct rpc_version nfs_version2 = {
        .number                 = 2,
        .nrprocs                = ARRAY_SIZE(nfs_procedures),
-       .procs                  = nfs_procedures
+       .procs                  = nfs_procedures,
+       .counts                 = nfs_version2_counts,
 };
 
        PROC(COMMIT,            commit,         commit,         5),
 };
 
+static unsigned int nfs_version3_counts[ARRAY_SIZE(nfs3_procedures)];
 const struct rpc_version nfs_version3 = {
        .number                 = 3,
        .nrprocs                = ARRAY_SIZE(nfs3_procedures),
-       .procs                  = nfs3_procedures
+       .procs                  = nfs3_procedures,
+       .counts                 = nfs_version3_counts,
 };
 
 #ifdef CONFIG_NFS_V3_ACL
        },
 };
 
+static unsigned int nfs3_acl_counts[ARRAY_SIZE(nfs3_acl_procedures)];
 const struct rpc_version nfsacl_version3 = {
        .number                 = 3,
        .nrprocs                = sizeof(nfs3_acl_procedures)/
                                  sizeof(nfs3_acl_procedures[0]),
        .procs                  = nfs3_acl_procedures,
+       .counts                 = nfs3_acl_counts,
 };
 #endif  /* CONFIG_NFS_V3_ACL */
 
 #endif /* CONFIG_NFS_V4_2 */
 };
 
+static unsigned int nfs_version4_counts[ARRAY_SIZE(nfs4_procedures)];
 const struct rpc_version nfs_version4 = {
        .number                 = 4,
        .nrprocs                = ARRAY_SIZE(nfs4_procedures),
-       .procs                  = nfs4_procedures
+       .procs                  = nfs4_procedures,
+       .counts                 = nfs_version4_counts,
 };
 
 /*
 
        PROC(CB_NOTIFY_LOCK,    COMPOUND,       cb_notify_lock, cb_notify_lock),
 };
 
+static unsigned int nfs4_cb_counts[ARRAY_SIZE(nfs4_cb_procedures)];
 static struct rpc_version nfs_cb_version4 = {
 /*
  * Note on the callback rpc program version number: despite language in rfc
  */
        .number                 = 1,
        .nrprocs                = ARRAY_SIZE(nfs4_cb_procedures),
-       .procs                  = nfs4_cb_procedures
+       .procs                  = nfs4_cb_procedures,
+       .counts                 = nfs4_cb_counts,
 };
 
 static const struct rpc_version *nfs_cb_version[] = {
 
        u32                     number;         /* version number */
        unsigned int            nrprocs;        /* number of procs */
        struct rpc_procinfo *   procs;          /* procedure array */
+       unsigned int            *counts;        /* call counts */
 };
 
 /*
        kxdrdproc_t             p_decode;       /* XDR decode function */
        unsigned int            p_arglen;       /* argument hdr length (u32) */
        unsigned int            p_replen;       /* reply hdr length (u32) */
-       unsigned int            p_count;        /* call count */
        unsigned int            p_timer;        /* Which RTT timer to use */
        u32                     p_statidx;      /* Which procedure to account */
        const char *            p_name;         /* name of procedure */
 
 /*
  * Initialization stuff
  */
-
+static unsigned int gssp_version1_counts[ARRAY_SIZE(gssp_procedures)];
 static const struct rpc_version gssp_version1 = {
        .number         = GSSPROXY_VERS_1,
        .nrprocs        = ARRAY_SIZE(gssp_procedures),
        .procs          = gssp_procedures,
+       .counts         = gssp_version1_counts,
 };
 
 static const struct rpc_version *gssp_version[] = {
 
 call_start(struct rpc_task *task)
 {
        struct rpc_clnt *clnt = task->tk_client;
+       int idx = task->tk_msg.rpc_proc->p_statidx;
 
        dprintk("RPC: %5u call_start %s%d proc %s (%s)\n", task->tk_pid,
                        clnt->cl_program->name, clnt->cl_vers,
                        rpc_proc_name(task),
                        (RPC_IS_ASYNC(task) ? "async" : "sync"));
 
-       /* Increment call count */
-       task->tk_msg.rpc_proc->p_count++;
+       /* Increment call count (version might not be valid for ping) */
+       if (clnt->cl_program->version[clnt->cl_vers])
+               clnt->cl_program->version[clnt->cl_vers]->counts[idx]++;
        clnt->cl_stats->rpccnt++;
        task->tk_action = call_reserve;
 }
 
        },
 };
 
+static unsigned int rpcb_version2_counts[ARRAY_SIZE(rpcb_procedures2)];
 static const struct rpc_version rpcb_version2 = {
        .number         = RPCBVERS_2,
        .nrprocs        = ARRAY_SIZE(rpcb_procedures2),
-       .procs          = rpcb_procedures2
+       .procs          = rpcb_procedures2,
+       .counts         = rpcb_version2_counts,
 };
 
+static unsigned int rpcb_version3_counts[ARRAY_SIZE(rpcb_procedures3)];
 static const struct rpc_version rpcb_version3 = {
        .number         = RPCBVERS_3,
        .nrprocs        = ARRAY_SIZE(rpcb_procedures3),
-       .procs          = rpcb_procedures3
+       .procs          = rpcb_procedures3,
+       .counts         = rpcb_version3_counts,
 };
 
+static unsigned int rpcb_version4_counts[ARRAY_SIZE(rpcb_procedures4)];
 static const struct rpc_version rpcb_version4 = {
        .number         = RPCBVERS_4,
        .nrprocs        = ARRAY_SIZE(rpcb_procedures4),
-       .procs          = rpcb_procedures4
+       .procs          = rpcb_procedures4,
+       .counts         = rpcb_version4_counts,
 };
 
 static const struct rpc_version *rpcb_version[] = {
 
                seq_printf(seq, "proc%u %u",
                                        vers->number, vers->nrprocs);
                for (j = 0; j < vers->nrprocs; j++)
-                       seq_printf(seq, " %u",
-                                       vers->procs[j].p_count);
+                       seq_printf(seq, " %u", vers->counts[j]);
                seq_putc(seq, '\n');
        }
        return 0;