SUNRPC: fix hang due to eventd deadlock...
[firefly-linux-kernel-4.4.55.git] / net / sunrpc / xprtsock.c
index cc33c5880abb477eb3cdb7d415e2f7df91f303b1..ee6ad3baf68049f032824eb768043f93d8f9d897 100644 (file)
@@ -653,8 +653,7 @@ static void xs_destroy(struct rpc_xprt *xprt)
 
        dprintk("RPC:       xs_destroy xprt %p\n", xprt);
 
-       cancel_delayed_work(&transport->connect_worker);
-       flush_scheduled_work();
+       cancel_rearming_delayed_work(&transport->connect_worker);
 
        xprt_disconnect(xprt);
        xs_close(xprt);
@@ -1001,7 +1000,7 @@ static void xs_tcp_state_change(struct sock *sk)
                /* Try to schedule an autoclose RPC calls */
                set_bit(XPRT_CLOSE_WAIT, &xprt->state);
                if (test_and_set_bit(XPRT_LOCKED, &xprt->state) == 0)
-                       schedule_work(&xprt->task_cleanup);
+                       queue_work(rpciod_workqueue, &xprt->task_cleanup);
        default:
                xprt_disconnect(xprt);
        }
@@ -1410,18 +1409,16 @@ static void xs_connect(struct rpc_task *task)
                dprintk("RPC:       xs_connect delayed xprt %p for %lu "
                                "seconds\n",
                                xprt, xprt->reestablish_timeout / HZ);
-               schedule_delayed_work(&transport->connect_worker,
-                                       xprt->reestablish_timeout);
+               queue_delayed_work(rpciod_workqueue,
+                                  &transport->connect_worker,
+                                  xprt->reestablish_timeout);
                xprt->reestablish_timeout <<= 1;
                if (xprt->reestablish_timeout > XS_TCP_MAX_REEST_TO)
                        xprt->reestablish_timeout = XS_TCP_MAX_REEST_TO;
        } else {
                dprintk("RPC:       xs_connect scheduled xprt %p\n", xprt);
-               schedule_delayed_work(&transport->connect_worker, 0);
-
-               /* flush_scheduled_work can sleep... */
-               if (!RPC_IS_ASYNC(task))
-                       flush_scheduled_work();
+               queue_delayed_work(rpciod_workqueue,
+                                  &transport->connect_worker, 0);
        }
 }