aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/f2fs/f2fs.h11
-rw-r--r--fs/f2fs/inode.c8
2 files changed, 19 insertions, 0 deletions
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 7102d3965fea..1df7f10476d6 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -664,6 +664,7 @@ struct f2fs_inode_info {
664 kprojid_t i_projid; /* id for project quota */ 664 kprojid_t i_projid; /* id for project quota */
665 int i_inline_xattr_size; /* inline xattr size */ 665 int i_inline_xattr_size; /* inline xattr size */
666 struct timespec i_crtime; /* inode creation time */ 666 struct timespec i_crtime; /* inode creation time */
667 struct timespec i_disk_time[4]; /* inode disk times */
667}; 668};
668 669
669static inline void get_extent_info(struct extent_info *ext, 670static inline void get_extent_info(struct extent_info *ext,
@@ -2474,6 +2475,16 @@ static inline bool f2fs_skip_inode_update(struct inode *inode, int dsync)
2474 i_size_read(inode) & ~PAGE_MASK) 2475 i_size_read(inode) & ~PAGE_MASK)
2475 return false; 2476 return false;
2476 2477
2478 if (!timespec_equal(F2FS_I(inode)->i_disk_time, &inode->i_atime))
2479 return false;
2480 if (!timespec_equal(F2FS_I(inode)->i_disk_time + 1, &inode->i_ctime))
2481 return false;
2482 if (!timespec_equal(F2FS_I(inode)->i_disk_time + 2, &inode->i_mtime))
2483 return false;
2484 if (!timespec_equal(F2FS_I(inode)->i_disk_time + 3,
2485 &F2FS_I(inode)->i_crtime))
2486 return false;
2487
2477 down_read(&F2FS_I(inode)->i_sem); 2488 down_read(&F2FS_I(inode)->i_sem);
2478 ret = F2FS_I(inode)->last_disk_size == i_size_read(inode); 2489 ret = F2FS_I(inode)->last_disk_size == i_size_read(inode);
2479 up_read(&F2FS_I(inode)->i_sem); 2490 up_read(&F2FS_I(inode)->i_sem);
diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c
index 401f09ccce7e..e0d9e8f27ed2 100644
--- a/fs/f2fs/inode.c
+++ b/fs/f2fs/inode.c
@@ -284,6 +284,10 @@ static int do_read_inode(struct inode *inode)
284 fi->i_crtime.tv_nsec = le32_to_cpu(ri->i_crtime_nsec); 284 fi->i_crtime.tv_nsec = le32_to_cpu(ri->i_crtime_nsec);
285 } 285 }
286 286
287 F2FS_I(inode)->i_disk_time[0] = inode->i_atime;
288 F2FS_I(inode)->i_disk_time[1] = inode->i_ctime;
289 F2FS_I(inode)->i_disk_time[2] = inode->i_mtime;
290 F2FS_I(inode)->i_disk_time[3] = F2FS_I(inode)->i_crtime;
287 f2fs_put_page(node_page, 1); 291 f2fs_put_page(node_page, 1);
288 292
289 stat_inc_inline_xattr(inode); 293 stat_inc_inline_xattr(inode);
@@ -444,6 +448,10 @@ void update_inode(struct inode *inode, struct page *node_page)
444 if (inode->i_nlink == 0) 448 if (inode->i_nlink == 0)
445 clear_inline_node(node_page); 449 clear_inline_node(node_page);
446 450
451 F2FS_I(inode)->i_disk_time[0] = inode->i_atime;
452 F2FS_I(inode)->i_disk_time[1] = inode->i_ctime;
453 F2FS_I(inode)->i_disk_time[2] = inode->i_mtime;
454 F2FS_I(inode)->i_disk_time[3] = F2FS_I(inode)->i_crtime;
447} 455}
448 456
449void update_inode_page(struct inode *inode) 457void update_inode_page(struct inode *inode)