[Devel] [PATCH 4/6] Add ckpt_obj_del() to objhash for handling error conditions

Dan Smith danms at us.ibm.com
Mon Mar 22 12:33:33 PDT 2010


This is not something that I would expect to be used in normal situations,
but it makes the error path of codependent network interfaces much smoother.

Signed-off-by: Dan Smith <danms at us.ibm.com>
---
 checkpoint/objhash.c       |   30 ++++++++++++++++++++++++++++++
 include/linux/checkpoint.h |    1 +
 2 files changed, 31 insertions(+), 0 deletions(-)

diff --git a/checkpoint/objhash.c b/checkpoint/objhash.c
index 5ae2e64..306f1b6 100644
--- a/checkpoint/objhash.c
+++ b/checkpoint/objhash.c
@@ -739,6 +739,14 @@ static struct ckpt_obj *obj_new(struct ckpt_ctx *ctx, void *ptr,
 	return obj;
 }
 
+static void obj_del(struct ckpt_ctx *ctx, struct ckpt_obj *obj)
+{
+	hlist_del(&obj->hash);
+	hlist_del(&obj->next);
+	obj->ops->ref_drop(obj->ptr, 1);
+	kfree(obj);
+}
+
 /**************************************************************************
  * Checkpoint
  */
@@ -1175,6 +1183,28 @@ int ckpt_obj_insert(struct ckpt_ctx *ctx, void *ptr,
 EXPORT_SYMBOL(ckpt_obj_insert);
 
 /**
+ * ckpt_obj_del - delete object (by pointer) in objhash
+ * @ctx: checkpoint context
+ * @ref: object reference
+ * @type: object type
+ *
+ * Return: nonzero on failure
+ */
+int ckpt_obj_del(struct ckpt_ctx *ctx, int objref, enum obj_type type)
+{
+	struct ckpt_obj *obj;
+
+	obj = obj_find_by_objref(ctx, objref);
+	BUG_ON(obj && obj->ops->obj_type != type);
+	if (obj) {
+		ckpt_debug("%s deleted from hash\n", obj->ops->obj_name);
+		obj_del(ctx, obj);
+	}
+
+	return obj ? 0 : -ESRCH;
+}
+
+/**
  * ckpt_obj_try_fetch - fetch an object by its identifier
  * @ctx: checkpoint context
  * @objref: object id
diff --git a/include/linux/checkpoint.h b/include/linux/checkpoint.h
index 1e7f8d3..efbc049 100644
--- a/include/linux/checkpoint.h
+++ b/include/linux/checkpoint.h
@@ -193,6 +193,7 @@ extern void *ckpt_obj_fetch(struct ckpt_ctx *ctx, int objref,
 extern int ckpt_obj_insert(struct ckpt_ctx *ctx, void *ptr, int objref,
 			   enum obj_type type);
 extern int ckpt_obj_reserve(struct ckpt_ctx *ctx);
+extern int ckpt_obj_del(struct ckpt_ctx *ctx, int objref, enum obj_type type);
 
 extern struct ckpt_ctx *ckpt_ctx_get(struct ckpt_ctx *ctx);
 extern void ckpt_ctx_put(struct ckpt_ctx *ctx);
-- 
1.6.2.5

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




More information about the Devel mailing list