Exemple #1
0
/**
 * xs_connect - connect a socket to a remote endpoint
 * @task: address of RPC task that manages state of connect request
 *
 * TCP: If the remote end dropped the connection, delay reconnecting.
 *
 * UDP socket connects are synchronous, but we use a work queue anyway
 * to guarantee that even unprivileged user processes can set up a
 * socket on a privileged port.
 *
 * If a UDP socket connect fails, the delay behavior here prevents
 * retry floods (hard mounts).
 */
static void xs_connect(struct rpc_task *task)
{
    struct rpc_xprt *xprt = task->tk_xprt;

    if (xprt_test_and_set_connecting(xprt))
        return;

    if (xprt->sock != NULL) {
        dprintk("RPC:      xs_connect delayed xprt %p for %lu seconds\n",
                xprt, xprt->reestablish_timeout / HZ);
        queue_delayed_work(rpciod_workqueue, &xprt->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);
        queue_work(rpciod_workqueue, &xprt->connect_worker);
    }
}
/**
 * xs_connect - connect a socket to a remote endpoint
 * @task: address of RPC task that manages state of connect request
 *
 * TCP: If the remote end dropped the connection, delay reconnecting.
 *
 * UDP socket connects are synchronous, but we use a work queue anyway
 * to guarantee that even unprivileged user processes can set up a
 * socket on a privileged port.
 *
 * If a UDP socket connect fails, the delay behavior here prevents
 * retry floods (hard mounts).
 */
static void xs_connect(struct rpc_task *task)
{
	struct rpc_xprt *xprt = task->tk_xprt;

	if (xprt_test_and_set_connecting(xprt))
		return;

	if (xprt->sock != NULL) {
		dprintk("RPC:      xs_connect delayed xprt %p for %lu seconds\n",
				xprt, xprt->reestablish_timeout / HZ);
		schedule_delayed_work(&xprt->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_work(&xprt->connect_worker);

		/* flush_scheduled_work can sleep... */
		if (!RPC_IS_ASYNC(task))
			flush_scheduled_work();
	}
}