From: Dave Reisner Date: Wed, 2 Apr 2014 14:41:30 +0000 (-0400) Subject: switch_root: verify initramfs by f_type, not devno X-Git-Tag: v2.25-rc1~331 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c7832fb8f122f08b10bc6712f1062295a239bd06;p=thirdparty%2Futil-linux.git 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 --- 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);