Skip to content

Commit fec114a

Browse files
zoumingzheaxboe
authored andcommitted
bcache: fix cached_dev.sb_bio use-after-free and crash
In our production environment, we have received multiple crash reports regarding libceph, which have caught our attention: ``` [6888366.280350] Call Trace: [6888366.280452] blk_update_request+0x14e/0x370 [6888366.280561] blk_mq_end_request+0x1a/0x130 [6888366.280671] rbd_img_handle_request+0x1a0/0x1b0 [rbd] [6888366.280792] rbd_obj_handle_request+0x32/0x40 [rbd] [6888366.280903] __complete_request+0x22/0x70 [libceph] [6888366.281032] osd_dispatch+0x15e/0xb40 [libceph] [6888366.281164] ? inet_recvmsg+0x5b/0xd0 [6888366.281272] ? ceph_tcp_recvmsg+0x6f/0xa0 [libceph] [6888366.281405] ceph_con_process_message+0x79/0x140 [libceph] [6888366.281534] ceph_con_v1_try_read+0x5d7/0xf30 [libceph] [6888366.281661] ceph_con_workfn+0x329/0x680 [libceph] ``` After analyzing the coredump file, we found that the address of dc->sb_bio has been freed. We know that cached_dev is only freed when it is stopped. Since sb_bio is a part of struct cached_dev, rather than an alloc every time. If the device is stopped while writing to the superblock, the released address will be accessed at endio. This patch hopes to wait for sb_write to complete in cached_dev_free. It should be noted that we analyzed the cause of the problem, then tell all details to the QWEN and adopted the modifications it made. Signed-off-by: Mingzhe Zou <mingzhe.zou@easystack.cn> Fixes: cafe563 ("bcache: A block layer cache") Cc: stable@vger.kernel.org # 3.10+ Signed-off-by: Coly Li <colyli@fnnas.com> Link: https://patch.msgid.link/20260322134102.480107-1-colyli@fnnas.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent a175ee8 commit fec114a

1 file changed

Lines changed: 7 additions & 0 deletions

File tree

drivers/md/bcache/super.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1373,6 +1373,13 @@ static CLOSURE_CALLBACK(cached_dev_free)
13731373

13741374
mutex_unlock(&bch_register_lock);
13751375

1376+
/*
1377+
* Wait for any pending sb_write to complete before free.
1378+
* The sb_bio is embedded in struct cached_dev, so we must
1379+
* ensure no I/O is in progress.
1380+
*/
1381+
closure_sync(&dc->sb_write);
1382+
13761383
if (dc->sb_disk)
13771384
folio_put(virt_to_folio(dc->sb_disk));
13781385

0 commit comments

Comments
 (0)