lkml.org 
[lkml]   [2022]   [Aug]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 518/545] ext4: fix warning in ext4_iomap_begin as race between bmap and write
    Date
    From: Ye Bin <yebin10@huawei.com>

    commit 51ae846cff568c8c29921b1b28eb2dfbcd4ac12d upstream.

    We got issue as follows:
    ------------[ cut here ]------------
    WARNING: CPU: 3 PID: 9310 at fs/ext4/inode.c:3441 ext4_iomap_begin+0x182/0x5d0
    RIP: 0010:ext4_iomap_begin+0x182/0x5d0
    RSP: 0018:ffff88812460fa08 EFLAGS: 00010293
    RAX: ffff88811f168000 RBX: 0000000000000000 RCX: ffffffff97793c12
    RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000003
    RBP: ffff88812c669160 R08: ffff88811f168000 R09: ffffed10258cd20f
    R10: ffff88812c669077 R11: ffffed10258cd20e R12: 0000000000000001
    R13: 00000000000000a4 R14: 000000000000000c R15: ffff88812c6691ee
    FS: 00007fd0d6ff3740(0000) GS:ffff8883af180000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 00007fd0d6dda290 CR3: 0000000104a62000 CR4: 00000000000006e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    Call Trace:
    iomap_apply+0x119/0x570
    iomap_bmap+0x124/0x150
    ext4_bmap+0x14f/0x250
    bmap+0x55/0x80
    do_vfs_ioctl+0x952/0xbd0
    __x64_sys_ioctl+0xc6/0x170
    do_syscall_64+0x33/0x40
    entry_SYSCALL_64_after_hwframe+0x44/0xa9

    Above issue may happen as follows:
    bmap write
    bmap
    ext4_bmap
    iomap_bmap
    ext4_iomap_begin
    ext4_file_write_iter
    ext4_buffered_write_iter
    generic_perform_write
    ext4_da_write_begin
    ext4_da_write_inline_data_begin
    ext4_prepare_inline_data
    ext4_create_inline_data
    ext4_set_inode_flag(inode,
    EXT4_INODE_INLINE_DATA);
    if (WARN_ON_ONCE(ext4_has_inline_data(inode))) ->trigger bug_on

    To solved above issue hold inode lock in ext4_bamp.

    Signed-off-by: Ye Bin <yebin10@huawei.com>
    Link: https://lore.kernel.org/r/20220617013935.397596-1-yebin10@huawei.com
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Cc: stable@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    fs/ext4/inode.c | 12 +++++++++---
    1 file changed, 9 insertions(+), 3 deletions(-)

    --- a/fs/ext4/inode.c
    +++ b/fs/ext4/inode.c
    @@ -3219,13 +3219,15 @@ static sector_t ext4_bmap(struct address
    {
    struct inode *inode = mapping->host;
    journal_t *journal;
    + sector_t ret = 0;
    int err;

    + inode_lock_shared(inode);
    /*
    * We can get here for an inline file via the FIBMAP ioctl
    */
    if (ext4_has_inline_data(inode))
    - return 0;
    + goto out;

    if (mapping_tagged(mapping, PAGECACHE_TAG_DIRTY) &&
    test_opt(inode->i_sb, DELALLOC)) {
    @@ -3264,10 +3266,14 @@ static sector_t ext4_bmap(struct address
    jbd2_journal_unlock_updates(journal);

    if (err)
    - return 0;
    + goto out;
    }

    - return iomap_bmap(mapping, block, &ext4_iomap_ops);
    + ret = iomap_bmap(mapping, block, &ext4_iomap_ops);
    +
    +out:
    + inode_unlock_shared(inode);
    + return ret;
    }

    static int ext4_readpage(struct file *file, struct page *page)

    \
     
     \ /
      Last update: 2022-08-19 18:50    [W:4.071 / U:0.180 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site