1
0
Fork 0

nsfs: clean-up ns_get_path() signature to return int

ns_get_path() and ns_get_path_cb() only ever return either NULL or an
ERR_PTR. It is far more idiomatic to simply return an integer, and it
makes all of the callers of ns_get_path() more straightforward to read.

Fixes: e149ed2b80 ("take the targets of /proc/*/ns/* symlinks to separate fs")
Signed-off-by: Aleksa Sarai <cyphar@cyphar.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
alistair/sensors
Aleksa Sarai 2019-12-07 01:13:27 +11:00 committed by Al Viro
parent 2b98149c23
commit ce623f8987
5 changed files with 26 additions and 27 deletions

View File

@ -52,7 +52,7 @@ static void nsfs_evict(struct inode *inode)
ns->ops->put(ns); ns->ops->put(ns);
} }
static void *__ns_get_path(struct path *path, struct ns_common *ns) static int __ns_get_path(struct path *path, struct ns_common *ns)
{ {
struct vfsmount *mnt = nsfs_mnt; struct vfsmount *mnt = nsfs_mnt;
struct dentry *dentry; struct dentry *dentry;
@ -71,13 +71,13 @@ static void *__ns_get_path(struct path *path, struct ns_common *ns)
got_it: got_it:
path->mnt = mntget(mnt); path->mnt = mntget(mnt);
path->dentry = dentry; path->dentry = dentry;
return NULL; return 0;
slow: slow:
rcu_read_unlock(); rcu_read_unlock();
inode = new_inode_pseudo(mnt->mnt_sb); inode = new_inode_pseudo(mnt->mnt_sb);
if (!inode) { if (!inode) {
ns->ops->put(ns); ns->ops->put(ns);
return ERR_PTR(-ENOMEM); return -ENOMEM;
} }
inode->i_ino = ns->inum; inode->i_ino = ns->inum;
inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode); inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
@ -89,7 +89,7 @@ slow:
dentry = d_alloc_anon(mnt->mnt_sb); dentry = d_alloc_anon(mnt->mnt_sb);
if (!dentry) { if (!dentry) {
iput(inode); iput(inode);
return ERR_PTR(-ENOMEM); return -ENOMEM;
} }
d_instantiate(dentry, inode); d_instantiate(dentry, inode);
dentry->d_fsdata = (void *)ns->ops; dentry->d_fsdata = (void *)ns->ops;
@ -98,23 +98,22 @@ slow:
d_delete(dentry); /* make sure ->d_prune() does nothing */ d_delete(dentry); /* make sure ->d_prune() does nothing */
dput(dentry); dput(dentry);
cpu_relax(); cpu_relax();
return ERR_PTR(-EAGAIN); return -EAGAIN;
} }
goto got_it; goto got_it;
} }
void *ns_get_path_cb(struct path *path, ns_get_path_helper_t *ns_get_cb, int ns_get_path_cb(struct path *path, ns_get_path_helper_t *ns_get_cb,
void *private_data) void *private_data)
{ {
void *ret; int ret;
do { do {
struct ns_common *ns = ns_get_cb(private_data); struct ns_common *ns = ns_get_cb(private_data);
if (!ns) if (!ns)
return ERR_PTR(-ENOENT); return -ENOENT;
ret = __ns_get_path(path, ns); ret = __ns_get_path(path, ns);
} while (ret == ERR_PTR(-EAGAIN)); } while (ret == -EAGAIN);
return ret; return ret;
} }
@ -131,7 +130,7 @@ static struct ns_common *ns_get_path_task(void *private_data)
return args->ns_ops->get(args->task); return args->ns_ops->get(args->task);
} }
void *ns_get_path(struct path *path, struct task_struct *task, int ns_get_path(struct path *path, struct task_struct *task,
const struct proc_ns_operations *ns_ops) const struct proc_ns_operations *ns_ops)
{ {
struct ns_get_path_task_args args = { struct ns_get_path_task_args args = {
@ -147,7 +146,7 @@ int open_related_ns(struct ns_common *ns,
{ {
struct path path = {}; struct path path = {};
struct file *f; struct file *f;
void *err; int err;
int fd; int fd;
fd = get_unused_fd_flags(O_CLOEXEC); fd = get_unused_fd_flags(O_CLOEXEC);
@ -164,11 +163,11 @@ int open_related_ns(struct ns_common *ns,
} }
err = __ns_get_path(&path, relative); err = __ns_get_path(&path, relative);
} while (err == ERR_PTR(-EAGAIN)); } while (err == -EAGAIN);
if (IS_ERR(err)) { if (err) {
put_unused_fd(fd); put_unused_fd(fd);
return PTR_ERR(err); return err;
} }
f = dentry_open(&path, O_RDONLY, current_cred()); f = dentry_open(&path, O_RDONLY, current_cred());

View File

@ -42,14 +42,14 @@ static const char *proc_ns_get_link(struct dentry *dentry,
const struct proc_ns_operations *ns_ops = PROC_I(inode)->ns_ops; const struct proc_ns_operations *ns_ops = PROC_I(inode)->ns_ops;
struct task_struct *task; struct task_struct *task;
struct path ns_path; struct path ns_path;
void *error = ERR_PTR(-EACCES); int error = -EACCES;
if (!dentry) if (!dentry)
return ERR_PTR(-ECHILD); return ERR_PTR(-ECHILD);
task = get_proc_task(inode); task = get_proc_task(inode);
if (!task) if (!task)
return error; return ERR_PTR(-EACCES);
if (ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS)) { if (ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS)) {
error = ns_get_path(&ns_path, task, ns_ops); error = ns_get_path(&ns_path, task, ns_ops);
@ -57,7 +57,7 @@ static const char *proc_ns_get_link(struct dentry *dentry,
nd_jump_link(&ns_path); nd_jump_link(&ns_path);
} }
put_task_struct(task); put_task_struct(task);
return error; return ERR_PTR(error);
} }
static int proc_ns_readlink(struct dentry *dentry, char __user *buffer, int buflen) static int proc_ns_readlink(struct dentry *dentry, char __user *buffer, int buflen)

View File

@ -76,10 +76,10 @@ static inline int ns_alloc_inum(struct ns_common *ns)
extern struct file *proc_ns_fget(int fd); extern struct file *proc_ns_fget(int fd);
#define get_proc_ns(inode) ((struct ns_common *)(inode)->i_private) #define get_proc_ns(inode) ((struct ns_common *)(inode)->i_private)
extern void *ns_get_path(struct path *path, struct task_struct *task, extern int ns_get_path(struct path *path, struct task_struct *task,
const struct proc_ns_operations *ns_ops); const struct proc_ns_operations *ns_ops);
typedef struct ns_common *ns_get_path_helper_t(void *); 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, extern int ns_get_path_cb(struct path *path, ns_get_path_helper_t ns_get_cb,
void *private_data); void *private_data);
extern int ns_get_name(char *buf, size_t size, struct task_struct *task, extern int ns_get_name(char *buf, size_t size, struct task_struct *task,

View File

@ -302,14 +302,14 @@ int bpf_prog_offload_info_fill(struct bpf_prog_info *info,
struct inode *ns_inode; struct inode *ns_inode;
struct path ns_path; struct path ns_path;
char __user *uinsns; char __user *uinsns;
void *res; int res;
u32 ulen; u32 ulen;
res = ns_get_path_cb(&ns_path, bpf_prog_offload_info_fill_ns, &args); res = ns_get_path_cb(&ns_path, bpf_prog_offload_info_fill_ns, &args);
if (IS_ERR(res)) { if (res) {
if (!info->ifindex) if (!info->ifindex)
return -ENODEV; return -ENODEV;
return PTR_ERR(res); return res;
} }
down_read(&bpf_devs_lock); down_read(&bpf_devs_lock);
@ -526,13 +526,13 @@ int bpf_map_offload_info_fill(struct bpf_map_info *info, struct bpf_map *map)
}; };
struct inode *ns_inode; struct inode *ns_inode;
struct path ns_path; struct path ns_path;
void *res; int res;
res = ns_get_path_cb(&ns_path, bpf_map_offload_info_fill_ns, &args); res = ns_get_path_cb(&ns_path, bpf_map_offload_info_fill_ns, &args);
if (IS_ERR(res)) { if (res) {
if (!info->ifindex) if (!info->ifindex)
return -ENODEV; return -ENODEV;
return PTR_ERR(res); return res;
} }
ns_inode = ns_path.dentry->d_inode; ns_inode = ns_path.dentry->d_inode;

View File

@ -7495,7 +7495,7 @@ static void perf_fill_ns_link_info(struct perf_ns_link_info *ns_link_info,
{ {
struct path ns_path; struct path ns_path;
struct inode *ns_inode; struct inode *ns_inode;
void *error; int error;
error = ns_get_path(&ns_path, task, ns_ops); error = ns_get_path(&ns_path, task, ns_ops);
if (!error) { if (!error) {