nfsd: persist nfsd filesystem across mounts
authorJ. Bruce Fields <bfields@redhat.com>
Fri, 14 Dec 2018 14:40:56 +0000 (09:40 -0500)
committerJ. Bruce Fields <bfields@redhat.com>
Wed, 3 Jul 2019 21:52:49 +0000 (17:52 -0400)
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>
fs/nfsd/netns.h
fs/nfsd/nfsctl.c

index ceb413f8fff37d9d26fbbc4a3b30c1559cbd5b12..df4ba4b8b5403e8465ea5a71071b1218bbe874df 100644 (file)
@@ -42,6 +42,9 @@ struct nfsd_net {
        bool grace_ended;
        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
         * used in reboot/reset lease grace period processing
index 304a95e4ea6007a221fd7c45df21dda9ce45338c..25910a7d21ccfb78f01dca5eef9f0ad4a9ad0495 100644 (file)
@@ -1232,6 +1232,7 @@ unsigned int nfsd_net_id;
 static __net_init int nfsd_init_net(struct net *net)
 {
        int retval;
+       struct vfsmount *mnt;
        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 
        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);
        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;
 
+out_mount_err:
+       nfsd_reply_cache_shutdown(nn);
 out_drc_error:
        nfsd_idmap_shutdown(net);
 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);
 
+       mntput(nn->nfsd_mnt);
        nfsd_reply_cache_shutdown(nn);
        nfsd_idmap_shutdown(net);
        nfsd_export_shutdown(net);