|
@@ -690,6 +690,37 @@ out_abort:
|
|
|
spin_unlock(&xprt->transport_lock);
|
|
|
}
|
|
|
|
|
|
+bool xprt_lock_connect(struct rpc_xprt *xprt,
|
|
|
+ struct rpc_task *task,
|
|
|
+ void *cookie)
|
|
|
+{
|
|
|
+ bool ret = false;
|
|
|
+
|
|
|
+ spin_lock_bh(&xprt->transport_lock);
|
|
|
+ if (!test_bit(XPRT_LOCKED, &xprt->state))
|
|
|
+ goto out;
|
|
|
+ if (xprt->snd_task != task)
|
|
|
+ goto out;
|
|
|
+ xprt->snd_task = cookie;
|
|
|
+ ret = true;
|
|
|
+out:
|
|
|
+ spin_unlock_bh(&xprt->transport_lock);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+void xprt_unlock_connect(struct rpc_xprt *xprt, void *cookie)
|
|
|
+{
|
|
|
+ spin_lock_bh(&xprt->transport_lock);
|
|
|
+ if (xprt->snd_task != cookie)
|
|
|
+ goto out;
|
|
|
+ if (!test_bit(XPRT_LOCKED, &xprt->state))
|
|
|
+ goto out;
|
|
|
+ xprt->snd_task =NULL;
|
|
|
+ xprt->ops->release_xprt(xprt, NULL);
|
|
|
+out:
|
|
|
+ spin_unlock_bh(&xprt->transport_lock);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* xprt_connect - schedule a transport connect operation
|
|
|
* @task: RPC task that is requesting the connect
|
|
@@ -712,9 +743,7 @@ void xprt_connect(struct rpc_task *task)
|
|
|
if (test_and_clear_bit(XPRT_CLOSE_WAIT, &xprt->state))
|
|
|
xprt->ops->close(xprt);
|
|
|
|
|
|
- if (xprt_connected(xprt))
|
|
|
- xprt_release_write(xprt, task);
|
|
|
- else {
|
|
|
+ if (!xprt_connected(xprt)) {
|
|
|
task->tk_rqstp->rq_bytes_sent = 0;
|
|
|
task->tk_timeout = task->tk_rqstp->rq_timeout;
|
|
|
rpc_sleep_on(&xprt->pending, task, xprt_connect_status);
|
|
@@ -726,6 +755,7 @@ void xprt_connect(struct rpc_task *task)
|
|
|
xprt->stat.connect_start = jiffies;
|
|
|
xprt->ops->connect(xprt, task);
|
|
|
}
|
|
|
+ xprt_release_write(xprt, task);
|
|
|
}
|
|
|
|
|
|
static void xprt_connect_status(struct rpc_task *task)
|
|
@@ -758,7 +788,6 @@ static void xprt_connect_status(struct rpc_task *task)
|
|
|
dprintk("RPC: %5u xprt_connect_status: error %d connecting to "
|
|
|
"server %s\n", task->tk_pid, -task->tk_status,
|
|
|
xprt->servername);
|
|
|
- xprt_release_write(xprt, task);
|
|
|
task->tk_status = -EIO;
|
|
|
}
|
|
|
}
|