When pinning programs/objects under PATH (eg: during "bpftool prog loadall") the bpffs is mounted on the parent dir of PATH in the following situations: - the given dir exists but it is not bpffs. - the given dir doesn't exist and the parent dir is not bpffs. Mounting on the parent dir can also have the unintentional side- effect of hiding other files located under the parent dir. If the given dir exists but is not bpffs, then the bpffs should be mounted on the given dir and not its parent dir. Similarly, if the given dir doesn't exist and its parent dir is not bpffs, then the given dir should be created and the bpffs should be mounted on this new dir. Link: https://lore.kernel.org/bpf/2da44d24-74ae-a564-1764-afccf395eeec@xxxxxxxxxxxxx/T/#t Closes: https://github.com/libbpf/bpftool/issues/100 Signed-off-by: Sahil Siddiq <icegambit91@xxxxxxxxx> --- tools/bpf/bpftool/common.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/tools/bpf/bpftool/common.c b/tools/bpf/bpftool/common.c index cc6e6aae2447..6b2c3e82c19e 100644 --- a/tools/bpf/bpftool/common.c +++ b/tools/bpf/bpftool/common.c @@ -254,6 +254,17 @@ int mount_bpffs_for_pin(const char *name, bool is_dir) if (is_dir && is_bpffs(name)) return err; + if (is_dir && access(name, F_OK) != -1) { + err = mnt_fs(name, "bpf", err_str, ERR_MAX_LEN); + if (err) { + err_str[ERR_MAX_LEN - 1] = '\0'; + p_err("can't mount BPF file system to pin the object (%s): %s", + name, err_str); + } + + return err; + } + file = malloc(strlen(name) + 1); if (!file) { p_err("mem alloc failed"); @@ -273,7 +284,17 @@ int mount_bpffs_for_pin(const char *name, bool is_dir) goto out_free; } - err = mnt_fs(dir, "bpf", err_str, ERR_MAX_LEN); + if (is_dir) { + err = mkdir(name, 0700); + if (err) { + err_str[ERR_MAX_LEN - 1] = '\0'; + p_err("failed to mkdir (%s): %s", + name, err_str); + goto out_free; + } + } + + err = mnt_fs(is_dir ? name : dir, "bpf", err_str, ERR_MAX_LEN); if (err) { err_str[ERR_MAX_LEN - 1] = '\0'; p_err("can't mount BPF file system to pin the object (%s): %s", -- 2.44.0