]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commit
Btrfs: don't leave dangling dentry if symlink creation failed
authorFilipe Manana <fdmanana@suse.com>
Thu, 31 Dec 2015 18:08:24 +0000 (18:08 +0000)
committerFilipe Manana <fdmanana@suse.com>
Thu, 31 Dec 2015 18:10:56 +0000 (18:10 +0000)
commitd50866d00fb39fcf72307001763ee9cc92625a43
tree11a1b5540a17265cd715f864ca0de57eae4de57b
parenta879719b8c90e15c9e7fa7266d5e3c0ca962f9df
Btrfs: don't leave dangling dentry if symlink creation failed

When we are creating a symlink we might fail with an error after we
created its inode and added the corresponding directory indexes to its
parent inode. In this case we end up never removing the directory indexes
because the inode eviction handler, called for our symlink inode on the
final iput(), only removes items associated with the symlink inode and
not with the parent inode.

Example:

  $ mkfs.btrfs -f /dev/sdi
  $ mount /dev/sdi /mnt
  $ touch /mnt/foo
  $ ln -s /mnt/foo /mnt/bar
  ln: failed to create symbolic link ‘bar’: Cannot allocate memory
  $ umount /mnt
  $ btrfsck /dev/sdi
  Checking filesystem on /dev/sdi
  UUID: d5acb5ba-31bd-42da-b456-89dca2e716e1
  checking extents
  checking free space cache
  checking fs roots
  root 5 inode 258 errors 2001, no inode item, link count wrong
unresolved ref dir 256 index 3 namelen 3 name bar filetype 7 errors 4, no inode ref
  found 131073 bytes used err is 1
  total csum bytes: 0
  total tree bytes: 131072
  total fs tree bytes: 32768
  total extent tree bytes: 16384
  btree space waste bytes: 124305
  file data blocks allocated: 262144
   referenced 262144
  btrfs-progs v4.2.3

So fix this by adding the directory index entries as the very last
step of symlink creation.

Signed-off-by: Filipe Manana <fdmanana@suse.com>
fs/btrfs/inode.c