ext2/3/4 文件系统如何处理 64 位 time_t?

How do ext2/3/4 filesystems deal with 64 bit time_t?

我正在研究小型 ext2 文件系统图像处理工具(例如列出目录、添加和提取文件而无需安装)。 我刚刚遇到了 Unix 时间戳字段的问题。它们在 ext 文件系统中都是 32 位的。正如我们所知,32 位 Unix 时间戳在 2038 年之后将不再有效。大多数软件只需将 time_t 的定义更改为 64 位即可轻松解决此问题。但是对于文件系统来说就没那么容易了。它们需要与现有的实现兼容,但它们需要不时更新。 ext 文件系统究竟是如何做到的?特别是 s_mtimes_wtimes_lastchecki_atimei_ctimei_mtimei_dtime.

等字段

如果您查看 ext4's inode structure,您会看到:

struct ext4_inode {
    ...
    __le32  i_ctime;    /* Inode Change time */
    ...
    __le32  i_ctime_extra;  /* extra Change time      (nsec << 2 | epoch) */
    ...
};

您不会发现 i_ctime_extra 被使用 (*叹息*)。相反,您将 find:

#define EXT4_INODE_GET_XTIME(xtime, inode, raw_inode)               \
do {                                        \
    (inode)->xtime.tv_sec = (signed)le32_to_cpu((raw_inode)->xtime);    \
    if (EXT4_FITS_IN_INODE(raw_inode, EXT4_I(inode), xtime ## _extra)) {    \
        ext4_decode_extra_time(&(inode)->xtime,             \
                       raw_inode->xtime ## _extra);     \
        }                               \
    else                                    \
        (inode)->xtime.tv_nsec = 0;                 \
} while (0)


#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)

如果您查看用法,您会发现在内存中使用了 64 位整数,分隔仅存在于磁盘上。