iseries_veth: don't use flush_scheduled_work()
[pandora-kernel.git] / drivers / net / iseries_veth.c
index 63ac531..9ece1fd 100644 (file)
@@ -885,17 +885,8 @@ static void veth_stop_connection(struct veth_lpar_connection *cnx)
        veth_kick_statemachine(cnx);
        spin_unlock_irq(&cnx->lock);
 
-       /* There's a slim chance the reset code has just queued the
-        * statemachine to run in five seconds. If so we need to cancel
-        * that and requeue the work to run now. */
-       if (cancel_delayed_work(&cnx->statemachine_wq)) {
-               spin_lock_irq(&cnx->lock);
-               veth_kick_statemachine(cnx);
-               spin_unlock_irq(&cnx->lock);
-       }
-
-       /* Wait for the state machine to run. */
-       flush_scheduled_work();
+       /* ensure the statemachine runs now and waits for its completion */
+       flush_delayed_work_sync(&cnx->statemachine_wq);
 }
 
 static void veth_destroy_connection(struct veth_lpar_connection *cnx)
@@ -1653,15 +1644,14 @@ static void __exit veth_module_cleanup(void)
        /* Disconnect our "irq" to stop events coming from the Hypervisor. */
        HvLpEvent_unregisterHandler(HvLpEvent_Type_VirtualLan);
 
-       /* Make sure any work queued from Hypervisor callbacks is finished. */
-       flush_scheduled_work();
-
        for (i = 0; i < HVMAXARCHITECTEDLPS; ++i) {
                cnx = veth_cnx[i];
 
                if (!cnx)
                        continue;
 
+               /* Cancel work queued from Hypervisor callbacks */
+               cancel_delayed_work_sync(&cnx->statemachine_wq);
                /* Remove the connection from sysfs */
                kobject_del(&cnx->kobject);
                /* Drop the driver's reference to the connection */