Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal
[cascardo/linux.git] / fs / nfsd / nfsctl.c
index 2c53be6..7269988 100644 (file)
@@ -127,7 +127,17 @@ static const struct file_operations transaction_ops = {
 
 static int exports_open(struct inode *inode, struct file *file)
 {
-       return seq_open(file, &nfs_exports_op);
+       int err;
+       struct seq_file *seq;
+       struct nfsd_net *nn = net_generic(&init_net, nfsd_net_id);
+
+       err = seq_open(file, &nfs_exports_op);
+       if (err)
+               return err;
+
+       seq = file->private_data;
+       seq->private = nn->svc_export_cache;
+       return 0;
 }
 
 static const struct file_operations exports_operations = {
@@ -345,7 +355,7 @@ static ssize_t write_filehandle(struct file *file, char *buf, size_t size)
        if (!dom)
                return -ENOMEM;
 
-       len = exp_rootfh(dom, path, &fh,  maxsize);
+       len = exp_rootfh(&init_net, dom, path, &fh,  maxsize);
        auth_domain_put(dom);
        if (len)
                return len;
@@ -1127,7 +1137,34 @@ static int create_proc_exports_entry(void)
 #endif
 
 int nfsd_net_id;
+
+static __net_init int nfsd_init_net(struct net *net)
+{
+       int retval;
+
+       retval = nfsd_export_init(net);
+       if (retval)
+               goto out_export_error;
+       retval = nfsd_idmap_init(net);
+       if (retval)
+               goto out_idmap_error;
+       return 0;
+
+out_idmap_error:
+       nfsd_export_shutdown(net);
+out_export_error:
+       return retval;
+}
+
+static __net_exit void nfsd_exit_net(struct net *net)
+{
+       nfsd_idmap_shutdown(net);
+       nfsd_export_shutdown(net);
+}
+
 static struct pernet_operations nfsd_net_ops = {
+       .init = nfsd_init_net,
+       .exit = nfsd_exit_net,
        .id   = &nfsd_net_id,
        .size = sizeof(struct nfsd_net),
 };
@@ -1154,16 +1191,10 @@ static int __init init_nfsd(void)
        retval = nfsd_reply_cache_init();
        if (retval)
                goto out_free_stat;
-       retval = nfsd_export_init();
-       if (retval)
-               goto out_free_cache;
        nfsd_lockd_init();      /* lockd->nfsd callbacks */
-       retval = nfsd_idmap_init();
-       if (retval)
-               goto out_free_lockd;
        retval = create_proc_exports_entry();
        if (retval)
-               goto out_free_idmap;
+               goto out_free_lockd;
        retval = register_filesystem(&nfsd_fs_type);
        if (retval)
                goto out_free_all;
@@ -1171,12 +1202,8 @@ static int __init init_nfsd(void)
 out_free_all:
        remove_proc_entry("fs/nfs/exports", NULL);
        remove_proc_entry("fs/nfs", NULL);
-out_free_idmap:
-       nfsd_idmap_shutdown();
 out_free_lockd:
        nfsd_lockd_shutdown();
-       nfsd_export_shutdown();
-out_free_cache:
        nfsd_reply_cache_shutdown();
 out_free_stat:
        nfsd_stat_shutdown();
@@ -1192,13 +1219,11 @@ out_unregister_notifier:
 
 static void __exit exit_nfsd(void)
 {
-       nfsd_export_shutdown();
        nfsd_reply_cache_shutdown();
        remove_proc_entry("fs/nfs/exports", NULL);
        remove_proc_entry("fs/nfs", NULL);
        nfsd_stat_shutdown();
        nfsd_lockd_shutdown();
-       nfsd_idmap_shutdown();
        nfsd4_free_slabs();
        nfsd_fault_inject_cleanup();
        unregister_filesystem(&nfsd_fs_type);