Skip to content

Commit

Permalink
fs: allow mount namespace fd
Browse files Browse the repository at this point in the history
We already allow a mount namespace id, enable mount namespace file
descriptors as well.

Link: https://lore.kernel.org/r/20240719-work-mount-namespace-v1-2-834113cab0d2@kernel.org
Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
  • Loading branch information
Christian Brauner committed Aug 9, 2024
1 parent 720261c commit 7b9d14a
Showing 1 changed file with 32 additions and 7 deletions.
39 changes: 32 additions & 7 deletions fs/namespace.c
Original file line number Diff line number Diff line change
Expand Up @@ -5243,12 +5243,37 @@ static int copy_mnt_id_req(const struct mnt_id_req __user *req,
* that, or if not simply grab a passive reference on our mount namespace and
* return that.
*/
static struct mnt_namespace *grab_requested_mnt_ns(u64 mnt_ns_id)
static struct mnt_namespace *grab_requested_mnt_ns(const struct mnt_id_req *kreq)
{
if (mnt_ns_id)
return lookup_mnt_ns(mnt_ns_id);
refcount_inc(&current->nsproxy->mnt_ns->passive);
return current->nsproxy->mnt_ns;
struct mnt_namespace *mnt_ns;

if (kreq->mnt_ns_id && kreq->spare)
return ERR_PTR(-EINVAL);

if (kreq->mnt_ns_id)
return lookup_mnt_ns(kreq->mnt_ns_id);

if (kreq->spare) {
struct ns_common *ns;

CLASS(fd, f)(kreq->spare);
if (!f.file)
return ERR_PTR(-EBADF);

if (!proc_ns_file(f.file))
return ERR_PTR(-EINVAL);

ns = get_proc_ns(file_inode(f.file));
if (ns->ops->type != CLONE_NEWNS)
return ERR_PTR(-EINVAL);

mnt_ns = to_mnt_ns(ns);
} else {
mnt_ns = current->nsproxy->mnt_ns;
}

refcount_inc(&mnt_ns->passive);
return mnt_ns;
}

SYSCALL_DEFINE4(statmount, const struct mnt_id_req __user *, req,
Expand All @@ -5269,7 +5294,7 @@ SYSCALL_DEFINE4(statmount, const struct mnt_id_req __user *, req,
if (ret)
return ret;

ns = grab_requested_mnt_ns(kreq.mnt_ns_id);
ns = grab_requested_mnt_ns(&kreq);
if (!ns)
return -ENOENT;

Expand Down Expand Up @@ -5396,7 +5421,7 @@ SYSCALL_DEFINE4(listmount, const struct mnt_id_req __user *, req,
if (!kmnt_ids)
return -ENOMEM;

ns = grab_requested_mnt_ns(kreq.mnt_ns_id);
ns = grab_requested_mnt_ns(&kreq);
if (!ns)
return -ENOENT;

Expand Down

0 comments on commit 7b9d14a

Please sign in to comment.