Re: [RFC 11/32] xfs: convert to struct inode_time
From: Arnd Bergmann <arnd@arndb.de>
Date: 2014-06-02 15:01:20
Also in:
linux-fsdevel, linux-xfs, lkml
On Monday 02 June 2014 09:07:00 Theodore Ts'o wrote:
Yes, there are some ongoing dicussions about changing the post-2038 encoding of the timestamp in ext4, which is why this hasn't been fixed yet. The main thing that's been missing is time for me to review the patches, and a good way of writing regression tests that will work (or at least not fail) on build environments with a 32-bit time_t and 32-bit-only capable versions of functions such as gmtime(3). And given current discussions, I may want to think about some kind of superblock flag to allow the use of a 32-bit unsigned encoding for file systems using a 128-byte inode, with a way of setting that flag after scanning the file system to make sure there are no times that are previous to January 1, 1970. (Or more generally, allow any epoch to be defined using a 64-bit time_t offset stored in the superblock...)
FWIW, I've gone through the other file system implementations once more. The most common pattern I've encountered is to have a read_inode function with inode->i_mtime = le32_to_cpu(raw_inode->mtime); which results in interpreting the time as 'signed' on 32-bit kernels, but as 'unsigned' on 64-bit kernels. This could have been done intentionally to extend the valid time range to 2106 on 64-bit kernels, but it seems more likely that the code was written with no thought given to 64-bit time_t at all. I see this pattern on p9fs (old protocol only), afs, bfs, ceph, efs, freevxfs, hpfs, jffs2, jfs, minix, nfsv2/v3 (this was clearly intentional and is spelled out in the RFC), qnx4, qnx6, reiserfs, squashfs, sysv, and ufs (protocol version 1 only). The other behavior I see is to treat the on-disk 32-bit value as signed on both 32-bit and 64-bit kernels: inode->i_mtime = (signed)le32_to_cpu(raw_inode->mtime); this seems to be done intentionally in all cases, to maintain compatibility between 32-bit and 64-bit kernels, but it's relatively rare: exofs, ext2/3/4 (good old inodes) and xfs are the only ones doing this. In case of ext2/3/4, the sign handlign was introduced here: http://www.spinics.net/lists/linux-ext4/msg01758.html exofs and xfs seem to have done it like this for all of git history. Arnd _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs