nfs41: sunrpc: provide functions to create and destroy a svc_xprt for backchannel use
For nfs41 callbacks we need an svc_xprt to process requests coming up the backchannel socket as rpc_rqst's that are transformed into svc_rqst's that need a rq_xprt to be processed. The svc_{udp,tcp}_create methods are too heavy for this job as svc_create_socket creates an actual socket to listen on while for nfs41 we're "reusing" the fore channel's socket. Signed-off-by: Benny Halevy <bhalevy@panasas.com>
This commit is contained in:
@@ -42,6 +42,8 @@ int svc_sock_names(char *buf, struct svc_serv *serv, char *toclose);
|
|||||||
int svc_addsock(struct svc_serv *serv, int fd, char *name_return);
|
int svc_addsock(struct svc_serv *serv, int fd, char *name_return);
|
||||||
void svc_init_xprt_sock(void);
|
void svc_init_xprt_sock(void);
|
||||||
void svc_cleanup_xprt_sock(void);
|
void svc_cleanup_xprt_sock(void);
|
||||||
|
struct svc_xprt *svc_sock_create(struct svc_serv *serv, int prot);
|
||||||
|
void svc_sock_destroy(struct svc_xprt *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* svc_makesock socket characteristics
|
* svc_makesock socket characteristics
|
||||||
|
@@ -1327,3 +1327,42 @@ static void svc_sock_free(struct svc_xprt *xprt)
|
|||||||
sock_release(svsk->sk_sock);
|
sock_release(svsk->sk_sock);
|
||||||
kfree(svsk);
|
kfree(svsk);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create a svc_xprt.
|
||||||
|
*
|
||||||
|
* For internal use only (e.g. nfsv4.1 backchannel).
|
||||||
|
* Callers should typically use the xpo_create() method.
|
||||||
|
*/
|
||||||
|
struct svc_xprt *svc_sock_create(struct svc_serv *serv, int prot)
|
||||||
|
{
|
||||||
|
struct svc_sock *svsk;
|
||||||
|
struct svc_xprt *xprt = NULL;
|
||||||
|
|
||||||
|
dprintk("svc: %s\n", __func__);
|
||||||
|
svsk = kzalloc(sizeof(*svsk), GFP_KERNEL);
|
||||||
|
if (!svsk)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
xprt = &svsk->sk_xprt;
|
||||||
|
if (prot == IPPROTO_TCP)
|
||||||
|
svc_xprt_init(&svc_tcp_class, xprt, serv);
|
||||||
|
else if (prot == IPPROTO_UDP)
|
||||||
|
svc_xprt_init(&svc_udp_class, xprt, serv);
|
||||||
|
else
|
||||||
|
BUG();
|
||||||
|
out:
|
||||||
|
dprintk("svc: %s return %p\n", __func__, xprt);
|
||||||
|
return xprt;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(svc_sock_create);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Destroy a svc_sock.
|
||||||
|
*/
|
||||||
|
void svc_sock_destroy(struct svc_xprt *xprt)
|
||||||
|
{
|
||||||
|
if (xprt)
|
||||||
|
kfree(container_of(xprt, struct svc_sock, sk_xprt));
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(svc_sock_destroy);
|
||||||
|
Reference in New Issue
Block a user