Whamcloud - gitweb
LU-17950 ldiskfs: race in ext4_inode_attach_jinode 81/58381/4
authorLi Dongyang <dongyangli@ddn.com>
Wed, 12 Mar 2025 09:28:53 +0000 (20:28 +1100)
committerOleg Drokin <green@whamcloud.com>
Wed, 26 Mar 2025 03:58:32 +0000 (03:58 +0000)
commit10fa969f87c2c4306a2da2087008f765f8cd0627
treef8d47f62d3c8028f5f3d3160e067ab656ac2d910
parentf387535f760b9cee31e29ac05a29e071e8488e2f
LU-17950 ldiskfs: race in ext4_inode_attach_jinode

A race condition could happen when multiple threads
trying to attach jinode for the same inode:

Thread 1:
ext4_map_blocks
  ext4_inode_attach_jinode
    spin_lock(&inode->i_lock)
    ei->jinode = jinode
->
    jbd2_journal_init_jbd_inode(ei->jinode, inode)

Thread 2:
ext4_map_blocks
  ext4_inode_attach_jinode
    if (ei->jinode || !EXT4_SB(inode->i_sb)->s_journal)
    return 0;
  ext4_jbd2_inode_add_write
->  jbd2_journal_file_inode

The problem is in ext4_inode_attach_jinode() the initial check
of ei->jinode is not protected by inode->i_lock,
thread 2 could go ahead and use the not yet initialized jinode
in jbd2_journal_file_inode(), and thread 1 later will
use jbd2_journal_init_jbd_inode, corrupting the jinode.

Note this issue is specific to ldiskfs because of
ext4-attach-jinode-in-writepages.patch added
ext4_inode_attach_jinode() to make sure jinode is initialized
before calling ext4_jbd2_inode_add_write().

Change-Id: Iafd7aa9537505afbf4bc53fef40ea3aa0a94b7da
Signed-off-by: Li Dongyang <dongyangli@ddn.com>
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/58381
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Reviewed-by: Yang Sheng <ys@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
52 files changed:
ldiskfs/kernel_patches/patches/base/ext4-fix-ext4_inode_attach_jinode.patch [new file with mode: 0644]
ldiskfs/kernel_patches/patches/rhel7.6/ext4-use-GFP_NOFS-in-ext4_inode_attach_jinode.patch [deleted file]
ldiskfs/kernel_patches/series/ldiskfs-3.10-rhel7.9.series
ldiskfs/kernel_patches/series/ldiskfs-4.12-sles15-22.series
ldiskfs/kernel_patches/series/ldiskfs-4.12-sles15.series
ldiskfs/kernel_patches/series/ldiskfs-4.12-sles15sp1-7.series
ldiskfs/kernel_patches/series/ldiskfs-4.12-sles15sp1.series
ldiskfs/kernel_patches/series/ldiskfs-4.15.0-20-ubuntu18.series
ldiskfs/kernel_patches/series/ldiskfs-4.15.0-24-ubuntu18.series
ldiskfs/kernel_patches/series/ldiskfs-4.18-rhel8.10-553.series
ldiskfs/kernel_patches/series/ldiskfs-4.18-rhel8.10.series
ldiskfs/kernel_patches/series/ldiskfs-4.18-rhel8.4.series
ldiskfs/kernel_patches/series/ldiskfs-4.18-rhel8.5.series
ldiskfs/kernel_patches/series/ldiskfs-4.18-rhel8.6.series
ldiskfs/kernel_patches/series/ldiskfs-4.18-rhel8.7.series
ldiskfs/kernel_patches/series/ldiskfs-4.18-rhel8.8.series
ldiskfs/kernel_patches/series/ldiskfs-4.18-rhel8.9.series
ldiskfs/kernel_patches/series/ldiskfs-5.0.0-13-ubuntu19.series
ldiskfs/kernel_patches/series/ldiskfs-5.10.0-ml.series
ldiskfs/kernel_patches/series/ldiskfs-5.10.0-oe2203.series
ldiskfs/kernel_patches/series/ldiskfs-5.10.0-oe2203sp1.series
ldiskfs/kernel_patches/series/ldiskfs-5.11.0-40-ubuntu20.series
ldiskfs/kernel_patches/series/ldiskfs-5.14-rhel9.1.series
ldiskfs/kernel_patches/series/ldiskfs-5.14-rhel9.2.series
ldiskfs/kernel_patches/series/ldiskfs-5.14-rhel9.3.series
ldiskfs/kernel_patches/series/ldiskfs-5.14-rhel9.4-427.13.series
ldiskfs/kernel_patches/series/ldiskfs-5.14-rhel9.4.series
ldiskfs/kernel_patches/series/ldiskfs-5.14-rhel9.5.series
ldiskfs/kernel_patches/series/ldiskfs-5.14-rhel9.series
ldiskfs/kernel_patches/series/ldiskfs-5.14.21-sles15sp4.series
ldiskfs/kernel_patches/series/ldiskfs-5.14.21-sles15sp5.series
ldiskfs/kernel_patches/series/ldiskfs-5.15.0-106-ubuntu20.series
ldiskfs/kernel_patches/series/ldiskfs-5.15.0-83-ubuntu20.series
ldiskfs/kernel_patches/series/ldiskfs-5.19.0-35-ubuntu.series
ldiskfs/kernel_patches/series/ldiskfs-5.3.18-sles15sp2.series
ldiskfs/kernel_patches/series/ldiskfs-5.3.18-sles15sp3-59.series
ldiskfs/kernel_patches/series/ldiskfs-5.3.18-sles15sp3.series
ldiskfs/kernel_patches/series/ldiskfs-5.4.0-42-ubuntu20.series
ldiskfs/kernel_patches/series/ldiskfs-5.4.0-66-ubuntu20.series
ldiskfs/kernel_patches/series/ldiskfs-5.4.0-80-ubuntu20.series
ldiskfs/kernel_patches/series/ldiskfs-5.4.0-90-ubuntu20.series
ldiskfs/kernel_patches/series/ldiskfs-5.4.0-ml.series
ldiskfs/kernel_patches/series/ldiskfs-5.4.136-ml.series
ldiskfs/kernel_patches/series/ldiskfs-5.4.21-ml.series
ldiskfs/kernel_patches/series/ldiskfs-5.8.0-53-ubuntu20.series
ldiskfs/kernel_patches/series/ldiskfs-5.8.0-63-ubuntu20.series
ldiskfs/kernel_patches/series/ldiskfs-6.1.38-ml.series
ldiskfs/kernel_patches/series/ldiskfs-6.10-ml.series
ldiskfs/kernel_patches/series/ldiskfs-6.11-ml.series
ldiskfs/kernel_patches/series/ldiskfs-6.6-ml.series
ldiskfs/kernel_patches/series/ldiskfs-6.7-ml.series
ldiskfs/kernel_patches/series/ldiskfs-6.8.0-45-ubuntu24.series