在 struct inode 中访问纳秒
access to nanosecond in struct inode
在linux内核v4.19.3
在我的模块中,我需要以纳秒而不是秒为单位获取 inode 最后修改时间,但它总是 returns 0.
构造 timespec64 i_mtime;
例如在这段代码中:
pr_info("nsec = %ld - sec = %lld\n",inode->i_mtime.tv_nsec,inode->i_mtime.tv_sec);
此代码 returns :
nsec = 0 - sec = 1593096577
有什么想法吗?
当然,这可能取决于您的 inode 所在的特定文件系统。此外,时间恰好是整数秒的可能性很小。
但是,您所观察到的行为最可能的原因是,在某些 Linux 文件系统中,inode
中每个与时间相关的 timespec
结构的纳秒部分创建索引节点时,结构设置为零。因此,例如,如果您在上次修改的时间戳中获得零纳秒,则可能意味着该文件自创建以来未被修改。
这是一个最小的内核模块,可以打印预定义文件的修改时间。它使用内核 4.15.0-101-generic
在 Ubuntu 上编译和工作。该模块有意不加载到内核中,并在打印出时间戳值后退出。
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/namei.h>
#define S_NAME "test.txt"
static int __init s_init(void)
{
int ret;
struct path path;
ret = kern_path(S_NAME, LOOKUP_FOLLOW, &path);
if (ret) {
pr_info("File not found '%s'\n", S_NAME);
} else {
pr_info("nsec = %ld - sec = %ld\n",
path.dentry->d_inode->i_mtime.tv_nsec,
path.dentry->d_inode->i_mtime.tv_sec);
}
return -1;
}
module_init(s_init);
MODULE_LICENSE("GPL");
我发现了问题:
我正在使用的这个自定义 FS,结构 SB(超级块)的 s_time_gran 设置为 10⁹,这是一个更差的可用粒度(一秒)。
我改成了1,得到了纳秒
在linux内核v4.19.3
在我的模块中,我需要以纳秒而不是秒为单位获取 inode 最后修改时间,但它总是 returns 0.
构造 timespec64 i_mtime;
例如在这段代码中:
pr_info("nsec = %ld - sec = %lld\n",inode->i_mtime.tv_nsec,inode->i_mtime.tv_sec);
此代码 returns :
nsec = 0 - sec = 1593096577
有什么想法吗?
当然,这可能取决于您的 inode 所在的特定文件系统。此外,时间恰好是整数秒的可能性很小。
但是,您所观察到的行为最可能的原因是,在某些 Linux 文件系统中,inode
中每个与时间相关的 timespec
结构的纳秒部分创建索引节点时,结构设置为零。因此,例如,如果您在上次修改的时间戳中获得零纳秒,则可能意味着该文件自创建以来未被修改。
这是一个最小的内核模块,可以打印预定义文件的修改时间。它使用内核 4.15.0-101-generic
在 Ubuntu 上编译和工作。该模块有意不加载到内核中,并在打印出时间戳值后退出。
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/namei.h>
#define S_NAME "test.txt"
static int __init s_init(void)
{
int ret;
struct path path;
ret = kern_path(S_NAME, LOOKUP_FOLLOW, &path);
if (ret) {
pr_info("File not found '%s'\n", S_NAME);
} else {
pr_info("nsec = %ld - sec = %ld\n",
path.dentry->d_inode->i_mtime.tv_nsec,
path.dentry->d_inode->i_mtime.tv_sec);
}
return -1;
}
module_init(s_init);
MODULE_LICENSE("GPL");
我发现了问题:
我正在使用的这个自定义 FS,结构 SB(超级块)的 s_time_gran 设置为 10⁹,这是一个更差的可用粒度(一秒)。
我改成了1,得到了纳秒