• K
    time: Fix nanosecond file time rounding in timespec_trunc() · de4a95fa
    Karsten Blees 提交于
    timespec_trunc() avoids rounding if granularity <= nanoseconds-per-jiffie
    (or TICK_NSEC). This optimization assumes that:
    
     1. current_kernel_time().tv_nsec is already rounded to TICK_NSEC (i.e.
        with HZ=1000 you'd get 1000000, 2000000, 3000000... but never 1000001).
        This is no longer true (probably since hrtimers introduced in 2.6.16).
    
     2. TICK_NSEC is evenly divisible by all possible granularities. This may
        be true for HZ=100, 250, 1000, but obviously not for HZ=300 /
        TICK_NSEC=3333333 (introduced in 2.6.20).
    
    Thus, sub-second portions of in-core file times are not rounded to on-disk
    granularity. I.e. file times may change when the inode is re-read from disk
    or when the file system is remounted.
    
    This affects all file systems with file time granularities > 1 ns and < 1s,
    e.g. CEPH (1000 ns), UDF (1000 ns), CIFS (100 ns), NTFS (100 ns) and FUSE
    (configurable from user mode via struct fuse_init_out.time_gran).
    
    Steps to reproduce with e.g. UDF:
    
      $ dd if=/dev/zero of=udfdisk count=10000 && mkudffs udfdisk
      $ mkdir udf && mount udfdisk udf
      $ touch udf/test && stat -c %y udf/test
      2015-06-09 10:22:56.130006767 +0200
      $ umount udf && mount udfdisk udf
      $ stat -c %y udf/test
      2015-06-09 10:22:56.130006000 +0200
    
    Remounting truncates the mtime to 1 µs.
    
    Fix the rounding in timespec_trunc() and update the documentation.
    
    timespec_trunc() is exclusively used to calculate inode's [acm]time (mostly
    via current_fs_time()), and always with super_block.s_time_gran as second
    argument. So this can safely be changed without side effects.
    
    Note: This does _not_ fix the issue for FAT's 2 second mtime resolution,
    as super_block.s_time_gran isn't prepared to handle different ctime /
    mtime / atime resolutions nor resolutions > 1 second.
    
    Cc: Prarit Bhargava <prarit@redhat.com>
    Cc: Richard Cochran <richardcochran@gmail.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: NKarsten Blees <blees@dcon.de>
    Signed-off-by: NJohn Stultz <john.stultz@linaro.org>
    de4a95fa
time.c 19.8 KB