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

问题描述 投票:0回答:1

我正在使用小型ext2文件系统图像处理工具(例如列出目录,添加和提取文件而无需挂载)。我刚遇到Unix时间戳字段的问题。它们都是ext文件系统中的32位。众所周知,2038年以后32位Unix时间戳将不再可用。只需将time_t的定义更改为64位,大多数软件就可以轻松解决此问题。但这对于文件系统而言并不容易。它们需要与现有实现兼容,但是需要不时更新。 ext文件系统到底是怎么做到的?特别是诸如s_mtimes_wtimes_lastchecki_atimei_ctimei_mtimei_dtime的字段。

filesystems unix-timestamp ext2 year2038
1个回答
0
投票

[如果您查看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位整数,分隔仅在磁盘上存在。

© www.soinside.com 2019 - 2024. All rights reserved.