bpf: Print error message for bpftool cgroup show

[ Upstream commit 1162f844030ac1ac7321b5e8f6c9badc7a11428f ]

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:
Hechao Li 2019-12-23 17:17:42 -08:00 committed by Greg Kroah-Hartman
parent 8a7aa4feea
commit 4783bf08f8

View File

@ -117,6 +117,25 @@ static int count_attached_bpf_progs(int cgroup_fd, enum bpf_attach_type type)
return prog_cnt; 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, static int show_attached_bpf_progs(int cgroup_fd, enum bpf_attach_type type,
int level) 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) static int do_show(int argc, char **argv)
{ {
enum bpf_attach_type type; enum bpf_attach_type type;
int has_attached_progs;
const char *path; const char *path;
int cgroup_fd; int cgroup_fd;
int ret = -1; int ret = -1;
@ -192,6 +212,16 @@ static int do_show(int argc, char **argv)
goto exit; 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) if (json_output)
jsonw_start_array(json_wtr); jsonw_start_array(json_wtr);
else else
@ -212,6 +242,7 @@ static int do_show(int argc, char **argv)
if (json_output) if (json_output)
jsonw_end_array(json_wtr); jsonw_end_array(json_wtr);
exit_cgroup:
close(cgroup_fd); close(cgroup_fd);
exit: exit:
return ret; return ret;
@ -228,7 +259,7 @@ static int do_show_tree_fn(const char *fpath, const struct stat *sb,
int typeflag, struct FTW *ftw) int typeflag, struct FTW *ftw)
{ {
enum bpf_attach_type type; enum bpf_attach_type type;
bool skip = true; int has_attached_progs;
int cgroup_fd; int cgroup_fd;
if (typeflag != FTW_D) 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; return SHOW_TREE_FN_ERR;
} }
for (type = 0; type < __MAX_BPF_ATTACH_TYPE; type++) { has_attached_progs = cgroup_has_attached_progs(cgroup_fd);
int count = count_attached_bpf_progs(cgroup_fd, type); if (has_attached_progs < 0) {
p_err("can't query bpf programs attached to %s: %s",
if (count < 0 && errno != EINVAL) { fpath, strerror(errno));
p_err("can't query bpf programs attached to %s: %s", close(cgroup_fd);
fpath, strerror(errno)); return SHOW_TREE_FN_ERR;
close(cgroup_fd); } else if (!has_attached_progs) {
return SHOW_TREE_FN_ERR;
}
if (count > 0) {
skip = false;
break;
}
}
if (skip) {
close(cgroup_fd); close(cgroup_fd);
return 0; return 0;
} }