scsi: libsas: use flush_workqueue to process disco events synchronously
authorJason Yan <yanaijie@huawei.com>
Fri, 8 Dec 2017 09:42:08 +0000 (17:42 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 9 Jan 2018 02:59:28 +0000 (21:59 -0500)
Now we are processing sas event and discover event in different
workqueues.  It's safe to wait the discover event done in the sas event
work. Use flush_workqueue() to insure the disco and revalidate events
processed synchronously so that the whole discover and revalidate
process will not be interrupted by other events.

Signed-off-by: Jason Yan <yanaijie@huawei.com>
CC: John Garry <john.garry@huawei.com>
CC: Johannes Thumshirn <jthumshirn@suse.de>
CC: Ewan Milne <emilne@redhat.com>
CC: Christoph Hellwig <hch@lst.de>
CC: Tomas Henzl <thenzl@redhat.com>
CC: Dan Williams <dan.j.williams@intel.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/libsas/sas_port.c

index 9326628..64722f4 100644 (file)
@@ -192,6 +192,7 @@ static void sas_form_port(struct asd_sas_phy *phy)
                si->dft->lldd_port_formed(phy);
 
        sas_discover_event(phy->port, DISCE_DISCOVER_DOMAIN);
+       flush_workqueue(sas_ha->disco_q);
 }
 
 /**
@@ -277,6 +278,9 @@ void sas_porte_broadcast_rcvd(struct work_struct *work)
 
        SAS_DPRINTK("broadcast received: %d\n", prim);
        sas_discover_event(phy->port, DISCE_REVALIDATE_DOMAIN);
+
+       if (phy->port)
+               flush_workqueue(phy->port->ha->disco_q);
 }
 
 void sas_porte_link_reset_err(struct work_struct *work)