78a79 > #ifdef CONFIG_NFSD_LEGACY_CLIENT_TRACKING 79a81 > #endif 95a98 > #ifdef CONFIG_NFSD_LEGACY_CLIENT_TRACKING 96a100 > #endif 182c186 < .release = nfsd_pool_stats_release, --- > .release = seq_release, 695a700 > struct svc_serv *serv; 706c711,712 < err = svc_addsock(nn->nfsd_serv, net, fd, buf, SIMPLE_TRANSACTION_LIMIT, cred); --- > serv = nn->nfsd_serv; > err = svc_addsock(serv, net, fd, buf, SIMPLE_TRANSACTION_LIMIT, cred); 708,712c714,715 < if (err < 0 && !nn->nfsd_serv->sv_nrthreads && !nn->keep_active) < nfsd_last_thread(net); < else if (err >= 0 && < !nn->nfsd_serv->sv_nrthreads && !xchg(&nn->keep_active, 1)) < svc_get(nn->nfsd_serv); --- > if (!serv->sv_nrthreads && list_empty(&nn->nfsd_serv->sv_permsocks)) > nfsd_destroy_serv(net); 714d716 < nfsd_put(net); 727a730 > struct svc_serv *serv; 740c743,744 < err = svc_xprt_create(nn->nfsd_serv, transport, net, --- > serv = nn->nfsd_serv; > err = svc_xprt_create(serv, transport, net, 745c749 < err = svc_xprt_create(nn->nfsd_serv, transport, net, --- > err = svc_xprt_create(serv, transport, net, 750,753d753 < if (!nn->nfsd_serv->sv_nrthreads && !xchg(&nn->keep_active, 1)) < svc_get(nn->nfsd_serv); < < nfsd_put(net); 756c756 < xprt = svc_find_xprt(nn->nfsd_serv, transport, net, PF_INET, port); --- > xprt = svc_find_xprt(serv, transport, net, PF_INET, port); 762,763c762,763 < if (!nn->nfsd_serv->sv_nrthreads && !nn->keep_active) < nfsd_last_thread(net); --- > if (!serv->sv_nrthreads && list_empty(&nn->nfsd_serv->sv_permsocks)) > nfsd_destroy_serv(net); 765d764 < nfsd_put(net); 1020a1020 > #ifdef CONFIG_NFSD_LEGACY_CLIENT_TRACKING 1080a1081 > #endif 1244c1245 < static void clear_ncl(struct inode *inode) --- > static void clear_ncl(struct dentry *dentry) 1245a1247 > struct inode *inode = d_inode(dentry); 1247a1250 > spin_lock(&inode->i_lock); 1248a1252 > spin_unlock(&inode->i_lock); 1252c1256 < static struct nfsdfs_client *__get_nfsdfs_client(struct inode *inode) --- > struct nfsdfs_client *get_nfsdfs_client(struct inode *inode) 1254c1258 < struct nfsdfs_client *nc = inode->i_private; --- > struct nfsdfs_client *nc; 1255a1260,1261 > spin_lock(&inode->i_lock); > nc = inode->i_private; 1257a1264 > spin_unlock(&inode->i_lock); 1261,1296d1267 < struct nfsdfs_client *get_nfsdfs_client(struct inode *inode) < { < struct nfsdfs_client *nc; < < inode_lock_shared(inode); < nc = __get_nfsdfs_client(inode); < inode_unlock_shared(inode); < return nc; < } < /* from __rpc_unlink */ < static void nfsdfs_remove_file(struct inode *dir, struct dentry *dentry) < { < int ret; < < clear_ncl(d_inode(dentry)); < dget(dentry); < ret = simple_unlink(dir, dentry); < d_drop(dentry); < fsnotify_unlink(dir, dentry); < dput(dentry); < WARN_ON_ONCE(ret); < } < < static void nfsdfs_remove_files(struct dentry *root) < { < struct dentry *dentry, *tmp; < < list_for_each_entry_safe(dentry, tmp, &root->d_subdirs, d_child) { < if (!simple_positive(dentry)) { < WARN_ON_ONCE(1); /* I think this can't happen? */ < continue; < } < nfsdfs_remove_file(d_inode(root), dentry); < } < } < 1300a1272 > struct nfsdfs_client *ncl, 1318a1291 > kref_get(&ncl->cl_ref); 1320c1293 < inode->i_private = __get_nfsdfs_client(dir); --- > inode->i_private = ncl; 1329d1301 < nfsdfs_remove_files(root); 1349c1321 < ret = nfsdfs_create_files(dentry, files, fdentries); --- > ret = nfsdfs_create_files(dentry, files, ncl, fdentries); 1360,1373c1332 < struct inode *dir = d_inode(dentry->d_parent); < struct inode *inode = d_inode(dentry); < int ret; < < inode_lock(dir); < nfsdfs_remove_files(dentry); < clear_ncl(inode); < dget(dentry); < ret = simple_rmdir(dir, dentry); < WARN_ON_ONCE(ret); < d_drop(dentry); < fsnotify_rmdir(dir, dentry); < dput(dentry); < inode_unlock(dir); --- > simple_recursive_removal(dentry, clear_ncl);