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.
Unified · Split
| @@ -103,14 +103,14 @@ slow: · 102 unmodified lines | ||
| 103 | 103 | goto got_it; |
| 104 | 104 | } |
| 105 | 105 | |
| 106 | −void *ns_get_path(struct path *path, struct task_struct *task, | |
| 107 | − const struct proc_ns_operations *ns_ops) | |
| 106 | +void *ns_get_path_cb(struct path *path, ns_get_path_helper_t *ns_get_cb, | |
| 107 | + void *private_data) | |
| 108 | 108 | { |
| 109 | 109 | struct ns_common *ns; |
| 110 | 110 | void *ret; |
| 111 | 111 | |
| 112 | 112 | again: |
| 113 | − ns = ns_ops->get(task); | |
| 113 | + ns = ns_get_cb(private_data); | |
| 114 | 114 | if (!ns) |
| 115 | 115 | return ERR_PTR(-ENOENT); |
| 116 | 116 | |
| @@ -120,6 +120,29 @@ again: · 3 unmodified lines | ||
| 120 | 120 | return ret; |
| 121 | 121 | } |
| 122 | 122 | |
| 123 | +struct ns_get_path_task_args { | |
| 124 | + const struct proc_ns_operations *ns_ops; | |
| 125 | + struct task_struct *task; | |
| 126 | +}; | |
| 127 | + | |
| 128 | +static struct ns_common *ns_get_path_task(void *private_data) | |
| 129 | +{ | |
| 130 | + struct ns_get_path_task_args *args = private_data; | |
| 131 | + | |
| 132 | + return args->ns_ops->get(args->task); | |
| 133 | +} | |
| 134 | + | |
| 135 | +void *ns_get_path(struct path *path, struct task_struct *task, | |
| 136 | + const struct proc_ns_operations *ns_ops) | |
| 137 | +{ | |
| 138 | + struct ns_get_path_task_args args = { | |
| 139 | + .ns_ops = ns_ops, | |
| 140 | + .task = task, | |
| 141 | + }; | |
| 142 | + | |
| 143 | + return ns_get_path_cb(path, ns_get_path_task, &args); | |
| 144 | +} | |
| 145 | + | |
| 123 | 146 | int open_related_ns(struct ns_common *ns, |
| 124 | 147 | struct ns_common *(*get_ns)(struct ns_common *ns)) |
| 125 | 148 | { |
| @@ -78,6 +78,9 @@ extern struct file *proc_ns_fget(int fd); · 77 unmodified lines | ||
| 78 | 78 | #define get_proc_ns(inode) ((struct ns_common *)(inode)->i_private) |
| 79 | 79 | extern void *ns_get_path(struct path *path, struct task_struct *task, |
| 80 | 80 | const struct proc_ns_operations *ns_ops); |
| 81 | +typedef struct ns_common *ns_get_path_helper_t(void *); | |
| 82 | +extern void *ns_get_path_cb(struct path *path, ns_get_path_helper_t ns_get_cb, | |
| 83 | + void *private_data); | |
| 81 | 84 | |
| 82 | 85 | extern int ns_get_name(char *buf, size_t size, struct task_struct *task, |
| 83 | 86 | const struct proc_ns_operations *ns_ops); |