|
Size: 10907
Comment:
|
Size: 8242
Comment:
|
| Deletions are marked like this. | Additions are marked like this. |
| Line 1: | Line 1: |
| = The year 2038 problem = | ''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 == |
| Line 4: | Line 7: |
| == User space interfaces == | === User space interfaces === |
| Line 7: | Line 10: |
| ==== System calls ==== | |
| Line 8: | Line 12: |
| System calls have been moved out [[:y2038/syscalls:]], that page is rather outdated, newer information is available at https://lwn.net/Articles/643234/ | |
| Line 9: | Line 14: |
| === 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. * nanosleep * select/pselect/poll/ppoll/epoll * getrusage (+ wait4?) * sched_rr_get_interval * sigtimedwait * alarm * Also: futex, recvmmsg, io_getevents? ==== 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. [Does checkpoint/restore have any implications here wrt to how freely we can change the start of the epoch? E.g., when freezing/restoring processed from different systems that have timer_settime() timers?] * getitimer/setitimer * timer_settime/timer_gettime(+timerfd_settime, timerfd_gettime?) * gettimeofday/settimeofday * adjtimex * clock_gettime/clock_settime/clock_adjtime/clock_nanosleep(? what about clock_nanosleep TIMER_ABSTIME?) * time/stime * sysv ipc (msg, sem, shm) * sysinfo ==== 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. * stat/lstat/fstatat/ * utime/utimes/futimesa/utimensat === ioctl === There are numerous ioctl commands using a time argument. This list is incomplete * audio time stamps * v4l time stamps * input event time stamps * socket time stamps * ... === 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. === Audit of include/uapi for time_t impact === Structure and IOCTL dependency: {{{ time_t struct msqid64_ds (has 2038 padding!) struct semid64_ds (has 2038 padding!) struct cyclades_idle_stats struct video_event VIDEO_GET_EVENT struct msqid_ds struct ppp_idle PPPIOCGIDLE struct semid_ds union semun struct timespec SIOCGSTAMPNS struct coda_vattr ... struct scm_timestamping struct som_hdr struct itimerspec struct v4l2_event VIDIOC_DQEVENT struct snd_pcm_status SNDRV_PCM_IOCTL_STATUS struct snd_pcm_mmap_status struct snd_pcm_sync_ptr SNDRV_PCM_IOCTL_SYNC_PTR struct snd_rawmidi_status SNDRV_RAWMIDI_IOCTL_STATUS struct snd_timer_status SNDRV_TIMER_IOCTL_STATUS struct snd_timer_tread struct snd_ctl_elem_value SNDRV_CTL_IOCTL_ELEM_READ SNDRV_CTL_IOCTL_ELEM_WRITE struct timeval SIOCGSTAMP struct zatm_t_hist struct bcm_msg_head struct elf_prstatus struct input_event struct omap3isp_stat_data VIDIOC_OMAP3ISP_STAT_REQ PPGETTIME PPSETTIME struct rusage struct itimerval struct timex struct v4l2_buffer VIDIOC_QUERYBUF VIDIOC_QBUF VIDIOC_DQBUF VIDIOC_PREPARE_BUF struct utimbuf }}} Syscalls affected by the above types: {{{ sys_time sys_stime sys_nanosleep sys_clock_settime sys_clock_gettime sys_clock_getres sys_clock_nanosleep sys_sched_rr_get_interval sys_futex sys_rt_sigtimedwait sys_io_getevents sys_recvmmsg sys_semtimedop sys_mq_timedsend sys_mq_timedreceive sys_utimensat sys_pselect6 sys_ppoll sys_gettimeofday sys_settimeofday sys_utimes sys_select sys_futimesat sys_utime sys_timer_gettime sys_timer_settime sys_timerfd_settime sys_timerfd_gettime sys_wait4 sys_waitid sys_getrusage sys_getitimer sys_setitimer sys_adjtimex sys_clock_adjtime }}} == File systems == |
=== File systems === |
| Line 158: | Line 17: |
| || '''file system''' || '''time type''' || '''expiration year''' || | || file system || time type || expiration year || || 9p (9P2000) || unsigned 32-bit seconds || 2106 || || file system || time type || expiration year || |
| Line 161: | Line 22: |
| || adfs || 40-bit cs since 1900 || 2248 || | || adfs || 40-bit cs since 1900 || 2248 || |
| Line 163: | Line 24: |
| || afs || unsigned 32-bit seconds || 2106 || || befs || unsigned 48-bit seconds || never || || bfs || unsigned 32-bit seconds || 2106 || |
|| afs || unsigned 32-bit seconds || 2106 || || befs || unsigned 48-bit seconds || never || || bfs || unsigned 32-bit seconds || 2106 || |
| Line 180: | Line 41: |
| || freevxfs || unsigned 32-bit seconds/u32 microseconds || 2106 || | || freevxfs || unsigned 32-bit seconds/u32 microseconds || 2106 || |
| Line 182: | Line 43: |
| || gfs2 || u64 seconds/u32 ns || never || | || gfs2 || u64 seconds/u32 ns || never || |
| Line 185: | Line 46: |
| || hostfs || timespec || 2038 || || hpfs || unsigned 32-bit seconds || 2106 || || isofs || 'char' year since 1900 (fixable) || 2028 (!) || |
|| hostfs || timespec || 2038 || || hpfs || unsigned 32-bit seconds || 2106 || || isofs || 'char' year since 1900 (fixable) || 2028 || |
| Line 189: | Line 50: |
| || jfs || unsigned 32-bit seconds/ns || 2106 || | || jfs || unsigned 32-bit seconds/ns || 2106 || |
| Line 191: | Line 52: |
| || minix || unsigned 32-bit seconds || 2106 || || ncpfs || 7-bit year since 1980 || 2107 || |
|| minix || unsigned 32-bit seconds || 2106 || || ncpfs || 7-bit year since 1980 || 2107 || |
| Line 196: | Line 57: |
| || nilfs2 || u64 seconds/u32 ns || never || | || nilfs2 || u64 seconds/u32 ns || never || |
| Line 199: | Line 60: |
| || omfs || 64-bit milliseconds || never || | || omfs || 64-bit milliseconds || never || |
| Line 201: | Line 62: |
| || qnx4 || unsigned 32-bit seconds || 2106 || || qnx6 || unsigned 32-bit seconds || 2106 || |
|| qnx4 || unsigned 32-bit seconds || 2106 || || qnx6 || unsigned 32-bit seconds || 2106 || |
| Line 206: | Line 67: |
| || sysv || unsigned 32-bit seconds || 2106 || | || sysv || unsigned 32-bit seconds || 2106 || |
| Line 210: | Line 71: |
| || ufs2 || signed 64-bit seconds/u32 ns ||never || | || ufs2 || signed 64-bit seconds/u32 ns || never || |
| Line 213: | Line 74: |
| == Tasks == | === Plan === || Milestone || # of patches || Status || Targeted Kernel release || || Infrastructure patches for vfs_time and granularity fields 1.4.1 and 1.4.2 || 2 || Done || 4.7- rc1 || || Test time ranges beyond y2038 support, in memory timestamps match with on disk -1.3.1 and 1.3.2 || Xfs tests || In progress || 5/28/16 || || Replace CURRENT_TIME and CURRENT_TIME_SEC – 1.2.1 || ~60 || In Progress, waiting for 4.7 rc1 and repost previous. || 4.8 || || Vfs_time patches – 1.4.3 || ~40 || In Progress, waiting for 4.7-rc1 || 4.8 || || Fill in right granularities and ranges for FS – 1.2.2 and 1.2.3 || ~40 || Yet to start || 4.8 || || Expose FS granularities and ranges – 1.4.5 and 1.4.6 || ~5 || Yet to start || 4.8 || || Tests to check the granularities and ranges – 1.3.3 and 1.3.4 || Xfs tests || Yet to start || 6/10/16 || || Add policy for wrong granularities - 1.4.7 || RFC for 4.9 || Yet to start || || || Stat and utime changes – 1.4.8 || RFC for 4.9 || Yet to start || || || Tests for I_DIRTY_* flags and mount options -1.3.5 and 1.3.6 || Xfs tests || Yet to start || 6/30/16 || || Transition vfs to 64 bit – 1.4.4 || 2 || Ready, wait for other patches to merge || 4.10 || === Cleanup === * Replace current_time and current_time_sec * Fill in right granularities * Fill in right ranges === Test === * Test time written on disk and in memory are same * Test time ranges beyond y2038 * Test time granularities are what the fs needs * Test time ranges supported are same as what fs reports * Perf tests * Test to check i_dirty_* flags are updating correctly * Test to check with different mount options like lazy atime etc. === Kernel tasks to transition vfs to use 64 bit times === * Infrastructure patches for vfs_time approach * Infrastructure patch for vfs granularity fields * Change each fs to use vfs time patches * Change vfs to use timespec64 * Expose fs granularities * Expose fs ranges * Add vfs policy for handling wrong ranges and granularity * Stat and utime api changes === Runtime library === * Make changes in one library * Make it part of some userspace and run it === Tasks === |
| Line 217: | Line 139: |
| === Small tasks === | ==== Trivial tasks ==== |
| Line 219: | Line 141: |
| * Find a driver using time_t/timespec/timeval internally and convert it to ktime_t/timespec64, examples: * drivers/staging/media/lirc/lirc_imon.c (timeval, trivial) * drivers/staging/ft1000/ (time_t and timeval) * drivers/staging/android/sync_debug.c (timeval, very easy) * drivers/staging/android/timed_gpio.c (timeval, easy) * drivers/staging/bcm/LeakyBucket.c (timeval, slightly tricky) * drivers/staging/bcm/Bcmchar.c (timeval, very easy) * drivers/staging/comedi/drivers/comedi_test.c (timeval) * drivers/staging/comedi/drivers/serial2002.c (timeval, easy) * drivers/staging/dgnc/dgnc_tty.c (timeval, very easy) * drivers/staging/gdm72xx/ (timeval, easy) * drivers/staging/media/lirc/lirc_igorplugusb.c (timeval) * drivers/staging/media/lirc/lirc_parallel.c (timeval, easy) * drivers/staging/media/lirc/lirc_sasem.c (timeval, very easy) * drivers/staging/media/lirc/lirc_serial.c (timeval, easy) * drivers/staging/media/lirc/lirc_sir.c (timeval) * drivers/staging/rts5208/rtsx.h (timeval) * drivers/staging/olpc_dcon/olpc_dcon.c (timespec, rather broken) * drivers/staging/ozwpan/ozhcd.c (timespec) * drivers/staging/ozwpan/ozproto.c (timespec) * kernel/cpuset.c (time_t) [Status: Completed, Heena Sirwani] * fs/reiserfs/journal.c (time_t) * drivers/scsi/ips.c (time_t) * sound/pci/es1968.c (timeval) [Status: Completed, Tina Ruchandani] * kernel/power/hibernate.c (timeval) [Status: Completed, Tina Ruchandani] * drivers/s390/net/ctcm_fsms.c (timespec) [Status: Completed, Aya Mahfouz] * drivers/power/ab8500_fg.c (timespec) [Status: Completed, Ebru Akagunduz] |
Find a driver using time_t/timespec/timeval internally and convert it to ktime_t/timespec64, examples: |
| Line 247: | Line 143: |
| === Medium tasks === | * 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 * fs/fuse/dir.c * drivers/scsi/pmcraid.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 * drivers/media/platform/vivid/ * drivers/net/hamradio/baycom_ser_fdx.c ==== Medium tasks ==== |
| Line 250: | Line 168: |
| * drivers/staging/comedi/comedi_fops.c (INSN_GTOD, timeval) * drivers/staging/android/alarm-dev.c (timespec) * include/uapi/linux/atm_zatm.h (zatm_t_hist/timeval) * include/uapi/linux/videodev2.h (v4l2_buffer/timespec) * Fix the android logger time format (drivers/staging/android/logger.c) |
* drivers/usb/misc/usbtest.c |
| Line 256: | Line 172: |
| * Convert all 'ptp' users in the kernel | |
| Line 258: | Line 174: |
| * Introduce known unsafe types (possibly like __kernel_time32_t, __kernel_compat_time_t etc) so we can annotate interfaces that are known to use a fixed size and cannot be changed to new types. * Fix all time issues in drivers/staging/lustre (maybe advanced task) |
|
| Line 261: | Line 175: |
| === Advanced tasks === | * fix all uses of timeval in drivers/scsi/bfa |
| Line 263: | Line 177: |
| * Introduce a new system call family to replace one or more of the problematic calls listed above. | ==== Advanced tasks ==== |
| Line 265: | Line 181: |
| Line 267: | Line 184: |
| === Tasks later in the project === | * start migrating the times in 'struct inode' and 'struct 'kstat' to separate 64-bit second + 32-bit nanosecond fields. ==== Tasks later in the project ==== |
| Line 269: | Line 189: |
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.
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.
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 have been moved out :y2038/syscalls:, that page is rather outdated, newer information is available at https://lwn.net/Articles/643234/
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
Milestone # of patches Status Targeted Kernel release Infrastructure patches for vfs_time and granularity fields 1.4.1 and 1.4.2 2 Done 4.7- rc1 Test time ranges beyond y2038 support, in memory timestamps match with on disk -1.3.1 and 1.3.2 Xfs tests In progress 5/28/16 Replace CURRENT_TIME and CURRENT_TIME_SEC – 1.2.1 ~60 In Progress, waiting for 4.7 rc1 and repost previous. 4.8 Vfs_time patches – 1.4.3 ~40 In Progress, waiting for 4.7-rc1 4.8 Fill in right granularities and ranges for FS – 1.2.2 and 1.2.3 ~40 Yet to start 4.8 Expose FS granularities and ranges – 1.4.5 and 1.4.6 ~5 Yet to start 4.8 Tests to check the granularities and ranges – 1.3.3 and 1.3.4 Xfs tests Yet to start 6/10/16 Add policy for wrong granularities - 1.4.7 RFC for 4.9 Yet to start Stat and utime changes – 1.4.8 RFC for 4.9 Yet to start Tests for I_DIRTY_* flags and mount options -1.3.5 and 1.3.6 Xfs tests Yet to start 6/30/16 Transition vfs to 64 bit – 1.4.4 2 Ready, wait for other patches to merge 4.10
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.
Find a driver using time_t/timespec/timeval internally and convert it to ktime_t/timespec64, examples:
Find a driver using time_t/timespec/timeval internally and convert it to ktime_t/timespec64, examples:
The year 2038 problem
User space interfaces
System calls
File systems
Plan
Cleanup
Test
Kernel tasks to transition vfs to use 64 bit times
Runtime library
Tasks
Trivial tasks
Small tasks
Medium tasks
Advanced tasks
Tasks later in the project