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 <[email protected]>
---
 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
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/containers

_______________________________________________
Devel mailing list
[email protected]
https://openvz.org/mailman/listinfo/devel

Reply via email to