]> git.ipfire.org Git - thirdparty/kernel/linux.git/commit
ntfs: fix mrec_lock ABBA deadlock in rename
authorPeiyang He <peiyang_he@smail.nju.edu.cn>
Tue, 30 Jun 2026 03:08:56 +0000 (11:08 +0800)
committerNamjae Jeon <linkinjeon@kernel.org>
Tue, 30 Jun 2026 14:22:34 +0000 (23:22 +0900)
commiteb94f5a41a193a425e09a63cb75dffd151d8f42e
treefb5e74e7cd3e3eb9f3402f82ac32a039481c8a0c
parent88496c4ac5a6ade75619f4b1015706a8b924d50a
ntfs: fix mrec_lock ABBA deadlock in rename

ntfs_file_fsync(), ntfs_dir_fsync() and __ntfs_write_inode() lock an
inode's mrec_lock before taking the mrec_lock of its parent directory.

ntfs_rename() takes old_ni->mrec_lock and old_dir_ni->mrec_lock
before taking new_ni->mrec_lock for an existing target, or
new_dir_ni->mrec_lock for a cross-directory rename.
This can deadlock when ntfs_file_fsync() or __ntfs_write_inode() holds
the target inode, or when ntfs_dir_fsync() holds a child target
directory, while rename() holds the parent directory and waits for the
target.

Fix this by locking the existing target inode before taking any parent
directory mrec_lock. For cross-directory renames where the target parent
is a descendant of the source parent, lock the target parent before the
source parent so the directory order matches the child-to-parent order used
by ntfs_file_fsync(), ntfs_dir_fsync(), and __ntfs_write_inode().

Reported-by: Peiyang He <peiyang_he@smail.nju.edu.cn>
Closes: https://lore.kernel.org/all/C4D296F0E9F3D66C+9397ffbc-eb55-44bb-9b3f-5da4809e7955@smail.nju.edu.cn/
Fixes: af0db57d4293 ("ntfs: update inode operations")
Cc: stable@vger.kernel.org
Signed-off-by: Peiyang He <peiyang_he@smail.nju.edu.cn>
Assisted-by: Codex:gpt-5.5
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
fs/ntfs/namei.c