[Devel] [PATCH 5/6] define ckpt_obj_try_fetch

serue at us.ibm.com serue at us.ibm.com
Tue Nov 17 17:53:32 PST 2009


From: Serge E. Hallyn <serue at us.ibm.com>

Which doesn't ckpt_err() on failure.  Also have callers which want
to, probe with _lite(), not ckpt_obj_fetch().

This is needed before the next patch, which will make ckpt_err()
with non-zero err bail a restart.

Signed-off-by: Serge E. Hallyn <serue at us.ibm.com>
---
 checkpoint/objhash.c       |   19 ++++++++++++-------
 checkpoint/signal.c        |   12 +++++++-----
 fs/pipe.c                  |    4 ++--
 include/linux/checkpoint.h |    2 ++
 mm/shmem.c                 |    2 +-
 5 files changed, 24 insertions(+), 15 deletions(-)

diff --git a/checkpoint/objhash.c b/checkpoint/objhash.c
index 2e50025..6b34426 100644
--- a/checkpoint/objhash.c
+++ b/checkpoint/objhash.c
@@ -999,20 +999,25 @@ int ckpt_obj_insert(struct ckpt_ctx *ctx, void *ptr,
  *
  * [This is used during restart].
  */
-void *ckpt_obj_fetch(struct ckpt_ctx *ctx, int objref, enum obj_type type)
+void *ckpt_obj_try_fetch(struct ckpt_ctx *ctx, int objref, enum obj_type type)
 {
 	struct ckpt_obj *obj;
 
 	obj = obj_find_by_objref(ctx, objref);
-	if (!obj) {
-		ckpt_err(ctx, -EINVAL, "%(O)No such object (type %d)\n",
-			 objref, type);
+	if (!obj)
 		return ERR_PTR(-EINVAL);
-	}
 	ckpt_debug("%s ref %d\n", obj->ops->obj_name, obj->objref);
 	if (obj->ops->obj_type == type)
 		return obj->ptr;
-	ckpt_err(ctx, -ENOMSG, "%(O)Hashed objed was type %d, not %d\n",
-		 objref, obj->ops->obj_type, type);
 	return ERR_PTR(-ENOMSG);
 }
+
+void *ckpt_obj_fetch(struct ckpt_ctx *ctx, int objref, enum obj_type type)
+{
+	void *ret = ckpt_obj_try_fetch(ctx, objref, type);
+
+	if (unlikely(IS_ERR(ret)))
+		ckpt_err(ctx, PTR_ERR(ret), "%(O)Fetching object (type %d)\n",
+			 objref, type);
+	return ret;
+}
diff --git a/checkpoint/signal.c b/checkpoint/signal.c
index 989b974..d8cb5d9 100644
--- a/checkpoint/signal.c
+++ b/checkpoint/signal.c
@@ -621,7 +621,7 @@ int restore_obj_signal(struct ckpt_ctx *ctx, int signal_objref)
 	struct signal_struct *signal;
 	int ret = 0;
 
-	signal = ckpt_obj_fetch(ctx, signal_objref, CKPT_OBJ_SIGNAL);
+	signal = ckpt_obj_try_fetch(ctx, signal_objref, CKPT_OBJ_SIGNAL);
 	if (!IS_ERR(signal)) {
 		/*
 		 * signal_struct is already shared properly as it is
@@ -629,15 +629,17 @@ int restore_obj_signal(struct ckpt_ctx *ctx, int signal_objref)
 		 * are already restore now, t->signal must match.
 		 */
 		if (signal != current->signal)
-			ret = -EINVAL;
-	} else if (PTR_ERR(signal) == -EINVAL) {
+			return -EINVAL;
+		return ret;
+	}
+
+	ret = PTR_ERR(signal);
+	if (ret == -EINVAL) {
 		/* first timer: add to hash and restore our t->signal */
 		ret = ckpt_obj_insert(ctx, current->signal,
 				      signal_objref, CKPT_OBJ_SIGNAL);
 		if (ret >= 0)
 			ret = restore_signal(ctx);
-	} else {
-		ret = PTR_ERR(signal);
 	}
 
 	return ret;
diff --git a/fs/pipe.c b/fs/pipe.c
index 65ad44e..7f350fc 100644
--- a/fs/pipe.c
+++ b/fs/pipe.c
@@ -919,7 +919,7 @@ struct file *pipe_file_restore(struct ckpt_ctx *ctx, struct ckpt_hdr_file *ptr)
 	if (h->pipe_objref <= 0)
 		return ERR_PTR(-EINVAL);
 
-	file = ckpt_obj_fetch(ctx, h->pipe_objref, CKPT_OBJ_FILE);
+	file = ckpt_obj_try_fetch(ctx, h->pipe_objref, CKPT_OBJ_FILE);
 	/*
 	 * If ckpt_obj_fetch() returned ERR_PTR(-EINVAL), then this is
 	 * the first time we see this pipe so need to restore the
@@ -990,7 +990,7 @@ struct file *fifo_file_restore(struct ckpt_ctx *ctx, struct ckpt_hdr_file *ptr)
 	 * If ckpt_obj_fetch() returned ERR_PTR(-EINVAL), this is the
 	 * first time for this fifo.
 	 */
-	file = ckpt_obj_fetch(ctx, h->pipe_objref, CKPT_OBJ_FILE);
+	file = ckpt_obj_try_fetch(ctx, h->pipe_objref, CKPT_OBJ_FILE);
 	if (!IS_ERR(file))
 		first = 0;
 	else if (PTR_ERR(file) == -EINVAL)
diff --git a/include/linux/checkpoint.h b/include/linux/checkpoint.h
index 8fd6cba..65765af 100644
--- a/include/linux/checkpoint.h
+++ b/include/linux/checkpoint.h
@@ -132,6 +132,8 @@ extern int ckpt_obj_lookup(struct ckpt_ctx *ctx, void *ptr,
 			   enum obj_type type);
 extern int ckpt_obj_lookup_add(struct ckpt_ctx *ctx, void *ptr,
 			       enum obj_type type, int *first);
+extern void *ckpt_obj_try_fetch(struct ckpt_ctx *ctx, int objref,
+			    enum obj_type type);
 extern void *ckpt_obj_fetch(struct ckpt_ctx *ctx, int objref,
 			    enum obj_type type);
 extern int ckpt_obj_insert(struct ckpt_ctx *ctx, void *ptr, int objref,
diff --git a/mm/shmem.c b/mm/shmem.c
index 2cfff8d..a0416d3 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -2419,7 +2419,7 @@ int shmem_restore(struct ckpt_ctx *ctx,
 	struct file *file;
 	int ret = 0;
 
-	file = ckpt_obj_fetch(ctx, h->ino_objref, CKPT_OBJ_FILE);
+	file = ckpt_obj_try_fetch(ctx, h->ino_objref, CKPT_OBJ_FILE);
 	if (PTR_ERR(file) == -EINVAL)
 		file = NULL;
 	if (IS_ERR(file))
-- 
1.6.1

_______________________________________________
Containers mailing list
Containers at lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/containers




More information about the Devel mailing list