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

Commit cde164ae authored by Steven Rostedt (Red Hat)'s avatar Steven Rostedt (Red Hat) Committed by Arnaldo Carvalho de Melo
Browse files

tools lib fs: Add helper to find mounted file systems



In preparation for adding tracefs for perf to use, create a findfs
helper utility that find_debugfs uses instead of hard coding the search
in the code. This will allow for a find_tracefs to be used as well.

Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: http://lkml.kernel.org/r/20150202193552.735023362@goodmis.org


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 5693c926
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -9,11 +9,13 @@ LIB_H=
LIB_OBJS=

LIB_H += fs/debugfs.h
LIB_H += fs/findfs.h
LIB_H += fs/fs.h
# See comment below about piggybacking...
LIB_H += fd/array.h

LIB_OBJS += $(OUTPUT)fs/debugfs.o
LIB_OBJS += $(OUTPUT)fs/findfs.o
LIB_OBJS += $(OUTPUT)fs/fs.o
# XXX piggybacking here, need to introduce libapikfd, or rename this
# to plain libapik.a and make it have it all api goodies
+7 −44
Original line number Diff line number Diff line
@@ -20,58 +20,21 @@ static const char * const debugfs_known_mountpoints[] = {

static bool debugfs_found;

/* verify that a mountpoint is actually a debugfs instance */

static int debugfs_valid_mountpoint(const char *debugfs)
{
	struct statfs st_fs;

	if (statfs(debugfs, &st_fs) < 0)
		return -ENOENT;
	else if ((long)st_fs.f_type != (long)DEBUGFS_MAGIC)
		return -ENOENT;

	return 0;
}

/* find the path to the mounted debugfs */
const char *debugfs_find_mountpoint(void)
{
	const char * const *ptr;
	char type[100];
	FILE *fp;
	const char *ret;

	if (debugfs_found)
		return (const char *)debugfs_mountpoint;

	ptr = debugfs_known_mountpoints;
	while (*ptr) {
		if (debugfs_valid_mountpoint(*ptr) == 0) {
			debugfs_found = true;
			strcpy(debugfs_mountpoint, *ptr);
			return debugfs_mountpoint;
		}
		ptr++;
	}

	/* give up and parse /proc/mounts */
	fp = fopen("/proc/mounts", "r");
	if (fp == NULL)
		return NULL;

	while (fscanf(fp, "%*s %" STR(PATH_MAX) "s %99s %*s %*d %*d\n",
		      debugfs_mountpoint, type) == 2) {
		if (strcmp(type, "debugfs") == 0)
			break;
	}
	fclose(fp);

	if (strcmp(type, "debugfs") != 0)
		return NULL;

	ret = find_mountpoint("debugfs", (long) DEBUGFS_MAGIC,
			      debugfs_mountpoint, PATH_MAX + 1,
			      debugfs_known_mountpoints);
	if (ret)
		debugfs_found = true;

	return debugfs_mountpoint;
	return ret;
}

/* mount the debugfs somewhere if it's not mounted */
+1 −10
Original line number Diff line number Diff line
#ifndef __API_DEBUGFS_H__
#define __API_DEBUGFS_H__

#define _STR(x) #x
#define STR(x) _STR(x)

/*
 * On most systems <limits.h> would have given us this, but  not on some systems
 * (e.g. GNU/Hurd).
 */
#ifndef PATH_MAX
#define PATH_MAX 4096
#endif
#include "findfs.h"

#ifndef DEBUGFS_MAGIC
#define DEBUGFS_MAGIC          0x64626720
+63 −0
Original line number Diff line number Diff line
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <sys/vfs.h>

#include "findfs.h"

/* verify that a mountpoint is actually the type we want */

int valid_mountpoint(const char *mount, long magic)
{
	struct statfs st_fs;

	if (statfs(mount, &st_fs) < 0)
		return -ENOENT;
	else if ((long)st_fs.f_type != magic)
		return -ENOENT;

	return 0;
}

/* find the path to a mounted file system */
const char *find_mountpoint(const char *fstype, long magic,
			    char *mountpoint, int len,
			    const char * const *known_mountpoints)
{
	const char * const *ptr;
	char format[128];
	char type[100];
	FILE *fp;

	if (known_mountpoints) {
		ptr = known_mountpoints;
		while (*ptr) {
			if (valid_mountpoint(*ptr, magic) == 0) {
				strncpy(mountpoint, *ptr, len - 1);
				mountpoint[len-1] = 0;
				return mountpoint;
			}
			ptr++;
		}
	}

	/* give up and parse /proc/mounts */
	fp = fopen("/proc/mounts", "r");
	if (fp == NULL)
		return NULL;

	snprintf(format, 128, "%%*s %%%ds %%99s %%*s %%*d %%*d\n", len);

	while (fscanf(fp, format, mountpoint, type) == 2) {
		if (strcmp(type, fstype) == 0)
			break;
	}
	fclose(fp);

	if (strcmp(type, fstype) != 0)
		return NULL;

	return mountpoint;
}
+21 −0
Original line number Diff line number Diff line
#ifndef __API_FINDFS_H__
#define __API_FINDFS_H__

#define _STR(x) #x
#define STR(x) _STR(x)

/*
 * On most systems <limits.h> would have given us this, but  not on some systems
 * (e.g. GNU/Hurd).
 */
#ifndef PATH_MAX
#define PATH_MAX 4096
#endif

const char *find_mountpoint(const char *fstype, long magic,
			    char *mountpoint, int len,
			    const char * const *known_mountpoints);

int valid_mountpoint(const char *mount, long magic);

#endif /* __API_FINDFS_H__ */