bpf: Print error message for bpftool cgroup show
authorHechao Li <hechaol@fb.com>
Tue, 24 Dec 2019 01:17:42 +0000 (17:17 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 24 Feb 2020 07:36:40 +0000 (08:36 +0100)
[ 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>
tools/bpf/bpftool/cgroup.c

index 1ef45e5..2f017ca 100644 (file)
@@ -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;
        }