mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 16:24:13 +08:00
bpf: Print error message for bpftool cgroup show
[ Upstream commit 1162f84403
]
Currently, when bpftool cgroup show <path> has an error, no error
message is printed. This is confusing because the user may think the
result is empty.
Before the change:
$ bpftool cgroup show /sys/fs/cgroup
ID AttachType AttachFlags Name
$ echo $?
255
After the change:
$ ./bpftool cgroup show /sys/fs/cgroup
Error: can't query bpf programs attached to /sys/fs/cgroup: Operation
not permitted
v2: Rename check_query_cgroup_progs to cgroup_has_attached_progs
Signed-off-by: Hechao Li <hechaol@fb.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20191224011742.3714301-1-hechaol@fb.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
8a7aa4feea
commit
4783bf08f8
@ -117,6 +117,25 @@ static int count_attached_bpf_progs(int cgroup_fd, enum bpf_attach_type type)
|
||||
return prog_cnt;
|
||||
}
|
||||
|
||||
static int cgroup_has_attached_progs(int cgroup_fd)
|
||||
{
|
||||
enum bpf_attach_type type;
|
||||
bool no_prog = true;
|
||||
|
||||
for (type = 0; type < __MAX_BPF_ATTACH_TYPE; type++) {
|
||||
int count = count_attached_bpf_progs(cgroup_fd, type);
|
||||
|
||||
if (count < 0 && errno != EINVAL)
|
||||
return -1;
|
||||
|
||||
if (count > 0) {
|
||||
no_prog = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return no_prog ? 0 : 1;
|
||||
}
|
||||
static int show_attached_bpf_progs(int cgroup_fd, enum bpf_attach_type type,
|
||||
int level)
|
||||
{
|
||||
@ -161,6 +180,7 @@ static int show_attached_bpf_progs(int cgroup_fd, enum bpf_attach_type type,
|
||||
static int do_show(int argc, char **argv)
|
||||
{
|
||||
enum bpf_attach_type type;
|
||||
int has_attached_progs;
|
||||
const char *path;
|
||||
int cgroup_fd;
|
||||
int ret = -1;
|
||||
@ -192,6 +212,16 @@ static int do_show(int argc, char **argv)
|
||||
goto exit;
|
||||
}
|
||||
|
||||
has_attached_progs = cgroup_has_attached_progs(cgroup_fd);
|
||||
if (has_attached_progs < 0) {
|
||||
p_err("can't query bpf programs attached to %s: %s",
|
||||
path, strerror(errno));
|
||||
goto exit_cgroup;
|
||||
} else if (!has_attached_progs) {
|
||||
ret = 0;
|
||||
goto exit_cgroup;
|
||||
}
|
||||
|
||||
if (json_output)
|
||||
jsonw_start_array(json_wtr);
|
||||
else
|
||||
@ -212,6 +242,7 @@ static int do_show(int argc, char **argv)
|
||||
if (json_output)
|
||||
jsonw_end_array(json_wtr);
|
||||
|
||||
exit_cgroup:
|
||||
close(cgroup_fd);
|
||||
exit:
|
||||
return ret;
|
||||
@ -228,7 +259,7 @@ static int do_show_tree_fn(const char *fpath, const struct stat *sb,
|
||||
int typeflag, struct FTW *ftw)
|
||||
{
|
||||
enum bpf_attach_type type;
|
||||
bool skip = true;
|
||||
int has_attached_progs;
|
||||
int cgroup_fd;
|
||||
|
||||
if (typeflag != FTW_D)
|
||||
@ -240,22 +271,13 @@ static int do_show_tree_fn(const char *fpath, const struct stat *sb,
|
||||
return SHOW_TREE_FN_ERR;
|
||||
}
|
||||
|
||||
for (type = 0; type < __MAX_BPF_ATTACH_TYPE; type++) {
|
||||
int count = count_attached_bpf_progs(cgroup_fd, type);
|
||||
|
||||
if (count < 0 && errno != EINVAL) {
|
||||
p_err("can't query bpf programs attached to %s: %s",
|
||||
fpath, strerror(errno));
|
||||
close(cgroup_fd);
|
||||
return SHOW_TREE_FN_ERR;
|
||||
}
|
||||
if (count > 0) {
|
||||
skip = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (skip) {
|
||||
has_attached_progs = cgroup_has_attached_progs(cgroup_fd);
|
||||
if (has_attached_progs < 0) {
|
||||
p_err("can't query bpf programs attached to %s: %s",
|
||||
fpath, strerror(errno));
|
||||
close(cgroup_fd);
|
||||
return SHOW_TREE_FN_ERR;
|
||||
} else if (!has_attached_progs) {
|
||||
close(cgroup_fd);
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user