KernelNewbies:

Problem

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

There are many clean up tasks that must precede the transitioning of VFS to use 64 bit timestamps. These help streamline the main series.

1.2.1 Replace current_time and current_time_sec

This patch series is aimed at getting rid of CURRENT_TIME and CURRENT_TIME_SEC macros. The macros: CURRENT_TIME and CURRENT_TIME_SEC are primarily used for filesystem timestamps. to the granularity as required by the filesystem. There will also be another series to add range checks and clamping to filesystem time functions that are meant to substitute the above macros:

          struct timespec current_fs_time(struct super_block *sb)

          struct timespec current_fs_time_sec(struct super_block *sb)

These time functions will also be transitioned along with VFS to use struct timespec64 instead of struct timespec. Any use of these macros outside of filesystem timestamps will be replaced by ktime_get*/ get_seconds functions.

Links to posted patches:

  1. http://thread.gmane.org/gmane.linux.file-systems/106912 (Infrastructure patch)

  2. https://lkml.org/lkml/2016/2/3/34

  3. https://lkml.org/lkml/2016/2/22/506

1.2.2 Fill in right granularities

The series is aimed at filling in right granularities in the s_time_gran field of struct super_block. The filed is used to determine the right granularity for nanosecond portion of inode timestamps. Some filesystems, for instance FAT do not initialize granularity fields since they only care about the seconds portion of the timestamps. This will lead to inconsistencies in the in memory timestamps compared to on disk ones as the filesystem uses VFS generic_update_time() which does not clear nanosecond field before updating the inode timestamps. Similar patches need to be submitted for other filesystems with similar issues.

1.2.3 Fill in right ranges

The time ranges supported by filesystems vary according to their on disk formats. The in memory version of the inode timestamps need to match the on disk version. The plan is for VFS to truncate filesystem timestamps according to their limits. Links posted:

  1. http://www.spinics.net/lists/linux-fsdevel/msg96564.html (Infrastructure patch)[http://www.spinics.net/lists/linux-fsdevel/msg96564.html ]

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.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

Overview of 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

2582

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

signed 32-bit seconds

2038

ufs2

signed 64-bit seconds/u32 ns

never

xfs

signed 32-bit seconds/ns

2106

KernelNewbies: y2038/vfs (last edited 2018-06-13 13:58:40 by arnd)