KernelNewbies:

unfortunately this page got deleted by accident, this version is restored from [https://web.archive.org/web/20150318062024/http://kernelnewbies.org/y2038], but most of the formatting is still missing.

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

System calls have been moved out :y2038/syscalls:, that page is rather outdated, newer information is available at https://lwn.net/Articles/643234/

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 (9P2000)

unsigned 32-bit seconds

2106

file system

time type

expiration year

9p (9P2000)

unsigned 32-bit seconds

2106

9p (9P2000.L)

signed 64-bit seconds, ns

never

adfs

40-bit cs since 1900

2248

affs

u32 days/mins/(secs/50)

11760870

afs

unsigned 32-bit seconds

2106

befs

unsigned 48-bit seconds

never

bfs

unsigned 32-bit seconds

2106

btrfs

signed 64-bit seconds, 32-bit ns

never

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

cramfs

fixed

1970

efs

unsigned 32-bit seconds

2106

exofs

signed 32-bit seconds

2038

ext2

signed 32-bit seconds

2038

ext3

signed 32-bit seconds

2038

ext4 (good old inodes)

signed 32-bit seconds

2038

ext4 (new inodes

34 bit seconds / 30-bit ns (but broken)

2038

f2fs

64-bit seconds / 32-bit ns

never

fat

7-bit years since 1980, 2s resolution

2107

freevxfs

unsigned 32-bit seconds/u32 microseconds

2106

fuse

64-bit second/32-bit ns

never

gfs2

u64 seconds/u32 ns

never

hfs

u32 seconds since 1904

2040

hfsplus

u32 seconds since 1904

2040

hostfs

timespec

2038

hpfs

unsigned 32-bit seconds

2106

isofs

'char' year since 1900 (fixable)

2028

jffs2

unsigned 32-bit seconds

2106

jfs

unsigned 32-bit seconds/ns

2106

logfs

signed 64-bit ns

2262

minix

unsigned 32-bit seconds

2106

ncpfs

7-bit year since 1980

2107

nfsv2,v3

unsigned 32-bit seconds/ns

2106

nfsv4

u64 seconds/u32 ns

never

nfsd

unsigned 32-bit seconds/ns

2106

nilfs2

u64 seconds/u32 ns

never

ntfs

64-bit 100ns since 1601

30828

ocfs2

34-bit seconds/30-bit ns

2514

omfs

64-bit milliseconds

never

pstore

ascii seconds

2106

qnx4

unsigned 32-bit seconds

2106

qnx6

unsigned 32-bit seconds

2106

reiserfs

unsigned 32-bit seconds

2106

romfs

fixed

1970

squashfs

unsigned 32-bit seconds

2106

sysv

unsigned 32-bit seconds

2106

ubifs

u64 second/u32 ns

never

udf

u16 year

2038

ufs1

unsigned 32-bit seconds

2106

ufs2

signed 64-bit seconds/u32 ns

never

xfs

signed 32-bit seconds/ns

2106

Tasks

The task list is for people that want to get involved, there will be many more tasks over time, so this is just a starting point. In the end, we should remove all instances of 'time_t', 'timespec' and 'timeval' from the kernel.

Trivial tasks

Find a driver using time_t/timespec/timeval internally and convert it to ktime_t/timespec64, examples:

  • drivers/firewire/core-cdev.c
  • drivers/firewire/nosy.c
  • drivers/hv/hv_util.c
  • drivers/infiniband/hw/nes/
  • drivers/misc/ibmasm/ibmasm.h
  • drivers/net/wireless/atmel.c
  • drivers/ide/pdc202xx_new.c

Small tasks

Find a driver using time_t/timespec/timeval internally and convert it to ktime_t/timespec64, examples:

  • drivers/block/sx8.c
  • drivers/char/ipmi/ipmi_ssif.c
  • drivers/char/mmtimer.c
  • drivers/cpufreq/speedstep-lib.c
  • drivers/hsi/clients/cmt_speech.c

Medium tasks

  • Modify an ioctl interface in a driver to support both 32- and 64-bit time interfaces, examples:
    • include/uapi/linux/atm_zatm.h (zatm_t_hist/timeval)
  • Convert the internal timekeeping in fs/nfsd
  • Convert all 'struct key' users (time_t)

Advanced tasks

  • Change the on-disk layout of a broken file system to optionally support longer time stamps
  • Port a small C library (uClibc, newlib, ...) to optionally use 64-bit time_t and build an embedded distribution (openembedded, openwrt, buildroot, ...) with this.

Tasks later in the project

  • Hook up all 32-bit architectures to use the new system calls
  • Introduce a Kconfig symbol to disable all code that has not yet been converted at compile time.

KernelNewbies: y2038 (last edited 2015-09-28 16:01:21 by arnd)