libbpf: Return non-null error on failures in libbpf_find_prog_btf_id()
[linux-2.6-microblaze.git] / tools / lib / bpf / libbpf.c
index 6c68346..7b2b5d2 100644 (file)
@@ -4657,10 +4657,13 @@ bpf_object__create_maps(struct bpf_object *obj)
        char *cp, errmsg[STRERR_BUFSIZE];
        unsigned int i, j;
        int err;
+       bool retried;
 
        for (i = 0; i < obj->nr_maps; i++) {
                map = &obj->maps[i];
 
+               retried = false;
+retry:
                if (map->pin_path) {
                        err = bpf_object__reuse_map(map);
                        if (err) {
@@ -4668,6 +4671,12 @@ bpf_object__create_maps(struct bpf_object *obj)
                                        map->name);
                                goto err_out;
                        }
+                       if (retried && map->fd < 0) {
+                               pr_warn("map '%s': cannot find pinned map\n",
+                                       map->name);
+                               err = -ENOENT;
+                               goto err_out;
+                       }
                }
 
                if (map->fd >= 0) {
@@ -4701,9 +4710,13 @@ bpf_object__create_maps(struct bpf_object *obj)
                if (map->pin_path && !map->pinned) {
                        err = bpf_map__pin(map, NULL);
                        if (err) {
+                               zclose(map->fd);
+                               if (!retried && err == -EEXIST) {
+                                       retried = true;
+                                       goto retry;
+                               }
                                pr_warn("map '%s': failed to auto-pin at '%s': %d\n",
                                        map->name, map->pin_path, err);
-                               zclose(map->fd);
                                goto err_out;
                        }
                }
@@ -8304,7 +8317,7 @@ static int libbpf_find_prog_btf_id(const char *name, __u32 attach_prog_fd)
        struct bpf_prog_info_linear *info_linear;
        struct bpf_prog_info *info;
        struct btf *btf = NULL;
-       int err = -EINVAL;
+       int err;
 
        info_linear = bpf_program__get_prog_info_linear(attach_prog_fd, 0);
        err = libbpf_get_error(info_linear);
@@ -8313,6 +8326,8 @@ static int libbpf_find_prog_btf_id(const char *name, __u32 attach_prog_fd)
                        attach_prog_fd);
                return err;
        }
+
+       err = -EINVAL;
        info = &info_linear->info;
        if (!info->btf_id) {
                pr_warn("The target program doesn't have BTF\n");