mirror of
https://github.com/netdata/libbpf.git
synced 2026-04-14 20:49:07 +08:00
libbpf: Move directory creation into _pin() functions
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
This commit is contained in:
committed by
Andrii Nakryiko
parent
44f9712f79
commit
ff3d2702d8
61
src/libbpf.c
61
src/libbpf.c
@@ -3816,6 +3816,28 @@ int bpf_object__load(struct bpf_object *obj)
|
|||||||
return bpf_object__load_xattr(&attr);
|
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)
|
static int check_path(const char *path)
|
||||||
{
|
{
|
||||||
char *cp, errmsg[STRERR_BUFSIZE];
|
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];
|
char *cp, errmsg[STRERR_BUFSIZE];
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
err = make_parent_dir(path);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
err = check_path(path);
|
err = check_path(path);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
@@ -3905,25 +3931,14 @@ int bpf_program__unpin_instance(struct bpf_program *prog, const char *path,
|
|||||||
return 0;
|
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 bpf_program__pin(struct bpf_program *prog, const char *path)
|
||||||
{
|
{
|
||||||
int i, err;
|
int i, err;
|
||||||
|
|
||||||
|
err = make_parent_dir(path);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
err = check_path(path);
|
err = check_path(path);
|
||||||
if (err)
|
if (err)
|
||||||
return 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);
|
return bpf_program__pin_instance(prog, path, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
err = make_dir(path);
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
|
|
||||||
for (i = 0; i < prog->instances.nr; i++) {
|
for (i = 0; i < prog->instances.nr; i++) {
|
||||||
char buf[PATH_MAX];
|
char buf[PATH_MAX];
|
||||||
int len;
|
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);
|
err = check_path(map->pin_path);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
@@ -4164,10 +4179,6 @@ int bpf_object__pin_maps(struct bpf_object *obj, const char *path)
|
|||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = make_dir(path);
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
|
|
||||||
bpf_object__for_each_map(map, obj) {
|
bpf_object__for_each_map(map, obj) {
|
||||||
char *pin_path = NULL;
|
char *pin_path = NULL;
|
||||||
char buf[PATH_MAX];
|
char buf[PATH_MAX];
|
||||||
@@ -4254,10 +4265,6 @@ int bpf_object__pin_programs(struct bpf_object *obj, const char *path)
|
|||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = make_dir(path);
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
|
|
||||||
bpf_object__for_each_program(prog, obj) {
|
bpf_object__for_each_program(prog, obj) {
|
||||||
char buf[PATH_MAX];
|
char buf[PATH_MAX];
|
||||||
int len;
|
int len;
|
||||||
|
|||||||
Reference in New Issue
Block a user