s390,alpha: switch to 64-bit ino_t
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. commitebce3eb2f7
("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 commitb85a7a8bb5
("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>
This commit is contained in:
parent
efa5473590
commit
96c0a6a72d
|
@ -327,6 +327,10 @@ config ARCH_32BIT_OFF_T
|
||||||
still support 32-bit off_t. This option is enabled for all such
|
still support 32-bit off_t. This option is enabled for all such
|
||||||
architectures explicitly.
|
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
|
config HAVE_ASM_MODVERSIONS
|
||||||
bool
|
bool
|
||||||
help
|
help
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
config ALPHA
|
config ALPHA
|
||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
select ARCH_32BIT_USTAT_F_TINODE
|
||||||
select ARCH_MIGHT_HAVE_PC_PARPORT
|
select ARCH_MIGHT_HAVE_PC_PARPORT
|
||||||
select ARCH_MIGHT_HAVE_PC_SERIO
|
select ARCH_MIGHT_HAVE_PC_SERIO
|
||||||
select ARCH_NO_PREEMPT
|
select ARCH_NO_PREEMPT
|
||||||
|
|
|
@ -58,6 +58,7 @@ config S390
|
||||||
# Note: keep this list sorted alphabetically
|
# Note: keep this list sorted alphabetically
|
||||||
#
|
#
|
||||||
imply IMA_SECURE_AND_OR_TRUSTED_BOOT
|
imply IMA_SECURE_AND_OR_TRUSTED_BOOT
|
||||||
|
select ARCH_32BIT_USTAT_F_TINODE
|
||||||
select ARCH_BINFMT_ELF_STATE
|
select ARCH_BINFMT_ELF_STATE
|
||||||
select ARCH_HAS_DEBUG_VM_PGTABLE
|
select ARCH_HAS_DEBUG_VM_PGTABLE
|
||||||
select ARCH_HAS_DEBUG_WX
|
select ARCH_HAS_DEBUG_WX
|
||||||
|
|
|
@ -255,6 +255,9 @@ SYSCALL_DEFINE2(ustat, unsigned, dev, struct ustat __user *, ubuf)
|
||||||
|
|
||||||
memset(&tmp,0,sizeof(struct ustat));
|
memset(&tmp,0,sizeof(struct ustat));
|
||||||
tmp.f_tfree = sbuf.f_bfree;
|
tmp.f_tfree = sbuf.f_bfree;
|
||||||
|
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;
|
tmp.f_tinode = sbuf.f_ffree;
|
||||||
|
|
||||||
return copy_to_user(ubuf, &tmp, sizeof(struct ustat)) ? -EFAULT : 0;
|
return copy_to_user(ubuf, &tmp, sizeof(struct ustat)) ? -EFAULT : 0;
|
||||||
|
|
|
@ -14,7 +14,7 @@ typedef u32 __kernel_dev_t;
|
||||||
|
|
||||||
typedef __kernel_fd_set fd_set;
|
typedef __kernel_fd_set fd_set;
|
||||||
typedef __kernel_dev_t dev_t;
|
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 __kernel_mode_t mode_t;
|
||||||
typedef unsigned short umode_t;
|
typedef unsigned short umode_t;
|
||||||
typedef u32 nlink_t;
|
typedef u32 nlink_t;
|
||||||
|
@ -189,7 +189,11 @@ struct hlist_node {
|
||||||
|
|
||||||
struct ustat {
|
struct ustat {
|
||||||
__kernel_daddr_t f_tfree;
|
__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_fname[6];
|
||||||
char f_fpack[6];
|
char f_fpack[6];
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue