diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c index b08ae85d53ef..49fd77c8f98d 100644 --- a/fs/nfsd/nfssvc.c +++ b/fs/nfsd/nfssvc.c @@ -615,13 +615,14 @@ int nfsd_create_serv(struct net *net) serv = svc_create_pooled(nfsd_programs, ARRAY_SIZE(nfsd_programs), &nn->nfsd_svcstats, nfsd_max_blksize, nfsd); - if (serv == NULL) - return -ENOMEM; - + if (serv == NULL) { + error = -ENOMEM; + goto err_percpu; + } error = svc_bind(serv, net); if (error < 0) { svc_destroy(&serv); - return error; + goto err_percpu; } spin_lock(&nfsd_notifier_lock); nn->nfsd_serv = serv; @@ -636,6 +637,9 @@ int nfsd_create_serv(struct net *net) } nfsd_reset_write_verifier(nn); return 0; +err_percpu: + percpu_ref_exit(&nn->nfsd_net_ref); + return error; } int nfsd_nrpools(struct net *net)