|
@@ -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",
|