> + if (dev->queue_mode == NULL_Q_BIO &&
> + bio_op(cmd->bio) != REQ_OP_FLUSH) {
> + is_flush = false;
> + sector = cmd->bio->bi_iter.bi_sector;
> + size = bio_sectors(cmd->bio);
> + }
> + if (dev->queue_mode != NULL_Q_BIO &&
> + req_op(cmd->rq) != REQ_OP_FLUSH) {
> + is_flush = false;
> + sector = blk_rq_pos(cmd->rq);
> + size = blk_rq_sectors(cmd->rq);
> + }
> + if (is_flush)
> + goto out;
This isn't really new in your patch, but looks very odd. Why not:
if (dev->queue_mode == NULL_Q_BIO) {
if (bio_op(cmd->bio) == REQ_OP_FLUSH)
return BLK_STS_OK;
sector = cmd->bio->bi_iter.bi_sector;
size = bio_sectors(cmd->bio);
} else {
if (req_op(cmd->rq) == REQ_OP_FLUSH)
return BLK_STS_OK;
sector = blk_rq_pos(cmd->rq);
size = blk_rq_sectors(cmd->rq);
}
> + if (badblocks_check(bb, sector, size, &first_bad, &bad_sectors)) {
> + cmd->error = BLK_STS_IOERR;
> + sts = BLK_STS_IOERR;
> + }
> +out:
> + return sts;
Also I find the idea of a goto label that just does a return rather odd.
Please just return directly to make it obvious what is going on.
But in general for the whole series: I'd much prefer moving the
bio vs request handling out of null_handle_cmd and into the callers
rather than hiding them one layer deeper in helpers. Patch 1 is
a good help for that, and anything else factoring out common code,
but code for request vs bio should much rather move to the callers.