Skip to contentSkip to conversation

fix 0 file creation time

PATCH In review Li Zefan 2 participants 2 messages Aug 6, 2008 – Aug 14, 2008

lore
Share & tools
lore

Li Zefan

author
#0 lore raw

PATCH 1/1 fix 0 file creation time

$ lsattr -c
1970-01-01 08:00:00.0 +0800 --------------- ./lost+found

It turns out that the crtime of files created by e2fsprogs is 0.

---
 lib/ext2fs/inode.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
lib/ext2fs/inode.c +1 -0
index ba15dda..66ddae4 100644
@@ -767,6 +767,7 @@ errcode_t ext2fs_write_new_inode(ext2_filsys fs, ext2_ino_t ino,
 	large_inode = (struct ext2_inode_large *) buf;
 	large_inode->i_extra_isize = sizeof(struct ext2_inode_large) - 
 		EXT2_GOOD_OLD_INODE_SIZE;
+	large_inode->i_crtime = large_inode->i_atime;
 
 	retval = ext2fs_write_inode_full(fs, ino, buf, size);
 	free(buf);
Signature · 1 line
1.5.4.rc3
#1 lore raw

Review

Quoted 7 lines · Li Zefan
$ lsattr -c
1970-01-01 08:00:00.0 +0800 --------------- ./lost+found

It turns out that the crtime of files created by e2fsprogs is 0.

(quoted diff) +1 -0
+	large_inode->i_crtime = large_inode->i_atime;

Your patch assumes that i_atime is appropriately set, which is not necessarily the case. Enclosed the patch which I have committed into e2fsprogs.

- Ted

commit 3bcc6276a0c229791ca4a4fee4cf6d8d48ebe824

Author: Theodore Ts'o <[email protected]>
Date:   Thu Aug 14 14:30:05 2008 -0400

libext2fs: Initialize unset inode timestamps when writing a new inode

As Li Zefan <[email protected]> reported, the creation timestamp was not getting set on the lost+found inode. This patch makes sure all of the timestamps are appropriately set.

lib/ext2fs/inode.c +10 -0
index ba15dda..b45de87 100644
@@ -752,6 +752,14 @@ errcode_t ext2fs_write_new_inode(ext2_filsys fs, ext2_ino_t ino,
 	int 			size = EXT2_INODE_SIZE(fs->super);
 	struct ext2_inode_large	*large_inode;
 	errcode_t		retval;
+	__u32 			t = fs->now ? fs->now : time(NULL);
+
+	if (!inode->i_ctime)
+		inode->i_ctime = t;
+	if (!inode->i_mtime)
+		inode->i_mtime = t;
+	if (!inode->i_atime)
+		inode->i_atime = t;
 
 	if (size == sizeof(struct ext2_inode))
 		return ext2fs_write_inode_full(fs, ino, inode,
@@ -767,6 +775,8 @@ errcode_t ext2fs_write_new_inode(ext2_filsys fs, ext2_ino_t ino,
 	large_inode = (struct ext2_inode_large *) buf;
 	large_inode->i_extra_isize = sizeof(struct ext2_inode_large) - 
 		EXT2_GOOD_OLD_INODE_SIZE;
+	if (!large_inode->i_crtime)
+		large_inode->i_crtime = t;
 
 	retval = ext2fs_write_inode_full(fs, ino, buf, size);
 	free(buf);
lib/ext2fs/mkdir.c +0 -1
index 34242df..e769ed5 100644
@@ -85,7 +85,6 @@ errcode_t ext2fs_mkdir(ext2_filsys fs, ext2_ino_t parent, ext2_ino_t inum,
 	ext2fs_iblk_set(fs, &inode, 1);
 	inode.i_block[0] = blk;
 	inode.i_links_count = 2;
-	inode.i_ctime = inode.i_atime = inode.i_mtime = fs->now ? fs->now : time(NULL);
 	inode.i_size = fs->blocksize;
 
 	/*