• Ming Lei's avatar
    blk-mq: fix is_flush_rq · a9ed27a7
    Ming Lei authored
    is_flush_rq() is called from bt_iter()/bt_tags_iter(), and runs the
    following check:
    
    	hctx->fq->flush_rq == req
    
    but the passed hctx from bt_iter()/bt_tags_iter() may be NULL because:
    
    1) memory re-order in blk_mq_rq_ctx_init():
    
    	rq->mq_hctx = data->hctx;
    	...
    	refcount_set(&rq->ref, 1);
    
    OR
    
    2) tag re-use and ->rqs[] isn't updated with new request.
    
    Fix the issue by re-writing is_flush_rq() as:
    
    	return rq->end_io == flush_end_io;
    
    which turns out simpler to follow and immune to data race since we have
    ordered WRITE rq->end_io and refcount_set(&rq->ref, 1).
    
    Fixes: 2e315dc0 ("blk-mq: grab rq->refcount before calling ->fn in blk_mq_tagset_busy_iter")
    Cc: "Blank-Burian, Markus, Dr." <blankburian@uni-muenster.de>
    Cc: Yufen Yu <yuyufen@huawei.com>
    Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
    Link: https://lore.kernel.org/r/20210818010925.607383-1-ming.lei@redhat.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    a9ed27a7
blk-mq.c 99.7 KB