This is the deferq bit of Matt's patch, which is needed by the subsequent
socket patch.

Changes in v2:
 - Allocate and destroy the deferqueue at context alloc/free time

Signed-off-by: Dan Smith <[email protected]>
Cc: Matt Helsley <[email protected]>
---
 checkpoint/files.c               |   17 +++++++++++++++++
 checkpoint/sys.c                 |    7 +++++++
 include/linux/checkpoint_types.h |    1 +
 3 files changed, 25 insertions(+), 0 deletions(-)

diff --git a/checkpoint/files.c b/checkpoint/files.c
index 204055b..3d99823 100644
--- a/checkpoint/files.c
+++ b/checkpoint/files.c
@@ -21,6 +21,7 @@
 #include <linux/syscalls.h>
 #include <linux/checkpoint.h>
 #include <linux/checkpoint_hdr.h>
+#include <linux/deferqueue.h>
 #include <net/sock.h>
 
 
@@ -294,6 +295,14 @@ static int do_checkpoint_file_table(struct ckpt_ctx *ctx,
                if (ret < 0)
                        break;
        }
+       if (!ret) {
+               ret = deferqueue_run(ctx->files_deferq);
+               if (ret > 0) {
+                       pr_warning("c/r: files deferqueue had %d entries\n",
+                                  ret);
+                       ret = 0;
+               }
+       }
  out:
        kfree(fdtable);
        return ret;
@@ -697,6 +706,14 @@ static struct files_struct *do_restore_file_table(struct 
ckpt_ctx *ctx)
                if (ret < 0)
                        break;
        }
+       if (!ret) {
+               ret = deferqueue_run(ctx->files_deferq);
+               if (ret > 0) {
+                       pr_warning("c/r: files deferqueue had %d entries\n",
+                                  ret);
+                       ret = 0;
+               }
+       }
  out:
        ckpt_hdr_put(ctx, h);
        if (!ret) {
diff --git a/checkpoint/sys.c b/checkpoint/sys.c
index 525182a..31a188d 100644
--- a/checkpoint/sys.c
+++ b/checkpoint/sys.c
@@ -201,6 +201,9 @@ static void ckpt_ctx_free(struct ckpt_ctx *ctx)
                deferqueue_destroy(ctx->deferqueue);
        }
 
+       if (ctx->files_deferq)
+               deferqueue_destroy(ctx->files_deferq);
+
        if (ctx->file)
                fput(ctx->file);
 
@@ -254,6 +257,10 @@ static struct ckpt_ctx *ckpt_ctx_alloc(int fd, unsigned 
long uflags,
        if (!ctx->deferqueue)
                goto err;
 
+       ctx->files_deferq = deferqueue_create();
+       if (!ctx->files_deferq)
+               goto err;
+
        atomic_inc(&ctx->refcount);
        return ctx;
  err:
diff --git a/include/linux/checkpoint_types.h b/include/linux/checkpoint_types.h
index a18846f..b6f130c 100644
--- a/include/linux/checkpoint_types.h
+++ b/include/linux/checkpoint_types.h
@@ -48,6 +48,7 @@ struct ckpt_ctx {
 
        struct ckpt_obj_hash *obj_hash; /* repository for shared objects */
        struct deferqueue_head *deferqueue;     /* queue of deferred work */
+       struct deferqueue_head *files_deferq;
 
        struct path fs_mnt;     /* container root (FIXME) */
 
-- 
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