• Filipe Manana's avatar
    Btrfs: fix wrong ctime and mtime of a directory after log replay · a48f8ac4
    Filipe Manana authored
    commit 5338e43a upstream.
    
    When replaying a log that contains a new file or directory name that needs
    to be added to its parent directory, we end up updating the mtime and the
    ctime of the parent directory to the current time after we have set their
    values to the correct ones (set at fsync time), efectivelly losing them.
    
    Sample reproducer:
    
      $ mkfs.btrfs -f /dev/sdb
      $ mount /dev/sdb /mnt
    
      $ mkdir /mnt/dir
      $ touch /mnt/dir/file
    
      # fsync of the directory is optional, not needed
      $ xfs_io -c fsync /mnt/dir
      $ xfs_io -c fsync /mnt/dir/file
    
      $ stat -c %Y /mnt/dir
      1557856079
    
      <power failure>
    
      $ sleep 3
      $ mount /dev/sdb /mnt
      $ stat -c %Y /mnt/dir
      1557856082
    
        --> should have been 1557856079, the mtime is updated to the current
            time when replaying the log
    
    Fix this by not updating the mtime and ctime to the current time at
    btrfs_add_link() when we are replaying a log tree.
    
    This could be triggered by my recent fsync fuzz tester for fstests, for
    which an fstests patch exists titled "fstests: generic, fsync fuzz tester
    with fsstress".
    
    Fixes: e02119d5 ("Btrfs: Add a write ahead tree log to optimize synchronous operations")
    CC: stable@vger.kernel.org # 4.4+
    Reviewed-by: default avatarNikolay Borisov <nborisov@suse.com>
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    a48f8ac4
inode.c 294 KB