s390 and alpha are the only 64 bit architectures with a 32-bit ino_t.
Since this is quite unusual this causes bugs from time to time.
See e.g. commit 
ebce3eb2f7ef ("ceph: fix inode number handling on
arches with 32-bit ino_t") for an example.
This (obviously) also prevents s390 and alpha to use 64-bit ino_t for
tmpfs. See commit 
b85a7a8bb573 ("tmpfs: disallow CONFIG_TMPFS_INODE64
on s390").
Therefore switch both s390 and alpha to 64-bit ino_t. This should only
have an effect on the ustat system call. To prevent ABI breakage
define struct ustat compatible to the old layout and change
sys_ustat() accordingly.
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
 
          still support 32-bit off_t. This option is enabled for all such
          architectures explicitly.
 
+# Selected by 64 bit architectures which have a 32 bit f_tinode in struct ustat
+config ARCH_32BIT_USTAT_F_TINODE
+       bool
+
 config HAVE_ASM_MODVERSIONS
        bool
        help
 
 config ALPHA
        bool
        default y
+       select ARCH_32BIT_USTAT_F_TINODE
        select ARCH_MIGHT_HAVE_PC_PARPORT
        select ARCH_MIGHT_HAVE_PC_SERIO
        select ARCH_NO_PREEMPT
 
        # Note: keep this list sorted alphabetically
        #
        imply IMA_SECURE_AND_OR_TRUSTED_BOOT
+       select ARCH_32BIT_USTAT_F_TINODE
        select ARCH_BINFMT_ELF_STATE
        select ARCH_HAS_DEBUG_VM_PGTABLE
        select ARCH_HAS_DEBUG_WX
 
 
        memset(&tmp,0,sizeof(struct ustat));
        tmp.f_tfree = sbuf.f_bfree;
-       tmp.f_tinode = sbuf.f_ffree;
+       if (IS_ENABLED(CONFIG_ARCH_32BIT_USTAT_F_TINODE))
+               tmp.f_tinode = min_t(u64, sbuf.f_ffree, UINT_MAX);
+       else
+               tmp.f_tinode = sbuf.f_ffree;
 
        return copy_to_user(ubuf, &tmp, sizeof(struct ustat)) ? -EFAULT : 0;
 }
 
 
 typedef __kernel_fd_set                fd_set;
 typedef __kernel_dev_t         dev_t;
-typedef __kernel_ino_t         ino_t;
+typedef __kernel_ulong_t       ino_t;
 typedef __kernel_mode_t                mode_t;
 typedef unsigned short         umode_t;
 typedef u32                    nlink_t;
 
 struct ustat {
        __kernel_daddr_t        f_tfree;
-       __kernel_ino_t          f_tinode;
+#ifdef CONFIG_ARCH_32BIT_USTAT_F_TINODE
+       unsigned int            f_tinode;
+#else
+       unsigned long           f_tinode;
+#endif
        char                    f_fname[6];
        char                    f_fpack[6];
 };