• J
    block: Do not discard buffers under a mounted filesystem · abbf198d
    Jan Kara 提交于
    mainline inclusion
    from mainline-v5.9
    commit 384d87ef
    category: bugfix
    bugzilla: 41569
    CVE: NA
    
    -----------------------------------------------
    
    Discarding blocks and buffers under a mounted filesystem is hardly
    anything admin wants to do. Usually it will confuse the filesystem and
    sometimes the loss of buffer_head state (including b_private field) can
    even cause crashes like:
    
    BUG: unable to handle kernel NULL pointer dereference at 0000000000000008
    PGD 0 P4D 0
    Oops: 0002 [#1] SMP PTI
    CPU: 4 PID: 203778 Comm: jbd2/dm-3-8 Kdump: loaded Tainted: G O     --------- -  - 4.18.0-147.5.0.5.h126.eulerosv2r9.x86_64 #1
    Hardware name: Huawei RH2288H V3/BC11HGSA0, BIOS 1.57 08/11/2015
    RIP: 0010:jbd2_journal_grab_journal_head+0x1b/0x40 [jbd2]
    ...
    Call Trace:
     __jbd2_journal_insert_checkpoint+0x23/0x70 [jbd2]
     jbd2_journal_commit_transaction+0x155f/0x1b60 [jbd2]
     kjournald2+0xbd/0x270 [jbd2]
    
    So if we don't have block device open with O_EXCL already, claim the
    block device while we truncate buffer cache. This makes sure any
    exclusive block device user (such as filesystem) cannot operate on the
    device while we are discarding buffer cache.
    Reported-by: NYe Bin <yebin10@huawei.com>
    Signed-off-by: NJan Kara <jack@suse.cz>
    Reviewed-by: NChristoph Hellwig <hch@lst.de>
    [axboe: fix !CONFIG_BLOCK error in truncate_bdev_range()]
    
    conflicts:
    fs/block_dev.c
    include/linux/blkdev.h
    Signed-off-by: NJens Axboe <axboe@kernel.dk>
    Signed-off-by: NYe Bin <yebin10@huawei.com>
    Reviewed-by: Nzhangyi (F) <yi.zhang@huawei.com>
    Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
    abbf198d
block_dev.c 56.6 KB