I'm using debugfs
to change the ctime of a file (programm rotine attached to ctime of this specific file) on an ext4 file system.
The therefor used command is:
debugfs -w -R 'set_inode_field foo/bar ctime 20130503145204' /dev/vdb1
but this is resulting in an ctime als followed:
myserver:~ # stat foo/bar
File: „foo/bar“
Size: 1234 Blocks: 24 IO Block: 4096 reguläre Datei
Device: 1234h/1234d Inode: 1234567 Links: 1
Access: (0660/-rw-rw----) Uid: ( 123/ whatever) Gid: ( 1234/ whatever)
Access: 2021-02-12 21:17:51.146954174 +0100
Modify: 2021-02-12 14:51:32.152323937 +0100
Change: 2013-05-03 16:52:04.991865222 +0200
not as expected: 2013-05-03 16:52:04.000000000 +0200
Reason, why it worked properly bevor is that the old ext3 FS stored ctime only at second resolution. the inode structur size
in ext2/ext3 was 128 bytes. With ext4 this size incremented to 156 bytes (i_extra_isize = 28, see: https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Inode_Size) resulting in nanosecond resolution.
How do I format the debugfs command to set the ctime to the exact nanoseconds?
After a little digging I managed to solve this problem. Solution: read the manual.
https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Inode_Table
https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Inode_Timestamps
debugfs supports setting of ctime/atime/mtime/crtime time_extra bytes with
set_inode_field foo/bar ctime_extra 0
The ctime_extra field is a unsigned integer, so the value of 0 gives the expected setting.
dtime was not widend and therefor does not support dtime_extra