【问题标题】:access to nanosecond in struct inode在结构 inode 中访问纳秒
【发布时间】:2020-10-16 02:06:38
【问题描述】:

在linux内核v4.19.3中

在我的模块中,我需要以纳秒而不是秒为单位获取 inode 上次修改时间,但它始终返回 0。

struct timespec64 i_mtime;

例如在这段代码中:

pr_info("nsec = %ld - sec = %lld\n",inode->i_mtime.tv_nsec,inode->i_mtime.tv_sec);

此代码返回:

nsec = 0 - sec = 1593096577

有什么想法吗?

【问题讨论】:

    标签: linux filesystems kernel inode


    【解决方案1】:

    当然,这可能取决于您的 inode 所在的特定文件系统。此外,时间恰好是整数秒的可能性不大。

    但是,您观察到的行为最可能的原因是,在某些 Linux 文件系统中,inode 结构中每个与时间相关的 timespec 结构的纳秒部分在创建 inode 时设置为零.因此,例如,如果您在最后修改的时间戳中得到零纳秒,这可能意味着文件自创建以来没有被修改。

    这是一个最小的内核模块,用于打印预定义文件的修改时间。它在内核 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");
    

    【讨论】:

    • 实际上,我使用 shell 脚本来一次创建数百个文件,而这发生在同一秒内...好吧,我将尝试修改它以查看纳秒级的变化.谢谢!
    • 我尝试修改一个文件,但纳秒停留在 0.... 有什么想法吗?
    • 我认为如果我能重现您的情况会很有帮助。究竟是如何创建这些文件的?你用什么方法?这些文件是在什么文件系统上创建的?
    • 您好,谢谢。我手动或通过 shell 脚本中的 for 循环使用“touch”bash 命令。我试图纳米文件以更改修改日期......结果相同。不幸的是,我不能与你分享 VFS YET,我不允许:(
    • 我不明白为什么你不能分享你的FS的类型。那是自定义FS类型吗?我很好奇,我编写了一个最小的内核模块来打印预定义文件的修改时间。 FS 是 ext4。使用任何常用编辑器或从命令提示符创建的文件(例如使用 touch 或使用 &gt;)在此 FS 上设置的纳秒没有非零值。从 tar 存档恢复的文件的修改时间的纳秒部分为零。当我在文件中添加一些东西(修改它)时,纳秒部分变为非零值。所有这些都成功地显示在模块输出中。
    【解决方案2】:

    我发现了问题:

    我正在使用的这个自定义 FS,将结构 SB(超级块)的 s_time_gran 设置为 10⁹,这是一个更差的可用粒度(一秒)。

    我把它改成了 1,得到了纳秒。

    【讨论】:

      猜你喜欢
      • 2017-06-19
      • 2021-10-23
      • 2019-11-04
      • 2011-12-20
      • 2011-05-17
      • 1970-01-01
      • 2013-02-04
      相关资源
      最近更新 更多