nfsd: persist nfsd filesystem across mounts

Keep around one internal mount of the nfsd filesystem so that we can add
stuff to it when clients come and go, regardless of whether anyone has
it mounted.

Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
J. Bruce Fields 2018-12-14 09:40:56 -05:00
Родитель 855c9e766a
Коммит 2c830dd720
2 изменённых файлов: 14 добавлений и 0 удалений

Просмотреть файл

@ -42,6 +42,9 @@ struct nfsd_net {
bool grace_ended; bool grace_ended;
time_t boot_time; time_t boot_time;
/* internal mount of the "nfsd" pseudofilesystem: */
struct vfsmount *nfsd_mnt;
/* /*
* reclaim_str_hashtbl[] holds known client info from previous reset/reboot * reclaim_str_hashtbl[] holds known client info from previous reset/reboot
* used in reboot/reset lease grace period processing * used in reboot/reset lease grace period processing

Просмотреть файл

@ -1232,6 +1232,7 @@ unsigned int nfsd_net_id;
static __net_init int nfsd_init_net(struct net *net) static __net_init int nfsd_init_net(struct net *net)
{ {
int retval; int retval;
struct vfsmount *mnt;
struct nfsd_net *nn = net_generic(net, nfsd_net_id); struct nfsd_net *nn = net_generic(net, nfsd_net_id);
retval = nfsd_export_init(net); retval = nfsd_export_init(net);
@ -1255,8 +1256,17 @@ static __net_init int nfsd_init_net(struct net *net)
atomic_set(&nn->ntf_refcnt, 0); atomic_set(&nn->ntf_refcnt, 0);
init_waitqueue_head(&nn->ntf_wq); init_waitqueue_head(&nn->ntf_wq);
mnt = vfs_kern_mount(&nfsd_fs_type, SB_KERNMOUNT, "nfsd", NULL);
if (IS_ERR(mnt)) {
retval = PTR_ERR(mnt);
goto out_mount_err;
}
nn->nfsd_mnt = mnt;
return 0; return 0;
out_mount_err:
nfsd_reply_cache_shutdown(nn);
out_drc_error: out_drc_error:
nfsd_idmap_shutdown(net); nfsd_idmap_shutdown(net);
out_idmap_error: out_idmap_error:
@ -1269,6 +1279,7 @@ static __net_exit void nfsd_exit_net(struct net *net)
{ {
struct nfsd_net *nn = net_generic(net, nfsd_net_id); struct nfsd_net *nn = net_generic(net, nfsd_net_id);
mntput(nn->nfsd_mnt);
nfsd_reply_cache_shutdown(nn); nfsd_reply_cache_shutdown(nn);
nfsd_idmap_shutdown(net); nfsd_idmap_shutdown(net);
nfsd_export_shutdown(net); nfsd_export_shutdown(net);