On Tue, Mar 11, 2025 at 10:42 AM Shin'ichiro Kawasaki <shinichiro.kawasaki@xxxxxxx> wrote: > > Commit 1f47ed294a2b ("block: cleanup and fix batch completion adding > conditions") modified the evaluation criteria for the third argument, > 'ioerror', in the blk_mq_add_to_batch() function. Initially, the > function had checked if 'ioerror' equals zero. Following the commit, it > started checking for negative error values, with the presumption that > such values, for instance -EIO, would be passed in. > > However, blk_mq_add_to_batch() callers do not pass negative error > values. Instead, they pass status codes defined in various ways: > > - NVMe PCI and Apple drivers pass NVMe status code > - virtio_blk driver passes the virtblk request header status byte > - null_blk driver passes blk_status_t > > These codes are either zero or positive, therefore the revised check > fails to function as intended. Specifically, with the NVMe PCI driver, > this modification led to the failure of the blktests test case nvme/039. > In this test scenario, errors are artificially injected to the NVMe > driver, resulting in positive NVMe status codes passed to > blk_mq_add_to_batch(), which unexpectedly processes the failed I/O in a > batch. Hence the failure. > > To correct the ioerror check within blk_mq_add_to_batch(), make all > callers to uniformly pass the argument as blk_status_t. Modify the > callers to translate their specific status codes into blk_status_t. For > this translation, export the helper function nvme_error_status(). Adjust > blk_mq_add_to_batch() to translate blk_status_t back into the error > number for the appropriate check. > > Fixes: 1f47ed294a2b ("block: cleanup and fix batch completion adding conditions") > Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@xxxxxxx> > --- > drivers/block/null_blk/main.c | 2 +- > drivers/block/virtio_blk.c | 5 +++-- For virtio_blk: Reviewed-by: Stefan Hajnoczi <stefanha@xxxxxxxxxx>