• Filipe Manana's avatar
    Btrfs: don't leave dangling dentry if symlink creation failed · d50866d0
    Filipe Manana authored
    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: default avatarFilipe Manana <fdmanana@suse.com>
    d50866d0
inode.c 267 KB