diff options
Diffstat (limited to 'tools/vm/page-types.c')
| -rw-r--r-- | tools/vm/page-types.c | 85 | 
1 files changed, 7 insertions, 78 deletions
| diff --git a/tools/vm/page-types.c b/tools/vm/page-types.c index b76edf2f833..71c9c2511ee 100644 --- a/tools/vm/page-types.c +++ b/tools/vm/page-types.c @@ -36,7 +36,7 @@  #include <sys/statfs.h>  #include "../../include/uapi/linux/magic.h"  #include "../../include/uapi/linux/kernel-page-flags.h" - +#include <lk/debugfs.h>  #ifndef MAX_PATH  # define MAX_PATH 256 @@ -178,7 +178,7 @@ static int		kpageflags_fd;  static int		opt_hwpoison;  static int		opt_unpoison; -static char		hwpoison_debug_fs[MAX_PATH+1]; +static char		*hwpoison_debug_fs;  static int		hwpoison_inject_fd;  static int		hwpoison_forget_fd; @@ -458,81 +458,6 @@ static uint64_t kpageflags_flags(uint64_t flags)  	return flags;  } -/* 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 (st_fs.f_type != (long) DEBUGFS_MAGIC) -		return -ENOENT; - -	return 0; -} - -/* find the path to the mounted debugfs */ -static const char *debugfs_find_mountpoint(void) -{ -	const char *const *ptr; -	char type[100]; -	FILE *fp; - -	ptr = debugfs_known_mountpoints; -	while (*ptr) { -		if (debugfs_valid_mountpoint(*ptr) == 0) { -			strcpy(hwpoison_debug_fs, *ptr); -			return hwpoison_debug_fs; -		} -		ptr++; -	} - -	/* give up and parse /proc/mounts */ -	fp = fopen("/proc/mounts", "r"); -	if (fp == NULL) -		perror("Can't open /proc/mounts for read"); - -	while (fscanf(fp, "%*s %" -		      STR(MAX_PATH) -		      "s %99s %*s %*d %*d\n", -		      hwpoison_debug_fs, type) == 2) { -		if (strcmp(type, "debugfs") == 0) -			break; -	} -	fclose(fp); - -	if (strcmp(type, "debugfs") != 0) -		return NULL; - -	return hwpoison_debug_fs; -} - -/* mount the debugfs somewhere if it's not mounted */ - -static void debugfs_mount(void) -{ -	const char *const *ptr; - -	/* see if it's already mounted */ -	if (debugfs_find_mountpoint()) -		return; - -	ptr = debugfs_known_mountpoints; -	while (*ptr) { -		if (mount(NULL, *ptr, "debugfs", 0, NULL) == 0) { -			/* save the mountpoint */ -			strcpy(hwpoison_debug_fs, *ptr); -			break; -		} -		ptr++; -	} - -	if (*ptr == NULL) { -		perror("mount debugfs"); -		exit(EXIT_FAILURE); -	} -} -  /*   * page actions   */ @@ -541,7 +466,11 @@ static void prepare_hwpoison_fd(void)  {  	char buf[MAX_PATH + 1]; -	debugfs_mount(); +	hwpoison_debug_fs = debugfs_mount(NULL); +	if (!hwpoison_debug_fs) { +		perror("mount debugfs"); +		exit(EXIT_FAILURE); +	}  	if (opt_hwpoison && !hwpoison_inject_fd) {  		snprintf(buf, MAX_PATH, "%s/hwpoison/corrupt-pfn", |