• Mingzhe Zou's avatar
    bcache: fixup btree_cache_wait list damage · f0854489
    Mingzhe Zou authored
    We get a kernel crash about "list_add corruption. next->prev should be
    prev (ffff9c801bc01210), but was ffff9c77b688237c.
    (next=ffffae586d8afe68)."
    
    crash> struct list_head 0xffff9c801bc01210
    struct list_head {
      next = 0xffffae586d8afe68,
      prev = 0xffffae586d8afe68
    }
    crash> struct list_head 0xffff9c77b688237c
    struct list_head {
      next = 0x0,
      prev = 0x0
    }
    crash> struct list_head 0xffffae586d8afe68
    struct list_head struct: invalid kernel virtual address: ffffae586d8afe68  type: "gdb_readmem_callback"
    Cannot access memory at address 0xffffae586d8afe68
    
    [230469.019492] Call Trace:
    [230469.032041]  prepare_to_wait+0x8a/0xb0
    [230469.044363]  ? bch_btree_keys_free+0x6c/0xc0 [escache]
    [230469.056533]  mca_cannibalize_lock+0x72/0x90 [escache]
    [230469.068788]  mca_alloc+0x2ae/0x450 [escache]
    [230469.080790]  bch_btree_node_get+0x136/0x2d0 [escache]
    [230469.092681]  bch_btree_check_thread+0x1e1/0x260 [escache]
    [230469.104382]  ? finish_wait+0x80/0x80
    [230469.115884]  ? bch_btree_check_recurse+0x1a0/0x1a0 [escache]
    [230469.127259]  kthread+0x112/0x130
    [230469.138448]  ? kthread_flush_work_fn+0x10/0x10
    [230469.149477]  ret_from_fork+0x35/0x40
    
    bch_btree_check_thread() and bch_dirty_init_thread() may call
    mca_cannibalize() to cannibalize other cached btree nodes. Only one thread
    can do it at a time, so the op of other threads will be added to the
    btree_cache_wait list.
    
    We must call finish_wait() to remove op from btree_cache_wait before free
    it's memory address. Otherwise, the list will be damaged. Also should call
    bch_cannibalize_unlock() to release the btree_cache_alloc_lock and wake_up
    other waiters.
    
    Fixes: 8e710227 ("bcache: make bch_btree_check() to be multithreaded")
    Fixes: b144e45f ("bcache: make bch_sectors_dirty_init() to be multithreaded")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarMingzhe Zou <mingzhe.zou@easystack.cn>
    Signed-off-by: default avatarColy Li <colyli@suse.de>
    Link: https://lore.kernel.org/r/20230615121223.22502-7-colyli@suse.deSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    f0854489
btree.h 14 KB