current_mgtime compares the ctime (which has already been truncated) to the value from ktime_get_coarse_real_ts64 (which has not). All of the existing filesystems that enable mgtime have 1ns granularity, so this is not a problem today, but it is more correct to compare truncated timestamps instead. Do the truncate earlier, so we're comparing like things. Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx> --- fs/inode.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/fs/inode.c b/fs/inode.c index 369621e7faf5..8199d0e02cce 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -2097,28 +2097,28 @@ EXPORT_SYMBOL(file_remove_privs); */ static struct timespec64 current_mgtime(struct inode *inode) { - struct timespec64 now; + struct timespec64 now, ctime; atomic_long_t *pnsec = (atomic_long_t *)&inode->__i_ctime.tv_nsec; long nsec = atomic_long_read(pnsec); if (nsec & I_CTIME_QUERIED) { ktime_get_real_ts64(&now); - } else { - struct timespec64 ctime; + return timestamp_truncate(now, inode); + } - ktime_get_coarse_real_ts64(&now); + ktime_get_coarse_real_ts64(&now); + now = timestamp_truncate(now, inode); - /* - * If we've recently fetched a fine-grained timestamp - * then the coarse-grained one may still be earlier than the - * existing one. Just keep the existing ctime if so. - */ - ctime = inode_get_ctime(inode); - if (timespec64_compare(&ctime, &now) > 0) - now = ctime; - } + /* + * If we've recently fetched a fine-grained timestamp + * then the coarse-grained one may still be earlier than the + * existing ctime. Just keep the existing value if so. + */ + ctime = inode_get_ctime(inode); + if (timespec64_compare(&ctime, &now) > 0) + now = ctime; - return timestamp_truncate(now, inode); + return now; } /** --- base-commit: 4ce0966ed7c04881c5f352e0bb53af9b38f94253 change-id: 20230728-mgctime-5e0ec0e89b04 Best regards, -- Jeff Layton <jlayton@xxxxxxxxxx>