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:
parent
c830206931
commit
c7832fb8f1
1 changed files with 8 additions and 6 deletions
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue