The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxcfs/pull/331
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 c55c8774a11bd53eb424aba44b2c157188531398 Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Thu, 27 Feb 2020 12:10:57 +0100 Subject: [PATCH 1/4] croups: remove unused variable Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- cgroups/cgroup_utils.c | 1 - 1 file changed, 1 deletion(-) diff --git a/cgroups/cgroup_utils.c b/cgroups/cgroup_utils.c index 936a156..9e63578 100644 --- a/cgroups/cgroup_utils.c +++ b/cgroups/cgroup_utils.c @@ -469,7 +469,6 @@ FILE *fopen_cloexec(const char *path, const char *mode) __do_fclose FILE *ret = NULL; int open_mode = 0; int step = 0; - int saved_errno = 0; if (!strncmp(mode, "r+", 2)) { open_mode = O_RDWR; From 99b183fb2ff4ed2181f84e6436cec4dfa22b5be0 Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Thu, 27 Feb 2020 12:21:43 +0100 Subject: [PATCH 2/4] tree-wide: introduce casting helpers Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- bindings.h | 4 ++-- cgroup_fuse.c | 10 +++++----- macro.h | 3 +++ proc_cpuview.c | 2 +- proc_fuse.c | 20 ++++++++++---------- proc_loadavg.c | 2 +- sysfs_fuse.c | 6 +++--- utils.c | 3 ++- 8 files changed, 27 insertions(+), 23 deletions(-) diff --git a/bindings.h b/bindings.h index 777fcd2..d995518 100644 --- a/bindings.h +++ b/bindings.h @@ -57,9 +57,9 @@ struct file_info { char *cgroup; char *file; int type; - char *buf; // unused as of yet + char *buf; /* unused */ int buflen; - int size; //actual data size + int size; /*actual data size */ int cached; }; diff --git a/cgroup_fuse.c b/cgroup_fuse.c index 9f9325f..2ff2ea6 100644 --- a/cgroup_fuse.c +++ b/cgroup_fuse.c @@ -1150,7 +1150,7 @@ int cg_open(const char *path, struct fuse_file_info *fi) file_info->buf = NULL; file_info->buflen = 0; - fi->fh = (unsigned long)file_info; + fi->fh = PTR_TO_UINT64(file_info); ret = 0; out: @@ -1358,7 +1358,7 @@ int cg_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi) { struct fuse_context *fc = fuse_get_context(); - struct file_info *f = (struct file_info *)fi->fh; + struct file_info *f = INTTYPE_TO_PTR(fi->fh); struct cgfs_files *k = NULL; char *data = NULL; int ret, s; @@ -1468,7 +1468,7 @@ int cg_opendir(const char *path, struct fuse_file_info *fi) dir_info->file = NULL; dir_info->buflen = 0; - fi->fh = (unsigned long)dir_info; + fi->fh = PTR_TO_UINT64(dir_info); return 0; } @@ -1811,7 +1811,7 @@ int cg_write(const char *path, const char *buf, size_t size, off_t offset, struct fuse_context *fc = fuse_get_context(); char *localbuf = NULL; struct cgfs_files *k = NULL; - struct file_info *f = (struct file_info *)fi->fh; + struct file_info *f = INTTYPE_TO_PTR(fi->fh); bool r; if (!fc || !cgroup_ops || pure_unified_layout(cgroup_ops)) @@ -1977,7 +1977,7 @@ static void free_keys(struct cgfs_files **keys) int cg_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi) { - struct file_info *d = (struct file_info *)fi->fh; + struct file_info *d = INTTYPE_TO_PTR(fi->fh); struct cgfs_files **list = NULL; int i, ret; char *nextcg = NULL; diff --git a/macro.h b/macro.h index dd66f24..b4277cb 100644 --- a/macro.h +++ b/macro.h @@ -95,4 +95,7 @@ _exit(EXIT_FAILURE); \ }) +#define PTR_TO_UINT64(p) ((uint64_t)((intptr_t)(p))) +#define INTTYPE_TO_PTR(u) ((void *)((intptr_t)(u))) + #endif /* __LXCFS_MACRO_H */ diff --git a/proc_cpuview.c b/proc_cpuview.c index e31d457..330438a 100644 --- a/proc_cpuview.c +++ b/proc_cpuview.c @@ -881,7 +881,7 @@ int proc_cpuinfo_read(char *buf, size_t size, off_t offset, __do_free char *cg = NULL, *cpuset = NULL, *line = NULL; __do_fclose FILE *f = NULL; struct fuse_context *fc = fuse_get_context(); - struct file_info *d = (struct file_info *)fi->fh; + struct file_info *d = INTTYPE_TO_PTR(fi->fh); size_t linelen = 0, total_len = 0; bool am_printing = false, firstline = true, is_s390x = false; int curcpu = -1, cpu, max_cpus = 0; diff --git a/proc_fuse.c b/proc_fuse.c index 7717c66..0117fee 100644 --- a/proc_fuse.c +++ b/proc_fuse.c @@ -153,7 +153,7 @@ int proc_open(const char *path, struct fuse_file_info *fi) /* set actual size to buffer size */ info->size = info->buflen; - fi->fh = (unsigned long)info; + fi->fh = PTR_TO_UINT64(info); return 0; } @@ -224,7 +224,7 @@ static int proc_swaps_read(char *buf, size_t size, off_t offset, __do_free char *cg = NULL, *memswlimit_str = NULL, *memusage_str = NULL, *memswusage_str = NULL; struct fuse_context *fc = fuse_get_context(); - struct file_info *d = (struct file_info *)fi->fh; + struct file_info *d = INTTYPE_TO_PTR(fi->fh); unsigned long memswlimit = 0, memlimit = 0, memusage = 0, memswusage = 0, swap_total = 0, swap_free = 0; ssize_t total_len = 0; @@ -347,7 +347,7 @@ static int proc_diskstats_read(char *buf, size_t size, off_t offset, *line = NULL; __do_fclose FILE *f = NULL; struct fuse_context *fc = fuse_get_context(); - struct file_info *d = (struct file_info *)fi->fh; + struct file_info *d = INTTYPE_TO_PTR(fi->fh); unsigned long read = 0, write = 0; unsigned long read_merged = 0, write_merged = 0; unsigned long read_sectors = 0, write_sectors = 0; @@ -655,7 +655,7 @@ static int proc_uptime_read(char *buf, size_t size, off_t offset, struct fuse_file_info *fi) { struct fuse_context *fc = fuse_get_context(); - struct file_info *d = (struct file_info *)fi->fh; + struct file_info *d = INTTYPE_TO_PTR(fi->fh); double busytime = get_reaper_busy(fc->pid); char *cache = d->buf; ssize_t total_len = 0; @@ -707,7 +707,7 @@ static int proc_stat_read(char *buf, size_t size, off_t offset, __do_free struct cpuacct_usage *cg_cpu_usage = NULL; __do_fclose FILE *f = NULL; struct fuse_context *fc = fuse_get_context(); - struct file_info *d = (struct file_info *)fi->fh; + struct file_info *d = INTTYPE_TO_PTR(fi->fh); size_t linelen = 0, total_len = 0; int curcpu = -1; /* cpu numbering starts at 0 */ int physcpu = 0; @@ -1004,7 +1004,7 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset, __do_fclose FILE *f = NULL; struct fuse_context *fc = fuse_get_context(); struct lxcfs_opts *opts = (struct lxcfs_opts *) fuse_get_context()->private_data; - struct file_info *d = (struct file_info *)fi->fh; + struct file_info *d = INTTYPE_TO_PTR(fi->fh); unsigned long memlimit = 0, memusage = 0, memswlimit = 0, memswusage = 0, cached = 0, hosttotal = 0, active_anon = 0, inactive_anon = 0, active_file = 0, inactive_file = 0, @@ -1193,9 +1193,9 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset, } int proc_read(const char *path, char *buf, size_t size, off_t offset, - struct fuse_file_info *fi) + struct fuse_file_info *fi) { - struct file_info *f = (struct file_info *) fi->fh; + struct file_info *f = INTTYPE_TO_PTR(fi->fh); switch (f->type) { case LXC_TYPE_PROC_MEMINFO: @@ -1212,7 +1212,7 @@ int proc_read(const char *path, char *buf, size_t size, off_t offset, return proc_swaps_read(buf, size, offset, fi); case LXC_TYPE_PROC_LOADAVG: return proc_loadavg_read(buf, size, offset, fi); - default: - return -EINVAL; } + + return -EINVAL; } diff --git a/proc_loadavg.c b/proc_loadavg.c index 3947f31..9fc602b 100644 --- a/proc_loadavg.c +++ b/proc_loadavg.c @@ -163,7 +163,7 @@ int proc_loadavg_read(char *buf, size_t size, off_t offset, struct fuse_file_info *fi) { struct fuse_context *fc = fuse_get_context(); - struct file_info *d = (struct file_info *)fi->fh; + struct file_info *d = INTTYPE_TO_PTR(fi->fh); pid_t initpid; char *cg; size_t total_len = 0; diff --git a/sysfs_fuse.c b/sysfs_fuse.c index 9ac6639..599790d 100644 --- a/sysfs_fuse.c +++ b/sysfs_fuse.c @@ -49,7 +49,7 @@ static int sys_devices_system_cpu_online_read(char *buf, size_t size, struct fuse_file_info *fi) { struct fuse_context *fc = fuse_get_context(); - struct file_info *d = (struct file_info *)fi->fh; + struct file_info *d = INTTYPE_TO_PTR(fi->fh); char *cache = d->buf; char *cg; char *cpuset = NULL; @@ -234,7 +234,7 @@ int sys_open(const char *path, struct fuse_file_info *fi) /* set actual size to buffer size */ info->size = info->buflen; - fi->fh = (unsigned long)info; + fi->fh = PTR_TO_UINT64(info); return 0; } @@ -270,7 +270,7 @@ int sys_releasedir(const char *path, struct fuse_file_info *fi) int sys_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi) { - struct file_info *f = (struct file_info *)fi->fh; + struct file_info *f = INTTYPE_TO_PTR(fi->fh); switch (f->type) { case LXC_TYPE_SYS_DEVICES_SYSTEM_CPU_ONLINE: diff --git a/utils.c b/utils.c index 6422b09..50c940f 100644 --- a/utils.c +++ b/utils.c @@ -157,8 +157,9 @@ int preserve_ns(const int pid, const char *ns) void do_release_file_info(struct fuse_file_info *fi) { - struct file_info *f = (struct file_info *)fi->fh; + struct file_info *f; + f = INTTYPE_TO_PTR(fi->fh); if (!f) return; From 2b8eff1d5dd755c07208e5aa1fab82bf65ffe78d Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Thu, 27 Feb 2020 12:26:12 +0100 Subject: [PATCH 3/4] proc_fuse: use correct format specifier Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- bindings.c | 6 ++--- proc_cpuview.c | 59 +++++++++++++++++++++++++------------------------- proc_fuse.c | 20 ++++++++--------- 3 files changed, 40 insertions(+), 45 deletions(-) diff --git a/bindings.c b/bindings.c index d365ce6..e4a8d15 100644 --- a/bindings.c +++ b/bindings.c @@ -692,10 +692,8 @@ static bool cgfs_setup_controllers(void) if (!cgfs_prepare_mounts()) return false; - if (!cgfs_mount_hierarchies()) { - lxcfs_error("%s\n", "Failed to set up private lxcfs cgroup mounts."); - return false; - } + if (!cgfs_mount_hierarchies()) + return log_error_errno(false, errno, "Failed to set up private lxcfs cgroup mounts"); if (!permute_root()) return false; diff --git a/proc_cpuview.c b/proc_cpuview.c index 330438a..5d29a5c 100644 --- a/proc_cpuview.c +++ b/proc_cpuview.c @@ -372,8 +372,8 @@ static struct cg_proc_stat *find_or_create_proc_stat_node(struct cpuacct_usage * return node; } -static void add_cpu_usage(unsigned long *surplus, struct cpuacct_usage *usage, - unsigned long *counter, unsigned long threshold) +static void add_cpu_usage(uint64_t *surplus, struct cpuacct_usage *usage, + uint64_t *counter, uint64_t threshold) { unsigned long free_space, to_add; @@ -441,7 +441,7 @@ static bool read_cpu_cfs_param(const char *cg, const char *param, int64_t *value if (!cgroup_ops->get(cgroup_ops, "cpu", cg, file, &str)) return false; - if (sscanf(str, "%ld", value) != 1) + if (sscanf(str, "%"PRId64, value) != 1) return false; return true; @@ -534,11 +534,11 @@ int cpuview_proc_stat(const char *cg, const char *cpuset, int curcpu = -1; /* cpu numbering starts at 0 */ int physcpu, i; int max_cpus = max_cpu_count(cg), cpu_cnt = 0; - unsigned long user = 0, nice = 0, system = 0, idle = 0, iowait = 0, - irq = 0, softirq = 0, steal = 0, guest = 0, guest_nice = 0; - unsigned long user_sum = 0, system_sum = 0, idle_sum = 0; - unsigned long user_surplus = 0, system_surplus = 0; - unsigned long total_sum, threshold; + uint64_t user = 0, nice = 0, system = 0, idle = 0, iowait = 0, irq = 0, + softirq = 0, steal = 0, guest = 0, guest_nice = 0; + uint64_t user_sum = 0, system_sum = 0, idle_sum = 0; + uint64_t user_surplus = 0, system_surplus = 0; + uint64_t total_sum, threshold; struct cg_proc_stat *stat_node; int nprocs = get_nprocs_conf(); @@ -583,7 +583,7 @@ int cpuview_proc_stat(const char *cg, const char *cpuset, cg_cpu_usage[curcpu].online = true; - ret = sscanf(line, "%*s %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu", + ret = sscanf(line, "%*s %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 "lu", &user, &nice, &system, @@ -605,9 +605,8 @@ int cpuview_proc_stat(const char *cg, const char *cpuset, cg_cpu_usage[curcpu].idle = idle + (all_used - cg_used); } else { - lxcfs_error("cpu%d from %s has unexpected cpu time: %lu in /proc/stat, " - "%lu in cpuacct.usage_all; unable to determine idle time\n", - curcpu, cg, all_used, cg_used); + lxcfs_error("cpu%d from %s has unexpected cpu time: %" PRIu64 " in /proc/stat, %" PRIu64 " in cpuacct.usage_all; unable to determine idle time", + curcpu, cg, all_used, cg_used); cg_cpu_usage[curcpu].idle = idle; } } @@ -664,11 +663,11 @@ int cpuview_proc_stat(const char *cg, const char *cpuset, /* Calculate usage counters of visible CPUs */ if (max_cpus > 0) { - unsigned long diff_user = 0; - unsigned long diff_system = 0; - unsigned long diff_idle = 0; - unsigned long max_diff_idle = 0; - unsigned long max_diff_idle_index = 0; + uint64_t diff_user = 0; + uint64_t diff_system = 0; + uint64_t diff_idle = 0; + uint64_t max_diff_idle = 0; + uint64_t max_diff_idle_index = 0; double exact_cpus; /* threshold = maximum usage per cpu, including idle */ @@ -765,10 +764,9 @@ int cpuview_proc_stat(const char *cg, const char *cpuset, /* Render the file */ /* cpu-all */ - l = snprintf(buf, buf_size, "cpu %lu 0 %lu %lu 0 0 0 0 0 0\n", - user_sum, - system_sum, - idle_sum); + l = snprintf(buf, buf_size, + "cpu %" PRIu64 " 0 %" PRIu64 " %" PRIu64 " 0 0 0 0 0 0\n", + user_sum, system_sum, idle_sum); lxcfs_v("cpu-all: %s\n", buf); if (l < 0) { @@ -794,11 +792,11 @@ int cpuview_proc_stat(const char *cg, const char *cpuset, if (max_cpus > 0 && i == max_cpus) break; - l = snprintf(buf, buf_size, "cpu%d %lu 0 %lu %lu 0 0 0 0 0 0\n", - i, - stat_node->view[curcpu].user, - stat_node->view[curcpu].system, - stat_node->view[curcpu].idle); + l = snprintf(buf, buf_size, "cpu%d %" PRIu64 " 0 %" PRIu64 " %" PRIu64 " 0 0 0 0 0 0\n", + i, + stat_node->view[curcpu].user, + stat_node->view[curcpu].system, + stat_node->view[curcpu].idle); lxcfs_v("cpu: %s\n", buf); if (l < 0) { @@ -1088,8 +1086,8 @@ int read_cpuacct_usage_all(char *cg, char *cpuset, must_strcat(&data, &sz, &asz, "cpu user system\n"); - while (sscanf(usage_str + read_pos, "%lu %n", &cg_user, &read_cnt) > 0) { - lxcfs_debug("i: %d, cg_user: %lu, read_pos: %d, read_cnt: %d\n", i, cg_user, read_pos, read_cnt); + while (sscanf(usage_str + read_pos, "%" PRIu64 " %n", &cg_user, &read_cnt) > 0) { + lxcfs_debug("i: %d, cg_user: %" PRIu64 ", read_pos: %d, read_cnt: %d\n", i, cg_user, read_pos, read_cnt); must_strcat(&data, &sz, &asz, "%d %lu 0\n", i, cg_user); i++; read_pos += read_cnt; @@ -1109,8 +1107,9 @@ int read_cpuacct_usage_all(char *cg, char *cpuset, read_pos += read_cnt; for (i = 0, j = 0; i < cpucount; i++) { - ret = sscanf(usage_str + read_pos, "%d %lu %lu\n%n", &cg_cpu, &cg_user, - &cg_system, &read_cnt); + ret = sscanf(usage_str + read_pos, + "%d %" PRIu64 " %" PRIu64 "\n%n", &cg_cpu, + &cg_user, &cg_system, &read_cnt); if (ret == EOF) break; diff --git a/proc_fuse.c b/proc_fuse.c index 0117fee..037fa32 100644 --- a/proc_fuse.c +++ b/proc_fuse.c @@ -762,10 +762,8 @@ static int proc_stat_read(char *buf, size_t size, off_t offset, * If the cpuacct cgroup is present, it is used to calculate the container's * CPU usage. If not, values from the host's /proc/stat are used. */ - if (read_cpuacct_usage_all(cg, cpuset, &cg_cpu_usage, &cg_cpu_usage_size) != 0) { - lxcfs_v("%s\n", "proc_stat_read failed to read from cpuacct, " - "falling back to the host's /proc/stat"); - } + if (read_cpuacct_usage_all(cg, cpuset, &cg_cpu_usage, &cg_cpu_usage_size) != 0) + lxcfs_v("%s\n", "proc_stat_read failed to read from cpuacct, falling back to the host's /proc/stat"); f = fopen("/proc/stat", "r"); if (!f) @@ -813,7 +811,7 @@ static int proc_stat_read(char *buf, size_t size, off_t offset, continue; if (!cpu_in_cpuset(physcpu, cpuset)) continue; - curcpu ++; + curcpu++; ret = sscanf(line, "%*s %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu", &user, @@ -861,15 +859,15 @@ static int proc_stat_read(char *buf, size_t size, off_t offset, new_idle = idle + (all_used - cg_used); } else { - lxcfs_error("cpu%d from %s has unexpected cpu time: %lu in /proc/stat, " - "%lu in cpuacct.usage_all; unable to determine idle time\n", - curcpu, cg, all_used, cg_used); + lxcfs_error("cpu%d from %s has unexpected cpu time: %" PRIu64 " in /proc/stat, %" PRIu64 " in cpuacct.usage_all; unable to determine idle time", + curcpu, cg, all_used, cg_used); new_idle = idle; } - l = snprintf(cache, cache_size, "cpu%d %lu 0 %lu %lu 0 0 0 0 0 0\n", - curcpu, cg_cpu_usage[physcpu].user, cg_cpu_usage[physcpu].system, - new_idle); + l = snprintf(cache, cache_size, + "cpu%d %" PRIu64 " 0 %" PRIu64 " %" PRIu64 " 0 0 0 0 0 0\n", + curcpu, cg_cpu_usage[physcpu].user, + cg_cpu_usage[physcpu].system, new_idle); if (l < 0) { perror("Error writing to cache"); From 1aa8983063cba544ece03a25eec987407743707c Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Thu, 27 Feb 2020 13:07:05 +0100 Subject: [PATCH 4/4] cgroup_utils: fix mounting Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- cgroups/cgroup_utils.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/cgroups/cgroup_utils.c b/cgroups/cgroup_utils.c index 9e63578..896ed43 100644 --- a/cgroups/cgroup_utils.c +++ b/cgroups/cgroup_utils.c @@ -291,12 +291,12 @@ static int open_if_safe(int dirfd, const char *nextpath) { __do_close_prot_errno int newfd = -EBADF; - newfd = openat(dirfd, nextpath, O_RDONLY | O_NOFOLLOW | O_CLOEXEC); + newfd = openat(dirfd, nextpath, O_RDONLY | O_CLOEXEC); if (newfd >= 0) /* Was not a symlink, all good. */ - return newfd; + return move_fd(newfd); if (errno == ELOOP) - return newfd; + return move_fd(newfd); if (errno == EPERM || errno == EACCES) { /* We're not root (cause we got EPERM) so try opening with @@ -310,7 +310,7 @@ static int open_if_safe(int dirfd, const char *nextpath) */ int ret = check_symlink(newfd); if (ret < 0) - newfd = ret; + return -1; } } @@ -371,7 +371,7 @@ static int open_without_symlink(const char *target, const char *prefix_skip) return -1; for (;;) { - __do_close_prot_errno int newfd = -EBADF; + int newfd; char *nextpath; nextpath = get_nextpath(dup, &curlen, fulllen); @@ -379,11 +379,10 @@ static int open_without_symlink(const char *target, const char *prefix_skip) return move_fd(dirfd); newfd = open_if_safe(dirfd, nextpath); - if (newfd < 0) - return -1; - close_prot_errno_disarm(dirfd); dirfd = newfd; + if (newfd < 0) + return -1; } return move_fd(dirfd);
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel