On Fri, 2017-09-22 at 07:25 +0800, Ming Lei wrote:
> On Thu, Sep 21, 2017 at 10:43:26PM +0000, Bart Van Assche wrote:
> > On Fri, 2017-09-22 at 06:06 +0800, Ming Lei wrote:
> > > On Thu, Sep 21, 2017 at 02:22:55PM -0700, Bart Van Assche wrote:
> > > > +       } else {
> > > >                 scsi_run_queue(q);
> > > > +               while (atomic_read(&sdev->device_busy)) {
> > > > +                       msleep_interruptible(200);
> > > > +                       scsi_run_queue(q);
> > > > +               }
> > > 
> > > Are you sure only blk-mq need to drain queue? We need
> > > to do that for block legacy too.
> > 
> > The code above your comment drains the queue for the legacy block layer.
> 
> That is just draining the requests dispatched to SCSI layer, and there
> might be lots of requests in block I/O scheduler queue or requeue or
> whatever.

There is no requeue list for the legacy block layer. There is only a requeue
list for blk-mq.

Waiting for I/O requests that are in scheduler queues is not the purpose of
scsi_quiesce_device(). The purpose of that function is to wait for requests
that have already been started. The sdev->device_busy counter represents the
number of started requests so waiting until that counter has reached zero is
sufficient.

Bart.

Reply via email to