我正在使用小型ext2文件系统图像处理工具(例如列出目录,添加和提取文件而无需挂载)。我刚遇到Unix时间戳字段的问题。它们都是ext文件系统中的32位。众所周知,2038年以后32位Unix时间戳将不再可用。只需将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位整数,分隔仅在磁盘上存在。