[C/R v20][PATCH 02/96] eclone (2/11): Have alloc_pidmap() return actual error code

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Oren Laadan
Date: Wednesday, March 17, 2010 - 9:07 am

From: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>

alloc_pidmap() can fail either because all pid numbers are in use or
because memory allocation failed.  With support for setting a specific
pid number, alloc_pidmap() would also fail if either the given pid
number is invalid or in use.

Rather than have callers assume -ENOMEM, have alloc_pidmap() return
the actual error.

Changelog[v1]:
	- [Oren Laadan] Rebase to kernel 2.6.33

Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Acked-by: Serge E. Hallyn <serue@us.ibm.com>
Tested-by: Serge E. Hallyn <serue@us.ibm.com>
Reviewed-by: Oren Laadan <orenl@cs.columbia.edu>
---
 kernel/fork.c |    5 +++--
 kernel/pid.c  |   10 ++++++----
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/kernel/fork.c b/kernel/fork.c
index f88bd98..e9cf524 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -1167,10 +1167,11 @@ static struct task_struct *copy_process(unsigned long clone_flags,
 		goto bad_fork_cleanup_io;
 
 	if (pid != &init_struct_pid) {
-		retval = -ENOMEM;
 		pid = alloc_pid(p->nsproxy->pid_ns);
-		if (!pid)
+		if (IS_ERR(pid)) {
+			retval = PTR_ERR(pid);
 			goto bad_fork_cleanup_io;
+		}
 
 		if (clone_flags & CLONE_NEWPID) {
 			retval = pid_ns_prepare_proc(p->nsproxy->pid_ns);
diff --git a/kernel/pid.c b/kernel/pid.c
index 39292e6..252babf 100644
--- a/kernel/pid.c
+++ b/kernel/pid.c
@@ -160,7 +160,7 @@ static int alloc_pidmap(struct pid_namespace *pid_ns)
 	for (i = 0; i <= max_scan; ++i) {
 		if (unlikely(!map->page))
 			if (alloc_pidmap_page(map) < 0)
-				break;
+				return -ENOMEM;
 		if (likely(atomic_read(&map->nr_free))) {
 			do {
 				if (!test_and_set_bit(offset, map->page)) {
@@ -191,7 +191,7 @@ static int alloc_pidmap(struct pid_namespace *pid_ns)
 		}
 		pid = mk_pid(pid_ns, map, offset);
 	}
-	return -1;
+	return -EBUSY;
 }
 
 int next_pidmap(struct pid_namespace *pid_ns, int last)
@@ -260,8 +260,10 @@ struct pid *alloc_pid(struct pid_namespace *ns)
 	struct upid *upid;
 
 	pid = kmem_cache_alloc(ns->pid_cachep, GFP_KERNEL);
-	if (!pid)
+	if (!pid) {
+		pid = ERR_PTR(-ENOMEM);
 		goto out;
+	}
 
 	tmp = ns;
 	for (i = ns->level; i >= 0; i--) {
@@ -295,7 +297,7 @@ out_free:
 		free_pidmap(pid->numbers + i);
 
 	kmem_cache_free(ns->pid_cachep, pid);
-	pid = NULL;
+	pid = ERR_PTR(nr);
 	goto out;
 }
 
-- 
1.6.3.3

--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[C/R v20][PATCH 00/96] Linux Checkpoint-Restart - v20, Oren Laadan, (Wed Mar 17, 9:07 am)
[C/R v20][PATCH 02/96] eclone (2/11): Have alloc_pidmap() ..., Oren Laadan, (Wed Mar 17, 9:07 am)
[C/R v20][PATCH 13/96] c/r: break out new_user_ns(), Oren Laadan, (Wed Mar 17, 9:08 am)
[C/R v20][PATCH 19/96] Namespaces submenu, Oren Laadan, (Wed Mar 17, 9:08 am)
[C/R v20][PATCH 22/96] c/r: documentation, Oren Laadan, (Wed Mar 17, 9:08 am)
[C/R v20][PATCH 28/96] c/r: restart-blocks, Oren Laadan, (Wed Mar 17, 9:08 am)
[C/R v20][PATCH 30/96] c/r: restart multiple processes, Oren Laadan, (Wed Mar 17, 9:08 am)
[C/R v20][PATCH 38/96] c/r: dump open file descriptors, Oren Laadan, (Wed Mar 17, 9:08 am)
[C/R v20][PATCH 51/96] c/r: support for open pipes, Oren Laadan, (Wed Mar 17, 9:08 am)
[C/R v20][PATCH 55/96] c/r: support for UTS namespace, Oren Laadan, (Wed Mar 17, 9:08 am)
[C/R v20][PATCH 60/96] c/r: support semaphore sysv-ipc, Oren Laadan, (Wed Mar 17, 9:08 am)
[C/R v20][PATCH 62/96] c/r: add CKPT_COPY() macro, Oren Laadan, (Wed Mar 17, 9:08 am)
[C/R v20][PATCH 66/96] c/r: restore file-&gt;f_cred, Oren Laadan, (Wed Mar 17, 9:08 am)
[C/R v20][PATCH 73/96] c/r: correctly restore pgid, Oren Laadan, (Wed Mar 17, 9:09 am)
[C/R v20][PATCH 83/96] c/r: checkpoint/restart eventfd, Oren Laadan, (Wed Mar 17, 9:09 am)
[C/R v20][PATCH 95/96] c/r: add selinux support (v6), Oren Laadan, (Wed Mar 17, 9:09 am)
Re: [C/R v20][PATCH 15/96] cgroup freezer: Fix buggy resum ..., Rafael J. Wysocki, (Mon Mar 22, 4:28 pm)
Re: [C/R v20][PATCH 15/96] cgroup freezer: Fix buggy resum ..., Rafael J. Wysocki, (Fri Mar 26, 3:53 pm)
Re: [C/R v20][PATCH 00/96] Linux Checkpoint-Restart - v20, Serge E. Hallyn, (Thu Apr 1, 4:37 pm)