From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jakub Kicinski Subject: [PATCH bpf-next v3 6/9] nsfs: generalize ns_get_path() for path resolution with a task Date: Wed, 27 Dec 2017 18:39:08 -0800 Message-ID: <20171228023911.4251-7-jakub.kicinski@netronome.com> References: <20171228023911.4251-1-jakub.kicinski@netronome.com> Cc: oss-drivers@netronome.com, Jakub Kicinski , "Eric W . Biederman" To: netdev@vger.kernel.org, daniel@iogearbox.net, alexei.starovoitov@gmail.com Return-path: Received: from mail-pl0-f65.google.com ([209.85.160.65]:42117 "EHLO mail-pl0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752782AbdL1Cj4 (ORCPT ); Wed, 27 Dec 2017 21:39:56 -0500 Received: by mail-pl0-f65.google.com with SMTP id bd8so20392995plb.9 for ; Wed, 27 Dec 2017 18:39:56 -0800 (PST) In-Reply-To: <20171228023911.4251-1-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org List-ID: ns_get_path() takes struct task_struct and proc_ns_ops as its parameters. For path resolution directly from a namespace, e.g. based on a networking device's net name space, we need more flexibility. Add a ns_get_path_cb() helper which will allow callers to use any method of obtaining the name space reference. Convert ns_get_path() to use ns_get_path_cb(). Following patches will bring a networking user. CC: Eric W. Biederman Suggested-by: Daniel Borkmann Signed-off-by: Jakub Kicinski --- fs/nsfs.c | 29 ++++++++++++++++++++++++++--- include/linux/proc_ns.h | 3 +++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/fs/nsfs.c b/fs/nsfs.c index 7c6f76d29f56..36b0772701a0 100644 --- a/fs/nsfs.c +++ b/fs/nsfs.c @@ -103,14 +103,14 @@ static void *__ns_get_path(struct path *path, struct ns_common *ns) goto got_it; } -void *ns_get_path(struct path *path, struct task_struct *task, - const struct proc_ns_operations *ns_ops) +void *ns_get_path_cb(struct path *path, ns_get_path_helper_t *ns_get_cb, + void *private_data) { struct ns_common *ns; void *ret; again: - ns = ns_ops->get(task); + ns = ns_get_cb(private_data); if (!ns) return ERR_PTR(-ENOENT); @@ -120,6 +120,29 @@ void *ns_get_path(struct path *path, struct task_struct *task, return ret; } +struct ns_get_path_task_args { + const struct proc_ns_operations *ns_ops; + struct task_struct *task; +}; + +static struct ns_common *ns_get_path_task(void *private_data) +{ + struct ns_get_path_task_args *args = private_data; + + return args->ns_ops->get(args->task); +} + +void *ns_get_path(struct path *path, struct task_struct *task, + const struct proc_ns_operations *ns_ops) +{ + struct ns_get_path_task_args args = { + .ns_ops = ns_ops, + .task = task, + }; + + return ns_get_path_cb(path, ns_get_path_task, &args); +} + int open_related_ns(struct ns_common *ns, struct ns_common *(*get_ns)(struct ns_common *ns)) { diff --git a/include/linux/proc_ns.h b/include/linux/proc_ns.h index 2ff18c9840a7..d31cb6215905 100644 --- a/include/linux/proc_ns.h +++ b/include/linux/proc_ns.h @@ -78,6 +78,9 @@ extern struct file *proc_ns_fget(int fd); #define get_proc_ns(inode) ((struct ns_common *)(inode)->i_private) extern void *ns_get_path(struct path *path, struct task_struct *task, const struct proc_ns_operations *ns_ops); +typedef struct ns_common *ns_get_path_helper_t(void *); +extern void *ns_get_path_cb(struct path *path, ns_get_path_helper_t ns_get_cb, + void *private_data); extern int ns_get_name(char *buf, size_t size, struct task_struct *task, const struct proc_ns_operations *ns_ops); -- 2.15.1