KernelNewbies:

The year 2038 problem

All 32-bit kernels to date use a signed 32-bit time_t type, which can only represent time until January 2038. Since embedded systems running 32-bit Linux are going to survive beyond that date, we have to change all current uses, in a backwards compatible way.

User space interfaces

We will likely keep the 32-bit time_t in all user space interfaces that currently use it, but add new interfaces with a 64-bit timespec or another type that can represent later times. Most importantly that impacts system calls, but also specific ioctl commands and a few other interfaces. User space programs have to be recompiled to use the new interfaces, and the policy whether to use the old or the time time is left to the C library. While that policy is a complex topic itself, we don't cover it here.

System calls

interfaces that uses relative time_t/timespec/timeval

These can stay compatible, but we'd have to use a different type if we change time_t.

interfaces that don't make sense for times in the past

Here, we are relatively free to change the start of the epoch in the kernel but convert to something else on the user space boundary. One possibility is to scale them to boot time and use ktime_t in the kernel.

interfaces that require absolute times

These absolutely have to use something better than time_t both in user space and in the kernel so we can deal with old files. A lot of file systems need to be fixed as well so we can actually store the times, regardless of whether we are running a 32 or 64 bit kernel.

ioctl

There are numerous ioctl commands using a time argument. This list is incomplete

memory mapped packet sockets

Socket timestamps are exported to user space using a memory mapped interface defined in include/uapi/linux/if_packet.h. There are currently three versions of this interface, all use a 32-bit time type. We will likely need a version 4 to solve this.

File systems

Each file system stores its file modification times in its own format on disk, and a lot of them have the same problem.

file system

time type

expiration year

9p

u32 seconds

2106

adfs

40-bit cs since 1900

2248

affs

u32 days/mins/(secs/50)

11760870

afs

autofs4

internal

befs

bfs

btrfs

64-bit second, 32-bit ns

never

cachefiles

internal

ceph

unsigned 32-bit second/ns

2106

cifs (smb)

7-bit years since 1980

2107

cifs (modern)

64-bit 100ns since 1601

30328

coda

timespec ioctl

2038

configfs

internal

cramfs

fixed

1970

debugfs

internal

devpts

internal

dlm

internal

ecryptfs

internal

efivarfs

internal

efs

u32 seconds

2106

exofs

s32 seconds

2038

exportfs

internal

ext2

u32 seconds

2106

ext3

u32 seconds

2106

ext4

34 bit seconds / 30-bit ns

2514

f2fs

64-bit seconds / 32-bit ns

never

fat

7-bit years since 1980, 2s resolution

2107

freevxfs

fscache

internal

fuse

64-bit second/32-bit ns

never

gfs2

hfs

u32 seconds since 1904

2040

hfsplus

u32 seconds since 1904

2040

hostfs

hpfs

hppfs

hugetlbfs

isofs

jbd

jbd2

jffs2

u32 seconds

2106

jfs

kernfs

lockd

logfs

u64 ns

2554

minix

ncpfs

nfsv2,v3

u32 seconds/ns

2106

nfsv4

u64 seconds/u32 ns

never

nfs_common

internal

nfsd

u32 seconds/ns

2106

nilfs2

nls

internal

notify

internal

ntfs

64-bit 100ns since 1601

30828

ocfs2

34-bit seconds/30-bit ns

2514

omfs

openpromfs

internal

proc

internal

pstore

internal

qnx4

qnx6

quota

internal

ramfs

internal

reiserfs

romfs

squashfs

sysfs

internal

sysv

ubifs

udf

ufs

xfs

u32 seconds/ns

2106

KernelNewbies: y2038 (last edited 2014-05-28 12:36:05 by arnd)