Enhancement: add i_atime and i_generation
authorJaegeuk Kim <jaegeuk.kim@samsung.com>
Mon, 29 Oct 2012 22:34:35 +0000 (07:34 +0900)
committerJaegeuk Kim <jaegeuk.kim@samsung.com>
Mon, 26 Nov 2012 10:45:59 +0000 (19:45 +0900)
"You appear to have dropped i_btime - no big deal, you weren't using it anyway.
However if you ever want to support NFS export you will need some value which
is assigned when the inode is allocated and never changed until it is
de-allocated.  This is used to detect when an NFS file-handle refers to a
previous incarnation of an inode and so should be rejected as STALE.
i_btime could have possibly provided this, but not any more.  You might want
to add something back.
ext3 uses "i_generation" and has an 's_next_generation' in the superblock to
ensure that each new inode gets a new generation number.

You've also dropped i_atime.  I can certainly understand the desire to do
that, but I wonder if it is entirely wise.  There are some use-cases where
i_mtime is a poor substitute.

Also 'current_depth' looks a little odd without a 'i_' prefix.  It wouldn't
hurt to have a comment noting that it is for directories."

>From Neil Brown.

Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
mkfs/f2fs_format.c
mkfs/f2fs_format.h

index e20ad4e..7d4dad2 100644 (file)
@@ -1021,13 +1021,16 @@ static int8_t f2fs_write_root_inode(void)
        raw_node->i.i_size = cpu_to_le64(1 * blk_size_bytes); /* dentry */
        raw_node->i.i_blocks = cpu_to_le64(2);
 
+       raw_node->i.i_atime = cpu_to_le32(time(NULL));
+       raw_node->i.i_atime_nsec = 0;
        raw_node->i.i_ctime = cpu_to_le32(time(NULL));
        raw_node->i.i_ctime_nsec = 0;
        raw_node->i.i_mtime = cpu_to_le32(time(NULL));
        raw_node->i.i_mtime_nsec = 0;
+       raw_node->i.i_generation = 0;
        raw_node->i.i_xattr_nid = 0;
        raw_node->i.i_flags = 0;
-       raw_node->i.current_depth = cpu_to_le32(1);
+       raw_node->i.i_current_depth = cpu_to_le32(1);
 
        data_blk_nor = le32_to_cpu(super_block.main_blkaddr) +
                f2fs_params.cur_seg[CURSEG_HOT_DATA] * f2fs_params.blks_per_seg;
index ed3c525..31c075b 100644 (file)
@@ -182,7 +182,7 @@ struct f2fs_extent {
 } __attribute__((packed));
 
 #define F2FS_MAX_NAME_LEN      256
-#define ADDRS_PER_INODE         927    /* Address Pointers in an Inode */
+#define ADDRS_PER_INODE         923    /* Address Pointers in an Inode */
 #define ADDRS_PER_BLOCK         1018   /* Address Pointers in a Direct Block */
 #define NIDS_PER_BLOCK          1018   /* Node IDs in an Indirect Block */
 
@@ -195,11 +195,14 @@ struct f2fs_inode {
        __le32 i_links;                 /* Links count */
        __le64 i_size;                  /* File size in bytes */
        __le64 i_blocks;                /* File size in bytes */
+       __le64 i_atime;                 /* Inode access time */
        __le64 i_ctime;                 /* inode Change time */
        __le64 i_mtime;                 /* Modification time */
+       __le32 i_atime_nsec;
        __le32 i_ctime_nsec;
        __le32 i_mtime_nsec;
-       __le32 current_depth;
+       __le32 i_generation;            /* File version (for NFS) */
+       __le32 i_current_depth;         /* only for directory depth */
        __le32 i_xattr_nid;
        __le32 i_flags;                 /* file attributes */
        __le32 i_pino;                  /* parent inode number */