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