|
@@ -962,85 +962,6 @@ struct rpc_xprt *xprt_create_transport(int proto, struct sockaddr *ap, size_t si
|
|
return xprt;
|
|
return xprt;
|
|
}
|
|
}
|
|
|
|
|
|
-static struct rpc_xprt *xprt_setup(int proto, struct sockaddr_in *ap, struct rpc_timeout *to)
|
|
|
|
-{
|
|
|
|
- int result;
|
|
|
|
- struct rpc_xprt *xprt;
|
|
|
|
- struct rpc_rqst *req;
|
|
|
|
-
|
|
|
|
- if ((xprt = kzalloc(sizeof(struct rpc_xprt), GFP_KERNEL)) == NULL)
|
|
|
|
- return ERR_PTR(-ENOMEM);
|
|
|
|
-
|
|
|
|
- memcpy(&xprt->addr, ap, sizeof(*ap));
|
|
|
|
- xprt->addrlen = sizeof(*ap);
|
|
|
|
-
|
|
|
|
- switch (proto) {
|
|
|
|
- case IPPROTO_UDP:
|
|
|
|
- result = xs_setup_udp(xprt, to);
|
|
|
|
- break;
|
|
|
|
- case IPPROTO_TCP:
|
|
|
|
- result = xs_setup_tcp(xprt, to);
|
|
|
|
- break;
|
|
|
|
- default:
|
|
|
|
- printk(KERN_ERR "RPC: unrecognized transport protocol: %d\n",
|
|
|
|
- proto);
|
|
|
|
- result = -EIO;
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- if (result) {
|
|
|
|
- kfree(xprt);
|
|
|
|
- return ERR_PTR(result);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- spin_lock_init(&xprt->transport_lock);
|
|
|
|
- spin_lock_init(&xprt->reserve_lock);
|
|
|
|
-
|
|
|
|
- INIT_LIST_HEAD(&xprt->free);
|
|
|
|
- INIT_LIST_HEAD(&xprt->recv);
|
|
|
|
- INIT_WORK(&xprt->task_cleanup, xprt_autoclose, xprt);
|
|
|
|
- init_timer(&xprt->timer);
|
|
|
|
- xprt->timer.function = xprt_init_autodisconnect;
|
|
|
|
- xprt->timer.data = (unsigned long) xprt;
|
|
|
|
- xprt->last_used = jiffies;
|
|
|
|
- xprt->cwnd = RPC_INITCWND;
|
|
|
|
-
|
|
|
|
- rpc_init_wait_queue(&xprt->binding, "xprt_binding");
|
|
|
|
- rpc_init_wait_queue(&xprt->pending, "xprt_pending");
|
|
|
|
- rpc_init_wait_queue(&xprt->sending, "xprt_sending");
|
|
|
|
- rpc_init_wait_queue(&xprt->resend, "xprt_resend");
|
|
|
|
- rpc_init_priority_wait_queue(&xprt->backlog, "xprt_backlog");
|
|
|
|
-
|
|
|
|
- /* initialize free list */
|
|
|
|
- for (req = &xprt->slot[xprt->max_reqs-1]; req >= &xprt->slot[0]; req--)
|
|
|
|
- list_add(&req->rq_list, &xprt->free);
|
|
|
|
-
|
|
|
|
- xprt_init_xid(xprt);
|
|
|
|
-
|
|
|
|
- dprintk("RPC: created transport %p with %u slots\n", xprt,
|
|
|
|
- xprt->max_reqs);
|
|
|
|
-
|
|
|
|
- return xprt;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- * xprt_create_proto - create an RPC client transport
|
|
|
|
- * @proto: requested transport protocol
|
|
|
|
- * @sap: remote peer's address
|
|
|
|
- * @to: timeout parameters for new transport
|
|
|
|
- *
|
|
|
|
- */
|
|
|
|
-struct rpc_xprt *xprt_create_proto(int proto, struct sockaddr_in *sap, struct rpc_timeout *to)
|
|
|
|
-{
|
|
|
|
- struct rpc_xprt *xprt;
|
|
|
|
-
|
|
|
|
- xprt = xprt_setup(proto, sap, to);
|
|
|
|
- if (IS_ERR(xprt))
|
|
|
|
- dprintk("RPC: xprt_create_proto failed\n");
|
|
|
|
- else
|
|
|
|
- dprintk("RPC: xprt_create_proto created xprt %p\n", xprt);
|
|
|
|
- return xprt;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
/**
|
|
/**
|
|
* xprt_destroy - destroy an RPC transport, killing off all requests.
|
|
* xprt_destroy - destroy an RPC transport, killing off all requests.
|
|
* @xprt: transport to destroy
|
|
* @xprt: transport to destroy
|