kernel_optimize_test/include/asm-generic
Chris Metcalf 2c7387ef99 asm-generic/stat.h: support 64-bit file time_t for stat()
The existing asm-generic/stat.h specifies st_mtime, etc., as a 32-value,
and works well for 32-bit architectures (currently microblaze, score,
and 32-bit tile).  However, for 64-bit architectures it isn't sufficient
to return 32 bits of time_t; this isn't good insurance against the 2037
rollover.  (It also makes glibc support less convenient, since we can't
use glibc's handy STAT_IS_KERNEL_STAT mode.)

This change extends the two "timespec" fields for each of the three atime,
mtime, and ctime fields from "int" to "long".  As a result, on 32-bit
platforms nothing changes, and 64-bit platforms will now work as expected.

The only wrinkle is 32-bit userspace under 64-bit kernels taking advantage
of COMPAT mode.  For these, we leave the "struct stat64" definitions with
the "int" versions of the time_t and nsec fields, so that architectures
can implement compat_sys_stat64() and friends with sys_stat64(), etc.,
and get the expected 32-bit structure layout.  This requires a
field-by-field copy in the kernel, implemented by the code guarded
under __ARCH_WANT_STAT64.

This does mean that the shape of the "struct stat" and "struct stat64"
structures is different on a 64-bit kernel, but only one of the two
structures should ever be used by any given process: "struct stat"
is meant for 64-bit userspace only, and "struct stat64" for 32-bit
userspace only.  (On a 32-bit kernel the two structures continue to have
the same shape, since "long" is 32 bits.)

The alternative is keeping the two structures the same shape on 64-bit
kernels, which means a 64-bit time_t in "struct stat64" for 32-bit
processes.  This is a little unnatural since 32-bit userspace can't
do anything with 64 bits of time_t information, since time_t is just
"long", not "int64_t"; and in any case 32-bit userspace might expect
to be running under a 32-bit kernel, which can't provide the high 32
bits anyway.  In the case of a 32-bit kernel we'd then be extending the
kernel's 32-bit time_t to 64 bits, then truncating it back to 32 bits
again in userspace, for no particular reason.  And, as mentioned above,
if we have 64-bit time_t for 32-bit processes we can't easily use glibc's
STAT_IS_KERNEL_STAT, since glibc's stat structure requires an embedded
"struct timespec", which is a pair of "long" (32-bit) values in a 32-bit
userspace.  "Inventive" solutions are possible, but are pretty hacky.

Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
2010-11-01 15:31:29 -04:00
..
bitops bitops: remove duplicated extern declarations 2010-10-09 21:51:45 +02:00
4level-fixup.h
atomic64.h
atomic-long.h
atomic.h Merge git://git.kernel.org/pub/scm/linux/kernel/git/arnd/asm-generic 2010-10-22 11:17:06 -07:00
audit_change_attr.h audit: make link()/linkat() match "attribute change" predicate 2010-10-30 08:45:43 -04:00
audit_dir_write.h
audit_read.h
audit_signal.h
audit_write.h
auxvec.h
bitops.h
bitsperlong.h
bug.h
bugs.h
cache.h
cacheflush.h
checksum.h
cmpxchg-local.h Fix IRQ flag handling naming 2010-10-07 14:08:55 +01:00
cmpxchg.h
cputime.h taskstats: use real microsecond granularity for CPU times 2010-10-27 18:03:17 -07:00
current.h
delay.h
device.h
div64.h
dma-coherent.h
dma-mapping-broken.h dma-mapping: remove dma_is_consistent API 2010-08-11 08:59:21 -07:00
dma-mapping-common.h
dma.h
emergency-restart.h
errno-base.h
errno.h
fb.h
fcntl.h asm-generic: fcntl: make exported headers use strict posix types 2010-10-09 21:51:43 +02:00
futex.h
getorder.h
gpio.h gpiolib: fix HAVE_GPIO_LIB leftovers in asm-generic/gpio.h 2010-10-27 18:03:06 -07:00
hardirq.h Fix IRQ flag handling naming 2010-10-07 14:08:55 +01:00
hw_irq.h
ide_iops.h
int-l64.h
int-ll64.h
io.h asm-generic/io.h: allow people to override individual funcs 2010-10-18 09:20:46 +02:00
ioctl.h
ioctls.h ioctl: Use asm-generic/ioctls.h on cris (enables termiox) 2010-10-22 10:19:59 -07:00
iomap.h
ipcbuf.h
irq_regs.h
irq.h
irqflags.h Fix IRQ flag handling naming 2010-10-07 14:08:55 +01:00
Kbuild include: replace unifdef-y with header-y 2010-08-14 22:26:51 +02:00
Kbuild.asm include: replace unifdef-y with header-y 2010-08-14 22:26:51 +02:00
kdebug.h asm-generic: kdebug.h: Checkpatch cleanup 2010-10-09 21:51:44 +02:00
kmap_types.h
libata-portmap.h
linkage.h
local64.h
local.h
memory_model.h
mm_hooks.h
mman-common.h
mman.h
mmu_context.h
mmu.h
module.h
msgbuf.h
mutex-dec.h
mutex-null.h
mutex-xchg.h
mutex.h
page.h
param.h
parport.h
pci-dma-compat.h
pci.h
percpu.h percpu: Optimize __get_cpu_var() 2010-09-10 10:56:51 +02:00
pgalloc.h
pgtable-nopmd.h
pgtable-nopud.h
pgtable.h [S390] add support for nonquiescing sske 2010-10-25 16:10:15 +02:00
poll.h
posix_types.h
resource.h
rtc.h
scatterlist.h
sections.h
segment.h
sembuf.h
serial.h
setup.h
shmbuf.h
shmparam.h
siginfo.h
signal-defs.h
signal.h
socket.h
sockios.h
spinlock.h
stat.h asm-generic/stat.h: support 64-bit file time_t for stat() 2010-11-01 15:31:29 -04:00
statfs.h add f_flags to struct statfs(64) 2010-08-09 16:48:44 -04:00
string.h
swab.h
syscall.h
syscalls.h Fix the declaration of sys_execve() in asm-generic/syscalls.h 2010-08-18 12:12:38 -07:00
system.h asm-generic: cmpxchg does not handle non-long arguments 2010-10-09 21:51:27 +02:00
termbits.h tty: Add EXTPROC support for LINEMODE 2010-08-10 13:47:39 -07:00
termios-base.h
termios.h
timex.h
tlb.h
tlbflush.h
topology.h topology: alternate fix for ia64 tiger_defconfig build breakage 2010-08-09 20:44:57 -07:00
types.h
uaccess-unaligned.h
uaccess.h
ucontext.h
unaligned.h
unistd.h Add fanotify syscalls to <asm-generic/unistd.h>. 2010-08-13 08:08:37 -04:00
user.h
vga.h
vmlinux.lds.h Merge branch 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6 2010-10-28 15:13:55 -07:00
xor.h