In linux kernel v4.19.3
In my module, I need to get the inode last modification time in nanosecondes and not in seconds, but it always returns 0.
struct timespec64 i_mtime;
for example in this code :
pr_info("nsec = %ld - sec = %lld\n",inode->i_mtime.tv_nsec,inode->i_mtime.tv_sec);
this code returns :
nsec = 0 - sec = 1593096577
Any idea ?
This, of course, may depend on a specific file system that your inode is located on. Also, there's that unlikely chance that the time was exactly a round number of seconds.
However, the most likely reason for the behaviour you're observing is that in some Linux file systems the nanosecond part of each time-related timespec
structure in the inode
structure is set to zero when the inode is created. So, for instance, if you are getting zero nanoseconds in the last-modified time stamp, it likely means that the file has not been modified since its creation.
This is a minimal kernel module that prints the modification time of a predefined file. It compiles and works on Ubuntu with kernel 4.15.0-101-generic
. The module is intentionally not loaded into the kernel and exits after printing out the timestamp values.
#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");