[RFC PATCH 5 4/7] nfs - cache_lib use service thread if not executing in init namespace
From: Ian Kent If pipefs is registered within a container pipefs requests should be run within their originating container also. To do that get a token to a service thread created within the container environment for usermode helper calls. Signed-off-by: Ian Kent Cc: Benjamin Coddington Cc: Al Viro Cc: J. Bruce Fields Cc: David Howells Cc: Trond Myklebust Cc: Oleg Nesterov Cc: Eric W. Biederman Cc: Jeff Layton --- fs/nfs/cache_lib.c |7 ++- include/linux/sunrpc/cache.h |2 ++ net/sunrpc/cache.c |5 + 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/fs/nfs/cache_lib.c b/fs/nfs/cache_lib.c index 5f7b053..78f9b6e 100644 --- a/fs/nfs/cache_lib.c +++ b/fs/nfs/cache_lib.c @@ -48,7 +48,12 @@ int nfs_cache_upcall(struct cache_detail *cd, char *entry_name) if (nfs_cache_getent_prog[0] == '\0') goto out; - ret = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC); + if (cd->u.pipefs.umh_token) { + int token = cd->u.pipefs.umh_token; + ret = call_usermodehelper_service(argv[0], argv, envp, + token, UMH_WAIT_EXEC); + } else + ret = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC); /* * Disable the upcall mechanism if we're getting an ENOENT or * EACCES error. The admin can re-enable it on the fly by using diff --git a/include/linux/sunrpc/cache.h b/include/linux/sunrpc/cache.h index 437ddb6..bb57c7e 100644 --- a/include/linux/sunrpc/cache.h +++ b/include/linux/sunrpc/cache.h @@ -68,6 +68,8 @@ struct cache_detail_procfs { struct cache_detail_pipefs { struct dentry *dir; + /* Namespace token */ + int umh_token; }; struct cache_detail { diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c index 5199bb1..eabc0d0 100644 --- a/net/sunrpc/cache.c +++ b/net/sunrpc/cache.c @@ -1811,6 +1811,9 @@ int sunrpc_cache_register_pipefs(struct dentry *parent, if (IS_ERR(dir)) return PTR_ERR(dir); cd->u.pipefs.dir = dir; + if (cd->net != _net) + cd->u.pipefs.umh_token = +umh_wq_get_token(cd->u.pipefs.umh_token, "pipefs"); return 0; } EXPORT_SYMBOL_GPL(sunrpc_cache_register_pipefs); @@ -1819,6 +1822,8 @@ void sunrpc_cache_unregister_pipefs(struct cache_detail *cd) { rpc_remove_cache_dir(cd->u.pipefs.dir); cd->u.pipefs.dir = NULL; + umh_wq_put_token(cd->u.pipefs.umh_token); + cd->u.pipefs.umh_token = 0; } EXPORT_SYMBOL_GPL(sunrpc_cache_unregister_pipefs); -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[RFC PATCH 5 4/7] nfs - cache_lib use service thread if not executing in init namespace
From: Ian Kent ik...@redhat.com If pipefs is registered within a container pipefs requests should be run within their originating container also. To do that get a token to a service thread created within the container environment for usermode helper calls. Signed-off-by: Ian Kent ik...@redhat.com Cc: Benjamin Coddington bcodd...@redhat.com Cc: Al Viro v...@zeniv.linux.org.uk Cc: J. Bruce Fields bfie...@fieldses.org Cc: David Howells dhowe...@redhat.com Cc: Trond Myklebust trond.mykleb...@primarydata.com Cc: Oleg Nesterov onest...@redhat.com Cc: Eric W. Biederman ebied...@xmission.com Cc: Jeff Layton jeff.lay...@primarydata.com --- fs/nfs/cache_lib.c |7 ++- include/linux/sunrpc/cache.h |2 ++ net/sunrpc/cache.c |5 + 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/fs/nfs/cache_lib.c b/fs/nfs/cache_lib.c index 5f7b053..78f9b6e 100644 --- a/fs/nfs/cache_lib.c +++ b/fs/nfs/cache_lib.c @@ -48,7 +48,12 @@ int nfs_cache_upcall(struct cache_detail *cd, char *entry_name) if (nfs_cache_getent_prog[0] == '\0') goto out; - ret = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC); + if (cd-u.pipefs.umh_token) { + int token = cd-u.pipefs.umh_token; + ret = call_usermodehelper_service(argv[0], argv, envp, + token, UMH_WAIT_EXEC); + } else + ret = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC); /* * Disable the upcall mechanism if we're getting an ENOENT or * EACCES error. The admin can re-enable it on the fly by using diff --git a/include/linux/sunrpc/cache.h b/include/linux/sunrpc/cache.h index 437ddb6..bb57c7e 100644 --- a/include/linux/sunrpc/cache.h +++ b/include/linux/sunrpc/cache.h @@ -68,6 +68,8 @@ struct cache_detail_procfs { struct cache_detail_pipefs { struct dentry *dir; + /* Namespace token */ + int umh_token; }; struct cache_detail { diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c index 5199bb1..eabc0d0 100644 --- a/net/sunrpc/cache.c +++ b/net/sunrpc/cache.c @@ -1811,6 +1811,9 @@ int sunrpc_cache_register_pipefs(struct dentry *parent, if (IS_ERR(dir)) return PTR_ERR(dir); cd-u.pipefs.dir = dir; + if (cd-net != init_net) + cd-u.pipefs.umh_token = +umh_wq_get_token(cd-u.pipefs.umh_token, pipefs); return 0; } EXPORT_SYMBOL_GPL(sunrpc_cache_register_pipefs); @@ -1819,6 +1822,8 @@ void sunrpc_cache_unregister_pipefs(struct cache_detail *cd) { rpc_remove_cache_dir(cd-u.pipefs.dir); cd-u.pipefs.dir = NULL; + umh_wq_put_token(cd-u.pipefs.umh_token); + cd-u.pipefs.umh_token = 0; } EXPORT_SYMBOL_GPL(sunrpc_cache_unregister_pipefs); -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/