int    nfsd_drc_slab_create(void);
 void   nfsd_drc_slab_free(void);
-int    nfsd_net_reply_cache_init(struct nfsd_net *nn);
-void   nfsd_net_reply_cache_destroy(struct nfsd_net *nn);
 int    nfsd_reply_cache_init(struct nfsd_net *);
 void   nfsd_reply_cache_shutdown(struct nfsd_net *);
 int    nfsd_cache_lookup(struct svc_rqst *rqstp, unsigned int start,
 
 #include <net/net_namespace.h>
 #include <net/netns/generic.h>
 #include <linux/filelock.h>
+#include <linux/nfs4.h>
 #include <linux/percpu_counter.h>
 #include <linux/siphash.h>
 
        NFSD_STATS_PAYLOAD_MISSES,
        /* amount of memory (in bytes) currently consumed by the DRC */
        NFSD_STATS_DRC_MEM_USAGE,
-       NFSD_NET_COUNTERS_NUM
+       NFSD_STATS_RC_HITS,             /* repcache hits */
+       NFSD_STATS_RC_MISSES,           /* repcache misses */
+       NFSD_STATS_RC_NOCACHE,          /* uncached reqs */
+       NFSD_STATS_FH_STALE,            /* FH stale error */
+       NFSD_STATS_IO_READ,             /* bytes returned to read requests */
+       NFSD_STATS_IO_WRITE,            /* bytes passed in write requests */
+#ifdef CONFIG_NFSD_V4
+       NFSD_STATS_FIRST_NFS4_OP,       /* count of individual nfsv4 operations */
+       NFSD_STATS_LAST_NFS4_OP = NFSD_STATS_FIRST_NFS4_OP + LAST_NFS4_OP,
+#define NFSD_STATS_NFS4_OP(op) (NFSD_STATS_FIRST_NFS4_OP + (op))
+       NFSD_STATS_WDELEG_GETATTR,      /* count of getattr conflict with wdeleg */
+#endif
+       NFSD_STATS_COUNTERS_NUM
 };
 
 /*
        atomic_t                 num_drc_entries;
 
        /* Per-netns stats counters */
-       struct percpu_counter    counter[NFSD_NET_COUNTERS_NUM];
+       struct percpu_counter    counter[NFSD_STATS_COUNTERS_NUM];
 
        /* longest hash chain seen */
        unsigned int             longest_chain;
 
        return rpc_success;
 }
 
-static inline void nfsd4_increment_op_stats(u32 opnum)
+static inline void nfsd4_increment_op_stats(struct nfsd_net *nn, u32 opnum)
 {
        if (opnum >= FIRST_NFS4_OP && opnum <= LAST_NFS4_OP)
-               percpu_counter_inc(&nfsdstats.counter[NFSD_STATS_NFS4_OP(opnum)]);
+               percpu_counter_inc(&nn->counter[NFSD_STATS_NFS4_OP(opnum)]);
 }
 
 static const struct nfsd4_operation nfsd4_ops[];
                                           status, nfsd4_op_name(op->opnum));
 
                nfsd4_cstate_clear_replay(cstate);
-               nfsd4_increment_op_stats(op->opnum);
+               nfsd4_increment_op_stats(nn, op->opnum);
        }
 
        fh_put(current_fh);
 
 nfsd4_deleg_getattr_conflict(struct svc_rqst *rqstp, struct inode *inode)
 {
        __be32 status;
+       struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
        struct file_lock_context *ctx;
        struct file_lock *fl;
        struct nfs4_delegation *dp;
                        }
 break_lease:
                        spin_unlock(&ctx->flc_lock);
-                       nfsd_stats_wdeleg_getattr_inc();
+                       nfsd_stats_wdeleg_getattr_inc(nn);
                        status = nfserrno(nfsd_open_break_lease(inode, NFSD_MAY_READ));
                        if (status != nfserr_jukebox ||
                                        !nfsd_wait_for_delegreturn(rqstp, inode))
 
        kmem_cache_destroy(drc_slab);
 }
 
-/**
- * nfsd_net_reply_cache_init - per net namespace reply cache set-up
- * @nn: nfsd_net being initialized
- *
- * Returns zero on succes; otherwise a negative errno is returned.
- */
-int nfsd_net_reply_cache_init(struct nfsd_net *nn)
-{
-       return nfsd_percpu_counters_init(nn->counter, NFSD_NET_COUNTERS_NUM);
-}
-
-/**
- * nfsd_net_reply_cache_destroy - per net namespace reply cache tear-down
- * @nn: nfsd_net being freed
- *
- */
-void nfsd_net_reply_cache_destroy(struct nfsd_net *nn)
-{
-       nfsd_percpu_counters_destroy(nn->counter, NFSD_NET_COUNTERS_NUM);
-}
-
 int nfsd_reply_cache_init(struct nfsd_net *nn)
 {
        unsigned int hashsize;
 int nfsd_cache_lookup(struct svc_rqst *rqstp, unsigned int start,
                      unsigned int len, struct nfsd_cacherep **cacherep)
 {
-       struct nfsd_net         *nn;
+       struct nfsd_net         *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
        struct nfsd_cacherep    *rp, *found;
        __wsum                  csum;
        struct nfsd_drc_bucket  *b;
        int rtn = RC_DOIT;
 
        if (type == RC_NOCACHE) {
-               nfsd_stats_rc_nocache_inc();
+               nfsd_stats_rc_nocache_inc(nn);
                goto out;
        }
 
         * Since the common case is a cache miss followed by an insert,
         * preallocate an entry.
         */
-       nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
        rp = nfsd_cacherep_alloc(rqstp, csum, nn);
        if (!rp)
                goto out;
 
        nfsd_cacherep_dispose(&dispose);
 
-       nfsd_stats_rc_misses_inc();
+       nfsd_stats_rc_misses_inc(nn);
        atomic_inc(&nn->num_drc_entries);
        nfsd_stats_drc_mem_usage_add(nn, sizeof(*rp));
        goto out;
 found_entry:
        /* We found a matching entry which is either in progress or done. */
        nfsd_reply_cache_free_locked(NULL, rp, nn);
-       nfsd_stats_rc_hits_inc();
+       nfsd_stats_rc_hits_inc(nn);
        rtn = RC_DROPIT;
        rp = found;
 
        seq_printf(m, "mem usage:             %lld\n",
                   percpu_counter_sum_positive(&nn->counter[NFSD_STATS_DRC_MEM_USAGE]));
        seq_printf(m, "cache hits:            %lld\n",
-                  percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_RC_HITS]));
+                  percpu_counter_sum_positive(&nn->counter[NFSD_STATS_RC_HITS]));
        seq_printf(m, "cache misses:          %lld\n",
-                  percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_RC_MISSES]));
+                  percpu_counter_sum_positive(&nn->counter[NFSD_STATS_RC_MISSES]));
        seq_printf(m, "not cached:            %lld\n",
-                  percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_RC_NOCACHE]));
+                  percpu_counter_sum_positive(&nn->counter[NFSD_STATS_RC_NOCACHE]));
        seq_printf(m, "payload misses:        %lld\n",
                   percpu_counter_sum_positive(&nn->counter[NFSD_STATS_PAYLOAD_MISSES]));
        seq_printf(m, "longest chain len:     %u\n", nn->longest_chain);
 
        retval = nfsd_idmap_init(net);
        if (retval)
                goto out_idmap_error;
-       retval = nfsd_net_reply_cache_init(nn);
+       retval = nfsd_stat_counters_init(nn);
        if (retval)
                goto out_repcache_error;
        nn->nfsd_versions = NULL;
        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 
        nfsd_proc_stat_shutdown(net);
-       nfsd_net_reply_cache_destroy(nn);
+       nfsd_stat_counters_destroy(nn);
        nfsd_idmap_shutdown(net);
        nfsd_export_shutdown(net);
        nfsd_netns_free_versions(nn);
        retval = nfsd4_init_pnfs();
        if (retval)
                goto out_free_slabs;
-       retval = nfsd_stat_counters_init();     /* Statistics */
-       if (retval)
-               goto out_free_pnfs;
        retval = nfsd_drc_slab_create();
        if (retval)
-               goto out_free_stat;
+               goto out_free_pnfs;
        nfsd_lockd_init();      /* lockd->nfsd callbacks */
        retval = create_proc_exports_entry();
        if (retval)
 out_free_lockd:
        nfsd_lockd_shutdown();
        nfsd_drc_slab_free();
-out_free_stat:
-       nfsd_stat_counters_destroy();
 out_free_pnfs:
        nfsd4_exit_pnfs();
 out_free_slabs:
        nfsd_drc_slab_free();
        remove_proc_entry("fs/nfs/exports", NULL);
        remove_proc_entry("fs/nfs", NULL);
-       nfsd_stat_counters_destroy();
        nfsd_lockd_shutdown();
        nfsd4_free_slabs();
        nfsd4_exit_pnfs();
 
 __be32
 fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, umode_t type, int access)
 {
+       struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
        struct svc_export *exp = NULL;
        struct dentry   *dentry;
        __be32          error;
 out:
        trace_nfsd_fh_verify_err(rqstp, fhp, type, access, error);
        if (error == nfserr_stale)
-               nfsd_stats_fh_stale_inc(exp);
+               nfsd_stats_fh_stale_inc(nn, exp);
        return error;
 }
 
 
 
 static int nfsd_show(struct seq_file *seq, void *v)
 {
+       struct net *net = pde_data(file_inode(seq->file));
+       struct nfsd_net *nn = net_generic(net, nfsd_net_id);
        int i;
 
        seq_printf(seq, "rc %lld %lld %lld\nfh %lld 0 0 0 0\nio %lld %lld\n",
-                  percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_RC_HITS]),
-                  percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_RC_MISSES]),
-                  percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_RC_NOCACHE]),
-                  percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_FH_STALE]),
-                  percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_IO_READ]),
-                  percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_IO_WRITE]));
+                  percpu_counter_sum_positive(&nn->counter[NFSD_STATS_RC_HITS]),
+                  percpu_counter_sum_positive(&nn->counter[NFSD_STATS_RC_MISSES]),
+                  percpu_counter_sum_positive(&nn->counter[NFSD_STATS_RC_NOCACHE]),
+                  percpu_counter_sum_positive(&nn->counter[NFSD_STATS_FH_STALE]),
+                  percpu_counter_sum_positive(&nn->counter[NFSD_STATS_IO_READ]),
+                  percpu_counter_sum_positive(&nn->counter[NFSD_STATS_IO_WRITE]));
 
        /* thread usage: */
        seq_printf(seq, "th %u 0", atomic_read(&nfsdstats.th_cnt));
        seq_printf(seq, "proc4ops %u", LAST_NFS4_OP + 1);
        for (i = 0; i <= LAST_NFS4_OP; i++) {
                seq_printf(seq, " %lld",
-                          percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_NFS4_OP(i)]));
+                          percpu_counter_sum_positive(&nn->counter[NFSD_STATS_NFS4_OP(i)]));
        }
        seq_printf(seq, "\nwdeleg_getattr %lld",
-               percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_WDELEG_GETATTR]));
+               percpu_counter_sum_positive(&nn->counter[NFSD_STATS_WDELEG_GETATTR]));
 
        seq_putc(seq, '\n');
 #endif
                percpu_counter_destroy(&counters[i]);
 }
 
-int nfsd_stat_counters_init(void)
+int nfsd_stat_counters_init(struct nfsd_net *nn)
 {
-       return nfsd_percpu_counters_init(nfsdstats.counter, NFSD_STATS_COUNTERS_NUM);
+       return nfsd_percpu_counters_init(nn->counter, NFSD_STATS_COUNTERS_NUM);
 }
 
-void nfsd_stat_counters_destroy(void)
+void nfsd_stat_counters_destroy(struct nfsd_net *nn)
 {
-       nfsd_percpu_counters_destroy(nfsdstats.counter, NFSD_STATS_COUNTERS_NUM);
+       nfsd_percpu_counters_destroy(nn->counter, NFSD_STATS_COUNTERS_NUM);
 }
 
 void nfsd_proc_stat_init(struct net *net)
 
 #include <uapi/linux/nfsd/stats.h>
 #include <linux/percpu_counter.h>
 
-
-enum {
-       NFSD_STATS_RC_HITS,             /* repcache hits */
-       NFSD_STATS_RC_MISSES,           /* repcache misses */
-       NFSD_STATS_RC_NOCACHE,          /* uncached reqs */
-       NFSD_STATS_FH_STALE,            /* FH stale error */
-       NFSD_STATS_IO_READ,             /* bytes returned to read requests */
-       NFSD_STATS_IO_WRITE,            /* bytes passed in write requests */
-#ifdef CONFIG_NFSD_V4
-       NFSD_STATS_FIRST_NFS4_OP,       /* count of individual nfsv4 operations */
-       NFSD_STATS_LAST_NFS4_OP = NFSD_STATS_FIRST_NFS4_OP + LAST_NFS4_OP,
-#define NFSD_STATS_NFS4_OP(op) (NFSD_STATS_FIRST_NFS4_OP + (op))
-       NFSD_STATS_WDELEG_GETATTR,      /* count of getattr conflict with wdeleg */
-#endif
-       NFSD_STATS_COUNTERS_NUM
-};
-
 struct nfsd_stats {
-       struct percpu_counter   counter[NFSD_STATS_COUNTERS_NUM];
-
        atomic_t        th_cnt;         /* number of available threads */
 };
 
 int nfsd_percpu_counters_init(struct percpu_counter *counters, int num);
 void nfsd_percpu_counters_reset(struct percpu_counter *counters, int num);
 void nfsd_percpu_counters_destroy(struct percpu_counter *counters, int num);
-int nfsd_stat_counters_init(void);
-void nfsd_stat_counters_destroy(void);
+int nfsd_stat_counters_init(struct nfsd_net *nn);
+void nfsd_stat_counters_destroy(struct nfsd_net *nn);
 void nfsd_proc_stat_init(struct net *net);
 void nfsd_proc_stat_shutdown(struct net *net);
 
-static inline void nfsd_stats_rc_hits_inc(void)
+static inline void nfsd_stats_rc_hits_inc(struct nfsd_net *nn)
 {
-       percpu_counter_inc(&nfsdstats.counter[NFSD_STATS_RC_HITS]);
+       percpu_counter_inc(&nn->counter[NFSD_STATS_RC_HITS]);
 }
 
-static inline void nfsd_stats_rc_misses_inc(void)
+static inline void nfsd_stats_rc_misses_inc(struct nfsd_net *nn)
 {
-       percpu_counter_inc(&nfsdstats.counter[NFSD_STATS_RC_MISSES]);
+       percpu_counter_inc(&nn->counter[NFSD_STATS_RC_MISSES]);
 }
 
-static inline void nfsd_stats_rc_nocache_inc(void)
+static inline void nfsd_stats_rc_nocache_inc(struct nfsd_net *nn)
 {
-       percpu_counter_inc(&nfsdstats.counter[NFSD_STATS_RC_NOCACHE]);
+       percpu_counter_inc(&nn->counter[NFSD_STATS_RC_NOCACHE]);
 }
 
-static inline void nfsd_stats_fh_stale_inc(struct svc_export *exp)
+static inline void nfsd_stats_fh_stale_inc(struct nfsd_net *nn,
+                                          struct svc_export *exp)
 {
-       percpu_counter_inc(&nfsdstats.counter[NFSD_STATS_FH_STALE]);
+       percpu_counter_inc(&nn->counter[NFSD_STATS_FH_STALE]);
        if (exp && exp->ex_stats)
                percpu_counter_inc(&exp->ex_stats->counter[EXP_STATS_FH_STALE]);
 }
 
-static inline void nfsd_stats_io_read_add(struct svc_export *exp, s64 amount)
+static inline void nfsd_stats_io_read_add(struct nfsd_net *nn,
+                                         struct svc_export *exp, s64 amount)
 {
-       percpu_counter_add(&nfsdstats.counter[NFSD_STATS_IO_READ], amount);
+       percpu_counter_add(&nn->counter[NFSD_STATS_IO_READ], amount);
        if (exp && exp->ex_stats)
                percpu_counter_add(&exp->ex_stats->counter[EXP_STATS_IO_READ], amount);
 }
 
-static inline void nfsd_stats_io_write_add(struct svc_export *exp, s64 amount)
+static inline void nfsd_stats_io_write_add(struct nfsd_net *nn,
+                                          struct svc_export *exp, s64 amount)
 {
-       percpu_counter_add(&nfsdstats.counter[NFSD_STATS_IO_WRITE], amount);
+       percpu_counter_add(&nn->counter[NFSD_STATS_IO_WRITE], amount);
        if (exp && exp->ex_stats)
                percpu_counter_add(&exp->ex_stats->counter[EXP_STATS_IO_WRITE], amount);
 }
 }
 
 #ifdef CONFIG_NFSD_V4
-static inline void nfsd_stats_wdeleg_getattr_inc(void)
+static inline void nfsd_stats_wdeleg_getattr_inc(struct nfsd_net *nn)
 {
-       percpu_counter_inc(&nfsdstats.counter[NFSD_STATS_WDELEG_GETATTR]);
+       percpu_counter_inc(&nn->counter[NFSD_STATS_WDELEG_GETATTR]);
 }
 #endif
 #endif /* _NFSD_STATS_H */
 
                               unsigned long *count, u32 *eof, ssize_t host_err)
 {
        if (host_err >= 0) {
-               nfsd_stats_io_read_add(fhp->fh_export, host_err);
+               struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
+
+               nfsd_stats_io_read_add(nn, fhp->fh_export, host_err);
                *eof = nfsd_eof_on_read(file, offset, host_err, *count);
                *count = host_err;
                fsnotify_access(file);
                goto out_nfserr;
        }
        *cnt = host_err;
-       nfsd_stats_io_write_add(exp, *cnt);
+       nfsd_stats_io_write_add(nn, exp, *cnt);
        fsnotify_modify(file);
        host_err = filemap_check_wb_err(file->f_mapping, since);
        if (host_err < 0)