diff options
author | Harald Hoyer <harald@redhat.com> | 2013-04-18 07:34:25 +0200 |
---|---|---|
committer | Harald Hoyer <harald@redhat.com> | 2013-04-18 07:34:25 +0200 |
commit | fc6e6d245ee3989c222a2a8cc82a33475f9922f3 (patch) | |
tree | 1bac92dfa3d1575e136586f4c549d2ac312cca6c /src/readahead | |
parent | 5521d6985648669a65d0529bb01c7a32edc99294 (diff) |
Add ugly CMP_F_TYPE() macro
On some architectures (like s390x) the kernel has the type int for
f_type, but long in userspace.
Assigning the 32 bit magic constants from linux/magic.h to the 31 bit
signed f_type in the kernel, causes f_type to be negative for some
constants.
glibc extends the int to long for those architecures in 64 bit mode, so
the negative int becomes a negative long, which cannot be simply
compared to the original magic constant, because the compiler would
automatically cast the constant to long.
To workaround this issue, we also compare to the (int)MAGIC value in a
macro. Of course, we could do #ifdef with the architecure, but it has to
be maintained, and the magic constants are 32 bit anyway.
Someday, when the int is unsigned or long for all architectures, we can
remove this macro again. Until then, keep it as simple as it can be.
Diffstat (limited to 'src/readahead')
-rw-r--r-- | src/readahead/readahead-collect.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/src/readahead/readahead-collect.c b/src/readahead/readahead-collect.c index fbfa8e786f..19703aa602 100644 --- a/src/readahead/readahead-collect.c +++ b/src/readahead/readahead-collect.c @@ -505,7 +505,7 @@ done: on_ssd = fs_on_ssd(root) > 0; log_debug("On SSD: %s", yes_no(on_ssd)); - on_btrfs = statfs(root, &sfs) >= 0 && (unsigned __SWORD_TYPE) sfs.f_type == BTRFS_SUPER_MAGIC; + on_btrfs = statfs(root, &sfs) >= 0 && CMP_F_TYPE(sfs.f_type, BTRFS_SUPER_MAGIC); log_debug("On btrfs: %s", yes_no(on_btrfs)); if (asprintf(&pack_fn_new, "%s/.readahead.new", root) < 0) { |