]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-client.git/commit
ext4: fix deadlock on inode reallocation
authorJan Kara <jack@suse.cz>
Fri, 20 Mar 2026 09:04:29 +0000 (10:04 +0100)
committerTheodore Ts'o <tytso@mit.edu>
Sat, 28 Mar 2026 03:37:48 +0000 (23:37 -0400)
commit0c90eed1b95335eba4f546e6742a8e4503d79349
tree794c12d6ea7d215ed397e39ab9ace6ddcce8868b
parentd15e4b0a418537aafa56b2cb80d44add83e83697
ext4: fix deadlock on inode reallocation

Currently there is a race in ext4 when reallocating freed inode
resulting in a deadlock:

Task1 Task2
ext4_evict_inode()
  handle = ext4_journal_start();
  ...
  if (IS_SYNC(inode))
    handle->h_sync = 1;
  ext4_free_inode()
ext4_new_inode()
  handle = ext4_journal_start()
  finds the bit in inode bitmap
    already clear
  insert_inode_locked()
    waits for inode to be
      removed from the hash.
  ext4_journal_stop(handle)
    jbd2_journal_stop(handle)
      jbd2_log_wait_commit(journal, tid);
        - deadlocks waiting for transaction handle Task2 holds

Fix the problem by removing inode from the hash already in
ext4_clear_inode() by which time all IO for the inode is done so reuse
is already fine but we are still before possibly blocking on transaction
commit.

Reported-by: "Lai, Yi" <yi1.lai@linux.intel.com>
Link: https://lore.kernel.org/all/abNvb2PcrKj1FBeC@ly-workstation
Fixes: 88ec797c4680 ("fs: make insert_inode_locked() wait for inode destruction")
CC: stable@vger.kernel.org
Signed-off-by: Jan Kara <jack@suse.cz>
Link: https://patch.msgid.link/20260320090428.24899-2-jack@suse.cz
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Cc: stable@kernel.org
fs/ext4/super.c