> +     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.

Reply via email to