• Mikulas Patocka's avatar
    stat: fix inconsistency between struct stat and struct compat_stat · 932aba1e
    Mikulas Patocka authored
    struct stat (defined in arch/x86/include/uapi/asm/stat.h) has 32-bit
    st_dev and st_rdev; struct compat_stat (defined in
    arch/x86/include/asm/compat.h) has 16-bit st_dev and st_rdev followed by
    a 16-bit padding.
    
    This patch fixes struct compat_stat to match struct stat.
    
    [ Historical note: the old x86 'struct stat' did have that 16-bit field
      that the compat layer had kept around, but it was changes back in 2003
      by "struct stat - support larger dev_t":
    
        https://git.kernel.org/pub/scm/linux/kernel/git/tglx/history.git/commit/?id=e95b2065677fe32512a597a79db94b77b90c968d
    
      and back in those days, the x86_64 port was still new, and separate
      from the i386 code, and had already picked up the old version with a
      16-bit st_dev field ]
    
    Note that we can't change compat_dev_t because it is used by
    compat_loop_info.
    
    Also, if the st_dev and st_rdev values are 32-bit, we don't have to use
    old_valid_dev to test if the value fits into them.  This fixes
    -EOVERFLOW on filesystems that are on NVMe because NVMe uses the major
    number 259.
    Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
    Cc: Andreas Schwab <schwab@linux-m68k.org>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Christoph Hellwig <hch@infradead.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    932aba1e
stat.c 21.7 KB