Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 73ca85ad authored by Jiri Olsa's avatar Jiri Olsa Committed by Arnaldo Carvalho de Melo
Browse files

tools lib api fs: Add FSTYPE__mount() method



Adding FSTYPE__mount (where FSTYPE is, as of now, one of sysfs, procfs,
debugfs, tracefs) method that tries to mount the filesystem in case no
mount of FSTYPE is found.

Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
Cc: Raphael Beamonte <raphael.beamonte@gmail.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Matt Fleming <matt@codeblueprint.co.uk>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Steven Rostedt <rostedt@goodmis.org>
Link: http://lkml.kernel.org/r/1441180605-24737-12-git-send-email-jolsa@kernel.org


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent c495afb4
Loading
Loading
Loading
Loading
+39 −5
Original line number Diff line number Diff line
@@ -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)
{
+11 −4
Original line number Diff line number Diff line
@@ -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);