]> git.baikalelectronics.ru Git - kernel.git/commit
Btrfs: fix empty symlink after creating symlink and fsync parent dir
authorFilipe Manana <fdmanana@suse.com>
Mon, 25 Apr 2016 03:45:02 +0000 (04:45 +0100)
committerFilipe Manana <fdmanana@suse.com>
Fri, 13 May 2016 00:59:12 +0000 (01:59 +0100)
commit6a8f88c6b2d1d33735a7e5442828b9be785f84bb
tree7cc406f97a7fbca0a52e80bf63e123fd15c7201d
parent31c1e6f1580768ccf6eb670e37e55f5c97cd1a6f
Btrfs: fix empty symlink after creating symlink and fsync parent dir

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: Filipe Manana <fdmanana@suse.com>
fs/btrfs/tree-log.c