summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStanislav Kinsbursky <skinsbursky@parallels.com>2011-12-26 15:39:04 +0300
committerTrond Myklebust <Trond.Myklebust@netapp.com>2012-01-31 18:20:23 -0500
commit021c68dec8c04c44cb82eb5bbee77028fafe22e8 (patch)
treef0444695a2e9579dea0e27e93575d4db40ababc8
parent38b0da7522c086f1dcdeda39a2d1849c6a31f518 (diff)
downloadlinux-3.10-021c68dec8c04c44cb82eb5bbee77028fafe22e8.tar.gz
linux-3.10-021c68dec8c04c44cb82eb5bbee77028fafe22e8.tar.bz2
linux-3.10-021c68dec8c04c44cb82eb5bbee77028fafe22e8.zip
SUNRPC: hold current network namespace while pipefs superblock is active
We want to be sure that network namespace is still alive while we have pipefs mounted. This will be required later, when RPC pipefs will be mounting only from user-space context. Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r--net/sunrpc/rpc_pipe.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c
index e32e6b8c006..f628b0f48a8 100644
--- a/net/sunrpc/rpc_pipe.c
+++ b/net/sunrpc/rpc_pipe.c
@@ -27,6 +27,9 @@
#include <linux/workqueue.h>
#include <linux/sunrpc/rpc_pipe_fs.h>
#include <linux/sunrpc/cache.h>
+#include <linux/nsproxy.h>
+
+#include "netns.h"
static struct vfsmount *rpc_mnt __read_mostly;
static int rpc_mount_count;
@@ -1011,6 +1014,7 @@ rpc_fill_super(struct super_block *sb, void *data, int silent)
}
if (rpc_populate(root, files, RPCAUTH_lockd, RPCAUTH_RootEOF, NULL))
return -ENOMEM;
+ sb->s_fs_info = get_net(net);
return 0;
}
@@ -1021,11 +1025,19 @@ rpc_mount(struct file_system_type *fs_type,
return mount_ns(fs_type, flags, current->nsproxy->net_ns, rpc_fill_super);
}
+void rpc_kill_sb(struct super_block *sb)
+{
+ struct net *net = sb->s_fs_info;
+
+ put_net(net);
+ kill_litter_super(sb);
+}
+
static struct file_system_type rpc_pipe_fs_type = {
.owner = THIS_MODULE,
.name = "rpc_pipefs",
.mount = rpc_mount,
- .kill_sb = kill_litter_super,
+ .kill_sb = rpc_kill_sb,
};
static void