struct lxc_conf;
struct lxc_list;
+typedef enum {
+ CGFS,
+ CGMANAGER,
+} cgroup_driver_t;
+
struct cgroup_ops {
const char *name;
bool (*mount_cgroup)(void *hdata, const char *root, int type);
int (*nrtasks)(void *hdata);
void (*disconnect)(void);
+ cgroup_driver_t driver;
};
extern bool cgroup_attach(const char *name, const char *lxcpath, pid_t pid);
extern const char *cgroup_canonical_path(struct lxc_handler *handler);
extern bool cgroup_unfreeze(struct lxc_handler *handler);
extern void cgroup_disconnect(void);
+extern cgroup_driver_t cgroup_driver(void);
#endif
return;
}
+ // We need to tell criu where cgmanager's socket is bind mounted from
+ // if it exists since it's external.
+ if (cgroup_driver() == CGMANAGER)
+ static_args+=2;
+
argv = malloc(static_args * sizeof(*argv));
if (!argv)
return;
if (strcmp(opts->action, "dump") == 0) {
char pid[32];
+ if (cgroup_driver() == CGMANAGER) {
+ DECLARE_ARG("--ext-mount-map");
+ DECLARE_ARG("/sys/fs/cgroup/cgmanager:cgmanager");
+ }
+
if (sprintf(pid, "%d", lxcapi_init_pid(opts->c)) < 0)
goto err;
if (!opts->stop)
DECLARE_ARG("--leave-running");
} else if (strcmp(opts->action, "restore") == 0) {
+
+ if (cgroup_driver() == CGMANAGER) {
+ DECLARE_ARG("--ext-mount-map");
+ DECLARE_ARG("cgmanager:/sys/fs/cgroup/cgmanager");
+ }
+
DECLARE_ARG("--root");
DECLARE_ARG(opts->c->lxc_conf->rootfs.mount);
DECLARE_ARG("--restore-detached");