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_mtime
、s_wtime
、s_lastcheck
、i_atime
、i_ctime
、i_mtime
和 i_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 位整数,分隔仅存在于磁盘上。
我正在研究小型 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
.
如果您查看 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 位整数,分隔仅存在于磁盘上。