When bcache is built on top of raid1 devices, the following warning happens:
WARNING: CPU: 2 PID: 8138 at include/linux/bio.h:559 raid1_write_request+0x994/0xba0 [raid1] Call Trace: dump_stack+0x19/0x1b __warn+0xd8/0x100 warn_slowpath_null+0x1d/0x20 raid1_write_request+0x994/0xba0 [raid1] raid1_make_request+0x8a/0x5b0 [raid1] md_handle_request+0xd0/0x150 md_make_request+0x79/0x190 generic_make_request+0x147/0x380 bch_generic_make_request_hack+0x2a/0xc0 [bcache] bch_generic_make_request+0x3d/0x190 [bcache] write_dirty+0x7e/0x110 [bcache] process_one_work+0x185/0x440 worker_thread+0x126/0x3c0 kthread+0xd1/0xe0 ret_from_fork_nospec_begin+0x21/0x21 And immediately followed by the crash: kernel BUG at drivers/md/bcache/closure.c:53! Call Trace: dirty_endio+0x28/0x30 [bcache] bio_endio+0x8c/0x130 call_bio_endio+0x2f/0x40 [raid1] raid_end_bio_io+0x2e/0x90 [raid1] r1_bio_write_done+0x35/0x50 [raid1] raid1_end_write_request+0x118/0x2f0 [raid1] bio_endio+0x8c/0x130 blk_update_request+0x90/0x370 blk_mq_end_request+0x1a/0x90 virtblk_request_done+0x3f/0x70 [virtio_blk] __blk_mq_complete_request_remote+0x19/0x20 flush_smp_call_function_queue+0x63/0x130 generic_smp_call_function_single_interrupt+0x13/0x30 smp_call_function_single_interrupt+0x2d/0x40 call_function_single_interrupt+0x16a/0x170 So this happens because bcache doesn't allocate & initialize 'bio_aux' structure needed by raid1 device. Add 'bio_aux' to 'dirty_io' struct and initialize it along with the 'bio' in dirty_init() to fix this. https://jira.sw.ru/browse/PSBM-106785 Signed-off-by: Andrey Ryabinin <aryabi...@virtuozzo.com> --- drivers/md/bcache/writeback.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c index 841f0490d4ef..c2bda701bf9d 100644 --- a/drivers/md/bcache/writeback.c +++ b/drivers/md/bcache/writeback.c @@ -17,6 +17,7 @@ static void read_dirty(struct closure *); struct dirty_io { struct closure cl; struct cached_dev *dc; + struct bio_aux bio_aux; struct bio bio; }; @@ -122,6 +123,7 @@ static void dirty_init(struct keybuf_key *w) bio->bi_max_vecs = DIV_ROUND_UP(KEY_SIZE(&w->key), PAGE_SECTORS); bio->bi_private = w; bio->bi_io_vec = bio->bi_inline_vecs; + bio_init_aux(&io->bio, &io->bio_aux); bch_bio_map(bio, NULL); } -- 2.26.2 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel