When this new switch is specified, the coordinator will unshare the
mounts namespace and restart will occur inside a private namespace.
Without it the restarting tasks will share the current mounts
namespace.

Signed-off-by: Oren Laadan <or...@cs.columbia.edu>
---
 restart.c |   16 ++++++++++++++--
 1 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/restart.c b/restart.c
index 9d1c1d1..f3d33de 100644
--- a/restart.c
+++ b/restart.c
@@ -51,6 +51,7 @@ static char usage_str[] =
 "  -r,--root=ROOT        restart under the directory ROOT instead of current\n"
 "     --signal=SIG       send SIG to root task on SIGINT (default: SIGKILL\n"
 "                        to container root, SIGINT otherwise)\n"
+"     --mntns            restart under a private mounts namespace\n"
 "  -w,--wait             wait for root task to termiate (default)\n"
 "     --show-status      show exit status of root task (implies -w)\n"
 "     --copy-status      imitate exit status of root task (implies -w)\n"
@@ -337,6 +338,7 @@ struct args {
        int inspect;
        char *root;
        int wait;
+       int mntns;
        int show_status;
        int copy_status;
        char *freezer;
@@ -417,6 +419,7 @@ static void parse_args(struct args *args, int argc, char 
*argv[])
                { "logfile",    required_argument,      NULL, 'l' },
                { "logfile-fd", required_argument,      NULL, 8 },
                { "root",       required_argument,      NULL, 'r' },
+               { "mntns",      no_argument,            NULL, 11 },
                { "wait",       no_argument,            NULL, 'w' },
                { "show-status",        no_argument,    NULL, 1 },
                { "copy-status",        no_argument,    NULL, 2 },
@@ -529,6 +532,9 @@ static void parse_args(struct args *args, int argc, char 
*argv[])
                case 10:
                        args->fail |= cond_to_mask(&opts[optind].name[5]);
                        break;
+               case 11:
+                       args->mntns = 1;
+                       break;
                default:
                        usage(usage_str);
                }
@@ -764,6 +770,12 @@ int main(int argc, char *argv[])
        if (args.freezer && freezer_prepare(&ctx) < 0)
                exit(1);
 
+       /* private mounts namespace ? */
+       if (args.mntns && unshare(CLONE_NEWNS | CLONE_FS) < 0) {
+               perror("unshare");
+               exit(1);
+       }
+
        /* chroot ? */
        if (args.root && chroot(args.root) < 0) {
                perror("chroot");
@@ -1011,8 +1023,8 @@ static int ckpt_coordinator_pidns(struct ckpt_ctx *ctx)
 
        /*
         * The coordinator report restart susccess/failure via pipe.
-        * (It cannot use return value, because the in the default
-        * --wait --copy-status case it is already used to report the
+        * (It cannot use return value, because in the default case
+        * of --wait --copy-status it is already used to report the
         * root-task's return value).
         */
        if (pipe(ctx->pipe_coord) < 0) {
-- 
1.6.3.3

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

_______________________________________________
Devel mailing list
Devel@openvz.org
https://openvz.org/mailman/listinfo/devel

Reply via email to