1

我正在研究小型 ext2 文件系统映像操作工具(例如列出目录、添加和提取文件而无需挂载它)。我刚刚遇到了 Unix 时间戳字段的问题。它们在 ext 文件系统中都是 32 位的。众所周知,32 位 Unix 时间戳在 2038 年后将不再起作用。大多数软件只需将 time_t 的定义更改为 64 位即可轻松解决此问题。但是对于文件系统来说并不是那么容易。它们需要与现有实现兼容,但需要不时更新。ext 文件系统究竟是如何做到这一点的?特别是s_mtime, s_wtime, s_lastcheck, i_atime, i_ctime,i_mtime和等字段i_dtime

4

1 回答 1

3

如果你看一下ext4 的 inode 结构,你会看到:

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

你不会发现i_ctime_extra被使用(*叹气*)。相反,您会发现

#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 位整数,分隔只存在于磁盘上。

于 2020-02-23T03:14:40.810 回答