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.