switch_root: improve statfs->f_type portability
__SWORD_TYPE is not available everywhere, for example it's not defined by musl libc. It also seems that __SWORD_TYPE is not used for f_type on some architectures (s390x). Reported-by: Natanael Copa <ncopa@alpinelinux.org> Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
parent
9cf4f90911
commit
8f806bb1ea
|
@ -1,6 +1,17 @@
|
|||
#ifndef UTIL_LINUX_STATFS_MAGIC_H
|
||||
#define UTIL_LINUX_STATFS_MAGIC_H
|
||||
|
||||
#include <sys/statfs.h>
|
||||
|
||||
/*
|
||||
* If possible then don't depend on internal libc __SWORD_TYPE type.
|
||||
*/
|
||||
#ifdef __GNUC__
|
||||
typedef __typeof__( ((struct statfs *)0)->f_type ) ul_statfs_ftype_t;
|
||||
#else
|
||||
typedef __SWORD_TYPE ul_statfs_ftype_t;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Unfortunately, Linux kernel hedeader file <linux/magic.h> is incomplete
|
||||
* mess and kernel returns by statfs f_type many numbers that are nowhere
|
||||
|
|
|
@ -181,8 +181,8 @@ static int switchroot(const char *newroot)
|
|||
if (pid <= 0) {
|
||||
struct statfs stfs;
|
||||
if (fstatfs(cfd, &stfs) == 0 &&
|
||||
(stfs.f_type == (__SWORD_TYPE)STATFS_RAMFS_MAGIC ||
|
||||
stfs.f_type == (__SWORD_TYPE)STATFS_TMPFS_MAGIC))
|
||||
(stfs.f_type == (ul_statfs_ftype_t) STATFS_RAMFS_MAGIC ||
|
||||
stfs.f_type == (ul_statfs_ftype_t) STATFS_TMPFS_MAGIC))
|
||||
recursiveRemove(cfd);
|
||||
else
|
||||
warn(_("old root filesystem is not an initramfs"));
|
||||
|
|
Loading…
Reference in New Issue