mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-11-18 07:35:12 +08:00
nilfs2: support nanosecond timestamp
After a review of user's feedback for finding out other compatibility issues, I found nilfs improperly initializes timestamps in inode; CURRENT_TIME was used there instead of CURRENT_TIME_SEC even though nilfs didn't have nanosecond timestamps on disk. A few users gave us the report that the tar program sometimes failed to expand symbolic links on nilfs, and it turned out to be the cause. Instead of applying the above displacement, I've decided to support nanosecond timestamps on this occation. Fortunetaly, a needless 64-bit field was in the nilfs_inode struct, and I found it's available for this purpose without impact for the users. So, this will do the enhancement and resolve the tar problem. Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
e339ad31f5
commit
612392307c
@ -226,7 +226,6 @@ static struct inode *alloc_gcinode(struct the_nilfs *nilfs, ino_t ino,
|
|||||||
ii->i_flags = 0;
|
ii->i_flags = 0;
|
||||||
ii->i_state = 1 << NILFS_I_GCINODE;
|
ii->i_state = 1 << NILFS_I_GCINODE;
|
||||||
ii->i_bh = NULL;
|
ii->i_bh = NULL;
|
||||||
ii->i_dtime = 0;
|
|
||||||
nilfs_bmap_init_gc(ii->i_bmap);
|
nilfs_bmap_init_gc(ii->i_bmap);
|
||||||
|
|
||||||
return inode;
|
return inode;
|
||||||
|
@ -306,7 +306,6 @@ struct inode *nilfs_new_inode(struct inode *dir, int mode)
|
|||||||
|
|
||||||
/* ii->i_file_acl = 0; */
|
/* ii->i_file_acl = 0; */
|
||||||
/* ii->i_dir_acl = 0; */
|
/* ii->i_dir_acl = 0; */
|
||||||
ii->i_dtime = 0;
|
|
||||||
ii->i_dir_start_lookup = 0;
|
ii->i_dir_start_lookup = 0;
|
||||||
#ifdef CONFIG_NILFS_FS_POSIX_ACL
|
#ifdef CONFIG_NILFS_FS_POSIX_ACL
|
||||||
ii->i_acl = NULL;
|
ii->i_acl = NULL;
|
||||||
@ -390,11 +389,10 @@ int nilfs_read_inode_common(struct inode *inode,
|
|||||||
inode->i_atime.tv_sec = le64_to_cpu(raw_inode->i_mtime);
|
inode->i_atime.tv_sec = le64_to_cpu(raw_inode->i_mtime);
|
||||||
inode->i_ctime.tv_sec = le64_to_cpu(raw_inode->i_ctime);
|
inode->i_ctime.tv_sec = le64_to_cpu(raw_inode->i_ctime);
|
||||||
inode->i_mtime.tv_sec = le64_to_cpu(raw_inode->i_mtime);
|
inode->i_mtime.tv_sec = le64_to_cpu(raw_inode->i_mtime);
|
||||||
inode->i_atime.tv_nsec = 0;
|
inode->i_atime.tv_nsec = le32_to_cpu(raw_inode->i_mtime_nsec);
|
||||||
inode->i_ctime.tv_nsec = 0;
|
inode->i_ctime.tv_nsec = le32_to_cpu(raw_inode->i_ctime_nsec);
|
||||||
inode->i_mtime.tv_nsec = 0;
|
inode->i_mtime.tv_nsec = le32_to_cpu(raw_inode->i_mtime_nsec);
|
||||||
ii->i_dtime = le64_to_cpu(raw_inode->i_dtime);
|
if (inode->i_nlink == 0 && inode->i_mode == 0)
|
||||||
if (inode->i_nlink == 0 && (inode->i_mode == 0 || ii->i_dtime))
|
|
||||||
return -EINVAL; /* this inode is deleted */
|
return -EINVAL; /* this inode is deleted */
|
||||||
|
|
||||||
inode->i_blocks = le64_to_cpu(raw_inode->i_blocks);
|
inode->i_blocks = le64_to_cpu(raw_inode->i_blocks);
|
||||||
@ -505,9 +503,10 @@ void nilfs_write_inode_common(struct inode *inode,
|
|||||||
raw_inode->i_size = cpu_to_le64(inode->i_size);
|
raw_inode->i_size = cpu_to_le64(inode->i_size);
|
||||||
raw_inode->i_ctime = cpu_to_le64(inode->i_ctime.tv_sec);
|
raw_inode->i_ctime = cpu_to_le64(inode->i_ctime.tv_sec);
|
||||||
raw_inode->i_mtime = cpu_to_le64(inode->i_mtime.tv_sec);
|
raw_inode->i_mtime = cpu_to_le64(inode->i_mtime.tv_sec);
|
||||||
|
raw_inode->i_ctime_nsec = cpu_to_le32(inode->i_ctime.tv_nsec);
|
||||||
|
raw_inode->i_mtime_nsec = cpu_to_le32(inode->i_mtime.tv_nsec);
|
||||||
raw_inode->i_blocks = cpu_to_le64(inode->i_blocks);
|
raw_inode->i_blocks = cpu_to_le64(inode->i_blocks);
|
||||||
|
|
||||||
raw_inode->i_dtime = cpu_to_le64(ii->i_dtime);
|
|
||||||
raw_inode->i_flags = cpu_to_le32(ii->i_flags);
|
raw_inode->i_flags = cpu_to_le32(ii->i_flags);
|
||||||
raw_inode->i_generation = cpu_to_le32(inode->i_generation);
|
raw_inode->i_generation = cpu_to_le32(inode->i_generation);
|
||||||
|
|
||||||
|
@ -48,7 +48,6 @@ struct nilfs_inode_info {
|
|||||||
struct nilfs_bmap *i_bmap;
|
struct nilfs_bmap *i_bmap;
|
||||||
union nilfs_bmap_union i_bmap_union;
|
union nilfs_bmap_union i_bmap_union;
|
||||||
__u64 i_xattr; /* sector_t ??? */
|
__u64 i_xattr; /* sector_t ??? */
|
||||||
__u32 i_dtime;
|
|
||||||
__u32 i_dir_start_lookup;
|
__u32 i_dir_start_lookup;
|
||||||
__u64 i_cno; /* check point number for GC inode */
|
__u64 i_cno; /* check point number for GC inode */
|
||||||
struct address_space i_btnode_cache;
|
struct address_space i_btnode_cache;
|
||||||
|
@ -792,6 +792,7 @@ nilfs_fill_super(struct super_block *sb, void *data, int silent,
|
|||||||
sb->s_op = &nilfs_sops;
|
sb->s_op = &nilfs_sops;
|
||||||
sb->s_export_op = &nilfs_export_ops;
|
sb->s_export_op = &nilfs_export_ops;
|
||||||
sb->s_root = NULL;
|
sb->s_root = NULL;
|
||||||
|
sb->s_time_gran = 1;
|
||||||
|
|
||||||
if (!nilfs_loaded(nilfs)) {
|
if (!nilfs_loaded(nilfs)) {
|
||||||
err = load_nilfs(nilfs, sbi);
|
err = load_nilfs(nilfs, sbi);
|
||||||
|
@ -67,9 +67,10 @@
|
|||||||
* struct nilfs_inode - structure of an inode on disk
|
* struct nilfs_inode - structure of an inode on disk
|
||||||
* @i_blocks: blocks count
|
* @i_blocks: blocks count
|
||||||
* @i_size: size in bytes
|
* @i_size: size in bytes
|
||||||
* @i_ctime: creation time
|
* @i_ctime: creation time (seconds)
|
||||||
* @i_mtime: modification time
|
* @i_mtime: modification time (seconds)
|
||||||
* @i_dtime: deletion time
|
* @i_ctime_nsec: creation time (nano seconds)
|
||||||
|
* @i_mtime_nsec: modification time (nano seconds)
|
||||||
* @i_uid: user id
|
* @i_uid: user id
|
||||||
* @i_gid: group id
|
* @i_gid: group id
|
||||||
* @i_mode: file mode
|
* @i_mode: file mode
|
||||||
@ -85,7 +86,8 @@ struct nilfs_inode {
|
|||||||
__le64 i_size;
|
__le64 i_size;
|
||||||
__le64 i_ctime;
|
__le64 i_ctime;
|
||||||
__le64 i_mtime;
|
__le64 i_mtime;
|
||||||
__le64 i_dtime;
|
__le32 i_ctime_nsec;
|
||||||
|
__le32 i_mtime_nsec;
|
||||||
__le32 i_uid;
|
__le32 i_uid;
|
||||||
__le32 i_gid;
|
__le32 i_gid;
|
||||||
__le16 i_mode;
|
__le16 i_mode;
|
||||||
|
Loading…
Reference in New Issue
Block a user