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 <dreisner@archlinux.org>
This commit is contained in:
Dave Reisner 2014-04-02 10:41:30 -04:00 committed by Karel Zak
parent c830206931
commit c7832fb8f1

View file

@ -23,6 +23,7 @@
#include <sys/mount.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/statfs.h>
#include <sys/param.h>
#include <fcntl.h>
#include <stdio.h>
@ -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);