s390/zcrypt: ap bus rescan problem when toggle crypto adapters on/off
authorIngo Tuchscherer <ingo.tuchscherer@de.ibm.com>
Fri, 12 Apr 2013 15:52:08 +0000 (17:52 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Thu, 2 May 2013 15:10:20 +0000 (17:10 +0200)
The bus rescan process was called simultaneously on
every device failure. This finally leads into race
conditions (double device add/remove actions).

This patch protects the rescan area by mutual exclusion
and improves ap_config_timer handling

Signed-off-by: Ingo Tuchscherer <ingo.tuchscherer@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/crypto/ap_bus.c

index b8b340a..9de41aa 100644 (file)
@@ -954,15 +954,11 @@ EXPORT_SYMBOL(ap_driver_unregister);
 
 void ap_bus_force_rescan(void)
 {
-       /* Delete the AP bus rescan timer. */
-       del_timer(&ap_config_timer);
-
-       /* processing a synchonuous bus rescan */
-       ap_scan_bus(NULL);
-
-       /* Setup the AP bus rescan timer again. */
-       ap_config_timer.expires = jiffies + ap_config_time * HZ;
-       add_timer(&ap_config_timer);
+       /* reconfigure the AP bus rescan timer. */
+       mod_timer(&ap_config_timer, jiffies + ap_config_time * HZ);
+       /* processing a asynchronous bus rescan */
+       queue_work(ap_work_queue, &ap_config_work);
+       flush_work(&ap_config_work);
 }
 EXPORT_SYMBOL(ap_bus_force_rescan);
 
@@ -1305,8 +1301,9 @@ static void ap_scan_bus(struct work_struct *unused)
        int rc, i;
 
        ap_query_configuration();
-       if (ap_select_domain() != 0)
+       if (ap_select_domain() != 0) {
                return;
+       }
        for (i = 0; i < AP_DEVICES; i++) {
                qid = AP_MKQID(i, ap_domain_index);
                dev = bus_find_device(&ap_bus_type, NULL,