Revert f_type fixups

This reverts commit a858b64ddd.
This reverts commit aea275c431.
This reverts commit fc6e6d245e.
This reverts commit c4073a27c5.
This reverts commit cddf148028.
This reverts commit 8c68a70170.

The constants are now casted to __SWORD_TYPE, which should resolve the
compiler warnings about signed vs unsigned.

After talking to Kay, we concluded:

This should be fixed in the kernel, not worked around in userspace tools.

Architectures cannot use int and expect magic constants lager than INT_MAX
to work correctly. The kernel header needs to be fixed.

Even coreutils cannot handle it:
  #define RAMFS_MAGIC  0x858458f6
  # stat -f -c%t /
  ffffffff858458f6

  #define BTRFS_SUPER_MAGIC 0x9123683E
  # stat -f -c%t /mnt
  ffffffff9123683e

Although I found the perfect working macro to fix the thing :)

        __extension__ ({                                                \
                        bool _ret = false;                              \
                        switch(f) { case c: _ret=true; };               \
                        ( _ret );                                       \
                })
This commit is contained in:
Harald Hoyer 2013-04-18 14:50:42 +02:00
parent a858b64ddd
commit 4826f0b7b5
4 changed files with 8 additions and 27 deletions

View file

@ -1248,11 +1248,11 @@ static void check_network(sd_journal *j, int fd) {
return;
j->on_network =
F_TYPE_CMP(sfs.f_type, CIFS_MAGIC_NUMBER) ||
F_TYPE_CMP(sfs.f_type, CODA_SUPER_MAGIC) ||
F_TYPE_CMP(sfs.f_type, NCP_SUPER_MAGIC) ||
F_TYPE_CMP(sfs.f_type, NFS_SUPER_MAGIC) ||
F_TYPE_CMP(sfs.f_type, SMB_SUPER_MAGIC);
sfs.f_type == (__SWORD_TYPE) CIFS_MAGIC_NUMBER ||
sfs.f_type == (__SWORD_TYPE) CODA_SUPER_MAGIC ||
sfs.f_type == (__SWORD_TYPE) NCP_SUPER_MAGIC ||
sfs.f_type == (__SWORD_TYPE) NFS_SUPER_MAGIC ||
sfs.f_type == (__SWORD_TYPE) SMB_SUPER_MAGIC;
}
static int add_file(sd_journal *j, const char *prefix, const char *filename) {

View file

@ -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 && F_TYPE_CMP(sfs.f_type, BTRFS_SUPER_MAGIC);
on_btrfs = statfs(root, &sfs) >= 0 && sfs.f_type == (__SWORD_TYPE) BTRFS_SUPER_MAGIC;
log_debug("On btrfs: %s", yes_no(on_btrfs));
if (asprintf(&pack_fn_new, "%s/.readahead.new", root) < 0) {

View file

@ -264,24 +264,6 @@ do { \
} \
} while(false)
/* Remove this macro, when the kernel has f_type as unsigned int or long
* for every architecure. Currently some 64bit architecures (like s390x)
* have int in the kernel, but long in userspace for f_type, so glibc
* extends the int to long and carries over the sign. Negative numbers are
* caused by the 32bit magic constants in linux/magic.h stuffed into the
* signed int in the kernel and these negative numbers are extended to
* long, which cannot be simply compared to the magic constants anymore.
*/
#define F_TYPE_CMP(f_type, magic) \
__extension__ ({ \
__SWORD_TYPE _f = (f_type); \
const __SWORD_TYPE _c = (magic); \
const int _c32 = 1 ? (magic) \
: sizeof((int[magic]){0}); \
(_f == _c || _f == _c32 ); \
})
/* Returns the number of chars needed to format variables of the
* specified type as a decimal string. Adds in extra space for a
* negative '-' prefix. */

View file

@ -2779,9 +2779,8 @@ int rm_rf_children_dangerous(int fd, bool only_dirs, bool honour_sticky, struct
static int is_temporary_fs(struct statfs *s) {
assert(s);
return
F_TYPE_CMP(s->f_type, TMPFS_MAGIC) ||
F_TYPE_CMP(s->f_type, RAMFS_MAGIC);
return s->f_type == (__SWORD_TYPE) TMPFS_MAGIC ||
s->f_type == (__SWORD_TYPE) RAMFS_MAGIC;
}
int rm_rf_children(int fd, bool only_dirs, bool honour_sticky, struct stat *root_dev) {