From c7832fb8f122f08b10bc6712f1062295a239bd06 Mon Sep 17 00:00:00 2001 From: Dave Reisner Date: Wed, 2 Apr 2014 10:41:30 -0400 Subject: [PATCH] switch_root: verify initramfs by f_type, not devno As of linux 3.14, the initramfs device will have both major and minor 0, causing our paranoia check to fail. Make this version agnostic by checking the filesystem type, rather than a device number. Signed-off-by: Dave Reisner --- sys-utils/switch_root.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/sys-utils/switch_root.c b/sys-utils/switch_root.c index 1222fb1b49..dac946f8c9 100644 --- a/sys-utils/switch_root.c +++ b/sys-utils/switch_root.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -36,6 +37,7 @@ #include "c.h" #include "nls.h" #include "closestream.h" +#include "statfs_magic.h" #ifndef MS_MOVE #define MS_MOVE 8192 @@ -177,12 +179,12 @@ static int switchroot(const char *newroot) if (cfd >= 0) { pid = fork(); if (pid <= 0) { - if (fstat(cfd, &sb) == 0) { - if (sb.st_dev == makedev(0, 1)) - recursiveRemove(cfd); - else - warn(_("old root filesystem is not an initramfs")); - } + struct statfs stfs; + if (fstatfs(cfd, &stfs) == 0 && + (stfs.f_type == STATFS_RAMFS_MAGIC || stfs.f_type == STATFS_TMPFS_MAGIC)) + recursiveRemove(cfd); + else + warn(_("old root filesystem is not an initramfs")); if (pid == 0) exit(EXIT_SUCCESS); -- 2.47.3