From dc08143bcaf8722492a70848124b8d48dfa099f7 Mon Sep 17 00:00:00 2001
From: gaohuatao <gaohuatao@huawei.com>
Date: Fri, 22 Oct 2021 14:43:13 +0800
Subject: [PATCH] disable lxc_keep with oci image

Signed-off-by: gaohuatao <gaohuatao@huawei.com>
---
 src/lxc/confile.c      |  6 ++++++
 src/lxc/lxccontainer.c | 24 ++++++++++++++++++++++++
 src/lxc/lxccontainer.h | 18 ++++++++++++++++++
 src/lxc/start.c        |  5 +++++
 src/lxc/start.h        |  1 +
 5 files changed, 54 insertions(+)

diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index e898e23..e298ce9 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -3018,6 +3018,12 @@ bool lxc_config_define_load(struct lxc_list *defines, struct lxc_container *c)
 
 	lxc_list_for_each(it, defines) {
 		struct new_config_item *new_item = it->elem;
+#ifdef HAVE_ISULAD
+		if (strcmp(new_item->key, LXC_IMAGE_OCI_KEY) == 0) {
+			c->set_oci_type(c, true);
+			continue;
+		}
+#endif
 		bret = c->set_config_item(c, new_item->key, new_item->val);
 		if (!bret)
 			break;
diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
index 2d58191..69706a5 100644
--- a/src/lxc/lxccontainer.c
+++ b/src/lxc/lxccontainer.c
@@ -1061,6 +1061,10 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
 	if (!argv) {
 		argv = init_cmd = use_init_args(conf->init_argv, conf->init_argc);
 	}
+
+	if (c->image_type_oci) {
+		handler->image_type_oci = true;
+	}
 #endif
 
 	/* ... otherwise use default_args. */
@@ -5755,6 +5759,22 @@ static bool do_lxcapi_set_start_timeout(struct lxc_container *c,  unsigned int s
 
 WRAP_API_1(bool, lxcapi_set_start_timeout, unsigned int)
 
+/* isulad add set image type */
+static bool do_lxcapi_set_oci_type(struct lxc_container *c,  bool image_type_oci)
+{
+	if (!c || !c->lxc_conf)
+		return false;
+	if (container_mem_lock(c)) {
+		ERROR("Error getting mem lock");
+		return false;
+	}
+	c->image_type_oci = image_type_oci;
+	container_mem_unlock(c);
+	return true;
+}
+
+WRAP_API_1(bool, lxcapi_set_oci_type, bool)
+
 static uint64_t metrics_get_ull(struct lxc_container *c, struct cgroup_ops *cgroup_ops, const char *item)
 {
     char buf[81] = {0};
@@ -6177,6 +6197,9 @@ struct lxc_container *lxc_container_new(const char *name, const char *configpath
 
 	c->daemonize = true;
 	c->pidfile = NULL;
+#ifdef HAVE_ISULAD
+	c->image_type_oci = false;
+#endif
 
 	/* Assign the member functions. */
 	c->is_defined = lxcapi_is_defined;
@@ -6249,6 +6272,7 @@ struct lxc_container *lxc_container_new(const char *name, const char *configpath
 	c->clean_container_resource = lxcapi_clean_container_resource;
 	c->get_container_pids = lxcapi_get_container_pids;
 	c->set_start_timeout = lxcapi_set_start_timeout;
+	c->set_oci_type = lxcapi_set_oci_type;
 	c->get_container_metrics = lxcapi_get_container_metrics;
 #endif
 	return c;
diff --git a/src/lxc/lxccontainer.h b/src/lxc/lxccontainer.h
index 9abbd09..a5be3f8 100644
--- a/src/lxc/lxccontainer.h
+++ b/src/lxc/lxccontainer.h
@@ -26,6 +26,8 @@ extern "C" {
 #define LXC_CREATE_MAXFLAGS       (1 << 1) /*!< Number of \c LXC_CREATE* flags */
 #define LXC_MOUNT_API_V1		   1
 
+#define LXC_IMAGE_OCI_KEY "lxc.imagetype.oci"
+
 struct bdev_specs;
 
 struct lxc_snapshot;
@@ -164,6 +166,12 @@ struct lxc_container {
 	 */
 	unsigned int start_timeout;
 
+	/*! isulad:
+	 * \private
+	 *  image_type_oci
+	 */
+	bool image_type_oci;
+
 	/*!
 	 * \brief Determine if \c /var/lib/lxc/$name/config exists.
 	 *
@@ -1010,6 +1018,16 @@ struct lxc_container {
 	 */
 	bool (*set_start_timeout)(struct lxc_container *c, unsigned int start_timeout);
 
+	/*! isulad add
+	 * \brief An API call to set oci type
+	 *
+	 * \param c Container.
+	 * \param image_type_oci image oci type.
+	 *
+	 * \return \c true on success, else \c false.
+	 */
+	bool (*set_oci_type)(struct lxc_container *c, bool image_type_oci);
+	
 	/*! isulad add
 	 * \brief An API call to set start timeout
 	 *
diff --git a/src/lxc/start.c b/src/lxc/start.c
index 52ea561..c1563e0 100644
--- a/src/lxc/start.c
+++ b/src/lxc/start.c
@@ -694,6 +694,7 @@ struct lxc_handler *lxc_init_handler(const char *name, struct lxc_conf *conf,
 
 #ifdef HAVE_ISULAD
 	handler->exit_code = -1; /* isulad: record exit code of container */
+	handler->image_type_oci = false;
 #endif
 
 	if (daemonize)
@@ -2080,7 +2081,11 @@ static int lxc_spawn(struct lxc_handler *handler)
 	 * it readonly.
 	 * If the container is unprivileged then skip rootfs pinning.
 	 */
+#ifdef HAVE_ISULAD
+	if (!wants_to_map_ids && !handler->image_type_oci) {
+#else
 	if (!wants_to_map_ids) {
+#endif
 		handler->pinfd = pin_rootfs(conf->rootfs.path);
 		if (handler->pinfd == -EBADF)
 			INFO("Failed to pin the rootfs for container \"%s\"", handler->name);
diff --git a/src/lxc/start.h b/src/lxc/start.h
index ebeeb72..98de103 100644
--- a/src/lxc/start.h
+++ b/src/lxc/start.h
@@ -129,6 +129,7 @@ struct lxc_handler {
 	bool disable_pty;
 	/* Indicates whether should we keep stdin active. */
 	bool open_stdin;
+	bool image_type_oci;
 #endif
 
 };
-- 
2.20.1

