2015-09-02 3:56 GMT-04:00 Jiri Olsa <jo...@kernel.org>: > 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-ja49vwfiq2qqkmoxx9yk2...@git.kernel.org > Signed-off-by: Jiri Olsa <jo...@kernel.org> > --- > 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 majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/