The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxc/pull/3338
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) === Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
From c468e4d42902d6f56659ee3b3d9009c5d711337a Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Sat, 28 Mar 2020 14:56:51 +0100 Subject: [PATCH 1/3] cgroups: move check for valid monitor process up Cc: cenxianlong <cenxianl...@huawei.com> Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- src/lxc/cgroups/cgfsng.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/lxc/cgroups/cgfsng.c b/src/lxc/cgroups/cgfsng.c index 0df8506954..68d158aa30 100644 --- a/src/lxc/cgroups/cgfsng.c +++ b/src/lxc/cgroups/cgfsng.c @@ -1082,6 +1082,12 @@ __cgfsng_ops static void cgfsng_monitor_destroy(struct cgroup_ops *ops, if (!h->monitor_full_path) continue; + /* Monitor might have died before we entered the cgroup. */ + if (handler->monitor_pid <= 0) { + WARN("No valid monitor process found while destroying cgroups"); + goto try_recursive_destroy; + } + if (conf && conf->cgroup_meta.dir) pivot_path = must_make_path(h->mountpoint, h->container_base_path, @@ -1098,12 +1104,10 @@ __cgfsng_ops static void cgfsng_monitor_destroy(struct cgroup_ops *ops, goto try_recursive_destroy; } - if (handler->monitor_pid != 0) { - ret = lxc_write_openat(pivot_path, "cgroup.procs", pidstr, len); - if (ret != 0) { - SYSWARN("Failed to move monitor %s to \"%s\"", pidstr, pivot_path); - continue; - } + ret = lxc_write_openat(pivot_path, "cgroup.procs", pidstr, len); + if (ret != 0) { + SYSWARN("Failed to move monitor %s to \"%s\"", pidstr, pivot_path); + continue; } try_recursive_destroy: From de6fe1328c4d9b0e04fc9c6cbf845690c182c859 Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Sat, 28 Mar 2020 15:01:58 +0100 Subject: [PATCH 2/3] cgroups: better helper naming Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- src/lxc/cgroups/cgfsng.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/lxc/cgroups/cgfsng.c b/src/lxc/cgroups/cgfsng.c index 68d158aa30..11b6fd3c9b 100644 --- a/src/lxc/cgroups/cgfsng.c +++ b/src/lxc/cgroups/cgfsng.c @@ -945,7 +945,7 @@ static void lxc_cgfsng_print_basecg_debuginfo(char *basecginfo, char **klist, TRACE("named subsystem %d: %s", k, *it); } -static int cgroup_rmdir(struct hierarchy **hierarchies, +static int cgroup_tree_remove(struct hierarchy **hierarchies, const char *container_cgroup) { if (!container_cgroup || !hierarchies) @@ -976,7 +976,7 @@ struct generic_userns_exec_data { char *path; }; -static int cgroup_rmdir_wrapper(void *data) +static int cgroup_tree_remove_wrapper(void *data) { struct generic_userns_exec_data *arg = data; uid_t nsuid = (arg->conf->root_nsuid_map != NULL) ? 0 : arg->conf->init_uid; @@ -996,7 +996,7 @@ static int cgroup_rmdir_wrapper(void *data) return log_error_errno(-1, errno, "Failed to setresuid(%d, %d, %d)", (int)nsuid, (int)nsuid, (int)nsuid); - return cgroup_rmdir(arg->hierarchies, arg->container_cgroup); + return cgroup_tree_remove(arg->hierarchies, arg->container_cgroup); } __cgfsng_ops static void cgfsng_payload_destroy(struct cgroup_ops *ops, @@ -1035,10 +1035,10 @@ __cgfsng_ops static void cgfsng_payload_destroy(struct cgroup_ops *ops, .hierarchies = ops->hierarchies, .origuid = 0, }; - ret = userns_exec_1(handler->conf, cgroup_rmdir_wrapper, &wrap, - "cgroup_rmdir_wrapper"); + ret = userns_exec_1(handler->conf, cgroup_tree_remove_wrapper, + &wrap, "cgroup_tree_remove_wrapper"); } else { - ret = cgroup_rmdir(ops->hierarchies, ops->container_cgroup); + ret = cgroup_tree_remove(ops->hierarchies, ops->container_cgroup); } if (ret < 0) SYSWARN("Failed to destroy cgroups"); @@ -1145,7 +1145,7 @@ static int mkdir_eexist_on_last(const char *dir, mode_t mode) return 0; } -static bool create_cgroup_tree(struct hierarchy *h, const char *cgroup_tree, +static bool cgroup_tree_create(struct hierarchy *h, const char *cgroup_tree, const char *cgroup_leaf, bool payload) { __do_free char *path = NULL; @@ -1185,7 +1185,7 @@ static bool create_cgroup_tree(struct hierarchy *h, const char *cgroup_tree, return true; } -static void cgroup_remove_leaf(struct hierarchy *h, bool payload) +static void cgroup_tree_leaf_remove(struct hierarchy *h, bool payload) { __do_free char *full_path = NULL; @@ -1257,12 +1257,12 @@ __cgfsng_ops static inline bool cgfsng_monitor_create(struct cgroup_ops *ops, sprintf(suffix, "-%d", idx); for (i = 0; ops->hierarchies[i]; i++) { - if (create_cgroup_tree(ops->hierarchies[i], cgroup_tree, monitor_cgroup, false)) + if (cgroup_tree_create(ops->hierarchies[i], cgroup_tree, monitor_cgroup, false)) continue; ERROR("Failed to create cgroup \"%s\"", ops->hierarchies[i]->monitor_full_path ?: "(null)"); for (int j = 0; j < i; j++) - cgroup_remove_leaf(ops->hierarchies[j], false); + cgroup_tree_leaf_remove(ops->hierarchies[j], false); idx++; break; @@ -1336,12 +1336,12 @@ __cgfsng_ops static inline bool cgfsng_payload_create(struct cgroup_ops *ops, sprintf(suffix, "-%d", idx); for (i = 0; ops->hierarchies[i]; i++) { - if (create_cgroup_tree(ops->hierarchies[i], cgroup_tree, container_cgroup, true)) + if (cgroup_tree_create(ops->hierarchies[i], cgroup_tree, container_cgroup, true)) continue; ERROR("Failed to create cgroup \"%s\"", ops->hierarchies[i]->container_full_path ?: "(null)"); for (int j = 0; j < i; j++) - cgroup_remove_leaf(ops->hierarchies[j], true); + cgroup_tree_leaf_remove(ops->hierarchies[j], true); idx++; break; From 8408a9cc8dcff977ba32de8e3e12299662462aab Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Sat, 28 Mar 2020 15:03:51 +0100 Subject: [PATCH 3/3] tree-wide: s/recursive_destroy/lxc_rm_rf/g Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- src/lxc/cgroups/cgfsng.c | 10 +++++----- src/lxc/storage/btrfs.c | 6 +++--- src/lxc/tools/lxc_ls.c | 2 +- src/lxc/utils.c | 4 ++-- src/lxc/utils.h | 2 +- src/tests/mount_injection.c | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/lxc/cgroups/cgfsng.c b/src/lxc/cgroups/cgfsng.c index 11b6fd3c9b..5c37c842e0 100644 --- a/src/lxc/cgroups/cgfsng.c +++ b/src/lxc/cgroups/cgfsng.c @@ -958,7 +958,7 @@ static int cgroup_tree_remove(struct hierarchy **hierarchies, if (!h->container_full_path) continue; - ret = recursive_destroy(h->container_full_path); + ret = lxc_rm_rf(h->container_full_path); if (ret < 0) WARN("Failed to destroy \"%s\"", h->container_full_path); @@ -1085,7 +1085,7 @@ __cgfsng_ops static void cgfsng_monitor_destroy(struct cgroup_ops *ops, /* Monitor might have died before we entered the cgroup. */ if (handler->monitor_pid <= 0) { WARN("No valid monitor process found while destroying cgroups"); - goto try_recursive_destroy; + goto try_lxc_rm_rf; } if (conf && conf->cgroup_meta.dir) @@ -1101,7 +1101,7 @@ __cgfsng_ops static void cgfsng_monitor_destroy(struct cgroup_ops *ops, ret = mkdir_p(pivot_path, 0755); if (ret < 0 && errno != EEXIST) { ERROR("Failed to create %s", pivot_path); - goto try_recursive_destroy; + goto try_lxc_rm_rf; } ret = lxc_write_openat(pivot_path, "cgroup.procs", pidstr, len); @@ -1110,8 +1110,8 @@ __cgfsng_ops static void cgfsng_monitor_destroy(struct cgroup_ops *ops, continue; } -try_recursive_destroy: - ret = recursive_destroy(h->monitor_full_path); +try_lxc_rm_rf: + ret = lxc_rm_rf(h->monitor_full_path); if (ret < 0) WARN("Failed to destroy \"%s\"", h->monitor_full_path); } diff --git a/src/lxc/storage/btrfs.c b/src/lxc/storage/btrfs.c index 0929305197..92a4a6def2 100644 --- a/src/lxc/storage/btrfs.c +++ b/src/lxc/storage/btrfs.c @@ -730,7 +730,7 @@ static bool do_remove_btrfs_children(struct my_btrfs_tree *tree, u64 root_id, return true; } -static int btrfs_recursive_destroy(const char *path) +static int btrfs_lxc_rm_rf(const char *path) { u64 root_id; int fd; @@ -893,7 +893,7 @@ bool btrfs_try_remove_subvol(const char *path) if (!btrfs_detect(path)) return false; - return btrfs_recursive_destroy(path) == 0; + return btrfs_lxc_rm_rf(path) == 0; } int btrfs_destroy(struct lxc_storage *orig) @@ -902,7 +902,7 @@ int btrfs_destroy(struct lxc_storage *orig) src = lxc_storage_get_path(orig->src, "btrfs"); - return btrfs_recursive_destroy(src); + return btrfs_lxc_rm_rf(src); } int btrfs_create(struct lxc_storage *bdev, const char *dest, const char *n, diff --git a/src/lxc/tools/lxc_ls.c b/src/lxc/tools/lxc_ls.c index 7a0ae62698..4be8564d19 100644 --- a/src/lxc/tools/lxc_ls.c +++ b/src/lxc/tools/lxc_ls.c @@ -1071,7 +1071,7 @@ static int ls_remove_lock(const char *path, const char *name, if (check < 0 || (size_t)check >= *len_lockpath) goto out; - ret = recursive_destroy(*lockpath); + ret = lxc_rm_rf(*lockpath); if (ret < 0) WARN("Failed to destroy \"%s\"", *lockpath); diff --git a/src/lxc/utils.c b/src/lxc/utils.c index c34519084d..97507fe642 100644 --- a/src/lxc/utils.c +++ b/src/lxc/utils.c @@ -1747,7 +1747,7 @@ int fd_cloexec(int fd, bool cloexec) return 0; } -int recursive_destroy(const char *dirname) +int lxc_rm_rf(const char *dirname) { __do_closedir DIR *dir = NULL; int fret = 0; @@ -1779,7 +1779,7 @@ int recursive_destroy(const char *dirname) if (!S_ISDIR(mystat.st_mode)) continue; - ret = recursive_destroy(pathname); + ret = lxc_rm_rf(pathname); if (ret < 0) fret = -1; } diff --git a/src/lxc/utils.h b/src/lxc/utils.h index 1d980f8855..4ab41bf1f4 100644 --- a/src/lxc/utils.h +++ b/src/lxc/utils.h @@ -235,7 +235,7 @@ extern uint64_t lxc_find_next_power2(uint64_t n); /* Set a signal the child process will receive after the parent has died. */ extern int lxc_set_death_signal(int signal, pid_t parent, int parent_status_fd); extern int fd_cloexec(int fd, bool cloexec); -extern int recursive_destroy(const char *dirname); +extern int lxc_rm_rf(const char *dirname); extern int lxc_setup_keyring(char *keyring_label); extern bool lxc_can_use_pidfd(int pidfd); diff --git a/src/tests/mount_injection.c b/src/tests/mount_injection.c index 3ea15f4331..3c44d4014f 100644 --- a/src/tests/mount_injection.c +++ b/src/tests/mount_injection.c @@ -415,7 +415,7 @@ static bool lxc_setup_shmount(const char *shmount_path) static void lxc_teardown_shmount(char *shmount_path) { (void)umount2(shmount_path, MNT_DETACH); - (void)recursive_destroy(shmount_path); + (void)lxc_rm_rf(shmount_path); } int main(int argc, char *argv[])
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel