Commit ce623f89 authored by Aleksa Sarai's avatar Aleksa Sarai Committed by Al Viro
Browse files

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: e149ed2b ("take the targets of /proc/*/ns/* symlinks to separate fs")
Signed-off-by: default avatarAleksa Sarai <cyphar@cyphar.com>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 2b98149c
Loading
Loading
Loading
Loading
+14 −15
Original line number Diff line number Diff line
@@ -52,7 +52,7 @@ static void nsfs_evict(struct inode *inode)
	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 dentry *dentry;
@@ -71,13 +71,13 @@ static void *__ns_get_path(struct path *path, struct ns_common *ns)
got_it:
	path->mnt = mntget(mnt);
	path->dentry = dentry;
	return NULL;
	return 0;
slow:
	rcu_read_unlock();
	inode = new_inode_pseudo(mnt->mnt_sb);
	if (!inode) {
		ns->ops->put(ns);
		return ERR_PTR(-ENOMEM);
		return -ENOMEM;
	}
	inode->i_ino = ns->inum;
	inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
@@ -89,7 +89,7 @@ slow:
	dentry = d_alloc_anon(mnt->mnt_sb);
	if (!dentry) {
		iput(inode);
		return ERR_PTR(-ENOMEM);
		return -ENOMEM;
	}
	d_instantiate(dentry, inode);
	dentry->d_fsdata = (void *)ns->ops;
@@ -98,23 +98,22 @@ slow:
		d_delete(dentry);	/* make sure ->d_prune() does nothing */
		dput(dentry);
		cpu_relax();
		return ERR_PTR(-EAGAIN);
		return -EAGAIN;
	}
	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 *ret;
	int ret;

	do {
		struct ns_common *ns = ns_get_cb(private_data);
		if (!ns)
			return ERR_PTR(-ENOENT);

			return -ENOENT;
		ret = __ns_get_path(path, ns);
	} while (ret == ERR_PTR(-EAGAIN));
	} while (ret == -EAGAIN);

	return ret;
}
@@ -131,7 +130,7 @@ static struct ns_common *ns_get_path_task(void *private_data)
	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)
{
	struct ns_get_path_task_args args = {
@@ -147,7 +146,7 @@ int open_related_ns(struct ns_common *ns,
{
	struct path path = {};
	struct file *f;
	void *err;
	int err;
	int fd;

	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);
	} while (err == ERR_PTR(-EAGAIN));
	} while (err == -EAGAIN);

	if (IS_ERR(err)) {
	if (err) {
		put_unused_fd(fd);
		return PTR_ERR(err);
		return err;
	}

	f = dentry_open(&path, O_RDONLY, current_cred());
+3 −3
Original line number Diff line number Diff line
@@ -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;
	struct task_struct *task;
	struct path ns_path;
	void *error = ERR_PTR(-EACCES);
	int error = -EACCES;

	if (!dentry)
		return ERR_PTR(-ECHILD);

	task = get_proc_task(inode);
	if (!task)
		return error;
		return ERR_PTR(-EACCES);

	if (ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS)) {
		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);
	}
	put_task_struct(task);
	return error;
	return ERR_PTR(error);
}

static int proc_ns_readlink(struct dentry *dentry, char __user *buffer, int buflen)
+2 −2
Original line number Diff line number Diff line
@@ -76,10 +76,10 @@ static inline int ns_alloc_inum(struct ns_common *ns)

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,
extern int 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,
extern int 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,
+6 −6
Original line number Diff line number Diff line
@@ -302,14 +302,14 @@ int bpf_prog_offload_info_fill(struct bpf_prog_info *info,
	struct inode *ns_inode;
	struct path ns_path;
	char __user *uinsns;
	void *res;
	int res;
	u32 ulen;

	res = ns_get_path_cb(&ns_path, bpf_prog_offload_info_fill_ns, &args);
	if (IS_ERR(res)) {
	if (res) {
		if (!info->ifindex)
			return -ENODEV;
		return PTR_ERR(res);
		return res;
	}

	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 path ns_path;
	void *res;
	int res;

	res = ns_get_path_cb(&ns_path, bpf_map_offload_info_fill_ns, &args);
	if (IS_ERR(res)) {
	if (res) {
		if (!info->ifindex)
			return -ENODEV;
		return PTR_ERR(res);
		return res;
	}

	ns_inode = ns_path.dentry->d_inode;
+1 −1
Original line number Diff line number Diff line
@@ -7495,7 +7495,7 @@ static void perf_fill_ns_link_info(struct perf_ns_link_info *ns_link_info,
{
	struct path ns_path;
	struct inode *ns_inode;
	void *error;
	int error;

	error = ns_get_path(&ns_path, task, ns_ops);
	if (!error) {