From: Greg Banks add svc_get() for those occasions when we need to temporarily bump up svc_serv->sv_nrthreads as a pseudo refcount. Signed-off-by: Greg Banks Signed-off-by: Neil Brown Signed-off-by: Andrew Morton --- fs/nfsd/nfssvc.c | 2 +- include/linux/sunrpc/svc.h | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff -puN fs/nfsd/nfssvc.c~knfsd-add-svc_get fs/nfsd/nfssvc.c --- a/fs/nfsd/nfssvc.c~knfsd-add-svc_get +++ a/fs/nfsd/nfssvc.c @@ -200,7 +200,7 @@ int nfsd_create_serv(void) int err = 0; lock_kernel(); if (nfsd_serv) { - nfsd_serv->sv_nrthreads++; + svc_get(nfsd_serv); unlock_kernel(); return 0; } diff -puN include/linux/sunrpc/svc.h~knfsd-add-svc_get include/linux/sunrpc/svc.h --- a/include/linux/sunrpc/svc.h~knfsd-add-svc_get +++ a/include/linux/sunrpc/svc.h @@ -71,6 +71,17 @@ struct svc_serv { }; /* + * We use sv_nrthreads as a reference count. svc_destroy() drops + * this refcount, so we need to bump it up around operations that + * change the number of threads. Horrible, but there it is. + * Should be called with the BKL held. + */ +static inline void svc_get(struct svc_serv *serv) +{ + serv->sv_nrthreads++; +} + +/* * Maximum payload size supported by a kernel RPC server. * This is use to determine the max number of pages nfsd is * willing to return in a single READ operation. _