Commit df75e774 authored by Eric W. Biederman's avatar Eric W. Biederman

userns: When the per user per user namespace limit is reached return ENOSPC

The current error codes returned when a the per user per user
namespace limit are hit (EINVAL, EUSERS, and ENFILE) are wrong.  I
asked for advice on linux-api and it we made clear that those were
the wrong error code, but a correct effor code was not suggested.

The best general error code I have found for hitting a resource limit
is ENOSPC.  It is not perfect but as it is unambiguous it will serve
until someone comes up with a better error code.
Signed-off-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
parent 9c722e40
...@@ -2754,7 +2754,7 @@ static struct mnt_namespace *alloc_mnt_ns(struct user_namespace *user_ns) ...@@ -2754,7 +2754,7 @@ static struct mnt_namespace *alloc_mnt_ns(struct user_namespace *user_ns)
ucounts = inc_mnt_namespaces(user_ns); ucounts = inc_mnt_namespaces(user_ns);
if (!ucounts) if (!ucounts)
return ERR_PTR(-ENFILE); return ERR_PTR(-ENOSPC);
new_ns = kmalloc(sizeof(struct mnt_namespace), GFP_KERNEL); new_ns = kmalloc(sizeof(struct mnt_namespace), GFP_KERNEL);
if (!new_ns) { if (!new_ns) {
......
...@@ -33,7 +33,7 @@ static struct ipc_namespace *create_ipc_ns(struct user_namespace *user_ns, ...@@ -33,7 +33,7 @@ static struct ipc_namespace *create_ipc_ns(struct user_namespace *user_ns,
struct ucounts *ucounts; struct ucounts *ucounts;
int err; int err;
err = -ENFILE; err = -ENOSPC;
ucounts = inc_ipc_namespaces(user_ns); ucounts = inc_ipc_namespaces(user_ns);
if (!ucounts) if (!ucounts)
goto fail; goto fail;
......
...@@ -6354,7 +6354,7 @@ struct cgroup_namespace *copy_cgroup_ns(unsigned long flags, ...@@ -6354,7 +6354,7 @@ struct cgroup_namespace *copy_cgroup_ns(unsigned long flags,
ucounts = inc_cgroup_namespaces(user_ns); ucounts = inc_cgroup_namespaces(user_ns);
if (!ucounts) if (!ucounts)
return ERR_PTR(-ENFILE); return ERR_PTR(-ENOSPC);
/* It is not safe to take cgroup_mutex here */ /* It is not safe to take cgroup_mutex here */
spin_lock_irq(&css_set_lock); spin_lock_irq(&css_set_lock);
......
...@@ -98,7 +98,7 @@ static struct pid_namespace *create_pid_namespace(struct user_namespace *user_ns ...@@ -98,7 +98,7 @@ static struct pid_namespace *create_pid_namespace(struct user_namespace *user_ns
int i; int i;
int err; int err;
err = -EINVAL; err = -ENOSPC;
if (level > MAX_PID_NS_LEVEL) if (level > MAX_PID_NS_LEVEL)
goto out; goto out;
ucounts = inc_pid_namespaces(user_ns); ucounts = inc_pid_namespaces(user_ns);
......
...@@ -76,7 +76,7 @@ int create_user_ns(struct cred *new) ...@@ -76,7 +76,7 @@ int create_user_ns(struct cred *new)
struct ucounts *ucounts; struct ucounts *ucounts;
int ret, i; int ret, i;
ret = -EUSERS; ret = -ENOSPC;
if (parent_ns->level > 32) if (parent_ns->level > 32)
goto fail; goto fail;
......
...@@ -49,7 +49,7 @@ static struct uts_namespace *clone_uts_ns(struct user_namespace *user_ns, ...@@ -49,7 +49,7 @@ static struct uts_namespace *clone_uts_ns(struct user_namespace *user_ns,
struct ucounts *ucounts; struct ucounts *ucounts;
int err; int err;
err = -ENFILE; err = -ENOSPC;
ucounts = inc_uts_namespaces(user_ns); ucounts = inc_uts_namespaces(user_ns);
if (!ucounts) if (!ucounts)
goto fail; goto fail;
......
...@@ -370,7 +370,7 @@ struct net *copy_net_ns(unsigned long flags, ...@@ -370,7 +370,7 @@ struct net *copy_net_ns(unsigned long flags,
ucounts = inc_net_namespaces(user_ns); ucounts = inc_net_namespaces(user_ns);
if (!ucounts) if (!ucounts)
return ERR_PTR(-ENFILE); return ERR_PTR(-ENOSPC);
net = net_alloc(); net = net_alloc();
if (!net) { if (!net) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment