OpenVZ Forum - RDF feed
type: channel
items: [PATCH v3, RESEND 00/16] make rpc_pipefs be mountable multiple time
items: [PATCH v3, RESEND 02/16] sunrpc: introduce init_rpc_pipefs
items: [PATCH v3, RESEND 03/16] sunrpc: push init_rpc_pipefs up to rpc_create() callers
items: [PATCH v3, RESEND 05/16] sunrpc: get rpc_pipefs mount point for svc_serv from callers
items: [PATCH v3, RESEND 06/16] lockd: get rpc_pipefs mount point from callers
items: [PATCH v3, RESEND 07/16] sunrpc: get rpc_pipefs mount point for rpcb_create[_local] from callers
items: [PATCH v3, RESEND 08/16] sunrpc: tag pipefs field of cache_detail with rpc_pipefs mount point
items: [PATCH v3, RESEND 09/16] sunrpc: introduce rpc_pipefs_add_destroy_cb()
items: [PATCH v3, RESEND 10/16] nfs: per-rpc_pipefs dns cache
items: [PATCH v3, RESEND 11/16] Export iterate_mounts symbol to be able to use from sunrpc module.
items: [PATCH v3, RESEND 12/16] sunrpc: introduce get_rpc_pipefs()
items: [PATCH v3, RESEND 13/16] nfs: introduce mount option 'rpcmount'
items: [PATCH v3, RESEND 14/16] sunrpc: make rpc_pipefs be mountable multiple times
items: [PATCH v3, RESEND 15/16] sunrpc: remove global init_rpc_pipefs
items: [PATCH v3, RESEND 16/16] Rework get_rpc_pipefs() and introduce put_rpc_pipefs()

[PATCH v3, RESEND 00/16] make rpc_pipefs be mountable multiple time
type: item
description: v3: - rebase to the current Linus' tree (52cfd503ad) - rework get_rpc_pipefs() once again; - solve problem with rmmod sunrpc moudle; - free dns cache on killing rpc_pipefs superblock. v2: - one of rpc_create() calls was missed initially, fixed; - change logic for get_rpc_pipefs(NULL); - export get_rpc_pipefs() to be able to use from modules (tnx J. Bruce Field); - change "From:" and "Signed-off-by:" addresses. v1: - initial revision of the patchset. Kirill A. Shutemov (16): sunrpc: mount rpc_pipefs on initialization sunrpc: introduce init_rpc_pipefs sunrpc: push init_rpc_pipefs up to rpc_create() callers sunrpc: tag svc_serv with rpc_pipefs mount point sunrpc: get rpc_pipefs mount point for svc_serv from callers lockd: get rpc_pipefs mount point from callers sunrpc: get rpc_pipefs mount point for rpcb_create[_local] from callers sunrpc: tag pipefs field of cache_detail with rpc_pipefs mount point sunrpc: introduce rpc_pipefs_add_destroy_cb() nfs: per-rpc_pipefs dns cache Export iterate_mounts symbol to be able to use from sunrpc module. sunrpc: introduce get_rpc_pipefs() nfs: introduce mount option 'rpcmount' sunrpc: make rpc_pipefs be mountable multiple times sunrpc: remove global init_rpc_pipefs Rework get_rpc_pipefs() and introduce put_rpc_pipefs() fs/lockd/clntlock.c | 8 +- fs/lockd/host.c | 15 ++- fs/lockd/mon.c | 13 ++- fs/lockd/svc.c | 4 +- fs/namespace.c | 1 + fs/nfs/cache_lib.c | 18 +-- fs/nfs/cache_lib.h | 3 +- fs/nfs/callback.c | 7 +- fs/nfs/callback.h | 3 +- fs/nfs/client.c | 45 ++++++- fs/nfs/dns_resolve.c | 137 ++++++++++++++++----- fs/nfs/dns_resolve.h | 15 +-- fs/nfs/inode.c | 9 +-- fs/nfs/internal.h | 10 ++- fs/nfs/mount_clnt.c | 1 + fs/nfs/namespace.c | 3 +- fs/nfs/nfs4namespace.c | 20 ++-- fs/nfs/super.c | 20 +++ fs/nfsd/nfs4callback.c | 5 + fs/nfsd/nfssvc.c | 20 +++- include/linux/lockd/bind.h | 3 +- include/linux/lockd/lockd.h | 4 +- include/linux/nfs_fs_sb.h | 1 + include/linux/sunrpc/cache.h | 9 +- include/linux/sunrpc/clnt.h | 5 +- include/li…
creator: Kirill A. Shutemov
date: 2011-02-08T18:41:51-00:00

[PATCH v3, RESEND 02/16] sunrpc: introduce init_rpc_pipefs
type: item
description: Introduce global variable init_rpc_pipefs and use it instead of rpc_get_mount()/rpc_put_mount(). Signed-off-by: Kirill A. Shutemov <kas@openvz.org> Reviewed-by: Rob Landley <rlandley@parallels.com> --- fs/nfs/cache_lib.c | 6 +++--- include/linux/sunrpc/rpc_pipe_fs.h | 4 ++-- net/sunrpc/clnt.c | 10 ++++------ net/sunrpc/rpc_pipe.c | 21 +++++---------------- 4 files changed, 14 insertions(+), 27 deletions(-) diff --git a/fs/nfs/cache_lib.c b/fs/nfs/cache_lib.c index 8469031..dd7ca5f 100644 --- a/fs/nfs/cache_lib.c +++ b/fs/nfs/cache_lib.c @@ -117,7 +117,7 @@ int nfs_cache_register(struct cache_detail *cd) struct vfsmount *mnt; int ret; - mnt = rpc_get_mount(); + mnt = mntget(init_rpc_pipefs); if (IS_ERR(mnt)) return PTR_ERR(mnt); ret = vfs_path_lookup(mnt->mnt_root, mnt, "/cache", 0, &nd); @@ -129,13 +129,13 @@ int nfs_cache_register(struct cache_detail *cd) if (!ret) return ret; err: - rpc_put_mount(); + mntput(mnt); return ret; } void nfs_cache_unregister(struct cache_detail *cd) { sunrpc_cache_unregister_pipefs(cd); - rpc_put_mount(); + mntput(init_rpc_pipefs); } diff --git a/include/linux/sunrpc/rpc_pipe_fs.h b/include/linux/sunrpc/rpc_pipe_fs.h index cf14db9..b09bfa5 100644 --- a/include/linux/sunrpc/rpc_pipe_fs.h +++ b/include/linux/sunrpc/rpc_pipe_fs.h @@ -44,6 +44,8 @@ RPC_I(struct inode *inode) return container_of(inode, struct rpc_inode, vfs_inode); } +extern struct vfsmount *init_rpc_pipefs; + extern int rpc_queue_upcall(struct inode *, struct rpc_pipe_msg *); struct rpc_clnt; @@ -60,8 +62,6 @@ extern void rpc_remove_cache_dir(struct dentry *); extern struct dentry *rpc_mkpipe(struct dentry *, const char *, void *, const struct rpc_pipe_ops *, int flags); extern int rpc_unlink(struct dentry *); -extern struct vfsmount *rpc_get_mount(void); -extern void rpc_put_mount(void); extern int register_rpc_pipefs(void); extern void unregister_rpc_pipefs(void); diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 57d344c..f3812d0 100644 --- a/net/sunrpc/clnt.c +++…
creator: Kirill A. Shutemov
date: 2011-02-08T18:41:53-00:00

[PATCH v3, RESEND 03/16] sunrpc: push init_rpc_pipefs up to rpc_create() callers
type: item
description: Signed-off-by: Kirill A. Shutemov <kas@openvz.org> Reviewed-by: Rob Landley <rlandley@parallels.com> --- fs/lockd/host.c | 2 ++ fs/lockd/mon.c | 2 ++ fs/nfs/client.c | 2 ++ fs/nfs/mount_clnt.c | 2 ++ fs/nfsd/nfs4callback.c | 2 ++ include/linux/sunrpc/clnt.h | 1 + net/sunrpc/clnt.c | 11 +++++++---- net/sunrpc/rpcb_clnt.c | 3 +++ 8 files changed, 21 insertions(+), 4 deletions(-) diff --git a/fs/lockd/host.c b/fs/lockd/host.c index b7c99bf..45e973f 100644 --- a/fs/lockd/host.c +++ b/fs/lockd/host.c @@ -14,6 +14,7 @@ #include <linux/in6.h> #include <linux/sunrpc/clnt.h> #include <linux/sunrpc/svc.h> +#include <linux/sunrpc/rpc_pipe_fs.h> #include <linux/lockd/lockd.h> #include <linux/mutex.h> @@ -463,6 +464,7 @@ nlm_bind_host(struct nlm_host *host) .authflavor = RPC_AUTH_UNIX, .flags = (RPC_CLNT_CREATE_NOPING | RPC_CLNT_CREATE_AUTOBIND), + .rpcmount = init_rpc_pipefs, }; /* diff --git a/fs/lockd/mon.c b/fs/lockd/mon.c index 23d7451..6219026 100644 --- a/fs/lockd/mon.c +++ b/fs/lockd/mon.c @@ -15,6 +15,7 @@ #include <linux/sunrpc/clnt.h> #include <linux/sunrpc/xprtsock.h> #include <linux/sunrpc/svc.h> +#include <linux/sunrpc/rpc_pipe_fs.h> #include <linux/lockd/lockd.h> #include <asm/unaligned.h> @@ -78,6 +79,7 @@ static struct rpc_clnt *nsm_create(void) .version = NSM_VERSION, .authflavor = RPC_AUTH_NULL, .flags = RPC_CLNT_CREATE_NOPING, + .rpcmount = init_rpc_pipefs, }; return rpc_create(&args); diff --git a/fs/nfs/client.c b/fs/nfs/client.c index bd3ca32..0e0a952 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c @@ -25,6 +25,7 @@ #include <linux/sunrpc/metrics.h> #include <linux/sunrpc/xprtsock.h> #include <linux/sunrpc/xprtrdma.h> +#include <linux/sunrpc/rpc_pipe_fs.h> #include <linux/nfs_fs.h> #include <linux/nfs_mount.h> #include <linux/nfs4_mount.h> @@ -628,6 +629,7 @@ static int nfs_create_rpc_client(struct nfs_client *clp, .program = &nfs_program, .version = clp->rpc_ops->version, .authflavor = flavor, + .rpcmount = init_rpc_pipefs, }; if (discrtry) diff --git …
creator: Kirill A. Shutemov
date: 2011-02-08T18:41:54-00:00

[PATCH v3, RESEND 05/16] sunrpc: get rpc_pipefs mount point for svc_serv from callers
type: item
description: Signed-off-by: Kirill A. Shutemov <kas@openvz.org> Reviewed-by: Rob Landley <rlandley@parallels.com> --- fs/lockd/svc.c | 4 +++- fs/nfs/callback.c | 4 +++- fs/nfsd/nfssvc.c | 6 ++++-- include/linux/sunrpc/svc.h | 8 ++++---- net/sunrpc/svc.c | 18 +++++++++--------- 5 files changed, 23 insertions(+), 17 deletions(-) diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c index abfff9d..32310b1 100644 --- a/fs/lockd/svc.c +++ b/fs/lockd/svc.c @@ -31,6 +31,7 @@ #include <linux/sunrpc/clnt.h> #include <linux/sunrpc/svc.h> #include <linux/sunrpc/svcsock.h> +#include <linux/sunrpc/rpc_pipe_fs.h> #include <net/ip.h> #include <linux/lockd/lockd.h> #include <linux/nfs.h> @@ -269,7 +270,8 @@ int lockd_up(void) "lockd_up: no pid, %d users??\n", nlmsvc_users); error = -ENOMEM; - serv = svc_create(&nlmsvc_program, LOCKD_BUFSIZE, NULL); + serv = svc_create(&nlmsvc_program, init_rpc_pipefs, LOCKD_BUFSIZE, + NULL); if (!serv) { printk(KERN_WARNING "lockd_up: create service failed\n"); goto out; diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c index e3d2942..c9b98ad 100644 --- a/fs/nfs/callback.c +++ b/fs/nfs/callback.c @@ -16,6 +16,7 @@ #include <linux/freezer.h> #include <linux/kthread.h> #include <linux/sunrpc/svcauth_gss.h> +#include <linux/sunrpc/rpc_pipe_fs.h> #include <linux/sunrpc/bc_xprt.h> #include <net/inet_sock.h> @@ -259,7 +260,8 @@ int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt) nfs_callback_bc_serv(minorversion, xprt, cb_info); goto out; } - serv = svc_create(&nfs4_callback_program, NFS4_CALLBACK_BUFSIZE, NULL); + serv = svc_create(&nfs4_callback_program, init_rpc_pipefs, + NFS4_CALLBACK_BUFSIZE, NULL); if (!serv) { ret = -ENOMEM; goto out_err; diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c index 18743c4..e4fc85d 100644 --- a/fs/nfsd/nfssvc.c +++ b/fs/nfsd/nfssvc.c @@ -13,6 +13,7 @@ #include <linux/sunrpc/stats.h> #include <linux/sunrpc/svcsock.h> +#include <linux/sunrpc/rpc_pipe_fs.h> #include <linux/lockd/bind.h> #include <linux/nfsacl.h> #include <linux/seq_fi…
creator: Kirill A. Shutemov
date: 2011-02-08T18:41:56-00:00

[PATCH v3, RESEND 06/16] lockd: get rpc_pipefs mount point from callers
type: item
description: Signed-off-by: Kirill A. Shutemov <kas@openvz.org> Reviewed-by: Rob Landley <rlandley@parallels.com> --- fs/lockd/clntlock.c | 8 +++++--- fs/lockd/host.c | 17 ++++++++++++++--- fs/lockd/mon.c | 15 ++++++++------- fs/lockd/svc.c | 6 ++---- fs/nfs/client.c | 1 + fs/nfsd/nfssvc.c | 2 +- include/linux/lockd/bind.h | 3 ++- include/linux/lockd/lockd.h | 4 +++- 8 files changed, 36 insertions(+), 20 deletions(-) diff --git a/fs/lockd/clntlock.c b/fs/lockd/clntlock.c index 8d4ea83..4664c56 100644 --- a/fs/lockd/clntlock.c +++ b/fs/lockd/clntlock.c @@ -56,13 +56,14 @@ struct nlm_host *nlmclnt_init(const struct nlmclnt_initdata *nlm_init) u32 nlm_version = (nlm_init->nfs_version == 2) ? 1 : 4; int status; - status = lockd_up(); + status = lockd_up(nlm_init->rpcmount); if (status < 0) return ERR_PTR(status); host = nlmclnt_lookup_host(nlm_init->address, nlm_init->addrlen, nlm_init->protocol, nlm_version, - nlm_init->hostname, nlm_init->noresvport); + nlm_init->hostname, nlm_init->noresvport, + nlm_init->rpcmount); if (host == NULL) { lockd_down(); return ERR_PTR(-ENOLCK); @@ -223,7 +224,8 @@ reclaimer(void *ptr) allow_signal(SIGKILL); down_write(&host->h_rwsem); - lockd_up(); /* note: this cannot fail as lockd is already running */ + /* note: this cannot fail as lockd is already running */ + lockd_up(host->h_rpcmount); dprintk("lockd: reclaiming locks for host %s\n", host->h_name); diff --git a/fs/lockd/host.c b/fs/lockd/host.c index 45e973f..b4cb391 100644 --- a/fs/lockd/host.c +++ b/fs/lockd/host.c @@ -14,9 +14,10 @@ #include <linux/in6.h> #include <linux/sunrpc/clnt.h> #include <linux/sunrpc/svc.h> -#include <linux/sunrpc/rpc_pipe_fs.h> #include <linux/lockd/lockd.h> #include <linux/mutex.h> +#include <linux/mount.h> + #include <net/ipv6.h> @@ -55,6 +56,7 @@ struct nlm_lookup_host_info { const char *hostname; /* remote's hostname */ const size_t hostname_len; /* it's length */ const int noresvport; /* use non-priv port */ + struct vfsmount *rpcmount; /* rpc_pipefs mount poin…
creator: Kirill A. Shutemov
date: 2011-02-08T18:41:57-00:00

[PATCH v3, RESEND 07/16] sunrpc: get rpc_pipefs mount point for rpcb_create[_local] from callers
type: item
description: Signed-off-by: Kirill A. Shutemov <kas@openvz.org> Reviewed-by: Rob Landley <rlandley@parallels.com> --- include/linux/sunrpc/clnt.h | 4 ++-- net/sunrpc/rpcb_clnt.c | 22 ++++++++++++---------- net/sunrpc/svc.c | 34 +++++++++++++++++++++------------- 3 files changed, 35 insertions(+), 25 deletions(-) diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h index dffaaaa..52f6142 100644 --- a/include/linux/sunrpc/clnt.h +++ b/include/linux/sunrpc/clnt.h @@ -135,10 +135,10 @@ void rpc_shutdown_client(struct rpc_clnt *); void rpc_release_client(struct rpc_clnt *); void rpc_task_release_client(struct rpc_task *); -int rpcb_register(u32, u32, int, unsigned short); +int rpcb_register(u32, u32, int, unsigned short, struct vfsmount *); int rpcb_v4_register(const u32 program, const u32 version, const struct sockaddr *address, - const char *netid); + const char *netid, struct vfsmount *rpcmount); void rpcb_getport_async(struct rpc_task *); void rpc_call_start(struct rpc_task *); diff --git a/net/sunrpc/rpcb_clnt.c b/net/sunrpc/rpcb_clnt.c index b059cbe..7fddafa 100644 --- a/net/sunrpc/rpcb_clnt.c +++ b/net/sunrpc/rpcb_clnt.c @@ -27,7 +27,6 @@ #include <linux/sunrpc/clnt.h> #include <linux/sunrpc/sched.h> #include <linux/sunrpc/xprtsock.h> -#include <linux/sunrpc/rpc_pipe_fs.h> #ifdef RPC_DEBUG # define RPCDBG_FACILITY RPCDBG_BIND @@ -171,7 +170,7 @@ static DEFINE_MUTEX(rpcb_create_local_mutex); * Returns zero on success, otherwise a negative errno value * is returned. */ -static int rpcb_create_local(void) +static int rpcb_create_local(struct vfsmount *rpcmount) { struct rpc_create_args args = { .net = &init_net, @@ -183,7 +182,7 @@ static int rpcb_create_local(void) .version = RPCBVERS_2, .authflavor = RPC_AUTH_UNIX, .flags = RPC_CLNT_CREATE_NOPING, - .rpcmount = init_rpc_pipefs, + .rpcmount = rpcmount, }; struct rpc_clnt *clnt, *clnt4; int result = 0; @@ -225,7 +224,8 @@ out: } static struct rpc_clnt *rpcb_create(char *hostname, struct sockaddr *srvaddr, - size…
creator: Kirill A. Shutemov
date: 2011-02-08T18:41:58-00:00

[PATCH v3, RESEND 08/16] sunrpc: tag pipefs field of cache_detail with rpc_pipefs mount point
type: item
description: Signed-off-by: Kirill A. Shutemov <kas@openvz.org> Reviewed-by: Rob Landley <rlandley@parallels.com> --- fs/nfs/cache_lib.c | 3 +-- include/linux/sunrpc/cache.h | 9 +++------ net/sunrpc/cache.c | 16 ++++++++++------ 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/fs/nfs/cache_lib.c b/fs/nfs/cache_lib.c index dd7ca5f..0944d4e 100644 --- a/fs/nfs/cache_lib.c +++ b/fs/nfs/cache_lib.c @@ -123,7 +123,7 @@ int nfs_cache_register(struct cache_detail *cd) ret = vfs_path_lookup(mnt->mnt_root, mnt, "/cache", 0, &nd); if (ret) goto err; - ret = sunrpc_cache_register_pipefs(nd.path.dentry, + ret = sunrpc_cache_register_pipefs(mnt, nd.path.dentry, cd->name, 0600, cd); path_put(&nd.path); if (!ret) @@ -136,6 +136,5 @@ err: void nfs_cache_unregister(struct cache_detail *cd) { sunrpc_cache_unregister_pipefs(cd); - mntput(init_rpc_pipefs); } diff --git a/include/linux/sunrpc/cache.h b/include/linux/sunrpc/cache.h index 7898ea1..a5957cb 100644 --- a/include/linux/sunrpc/cache.h +++ b/include/linux/sunrpc/cache.h @@ -65,10 +65,6 @@ struct cache_detail_procfs { struct proc_dir_entry *flush_ent, *channel_ent, *content_ent; }; -struct cache_detail_pipefs { - struct dentry *dir; -}; - struct cache_detail { struct module * owner; int hash_size; @@ -115,7 +111,7 @@ struct cache_detail { union { struct cache_detail_procfs procfs; - struct cache_detail_pipefs pipefs; + struct path pipefs; } u; }; @@ -202,7 +198,8 @@ extern int cache_register_net(struct cache_detail *cd, struct net *net); extern void cache_unregister(struct cache_detail *cd); extern void cache_unregister_net(struct cache_detail *cd, struct net *net); -extern int sunrpc_cache_register_pipefs(struct dentry *parent, const char *, +extern int sunrpc_cache_register_pipefs(struct vfsmount *rpcmount, + struct dentry *parent, const char *, mode_t, struct cache_detail *); extern void sunrpc_cache_unregister_pipefs(struct cache_detail *); diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c index 72ad836..cfc225a 100644 …
creator: Kirill A. Shutemov
date: 2011-02-08T18:41:59-00:00

[PATCH v3, RESEND 09/16] sunrpc: introduce rpc_pipefs_add_destroy_cb()
type: item
description: Add facility to do some action on destroying of rpc_pipefs superblock. Signed-off-by: Kirill A. Shutemov <kas@openvz.org> Reviewed-by: Rob Landley <rlandley@parallels.com> --- include/linux/sunrpc/rpc_pipe_fs.h | 3 ++ net/sunrpc/rpc_pipe.c | 51 ++++++++++++++++++++++++++++++++++- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/include/linux/sunrpc/rpc_pipe_fs.h b/include/linux/sunrpc/rpc_pipe_fs.h index b09bfa5..f5216f1 100644 --- a/include/linux/sunrpc/rpc_pipe_fs.h +++ b/include/linux/sunrpc/rpc_pipe_fs.h @@ -46,6 +46,9 @@ RPC_I(struct inode *inode) extern struct vfsmount *init_rpc_pipefs; +extern int rpc_pipefs_add_destroy_cb(struct super_block *sb, + void (*destroy_cb)(void *data), void *data); + extern int rpc_queue_upcall(struct inode *, struct rpc_pipe_msg *); struct rpc_clnt; diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c index 484c9a3..58312fa 100644 --- a/net/sunrpc/rpc_pipe.c +++ b/net/sunrpc/rpc_pipe.c @@ -939,6 +939,31 @@ static const struct super_operations s_ops = { #define RPCAUTH_GSSMAGIC 0x67596969 +struct destroy_cb { + struct list_head list; + void (*callback)(void *data); + void *data; +}; + +int rpc_pipefs_add_destroy_cb(struct super_block *sb, + void (*destroy_cb)(void *data), void *data) +{ + struct destroy_cb *dcb; + struct list_head *destroy_cb_list = sb->s_fs_info; + + dcb = kmalloc(sizeof(*dcb), GFP_KERNEL); + if (!dcb) + return -ENOMEM; + + dcb->callback = destroy_cb; + dcb->data = data; + INIT_LIST_HEAD(&dcb->list); + list_add(&dcb->list, destroy_cb_list); + + return 0; +} +EXPORT_SYMBOL_GPL(rpc_pipefs_add_destroy_cb); + /* * We have a single directory with 1 node in it. */ @@ -1004,8 +1029,16 @@ rpc_fill_super(struct super_block *sb, void *data, int silent) iput(inode); return -ENOMEM; } - if (rpc_populate(root, files, RPCAUTH_lockd, RPCAUTH_RootEOF, NULL)) + /* List of destroy callbacks */ + sb->s_fs_info = kmalloc(sizeof(struct list_head), GFP_KERNEL); + if (!sb->s_fs_info) + return -ENOMEM; + INIT_LIST_HEA…
creator: Kirill A. Shutemov
date: 2011-02-08T18:42:00-00:00

[PATCH v3, RESEND 10/16] nfs: per-rpc_pipefs dns cache
type: item
description: Lazy initialization of dns cache: on first call nfs_dns_resolve_name(). Every rpc_pipefs has separate dns cache now. Signed-off-by: Kirill A. Shutemov <kas@openvz.org> Reviewed-by: Rob Landley <rlandley@parallels.com> --- fs/nfs/cache_lib.c | 17 ++----- fs/nfs/cache_lib.h | 3 +- fs/nfs/dns_resolve.c | 137 +++++++++++++++++++++++++++++++++++++----------- fs/nfs/dns_resolve.h | 15 +----- fs/nfs/inode.c | 9 +--- fs/nfs/nfs4namespace.c | 4 +- 6 files changed, 117 insertions(+), 68 deletions(-) diff --git a/fs/nfs/cache_lib.c b/fs/nfs/cache_lib.c index 0944d4e..9b99d9e 100644 --- a/fs/nfs/cache_lib.c +++ b/fs/nfs/cache_lib.c @@ -12,7 +12,6 @@ #include <linux/namei.h> #include <linux/slab.h> #include <linux/sunrpc/cache.h> -#include <linux/sunrpc/rpc_pipe_fs.h> #include "cache_lib.h" @@ -111,25 +110,17 @@ int nfs_cache_wait_for_upcall(struct nfs_cache_defer_req *dreq) return 0; } -int nfs_cache_register(struct cache_detail *cd) +int nfs_cache_register(struct cache_detail *cd, struct vfsmount *rpcmount) { struct nameidata nd; - struct vfsmount *mnt; int ret; - mnt = mntget(init_rpc_pipefs); - if (IS_ERR(mnt)) - return PTR_ERR(mnt); - ret = vfs_path_lookup(mnt->mnt_root, mnt, "/cache", 0, &nd); + ret = vfs_path_lookup(rpcmount->mnt_root, rpcmount, "/cache", 0, &nd); if (ret) - goto err; - ret = sunrpc_cache_register_pipefs(mnt, nd.path.dentry, + return ret; + ret = sunrpc_cache_register_pipefs(rpcmount, nd.path.dentry, cd->name, 0600, cd); path_put(&nd.path); - if (!ret) - return ret; -err: - mntput(mnt); return ret; } diff --git a/fs/nfs/cache_lib.h b/fs/nfs/cache_lib.h index 76f856e..1d4a0a5 100644 --- a/fs/nfs/cache_lib.h +++ b/fs/nfs/cache_lib.h @@ -23,5 +23,6 @@ extern struct nfs_cache_defer_req *nfs_cache_defer_req_alloc(void); extern void nfs_cache_defer_req_put(struct nfs_cache_defer_req *dreq); extern int nfs_cache_wait_for_upcall(struct nfs_cache_defer_req *dreq); -extern int nfs_cache_register(struct cache_detail *cd); +extern int nfs_cache_register(struct cache_…
creator: Kirill A. Shutemov
date: 2011-02-08T18:42:01-00:00

[PATCH v3, RESEND 11/16] Export iterate_mounts symbol to be able to use from sunrpc module.
type: item
description: Signed-off-by: Kirill A. Shutemov <kas@openvz.org> Reviewed-by: Rob Landley <rlandley@parallels.com> --- fs/namespace.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/fs/namespace.c b/fs/namespace.c index 7b0b953..c7f9a19 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -1465,6 +1465,7 @@ int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg, } return 0; } +EXPORT_SYMBOL_GPL(iterate_mounts); static void cleanup_group_ids(struct vfsmount *mnt, struct vfsmount *end) { -- 1.7.4 _______________________________________________ Containers mailing list Containers@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/containe rs
creator: Kirill A. Shutemov
date: 2011-02-08T18:42:02-00:00

[PATCH v3, RESEND 12/16] sunrpc: introduce get_rpc_pipefs()
type: item
description: Get rpc_pipefs mount point by path. If path is NULL, we use first rpc_pipefs from mount table visible from current root directory. Signed-off-by: Kirill A. Shutemov <kas@openvz.org> Reviewed-by: Rob Landley <rlandley@parallels.com> --- include/linux/sunrpc/rpc_pipe_fs.h | 1 + net/sunrpc/rpc_pipe.c | 51 ++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 0 deletions(-) diff --git a/include/linux/sunrpc/rpc_pipe_fs.h b/include/linux/sunrpc/rpc_pipe_fs.h index f5216f1..4a8830a 100644 --- a/include/linux/sunrpc/rpc_pipe_fs.h +++ b/include/linux/sunrpc/rpc_pipe_fs.h @@ -46,6 +46,7 @@ RPC_I(struct inode *inode) extern struct vfsmount *init_rpc_pipefs; +extern struct vfsmount *get_rpc_pipefs(const char *path); extern int rpc_pipefs_add_destroy_cb(struct super_block *sb, void (*destroy_cb)(void *data), void *data); diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c index 58312fa..1261f27 100644 --- a/net/sunrpc/rpc_pipe.c +++ b/net/sunrpc/rpc_pipe.c @@ -16,6 +16,9 @@ #include <linux/namei.h> #include <linux/fsnotify.h> #include <linux/kernel.h> +#include <linux/nsproxy.h> +#include <linux/mnt_namespace.h> +#include <linux/fs_struct.h> #include <asm/ioctls.h> #include <linux/fs.h> @@ -939,6 +942,54 @@ static const struct super_operations s_ops = { #define RPCAUTH_GSSMAGIC 0x67596969 +static int check_rpc_pipefs(struct vfsmount *mnt, void *arg) +{ + struct vfsmount **rpcmount = arg; + struct path path = { + .mnt = mnt, + .dentry = mnt->mnt_root, + }; + + if (!mnt->mnt_sb) + return 0; + if (mnt->mnt_sb->s_magic != RPCAUTH_GSSMAGIC) + return 0; + + if (!path_is_under(&path, &current->fs->root)) + return 0; + + *rpcmount = mntget(mnt); + return 1; +} + +struct vfsmount *get_rpc_pipefs(const char *p) +{ + int error; + struct vfsmount *rpcmount = ERR_PTR(-EINVAL); + struct path path; + + if (!p) { + iterate_mounts(check_rpc_pipefs, &rpcmount, + current->nsproxy->mnt_ns->root); + + if (IS_ERR(rpcmount) && (current->nsproxy->mnt_ns == + init_task.nsproxy-…
creator: Kirill A. Shutemov
date: 2011-02-08T18:42:03-00:00

[PATCH v3, RESEND 13/16] nfs: introduce mount option 'rpcmount'
type: item
description: It specifies rpc_pipefs to use. /var/lib/nfs/rpc_pipefs, by default. Signed-off-by: Kirill A. Shutemov <kas@openvz.org> Reviewed-by: Rob Landley <rlandley@parallels.com> --- fs/nfs/callback.c | 5 ++- fs/nfs/callback.h | 3 +- fs/nfs/client.c | 46 ++++++++++++++++++++++++++++++++++++-------- fs/nfs/internal.h | 10 +++++++- fs/nfs/mount_clnt.c | 3 +- fs/nfs/namespace.c | 3 +- fs/nfs/nfs4namespace.c | 22 +++++++++++--------- fs/nfs/super.c | 20 +++++++++++++++++++ include/linux/nfs_fs_sb.h | 1 + 9 files changed, 86 insertions(+), 27 deletions(-) diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c index c9b98ad..d56f402 100644 --- a/fs/nfs/callback.c +++ b/fs/nfs/callback.c @@ -245,7 +245,8 @@ static inline void nfs_callback_bc_serv(u32 minorversion, struct rpc_xprt *xprt, /* * Bring up the callback thread if it is not already up. */ -int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt) +int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt, + struct vfsmount *rpcmount) { struct svc_serv *serv = NULL; struct svc_rqst *rqstp; @@ -260,7 +261,7 @@ int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt) nfs_callback_bc_serv(minorversion, xprt, cb_info); goto out; } - serv = svc_create(&nfs4_callback_program, init_rpc_pipefs, + serv = svc_create(&nfs4_callback_program, rpcmount, NFS4_CALLBACK_BUFSIZE, NULL); if (!serv) { ret = -ENOMEM; diff --git a/fs/nfs/callback.h b/fs/nfs/callback.h index 46d93ce..0ea5d1e 100644 --- a/fs/nfs/callback.h +++ b/fs/nfs/callback.h @@ -175,7 +175,8 @@ extern __be32 nfs4_callback_getattr(struct cb_getattrargs *args, extern __be32 nfs4_callback_recall(struct cb_recallargs *args, void *dummy, struct cb_process_state *cps); #ifdef CONFIG_NFS_V4 -extern int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt); +extern int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt, + struct vfsmount *rpcmount); extern void nfs_callback_down(int minorversion); extern int nfs4_validate_delegation_stateid(struct nfs_delegation *delegat…
creator: Kirill A. Shutemov
date: 2011-02-08T18:42:04-00:00

[PATCH v3, RESEND 14/16] sunrpc: make rpc_pipefs be mountable multiple times
type: item
description: To support containers, allow multiple independent instances of rpc_pipefs. Use '-o newinstance' to create new of the filesystem. The same semantics as with devpts. Signed-off-by: Kirill A. Shutemov <kas@openvz.org> Reviewed-by: Rob Landley <rlandley@parallels.com> --- net/sunrpc/rpc_pipe.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 79 insertions(+), 1 deletions(-) diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c index 1261f27..f824f33 100644 --- a/net/sunrpc/rpc_pipe.c +++ b/net/sunrpc/rpc_pipe.c @@ -19,6 +19,7 @@ #include <linux/nsproxy.h> #include <linux/mnt_namespace.h> #include <linux/fs_struct.h> +#include <linux/parser.h> #include <asm/ioctls.h> #include <linux/fs.h> @@ -41,6 +42,49 @@ static struct kmem_cache *rpc_inode_cachep __read_mostly; #define RPC_UPCALL_TIMEOUT (30*HZ) +struct rpc_mount_opts { + int newinstance; +}; + +enum { + Opt_newinstance, + + Opt_err +}; + +static const match_table_t tokens = { + {Opt_newinstance, "newinstance"}, + + {Opt_err, NULL} +}; + +static int +parse_mount_options(char *data, struct rpc_mount_opts *opts) +{ + char *p; + + opts->newinstance = 0; + + while ((p = strsep(&data, ",")) != NULL) { + substring_t args[MAX_OPT_ARGS]; + int token; + + if (!*p) + continue; + + token = match_token(p, tokens, args); + switch (token) { + case Opt_newinstance: + opts->newinstance = 1; + break; + default: + return -EINVAL; + } + } + + return 0; +} + static void rpc_purge_list(struct rpc_inode *rpci, struct list_head *head, void (*destroy_msg)(struct rpc_pipe_msg *), int err) { @@ -1093,11 +1137,45 @@ rpc_fill_super(struct super_block *sb, void *data, int silent) return 0; } +static int +compare_rpc_mnt_sb(struct super_block *s, void *p) +{ + if (init_rpc_pipefs) + return init_rpc_pipefs->mnt_sb == s; + return 0; +} + static struct dentry * rpc_mount(struct file_system_type *fs_type, int flags, const char *dev_name, void *data) { - return mount_single(fs_type, flags, data, rpc_fill_super); + int error;…
creator: Kirill A. Shutemov
date: 2011-02-08T18:42:05-00:00

[PATCH v3, RESEND 15/16] sunrpc: remove global init_rpc_pipefs
type: item
description: Replace remaining init_rpc_pipefs references with get_rpc_pipefs(NULL) and make init_rpc_pipefs static. Signed-off-by: Kirill A. Shutemov <kas@openvz.org> Reviewed-by: Rob Landley <rlandley@parallels.com> --- fs/nfsd/nfs4callback.c | 5 ++++- fs/nfsd/nfssvc.c | 16 ++++++++++++++-- include/linux/sunrpc/rpc_pipe_fs.h | 2 -- net/sunrpc/rpc_pipe.c | 1 - 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c index 6636ab2..3048988 100644 --- a/fs/nfsd/nfs4callback.c +++ b/fs/nfsd/nfs4callback.c @@ -646,7 +646,6 @@ static int setup_callback_client(struct nfs4_client *clp, struct nfs4_cb_conn *c .version = 0, .authflavor = clp->cl_flavor, .flags = (RPC_CLNT_CREATE_NOPING | RPC_CLNT_CREATE_QUIET), - .rpcmount = init_rpc_pipefs, }; struct rpc_clnt *client; @@ -666,8 +665,12 @@ static int setup_callback_client(struct nfs4_client *clp, struct nfs4_cb_conn *c args.prognumber = clp->cl_cb_session->se_cb_prog; args.protocol = XPRT_TRANSPORT_BC_TCP; } + args.rpcmount = get_rpc_pipefs(NULL); + if (IS_ERR(args.rpcmount)) + return PTR_ERR(args.rpcmount); /* Create RPC client */ client = rpc_create(&args); + mntput(args.rpcmount); if (IS_ERR(client)) { dprintk("NFSD: couldn't create callback client: %ld\n", PTR_ERR(client)); diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c index dc11012..a10b1439 100644 --- a/fs/nfsd/nfssvc.c +++ b/fs/nfsd/nfssvc.c @@ -206,6 +206,7 @@ static bool nfsd_up = false; static int nfsd_startup(unsigned short port, int nrservs) { int ret; + struct vfsmount *rpcmount; if (nfsd_up) return 0; @@ -220,7 +221,13 @@ static int nfsd_startup(unsigned short port, int nrservs) ret = nfsd_init_socks(port); if (ret) goto out_racache; - ret = lockd_up(init_rpc_pipefs); + rpcmount = get_rpc_pipefs(NULL); + if (IS_ERR(rpcmount)) { + ret = PTR_ERR(rpcmount); + goto out_racache; + } + ret = lockd_up(rpcmount); + mntput(rpcmount); if (ret) goto out_racache; ret = nfs4_state_start(); @@ -308,6 +315,7 @@ static void set_max_…
creator: Kirill A. Shutemov
date: 2011-02-08T18:42:06-00:00

[PATCH v3, RESEND 16/16] Rework get_rpc_pipefs() and introduce put_rpc_pipefs()
type: item
description: Now sunrpc module can be removed normally. Signed-off-by: Kirill A. Shutemov <kas@openvz.org> Reviewed-by: Rob Landley <rlandley@parallels.com> --- fs/nfs/client.c | 4 +- fs/nfs/super.c | 2 +- fs/nfsd/nfs4callback.c | 2 +- fs/nfsd/nfssvc.c | 4 +- include/linux/sunrpc/rpc_pipe_fs.h | 1 + net/sunrpc/rpc_pipe.c | 51 +++++++++++++++++++++++------------ 6 files changed, 40 insertions(+), 24 deletions(-) diff --git a/fs/nfs/client.c b/fs/nfs/client.c index 63e3b54..118952d 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c @@ -838,7 +838,7 @@ static int nfs_init_server(struct nfs_server *server, /* Allocate or find a client reference we can use */ clp = nfs_get_client(&cl_init); - mntput(cl_init.rpcmount); + put_rpc_pipefs(cl_init.rpcmount); if (IS_ERR(clp)) { dprintk("<-- nfs_init_server() = error %ld\n", PTR_ERR(clp)); return PTR_ERR(clp); @@ -1528,7 +1528,7 @@ static int nfs4_init_server(struct nfs_server *server, &timeparms, data->minorversion, rpcmount); - mntput(rpcmount); + put_rpc_pipefs(rpcmount); if (error < 0) goto error; diff --git a/fs/nfs/super.c b/fs/nfs/super.c index be4852b..148843e 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c @@ -1668,7 +1668,7 @@ static int nfs_try_mount(struct nfs_parsed_mount_data *args, * to a file handle. */ status = nfs_mount(&request); - mntput(request.rpcmount); + put_rpc_pipefs(request.rpcmount); if (status != 0) { dfprintk(MOUNT, "NFS: unable to mount server %s, error %d\n", request.hostname, status); diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c index 3048988..8c2ba1a 100644 --- a/fs/nfsd/nfs4callback.c +++ b/fs/nfsd/nfs4callback.c @@ -670,7 +670,7 @@ static int setup_callback_client(struct nfs4_client *clp, struct nfs4_cb_conn *c return PTR_ERR(args.rpcmount); /* Create RPC client */ client = rpc_create(&args); - mntput(args.rpcmount); + put_rpc_pipefs(args.rpcmount); if (IS_ERR(client)) { dprintk("NFSD: couldn't create callback client: %ld\n", PTR_ERR(client)); diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssv…
creator: Kirill A. Shutemov
date: 2011-02-08T18:42:07-00:00