On Mon, Apr 17, 2023 at 11:03:26PM +0900, Tetsuo Handa wrote: > syzbot is reporting circular locking dependency between ntfs_file_mmap() > (which has mm->mmap_lock => ni->ni_lock => ni->file.run_lock dependency) > and ntfs_fiemap() (which has ni->ni_lock => ni->file.run_lock => > mm->mmap_lock dependency), for commit c4b929b85bdb ("vfs: vfs-level fiemap > interface") implemented fiemap_fill_next_extent() using copy_to_user() > where direct mm->mmap_lock dependency is inevitable. > > Since ntfs3 does not want to release ni->ni_lock and/or ni->file.run_lock > in order to make sure that "struct ATTRIB" does not change during > ioctl(FS_IOC_FIEMAP) request, let's make it possible to call > fiemap_fill_next_extent() with filesystem locks held. > > This patch adds fiemap_fill_next_kernel_extent() which spools > "struct fiemap_extent" to dynamically allocated kernel buffer, and > fiemap_copy_kernel_extent() which copies spooled "struct fiemap_extent" > to userspace buffer after filesystem locks are released. Ugh... I'm pretty certain that this is a wrong approach. What is going on in ntfs_file_mmap() that requires that kind of locking? AFAICS, that's the part that looks odd... Details, please.