Size: 8242
Comment:
|
Size: 8458
Comment:
|
Deletions are marked like this. | Additions are marked like this. |
Line 1: | Line 1: |
''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. | ''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. '' |
Line 4: | Line 4: |
Line 11: | Line 10: |
System calls have been moved out [[:y2038/syscalls:]], that page is rather outdated, newer information is available at https://lwn.net/Articles/643234/ |
System calls have been moved out [["y2038/syscalls"]], that page is rather outdated, newer information is available at https://lwn.net/Articles/643234/ |
Line 48: | Line 46: |
|| isofs || 'char' year since 1900 (fixable) || 2028 || | || isofs || 'char' year since 1900 (fixable) || 2028 || |
Line 75: | Line 73: |
=== Plan === | = Plan = === 1.Plan for VFS === |
Line 85: | Line 84: |
|| Stat and utime changes – 1.4.8 || RFC for 4.9 || Yet to start || || | || Stat and utime changes – 1.4.8 || RFC for 4.9 || Yet to start || || |
Line 90: | Line 89: |
=== Cleanup === * Replace current_time and current_time_sec |
=== 1.2 Cleanup === '''1.2.1 '''Replace current_time and current_time_sec |
Line 93: | Line 92: |
* Fill in right granularities | '''1.2.2''' Fill in right granularities |
Line 95: | Line 94: |
* Fill in right ranges | '''1.2.3''' Fill in right ranges |
Line 97: | Line 96: |
=== Test === * Test time written on disk and in memory are same |
=== 1.3 Test === '''1.3.1''' Test time written on disk and in memory are same |
Line 100: | Line 99: |
* Test time ranges beyond y2038 | '''1.3.2 '''Test time ranges beyond y2038 |
Line 102: | Line 101: |
* Test time granularities are what the fs needs | '''1.3.3''' Test time granularities are what the fs needs |
Line 104: | Line 103: |
* Test time ranges supported are same as what fs reports | '''1.3.4''' Test time ranges supported are same as what fs reports |
Line 106: | Line 105: |
* Perf tests | '''1.3.5''' Perf tests |
Line 108: | Line 107: |
* Test to check i_dirty_* flags are updating correctly | '''1.3.6''' Test to check i_dirty_* flags are updating correctly |
Line 110: | Line 109: |
* Test to check with different mount options like lazy atime etc. | '''1.3.7''' Test to check with different mount options like lazy atime etc. |
Line 112: | Line 111: |
=== Kernel tasks to transition vfs to use 64 bit times === * Infrastructure patches for vfs_time approach |
=== 1.4 Kernel tasks to transition vfs to use 64 bit times === '''1.4.1''' Infrastructure patches for vfs_time approach |
Line 115: | Line 114: |
* Infrastructure patch for vfs granularity fields | '''1.4.2''' Infrastructure patch for vfs granularity fields |
Line 117: | Line 116: |
* Change each fs to use vfs time patches | '''1.4.3''' Change each fs to use vfs time patches |
Line 119: | Line 118: |
* Change vfs to use timespec64 | '''1.4.4''' Change vfs to use timespec64 |
Line 121: | Line 120: |
* Expose fs granularities | '''1.4.5''' Expose fs granularities |
Line 123: | Line 122: |
* Expose fs ranges | '''1.4.6''' Expose fs ranges |
Line 125: | Line 124: |
* Add vfs policy for handling wrong ranges and granularity | '''1.4.7''' Add vfs policy for handling wrong ranges and granularity |
Line 127: | Line 126: |
* Stat and utime api changes | '''1.4.8''' Stat and utime api changes |
Line 129: | Line 128: |
=== Runtime library === * Make changes in one library |
=== 1.5 Runtime library === '''1.5.1''' Make changes in one library |
Line 132: | Line 131: |
* Make it part of some userspace and run it | '''1.5.2''' Make it part of some userspace and run it |
Line 136: | Line 135: |
Line 140: | Line 138: |
Line 154: | Line 151: |
Line 166: | Line 162: |
Line 168: | Line 163: |
Line 177: | Line 171: |
Line 179: | Line 172: |
Line 187: | Line 179: |
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 |
Plan
1.Plan for VFS
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 |
1.2 Cleanup
1.2.1 Replace current_time and current_time_sec
1.2.2 Fill in right granularities
1.2.3 Fill in right ranges
1.3 Test
1.3.1 Test time written on disk and in memory are same
1.3.2 Test time ranges beyond y2038
1.3.3 Test time granularities are what the fs needs
1.3.4 Test time ranges supported are same as what fs reports
1.3.5 Perf tests
1.3.6 Test to check i_dirty_* flags are updating correctly
1.3.7 Test to check with different mount options like lazy atime etc.
1.4 Kernel tasks to transition vfs to use 64 bit times
1.4.1 Infrastructure patches for vfs_time approach
1.4.2 Infrastructure patch for vfs granularity fields
1.4.3 Change each fs to use vfs time patches
1.4.4 Change vfs to use timespec64
1.4.5 Expose fs granularities
1.4.6 Expose fs ranges
1.4.7 Add vfs policy for handling wrong ranges and granularity
1.4.8 Stat and utime api changes
1.5 Runtime library
1.5.1 Make changes in one library
1.5.2 Make it part of some userspace and run it
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
- 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
- Modify an ioctl interface in a driver to support both 32- and 64-bit time interfaces, examples:
- drivers/usb/misc/usbtest.c
- Convert the internal timekeeping in fs/nfsd
- Convert all 'struct key' users (time_t)
- fix all uses of timeval in drivers/scsi/bfa
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.
- start migrating the times in 'struct inode' and 'struct 'kstat' to separate 64-bit second + 32-bit nanosecond fields.
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.