linux/fs/ext4
Jan Kara 46e294efc3 ext4: fix deadlock with fs freezing and EA inodes
Xattr code using inodes with large xattr data can end up dropping last
inode reference (and thus deleting the inode) from places like
ext4_xattr_set_entry(). That function is called with transaction started
and so ext4_evict_inode() can deadlock against fs freezing like:

CPU1					CPU2

removexattr()				freeze_super()
  vfs_removexattr()
    ext4_xattr_set()
      handle = ext4_journal_start()
      ...
      ext4_xattr_set_entry()
        iput(old_ea_inode)
          ext4_evict_inode(old_ea_inode)
					  sb->s_writers.frozen = SB_FREEZE_FS;
					  sb_wait_write(sb, SB_FREEZE_FS);
					  ext4_freeze()
					    jbd2_journal_lock_updates()
					      -> blocks waiting for all
					         handles to stop
            sb_start_intwrite()
	      -> blocks as sb is already in SB_FREEZE_FS state

Generally it is advisable to delete inodes from a separate transaction
as it can consume quite some credits however in this case it would be
quite clumsy and furthermore the credits for inode deletion are quite
limited and already accounted for. So just tweak ext4_evict_inode() to
avoid freeze protection if we have transaction already started and thus
it is not really needed anyway.

Cc: stable@vger.kernel.org
Fixes: dec214d00e ("ext4: xattr inode deduplication")
Signed-off-by: Jan Kara <jack@suse.cz>
Reviewed-by: Andreas Dilger <adilger@dilger.ca>
Link: https://lore.kernel.org/r/20201127110649.24730-1-jack@suse.cz
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
2020-12-17 13:30:45 -05:00
..
acl.c ext4: main fast-commit commit path 2020-10-21 23:22:37 -04:00
acl.h ext4: fix up remaining files with SPDX cleanups 2017-12-17 22:00:59 -05:00
balloc.c ext4: use ASSERT() to replace J_ASSERT() 2020-12-03 09:36:57 -05:00
bitmap.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
block_validity.c ext4: update ext4_data_block_valid related comments 2020-12-09 14:11:27 -05:00
dir.c ext4: use generic casefolding support 2020-10-28 13:43:13 -04:00
ext4_extents.h ext4: fix EXT_MAX_EXTENT/INDEX to check for zeroed eh_max 2020-06-03 23:16:49 -04:00
ext4_jbd2.c ext4: fast commit recovery path 2020-10-21 23:22:38 -04:00
ext4_jbd2.h ext4: add helpers for checking whether quota can be enabled/is journalled 2020-12-03 09:18:48 -05:00
ext4.h ext4: remove the unused EXT4_CURRENT_REV macro 2020-12-17 13:30:44 -05:00
extents_status.c ext4: fast commit recovery path 2020-10-21 23:22:38 -04:00
extents_status.h ext4: fix extent_status trace points 2020-01-25 02:03:03 -05:00
extents.c ext4: fix an IS_ERR() vs NULL check 2020-12-17 13:30:32 -05:00
fast_commit.c ext4: make fast_commit.h byte identical with e2fsprogs/fast_commit.h 2020-12-17 13:30:45 -05:00
fast_commit.h ext4: make fast_commit.h byte identical with e2fsprogs/fast_commit.h 2020-12-17 13:30:45 -05:00
file.c ext4: make s_mount_flags modifications atomic 2020-11-06 23:01:05 -05:00
fsmap.c jbd2: rename j_maxlen to j_total_len and add jbd2_journal_max_txn_bufs 2020-11-06 23:01:02 -05:00
fsmap.h ext4: fix up remaining files with SPDX cleanups 2017-12-17 22:00:59 -05:00
fsync.c ext4: use ASSERT() to replace J_ASSERT() 2020-12-03 09:36:57 -05:00
hash.c ext4: use generic casefolding support 2020-10-28 13:43:13 -04:00
ialloc.c The siginificant new ext4 feature this time around is Harshad's new 2020-10-22 10:31:08 -07:00
indirect.c ext4: use ASSERT() to replace J_ASSERT() 2020-12-03 09:36:57 -05:00
inline.c ext4: unlock xattr_sem properly in ext4_inline_data_truncate() 2020-11-06 22:52:36 -05:00
inode-test.c kunit: allow kunit tests to be loaded as a module 2020-01-09 16:42:29 -07:00
inode.c ext4: fix deadlock with fs freezing and EA inodes 2020-12-17 13:30:45 -05:00
ioctl.c ext4: fast commit recovery path 2020-10-21 23:22:38 -04:00
Kconfig ext4: replace HTTP links with HTTPS ones 2020-08-06 01:01:57 -04:00
Makefile ext4 / jbd2: add fast commit initialization 2020-10-21 23:22:26 -04:00
mballoc.c ext4: fix a memory leak of ext4_free_data 2020-12-17 13:30:09 -05:00
mballoc.h ext4: limit the length of per-inode prealloc list 2020-08-19 12:04:36 -04:00
migrate.c ext4: handle ext4_mark_inode_dirty errors 2020-06-03 23:16:50 -04:00
mmp.c ext4: use common helpers in all places reading metadata buffers 2020-10-18 10:37:14 -04:00
move_extent.c ext4: use common helpers in all places reading metadata buffers 2020-10-18 10:37:14 -04:00
namei.c ext4: use ASSERT() to replace J_ASSERT() 2020-12-03 09:36:57 -05:00
page-io.c ext4: remove the null check of bio_vec page 2020-12-03 09:15:29 -05:00
readpage.c Improvements to ext4's block allocator performance for very large file 2020-08-21 11:03:38 -07:00
resize.c ext4: use ext4_sb_bread() instead of sb_bread() 2020-10-18 10:37:14 -04:00
super.c ext4: fix fall-through warnings for Clang 2020-12-17 13:30:45 -05:00
symlink.c ext4: switch to fscrypt_get_symlink() 2018-01-11 22:10:40 -05:00
sysfs.c ext4: indicate that fast_commit is available via /sys/fs/ext4/feature/... 2020-10-28 13:43:22 -04:00
truncate.h ext4: handle layout changes to pinned DAX mappings 2018-07-29 17:00:22 -04:00
verity.c mm/readahead: make page_cache_ra_unbounded take a readahead_control 2020-10-16 11:11:16 -07:00
xattr_hurd.c ext4: support xattr gnu.* namespace for the Hurd 2020-06-12 13:23:34 -04:00
xattr_security.c ext4: use XATTR_CREATE in ext4_initxattrs() 2018-05-10 11:52:14 -04:00
xattr_trusted.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
xattr_user.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
xattr.c ext4: delete nonsensical (commented-out) code inside ext4_xattr_block_set() 2020-12-09 14:22:56 -05:00
xattr.h ext4: support xattr gnu.* namespace for the Hurd 2020-06-12 13:23:34 -04:00