Re: [RFC 11/32] xfs: convert to struct inode_time
From: Arnd Bergmann <arnd@arndb.de>
Date: 2014-06-02 12:52:13
Also in:
linux-arch, linux-fsdevel, lkml
On Monday 02 June 2014 07:57:37 Theodore Ts'o wrote:
On Mon, Jun 02, 2014 at 12:56:42PM +0200, Arnd Bergmann wrote:quoted
I think you misunderstood what I suggested: the intent is to avoid seeing things break in 2038 by making them break much earlier. We have a solution for ext2 file systems, it's called ext4, and we just need to ensure that everybody knows they have to migrate eventually. At some point before the mid 2030ies, you should no longer be able to build a kernel that has support for ext2 or any other module that will run into bugs later....Even for ext4, it's not quite so simple as that. You only have support for times post 2038 if you are using an inode size > 128 bytes. There are a very, very large number of machines which even today, are using 128 byte inodes with ext4 for performance reasons. The vast majority of those machines which I know of can probably move to 256 byte inodes relatively easily, since hard drive replacement cycles are order 5-6 years tops, so I'm not that concerned, but it just goes to show this is a very complicated problem.
One stupid question about the current code:
static inline void ext4_decode_extra_time(struct inode_time *time, __le32 extra)
{
if (sizeof(time->tv_sec) > 4)
time->tv_sec |= (__u64)(le32_to_cpu(extra) & EXT4_EPOCH_MASK)
<< 32;
time->tv_nsec = (le32_to_cpu(extra) & EXT4_NSEC_MASK) >> EXT4_EPOCH_BITS;
}
#define EXT4_EINODE_GET_XTIME(xtime, einode, raw_inode) \
do { \
if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime)) \
(einode)->xtime.tv_sec = \
(signed)le32_to_cpu((raw_inode)->xtime); \
else \
(einode)->xtime.tv_sec = 0; \
if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime ## _extra)) \
ext4_decode_extra_time(&(einode)->xtime, \
raw_inode->xtime ## _extra); \
else \
(einode)->xtime.tv_nsec = 0; \
} while (0)
For a time between 2038 and 2106, this looks like xtime.tv_sec is
negative when ext4_decode_extra_time gets called, so the '|=' operator
doesn't actually do anything. Shouldn't that be '+='?
Arnd
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs