OSDN Git Service

libbpf: Move directory creation into _pin() functions
authorToke Høiland-Jørgensen <toke@redhat.com>
Sat, 2 Nov 2019 11:09:39 +0000 (12:09 +0100)
committerAlexei Starovoitov <ast@kernel.org>
Sat, 2 Nov 2019 19:35:07 +0000 (12:35 -0700)
The existing pin_*() functions all try to create the parent directory
before pinning. Move this check into the per-object _pin() functions
instead. This ensures consistent behaviour when auto-pinning is
added (which doesn't go through the top-level pin_maps() function), at the
cost of a few more calls to mkdir().

Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Andrii Nakryiko <andriin@fb.com>
Link: https://lore.kernel.org/bpf/157269297985.394725.5882630952992598610.stgit@toke.dk
tools/lib/bpf/libbpf.c

index 22f6dd1..fa15f3b 100644 (file)
@@ -3816,6 +3816,28 @@ int bpf_object__load(struct bpf_object *obj)
        return bpf_object__load_xattr(&attr);
 }
 
+static int make_parent_dir(const char *path)
+{
+       char *cp, errmsg[STRERR_BUFSIZE];
+       char *dname, *dir;
+       int err = 0;
+
+       dname = strdup(path);
+       if (dname == NULL)
+               return -ENOMEM;
+
+       dir = dirname(dname);
+       if (mkdir(dir, 0700) && errno != EEXIST)
+               err = -errno;
+
+       free(dname);
+       if (err) {
+               cp = libbpf_strerror_r(-err, errmsg, sizeof(errmsg));
+               pr_warn("failed to mkdir %s: %s\n", path, cp);
+       }
+       return err;
+}
+
 static int check_path(const char *path)
 {
        char *cp, errmsg[STRERR_BUFSIZE];
@@ -3852,6 +3874,10 @@ int bpf_program__pin_instance(struct bpf_program *prog, const char *path,
        char *cp, errmsg[STRERR_BUFSIZE];
        int err;
 
+       err = make_parent_dir(path);
+       if (err)
+               return err;
+
        err = check_path(path);
        if (err)
                return err;
@@ -3905,25 +3931,14 @@ int bpf_program__unpin_instance(struct bpf_program *prog, const char *path,
        return 0;
 }
 
-static int make_dir(const char *path)
-{
-       char *cp, errmsg[STRERR_BUFSIZE];
-       int err = 0;
-
-       if (mkdir(path, 0700) && errno != EEXIST)
-               err = -errno;
-
-       if (err) {
-               cp = libbpf_strerror_r(-err, errmsg, sizeof(errmsg));
-               pr_warn("failed to mkdir %s: %s\n", path, cp);
-       }
-       return err;
-}
-
 int bpf_program__pin(struct bpf_program *prog, const char *path)
 {
        int i, err;
 
+       err = make_parent_dir(path);
+       if (err)
+               return err;
+
        err = check_path(path);
        if (err)
                return err;
@@ -3944,10 +3959,6 @@ int bpf_program__pin(struct bpf_program *prog, const char *path)
                return bpf_program__pin_instance(prog, path, 0);
        }
 
-       err = make_dir(path);
-       if (err)
-               return err;
-
        for (i = 0; i < prog->instances.nr; i++) {
                char buf[PATH_MAX];
                int len;
@@ -4070,6 +4081,10 @@ int bpf_map__pin(struct bpf_map *map, const char *path)
                }
        }
 
+       err = make_parent_dir(map->pin_path);
+       if (err)
+               return err;
+
        err = check_path(map->pin_path);
        if (err)
                return err;
@@ -4164,10 +4179,6 @@ int bpf_object__pin_maps(struct bpf_object *obj, const char *path)
                return -ENOENT;
        }
 
-       err = make_dir(path);
-       if (err)
-               return err;
-
        bpf_object__for_each_map(map, obj) {
                char *pin_path = NULL;
                char buf[PATH_MAX];
@@ -4254,10 +4265,6 @@ int bpf_object__pin_programs(struct bpf_object *obj, const char *path)
                return -ENOENT;
        }
 
-       err = make_dir(path);
-       if (err)
-               return err;
-
        bpf_object__for_each_program(prog, obj) {
                char buf[PATH_MAX];
                int len;