在 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,得到了纳秒