• Filipe Manana's avatar
    Btrfs: fix empty symlink after creating symlink and fsync parent dir · 3f9749f6
    Filipe Manana authored
    If we create a symlink, fsync its parent directory, crash/power fail and
    mount the filesystem, we end up with an empty symlink, which not only is
    useless it's also not allowed in linux (the man page symlink(2) is well
    explicit about that).  So we just need to make sure to fully log an inode
    if it's a symlink, to ensure its inline extent gets logged, ensuring the
    same behaviour as ext3, ext4, xfs, reiserfs, f2fs, nilfs2, etc.
    
    Example reproducer:
    
      $ mkfs.btrfs -f /dev/sdb
      $ mount /dev/sdb /mnt
      $ mkdir /mnt/testdir
      $ sync
      $ ln -s /mnt/foo /mnt/testdir/bar
      $ xfs_io -c fsync /mnt/testdir
      <power fail>
      $ mount /dev/sdb /mnt
      $ readlink /mnt/testdir/bar
      <empty string>
    
    A test case for fstests follows soon.
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    3f9749f6
tree-log.c 153 KB