scsi: libsas: use flush_workqueue to process disco events synchronously
authorJason Yan <[email protected]>
Fri, 8 Dec 2017 09:42:08 +0000 (17:42 +0800)
committerMartin K. Petersen <[email protected]>
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 <[email protected]>
CC: John Garry <[email protected]>
CC: Johannes Thumshirn <[email protected]>
CC: Ewan Milne <[email protected]>
CC: Christoph Hellwig <[email protected]>
CC: Tomas Henzl <[email protected]>
CC: Dan Williams <[email protected]>
Reviewed-by: Hannes Reinecke <[email protected]>
Signed-off-by: Martin K. Petersen <[email protected]>
drivers/scsi/libsas/sas_port.c

index 93266283f51ff0c606b4e5d7210aa0f5d63d48ab..64722f42b2564f8cacca93d97fdb89f396242122 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)