Re: [PATCH 11/15] tools lib api: Add mount support for fs
From: RaphaÃl Beamonte
Date: Fri Sep 04 2015 - 10:14:53 EST
2015-09-02 3:56 GMT-04:00 Jiri Olsa <jolsa@xxxxxxxxxx>:
> Adding name__mount (where name is in sysfs,procfs,debugfs,tracefs)
> interface that tries to mount the filesystem in case no mount is found.
>
> Link: http://lkml.kernel.org/n/tip-ja49vwfiq2qqkmoxx9yk26lm@xxxxxxxxxxxxxx
> Signed-off-by: Jiri Olsa <jolsa@xxxxxxxxxx>
> ---
> tools/lib/api/fs/fs.c | 44 +++++++++++++++++++++++++++++++++++++++-----
> tools/lib/api/fs/fs.h | 15 +++++++++++----
> 2 files changed, 50 insertions(+), 9 deletions(-)
Why automatic mounting the **fs filesystems?
Isn't it better to let the user decide when and where to mount it if
s/he forgot to do it before? Forcing a mount is also potentially
forcing to umount then mount when mounting has been forgotten before.
> diff --git a/tools/lib/api/fs/fs.c b/tools/lib/api/fs/fs.c
> index ef16d2a83a27..bc93baf33fff 100644
> --- a/tools/lib/api/fs/fs.c
> +++ b/tools/lib/api/fs/fs.c
> @@ -9,6 +9,7 @@
> #include <sys/stat.h>
> #include <fcntl.h>
> #include <unistd.h>
> +#include <sys/mount.h>
>
> #include "debugfs.h"
> #include "fs.h"
> @@ -215,16 +216,49 @@ static const char *fs__mountpoint(int idx)
> return fs__get_mountpoint(fs);
> }
>
> -#define FS__MOUNTPOINT(name, idx) \
> +static const char *mount_overload(struct fs *fs)
> +{
> + size_t name_len = strlen(fs->name);
> + /* "PERF_" + name + "_ENVIRONMENT" + '\0' */
> + char upper_name[5 + name_len + 12 + 1];
> +
> + snprintf(upper_name, name_len, "PERF_%s_ENVIRONMENT", fs->name);
> + mem_toupper(upper_name, name_len);
> +
> + return getenv(upper_name) ?: *fs->mounts;
> +}
> +
> +static const char *fs__mount(int idx)
> +{
> + struct fs *fs = &fs__entries[idx];
> + const char *mountpoint;
> +
> + if (fs__mountpoint(idx))
> + return (const char *)fs->path;
> +
> + mountpoint = mount_overload(fs);
> +
> + if (mount(NULL, mountpoint, fs->name, 0, NULL) < 0)
> + return NULL;
> +
> + return fs__check_mounts(fs) ? fs->path : NULL;
> +}
> +
> +#define FS(name, idx) \
> const char *name##__mountpoint(void) \
> { \
> return fs__mountpoint(idx); \
> +} \
> + \
> +const char *name##__mount(void) \
> +{ \
> + return fs__mount(idx); \
> }
>
> -FS__MOUNTPOINT(sysfs, FS__SYSFS);
> -FS__MOUNTPOINT(procfs, FS__PROCFS);
> -FS__MOUNTPOINT(debugfs, FS__DEBUGFS);
> -FS__MOUNTPOINT(tracefs, FS__TRACEFS);
> +FS(sysfs, FS__SYSFS);
> +FS(procfs, FS__PROCFS);
> +FS(debugfs, FS__DEBUGFS);
> +FS(tracefs, FS__TRACEFS);
>
> int filename__read_int(const char *filename, int *value)
> {
> diff --git a/tools/lib/api/fs/fs.h b/tools/lib/api/fs/fs.h
> index 9013227ae0d1..a9627ea5e6ae 100644
> --- a/tools/lib/api/fs/fs.h
> +++ b/tools/lib/api/fs/fs.h
> @@ -9,10 +9,17 @@
> #define PATH_MAX 4096
> #endif
>
> -const char *sysfs__mountpoint(void);
> -const char *procfs__mountpoint(void);
> -const char *debugfs__mountpoint(void);
> -const char *tracefs__mountpoint(void);
> +#define FS(name) \
> + const char *name##__mountpoint(void); \
> + const char *name##__mount(void);
> +
> +FS(sysfs)
> +FS(procfs)
> +FS(debugfs)
> +FS(tracefs)
> +
> +#undef FS
> +
>
> int filename__read_int(const char *filename, int *value);
> int sysctl__read_int(const char *sysctl, int *value);
> --
> 2.4.3
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/