• Linus Torvalds's avatar
    Avoid 64-bit "switch()" statements on 32-bit architectures · ee568b25
    Linus Torvalds authored
    Commit ee6f779b ("filp->f_pos not
    correctly updated in proc_task_readdir") changed the proc code to use
    filp->f_pos directly, rather than through a temporary variable.  In the
    process, that caused the operations to be done on the full 64 bits, even
    though the offset is never that big.
    
    That's all fine and dandy per se, but for some unfathomable reason gcc
    generates absolutely horrid code when using 64-bit values in switch()
    statements.  To the point of actually calling out to gcc helper
    functions like __cmpdi2 rather than just doing the trivial comparisons
    directly the way gcc does for normal compares.  At which point we get
    link failures, because we really don't want to support that kind of
    crazy code.
    
    Fix this by just casting the f_pos value to "unsigned long", which
    is plenty big enough for /proc, and avoids the gcc code generation issue.
    Reported-by: default avatarAlexey Dobriyan <adobriyan@gmail.com>
    Cc: Zhang Le <r0bertz@gentoo.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    ee568b25
base.c 74.4 KB