> > +static void ibnbd_softirq_done_fn(struct request *rq)
> > +{
> > + struct ibnbd_clt_dev *dev = rq->rq_disk->private_data;
> > + struct ibnbd_clt_session *sess = dev->sess;
> > + struct ibnbd_iu *iu;
> > +
> > + iu = blk_mq_rq_to_pdu(rq);
> > + ibnbd_put_tag(sess, iu->tag);
> > + blk_mq_end_request(rq, iu->status);
> > +}
> > +
> > +static void msg_io_conf(void *priv, int errno)
> > +{
> > + struct ibnbd_iu *iu = (struct ibnbd_iu *)priv;
> > + struct ibnbd_clt_dev *dev = iu->dev;
> > + struct request *rq = iu->rq;
> > +
> > + iu->status = errno ? BLK_STS_IOERR : BLK_STS_OK;
> > +
> > + if (softirq_enable) {
> > + blk_mq_complete_request(rq);
> > + } else {
> > + ibnbd_put_tag(dev->sess, iu->tag);
> > + blk_mq_end_request(rq, iu->status);
> > + }
>
> Block drivers must call blk_mq_complete_request() instead of
> blk_mq_end_request() to complete a request after processing of the
> request has been started. Calling blk_mq_end_request() to complete a
> request is racy in case a timeout occurs while blk_mq_end_request() is
> in progress.
Hi Bart,
Could you elaborate a bit more, blk_mq_end_request is exported function and
used by a lot of block drivers: scsi, dm, etc.
Is there an open bug report for the problem?
Regards,
Jinpu