• Chaitanya Kulkarni's avatar
    nvmet: fix inline bio check for passthru · ab96de5d
    Chaitanya Kulkarni authored
    When handling passthru commands, for inline bio allocation we only
    consider the transfer size. This works well when req->sg_cnt fits into
    the req->inline_bvec, but it will result in the early return from
    bio_add_hw_page() when req->sg_cnt > NVMET_MAX_INLINE_BVEC.
    
    Consider an I/O of size 32768 and first buffer is not aligned to the
    page boundary, then I/O is split in following manner :-
    
    [ 2206.256140] nvmet: sg->length 3440 sg->offset 656
    [ 2206.256144] nvmet: sg->length 4096 sg->offset 0
    [ 2206.256148] nvmet: sg->length 4096 sg->offset 0
    [ 2206.256152] nvmet: sg->length 4096 sg->offset 0
    [ 2206.256155] nvmet: sg->length 4096 sg->offset 0
    [ 2206.256159] nvmet: sg->length 4096 sg->offset 0
    [ 2206.256163] nvmet: sg->length 4096 sg->offset 0
    [ 2206.256166] nvmet: sg->length 4096 sg->offset 0
    [ 2206.256170] nvmet: sg->length 656 sg->offset 0
    
    Now the req->transfer_size == NVMET_MAX_INLINE_DATA_LEN i.e. 32768, but
    the req->sg_cnt is (9) > NVMET_MAX_INLINE_BIOVEC which is (8).
    This will result in early return in the following code path :-
    
    nvmet_bdev_execute_rw()
    	bio_add_pc_page()
    		bio_add_hw_page()
    			if (bio_full(bio, len))
    				return 0;
    
    Use previously introduced helper nvmet_use_inline_bvec() to consider
    req->sg_cnt when using inline bio. This only affects nvme-loop
    transport.
    
    Fixes: dab3902b ("nvmet: use inline bio for passthru fast path")
    Signed-off-by: default avatarChaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
    Reviewed-by: default avatarSagi Grimberg <sagi@grimberg.me>
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    ab96de5d
passthru.c 15.2 KB