linux-stable/fs/btrfs
Filipe Manana fb729ed975 btrfs: always log symlinks in full mode
commit d0e64a981f upstream.

On Linux, empty symlinks are invalid, and attempting to create one with
the system call symlink(2) results in an -ENOENT error and this is
explicitly documented in the man page.

If we rename a symlink that was created in the current transaction and its
parent directory was logged before, we actually end up logging the symlink
without logging its content, which is stored in an inline extent. That
means that after a power failure we can end up with an empty symlink,
having no content and an i_size of 0 bytes.

It can be easily reproduced like this:

  $ mkfs.btrfs -f /dev/sdc
  $ mount /dev/sdc /mnt

  $ mkdir /mnt/testdir
  $ sync

  # Create a file inside the directory and fsync the directory.
  $ touch /mnt/testdir/foo
  $ xfs_io -c "fsync" /mnt/testdir

  # Create a symlink inside the directory and then rename the symlink.
  $ ln -s /mnt/testdir/foo /mnt/testdir/bar
  $ mv /mnt/testdir/bar /mnt/testdir/baz

  # Now fsync again the directory, this persist the log tree.
  $ xfs_io -c "fsync" /mnt/testdir

  <power failure>

  $ mount /dev/sdc /mnt
  $ stat -c %s /mnt/testdir/baz
  0
  $ readlink /mnt/testdir/baz
  $

Fix this by always logging symlinks in full mode (LOG_INODE_ALL), so that
their content is also logged.

A test case for fstests will follow.

CC: stable@vger.kernel.org # 4.9+
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2022-05-12 12:32:39 +02:00
..
tests btrfs: selftests: dump extent io tree if extent-io-tree test failed 2022-01-07 14:18:27 +01:00
acl.c overlayfs update for 5.15 2021-09-02 09:21:27 -07:00
async-thread.c btrfs: fix memory ordering between normal and ordered work functions 2021-11-16 16:50:23 +01:00
async-thread.h
backref.c btrfs: stop accessing ->extent_root directly 2022-01-03 15:09:49 +01:00
backref.h btrfs: remove ignore_offset argument from btrfs_find_all_roots() 2021-08-23 13:19:01 +02:00
block-group.c btrfs: zoned: activate block group only for extent allocation 2022-04-20 09:36:25 +02:00
block-group.h btrfs: zoned: activate block group only for extent allocation 2022-04-20 09:36:25 +02:00
block-rsv.c btrfs: reserve extra space for the free space tree 2022-01-07 14:18:25 +01:00
block-rsv.h btrfs: init root block_rsv at init root time 2022-01-03 15:09:48 +01:00
btrfs_inode.h btrfs: export a helper for compression hard check 2022-05-12 12:32:21 +02:00
check-integrity.c btrfs: check-integrity: stop storing the block device name in btrfsic_dev_state 2021-10-26 19:08:07 +02:00
check-integrity.h
compression.c btrfs: fix btrfs_submit_compressed_write cgroup attribution 2022-04-20 09:36:07 +02:00
compression.h btrfs: determine stripe boundary at bio allocation time in btrfs_submit_compressed_write 2021-10-26 19:08:04 +02:00
ctree.c btrfs: refactor unlock_up 2022-01-07 14:18:26 +01:00
ctree.h btrfs: zoned: use dedicated lock for data relocation 2022-05-09 09:16:30 +02:00
delalloc-space.c btrfs: change root to fs_info for btrfs_reserve_metadata_bytes 2022-01-03 15:09:45 +01:00
delalloc-space.h
delayed-inode.c btrfs: add an inode-item.h 2022-01-07 14:18:23 +01:00
delayed-inode.h btrfs: make btrfs_delayed_update_inode take btrfs_inode 2020-12-08 15:54:10 +01:00
delayed-ref.c btrfs: reserve extra space for the free space tree 2022-01-07 14:18:25 +01:00
delayed-ref.h btrfs: make btrfs_ref::real_root optional 2021-10-26 19:08:06 +02:00
dev-replace.c btrfs: fix assertion failure during scrub due to block group reallocation 2022-05-09 09:16:30 +02:00
dev-replace.h btrfs: zoned: mark block groups to copy for device-replace 2021-02-09 02:46:07 +01:00
dir-item.c btrfs: drop the _nr from the item helpers 2022-01-03 15:09:43 +01:00
discard.c btrfs: fix typos in comments 2021-06-22 14:11:57 +02:00
discard.h
disk-io.c btrfs: force v2 space cache usage for subpage mount 2022-05-12 12:32:21 +02:00
disk-io.h btrfs: track the csum, extent, and free space trees in a rb tree 2022-01-03 15:09:50 +01:00
export.c
export.h
extent-io-tree.h btrfs: use fixed width int type for extent_state::state 2020-12-08 15:54:13 +01:00
extent-tree.c btrfs: zoned: activate block group only for extent allocation 2022-04-20 09:36:25 +02:00
extent_io.c btrfs: fix direct I/O read repair for split bios 2022-05-09 09:16:30 +02:00
extent_io.h btrfs: fix qgroup reserve overflow the qgroup limit 2022-04-13 19:27:36 +02:00
extent_map.c btrfs: defrag: don't use merged extent map for their generation check 2022-02-23 17:43:13 +01:00
extent_map.h btrfs: defrag: don't use merged extent map for their generation check 2022-02-23 17:43:13 +01:00
file-item.c btrfs: handle csum lookup errors properly on reads 2022-04-08 13:58:40 +02:00
file.c btrfs: fix fallocate to use file_modified to update permissions consistently 2022-04-20 09:36:19 +02:00
free-space-cache.c btrfs: add inode to truncate control 2022-01-07 14:18:24 +01:00
free-space-cache.h btrfs: change name and type of private member of btrfs_free_space_ctl 2022-01-03 15:09:50 +01:00
free-space-tree.c btrfs: track the csum, extent, and free space trees in a rb tree 2022-01-03 15:09:50 +01:00
free-space-tree.h
inode-item.c btrfs: make should_throttle loop local in btrfs_truncate_inode_items 2022-01-07 14:18:25 +01:00
inode-item.h btrfs: add inode to truncate control 2022-01-07 14:18:24 +01:00
inode.c btrfs: export a helper for compression hard check 2022-05-12 12:32:21 +02:00
ioctl.c btrfs: avoid defragging extents whose next extents are not targets 2022-04-13 19:27:37 +02:00
Kconfig btrfs: use generic Kconfig option for 256kB page size limit 2022-01-20 08:52:55 +02:00
locking.c btrfs: fix typos in comments 2021-06-22 14:11:57 +02:00
locking.h btrfs: assert that extent buffers are write locked instead of only locked 2021-10-26 19:08:02 +02:00
lzo.c btrfs: prevent copying too big compressed lzo segment 2022-02-15 19:59:09 +01:00
Makefile btrfs: remove reada infrastructure 2022-01-07 14:18:26 +01:00
misc.h btrfs: use correct header for div_u64 in misc.h 2021-09-07 14:29:50 +02:00
ordered-data.c btrfs: zoned: fix double counting of split ordered extent 2021-09-07 14:30:41 +02:00
ordered-data.h btrfs: remove uptodate parameter from btrfs_dec_test_first_ordered_pending 2021-08-23 13:19:02 +02:00
orphan.c
print-tree.c btrfs: drop the _nr from the item helpers 2022-01-03 15:09:43 +01:00
print-tree.h btrfs: print the actual offset in btrfs_root_name 2021-01-07 17:25:05 +01:00
props.c btrfs: skip compression property for anything other than files and dirs 2022-05-12 12:32:22 +02:00
props.h btrfs: skip compression property for anything other than files and dirs 2022-05-12 12:32:22 +02:00
qgroup.c btrfs: qgroup: fix deadlock between rescan worker and remove qgroup 2022-03-02 16:53:04 +01:00
qgroup.h btrfs: fix lock inversion problem when doing qgroup extent tracing 2021-07-22 15:50:07 +02:00
raid56.c btrfs: remove btrfs_raid_bio::fs_info member 2021-10-26 19:08:03 +02:00
raid56.h btrfs: remove btrfs_raid_bio::fs_info member 2021-10-26 19:08:03 +02:00
rcu-string.h
ref-verify.c btrfs: stop accessing ->extent_root directly 2022-01-03 15:09:49 +01:00
ref-verify.h
reflink.c btrfs: fix unexpected error path when reflinking an inline extent 2022-04-08 13:57:40 +02:00
reflink.h
relocation.c btrfs: do not start relocation until in progress drops are done 2022-03-02 16:52:39 +01:00
root-tree.c btrfs: do not start relocation until in progress drops are done 2022-03-02 16:52:39 +01:00
scrub.c btrfs: fix assertion failure during scrub due to block group reallocation 2022-05-09 09:16:30 +02:00
send.c btrfs: send: in case of IO error log it 2022-02-09 18:53:26 +01:00
send.h btrfs: send: prepare for v2 protocol 2021-10-29 12:38:43 +02:00
space-info.c btrfs: extend locking to all space_info members accesses 2022-04-08 13:57:29 +02:00
space-info.h btrfs: change root to fs_info for btrfs_reserve_metadata_bytes 2022-01-03 15:09:45 +01:00
struct-funcs.c btrfs: add special case to setget helpers for 64k pages 2021-08-23 13:18:58 +02:00
subpage.c btrfs: subpage: fix a wrong check on subpage->writers 2022-03-02 16:51:39 +01:00
subpage.h btrfs: rework page locking in __extent_writepage() 2021-10-26 19:08:05 +02:00
super.c mm: remove cleancache 2022-01-22 08:33:38 +02:00
sysfs.c btrfs: sysfs: export the balance paused state of exclusive operation 2022-05-12 12:32:20 +02:00
sysfs.h
transaction.c btrfs: fix relocation crash due to premature return from btrfs_commit_transaction() 2022-03-02 16:52:46 +01:00
transaction.h btrfs: do not start relocation until in progress drops are done 2022-03-02 16:52:39 +01:00
tree-checker.c btrfs: tree-checker: use u64 for item data end to avoid overflow 2022-03-02 16:52:32 +01:00
tree-checker.h
tree-defrag.c btrfs: remove unnecessary extent root check in btrfs_defrag_leaves 2022-01-03 15:09:48 +01:00
tree-log.c btrfs: always log symlinks in full mode 2022-05-12 12:32:39 +02:00
tree-log.h btrfs: change error handling for btrfs_delete_*_in_log 2021-10-26 19:08:05 +02:00
tree-mod-log.c btrfs: fix race when picking most recent mod log operation for an old root 2021-04-20 19:27:17 +02:00
tree-mod-log.h btrfs: add and use helper to get lowest sequence number for the tree mod log 2021-04-19 17:25:17 +02:00
ulist.c
ulist.h
uuid-tree.c btrfs: drop the _nr from the item helpers 2022-01-03 15:09:43 +01:00
verity.c btrfs: drop the _nr from the item helpers 2022-01-03 15:09:43 +01:00
volumes.c btrfs: mark resumed async balance as writing 2022-04-20 09:36:25 +02:00
volumes.h btrfs: fix direct I/O read repair for split bios 2022-05-09 09:16:30 +02:00
xattr.c btrfs: skip compression property for anything other than files and dirs 2022-05-12 12:32:22 +02:00
xattr.h
zlib.c Revert "btrfs: compression: drop kmap/kunmap from zlib" 2021-10-29 13:03:05 +02:00
zoned.c btrfs: zoned: traverse devices under chunk_mutex in btrfs_can_activate_zone 2022-04-13 19:27:36 +02:00
zoned.h btrfs: zoned: use dedicated lock for data relocation 2022-05-09 09:16:30 +02:00
zstd.c lib: zstd: Add kernel-specific API 2021-11-08 16:55:21 -08:00