lkml.org 
[lkml]   [2021]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 052/917] Revert "ext4: enforce buffer head state assertion in ext4_da_map_blocks"
    Date
    From: Eric Whitney <enwlinux@gmail.com>

    commit 3eda41df05d6ad5c825cbc7fef03d563597b1afa upstream.

    This reverts commit 948ca5f30e1df0c11eb5b0f410b9ceb97fa77ad9.

    Two crash reports from users running variations on 5.15-rc4 kernels
    suggest that it is premature to enforce the state assertion in the
    original commit. Both crashes were triggered by BUG calls in that
    code, indicating that under some rare circumstance the buffer head
    state did not match a delayed allocated block at the time the
    block was written out. No reproducer is available. Resolving this
    problem will require more time than remains in the current release
    cycle, so reverting the original patch for the time being is necessary
    to avoid any instability it may cause.

    Signed-off-by: Eric Whitney <enwlinux@gmail.com>
    Link: https://lore.kernel.org/r/20211012171901.5352-1-enwlinux@gmail.com
    Fixes: 948ca5f30e1d ("ext4: enforce buffer head state assertion in ext4_da_map_blocks")
    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 | 15 ++++++---------
    1 file changed, 6 insertions(+), 9 deletions(-)

    --- a/fs/ext4/inode.c
    +++ b/fs/ext4/inode.c
    @@ -1711,16 +1711,13 @@ static int ext4_da_map_blocks(struct ino
    }

    /*
    - * the buffer head associated with a delayed and not unwritten
    - * block found in the extent status cache must contain an
    - * invalid block number and have its BH_New and BH_Delay bits
    - * set, reflecting the state assigned when the block was
    - * initially delayed allocated
    + * Delayed extent could be allocated by fallocate.
    + * So we need to check it.
    */
    - if (ext4_es_is_delonly(&es)) {
    - BUG_ON(bh->b_blocknr != invalid_block);
    - BUG_ON(!buffer_new(bh));
    - BUG_ON(!buffer_delay(bh));
    + if (ext4_es_is_delayed(&es) && !ext4_es_is_unwritten(&es)) {
    + map_bh(bh, inode->i_sb, invalid_block);
    + set_buffer_new(bh);
    + set_buffer_delay(bh);
    return 0;
    }


    \
     
     \ /
      Last update: 2021-11-16 02:40    [W:4.019 / U:0.204 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site