diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c index cdec3993e0d55134e4badd9ead100880b65e8477..9773f593b3ff97e5a8cfd5d71d2142b3df31fdfb 100644 --- a/fs/nfsd/nfssvc.c +++ b/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 --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h index c27d806af310d9a76c830c19f35e422455fd814c..54d8e7bc23411d51764686133f40517a3a38cdd2 100644 --- a/include/linux/sunrpc/svc.h +++ b/include/linux/sunrpc/svc.h @@ -70,6 +70,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