New VFS files have the 'correct' ctime
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 23 Jul 2014 01:08:05 +0000 (18:08 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 23 Jul 2014 01:08:05 +0000 (18:08 -0700)
The kernel doesn't know what the real time is, so it always thinks it
booted at May 12, 2009 (Nanwan's birthday, though it's actually the day
we found the picture of him (or her)).

I had to change the order of some initialization, since the VFS now
wants the TSC timing to be set up for epoch_seconds() to work.

kern/include/time.h
kern/src/ext2fs.c
kern/src/init.c
kern/src/time.c
kern/src/vfs.c

index 0fb40cc..eff60cb 100644 (file)
@@ -5,7 +5,7 @@
 #include <arch/time.h>
 
 /* (newlib) Time Value Specification Structures, P1003.1b-1993, p. 261 */
-typedef long time_t;
+typedef long time_t; /* TODO: this is fucked.  Thanks POSIX. */
 
 struct timespec {
   time_t  tv_sec;   /* Seconds */
@@ -33,6 +33,7 @@ uint64_t sec2tsc(uint64_t sec);
 uint64_t msec2tsc(uint64_t msec);
 uint64_t usec2tsc(uint64_t usec);
 uint64_t nsec2tsc(uint64_t nsec);
+uint64_t epoch_seconds(void);
 
 /* Just takes a time measurement.  Meant to be paired with stop_timing.  Use
  * this if you don't want to muck with overheads or subtraction. */
index 1a0b7bb..9a88b42 100644 (file)
@@ -1088,19 +1088,11 @@ int ext2_create(struct inode *dir, struct dentry *dentry, int mode,
        struct ext2_i_info *e2ii;
        uint32_t dir_block;
        unsigned int our_rec_len;
-       /* TODO: figure out the real time!  (Nanwan's birthday, bitches!) */
-       time_t now = 1242129600;
        struct ext2_dirent *new_dirent;
        /* Set basic inode stuff for files, get a disk inode, etc */
        SET_FTYPE(inode->i_mode, __S_IFREG);
        inode->i_fop = &ext2_f_op_file;
        inode->i_ino = ext2_alloc_diskinode(inode, dir_bg);
-       inode->i_atime.tv_sec = now;
-       inode->i_atime.tv_nsec = 0;
-       inode->i_ctime.tv_sec = now;
-       inode->i_ctime.tv_nsec = 0;
-       inode->i_mtime.tv_sec = now;
-       inode->i_mtime.tv_nsec = 0;
        /* Initialize disk inode (this will be different for short symlinks) */
        disk_inode = ext2_get_diskinode(inode);
        ext2_init_diskinode(disk_inode, inode);
index 5e39deb..774181d 100644 (file)
@@ -81,11 +81,11 @@ void kernel_init(multiboot_info_t *mboot_info)
        vmr_init();
        file_init();
        page_check();
-       vfs_init();
-       devfs_init();
        idt_init();
        kernel_msg_init();
        timer_init();
+       vfs_init();
+       devfs_init();
        train_timing();
        kb_buf_init(&cons_buf);
        arch_init();
index da1582f..3179b80 100644 (file)
@@ -132,3 +132,10 @@ uint64_t nsec2tsc(uint64_t nsec)
        else
                return (nsec * system_timing.tsc_freq) / 1000000000;
 }
+
+uint64_t epoch_seconds(void)
+{
+       /* TODO: figure out what epoch time TSC == 0 is */
+       uint64_t boot_sec = 1242129600; /* nanwan's birthday */
+       return tsc2sec(read_tsc()) + boot_sec;
+}
index 9662d0d..16f1d40 100644 (file)
@@ -958,6 +958,7 @@ void load_inode(struct dentry *dentry, unsigned long ino)
  * note we don't pass this an nd, like Linux does... */
 static struct inode *create_inode(struct dentry *dentry, int mode)
 {
+       uint64_t now = epoch_seconds();
        /* note it is the i_ino that uniquely identifies a file in the specific
         * filesystem.  there's a diff between creating an inode (even for an in-use
         * ino) and then filling it in, and vs creating a brand new one.
@@ -970,10 +971,10 @@ static struct inode *create_inode(struct dentry *dentry, int mode)
        inode->i_nlink = 1;
        inode->i_size = 0;
        inode->i_blocks = 0;
-       inode->i_atime.tv_sec = 0;              /* TODO: now! */
-       inode->i_ctime.tv_sec = 0;
-       inode->i_mtime.tv_sec = 0;
-       inode->i_atime.tv_nsec = 0;             /* are these supposed to be the extra ns? */
+       inode->i_atime.tv_sec = now;
+       inode->i_ctime.tv_sec = now;
+       inode->i_mtime.tv_sec = now;
+       inode->i_atime.tv_nsec = 0;
        inode->i_ctime.tv_nsec = 0;
        inode->i_mtime.tv_nsec = 0;
        inode->i_bdev = inode->i_sb->s_bdev;