|
@@ -75,7 +75,7 @@
|
|
|
|
|
|
|
|
|
|
static struct svc_sock *svc_setup_socket(struct svc_serv *, struct socket *,
|
|
static struct svc_sock *svc_setup_socket(struct svc_serv *, struct socket *,
|
|
- int *errp, int pmap_reg);
|
|
|
|
|
|
+ int *errp, int flags);
|
|
static void svc_delete_socket(struct svc_sock *svsk);
|
|
static void svc_delete_socket(struct svc_sock *svsk);
|
|
static void svc_udp_data_ready(struct sock *, int);
|
|
static void svc_udp_data_ready(struct sock *, int);
|
|
static int svc_udp_recvfrom(struct svc_rqst *);
|
|
static int svc_udp_recvfrom(struct svc_rqst *);
|
|
@@ -935,7 +935,8 @@ svc_tcp_accept(struct svc_sock *svsk)
|
|
*/
|
|
*/
|
|
newsock->sk->sk_sndtimeo = HZ*30;
|
|
newsock->sk->sk_sndtimeo = HZ*30;
|
|
|
|
|
|
- if (!(newsvsk = svc_setup_socket(serv, newsock, &err, 0)))
|
|
|
|
|
|
+ if (!(newsvsk = svc_setup_socket(serv, newsock, &err,
|
|
|
|
+ (SVC_SOCK_ANONYMOUS | SVC_SOCK_TEMPORARY))))
|
|
goto failed;
|
|
goto failed;
|
|
|
|
|
|
|
|
|
|
@@ -1476,12 +1477,14 @@ svc_age_temp_sockets(unsigned long closure)
|
|
* Initialize socket for RPC use and create svc_sock struct
|
|
* Initialize socket for RPC use and create svc_sock struct
|
|
* XXX: May want to setsockopt SO_SNDBUF and SO_RCVBUF.
|
|
* XXX: May want to setsockopt SO_SNDBUF and SO_RCVBUF.
|
|
*/
|
|
*/
|
|
-static struct svc_sock *
|
|
|
|
-svc_setup_socket(struct svc_serv *serv, struct socket *sock,
|
|
|
|
- int *errp, int pmap_register)
|
|
|
|
|
|
+static struct svc_sock *svc_setup_socket(struct svc_serv *serv,
|
|
|
|
+ struct socket *sock,
|
|
|
|
+ int *errp, int flags)
|
|
{
|
|
{
|
|
struct svc_sock *svsk;
|
|
struct svc_sock *svsk;
|
|
struct sock *inet;
|
|
struct sock *inet;
|
|
|
|
+ int pmap_register = !(flags & SVC_SOCK_ANONYMOUS);
|
|
|
|
+ int is_temporary = flags & SVC_SOCK_TEMPORARY;
|
|
|
|
|
|
dprintk("svc: svc_setup_socket %p\n", sock);
|
|
dprintk("svc: svc_setup_socket %p\n", sock);
|
|
if (!(svsk = kzalloc(sizeof(*svsk), GFP_KERNEL))) {
|
|
if (!(svsk = kzalloc(sizeof(*svsk), GFP_KERNEL))) {
|
|
@@ -1523,7 +1526,7 @@ svc_setup_socket(struct svc_serv *serv, struct socket *sock,
|
|
svc_tcp_init(svsk);
|
|
svc_tcp_init(svsk);
|
|
|
|
|
|
spin_lock_bh(&serv->sv_lock);
|
|
spin_lock_bh(&serv->sv_lock);
|
|
- if (!pmap_register) {
|
|
|
|
|
|
+ if (is_temporary) {
|
|
set_bit(SK_TEMP, &svsk->sk_flags);
|
|
set_bit(SK_TEMP, &svsk->sk_flags);
|
|
list_add(&svsk->sk_list, &serv->sv_tempsocks);
|
|
list_add(&svsk->sk_list, &serv->sv_tempsocks);
|
|
serv->sv_tmpcnt++;
|
|
serv->sv_tmpcnt++;
|
|
@@ -1567,7 +1570,7 @@ int svc_addsock(struct svc_serv *serv,
|
|
else if (so->state > SS_UNCONNECTED)
|
|
else if (so->state > SS_UNCONNECTED)
|
|
err = -EISCONN;
|
|
err = -EISCONN;
|
|
else {
|
|
else {
|
|
- svsk = svc_setup_socket(serv, so, &err, 1);
|
|
|
|
|
|
+ svsk = svc_setup_socket(serv, so, &err, SVC_SOCK_DEFAULTS);
|
|
if (svsk)
|
|
if (svsk)
|
|
err = 0;
|
|
err = 0;
|
|
}
|
|
}
|
|
@@ -1583,8 +1586,8 @@ EXPORT_SYMBOL_GPL(svc_addsock);
|
|
/*
|
|
/*
|
|
* Create socket for RPC service.
|
|
* Create socket for RPC service.
|
|
*/
|
|
*/
|
|
-static int
|
|
|
|
-svc_create_socket(struct svc_serv *serv, int protocol, struct sockaddr_in *sin)
|
|
|
|
|
|
+static int svc_create_socket(struct svc_serv *serv, int protocol,
|
|
|
|
+ struct sockaddr_in *sin, int flags)
|
|
{
|
|
{
|
|
struct svc_sock *svsk;
|
|
struct svc_sock *svsk;
|
|
struct socket *sock;
|
|
struct socket *sock;
|
|
@@ -1620,8 +1623,8 @@ svc_create_socket(struct svc_serv *serv, int protocol, struct sockaddr_in *sin)
|
|
goto bummer;
|
|
goto bummer;
|
|
}
|
|
}
|
|
|
|
|
|
- if ((svsk = svc_setup_socket(serv, sock, &error, 1)) != NULL)
|
|
|
|
- return 0;
|
|
|
|
|
|
+ if ((svsk = svc_setup_socket(serv, sock, &error, flags)) != NULL)
|
|
|
|
+ return ntohs(inet_sk(svsk->sk_sk)->sport);
|
|
|
|
|
|
bummer:
|
|
bummer:
|
|
dprintk("svc: svc_create_socket error = %d\n", -error);
|
|
dprintk("svc: svc_create_socket error = %d\n", -error);
|
|
@@ -1681,19 +1684,23 @@ void svc_close_socket(struct svc_sock *svsk)
|
|
svc_sock_put(svsk);
|
|
svc_sock_put(svsk);
|
|
}
|
|
}
|
|
|
|
|
|
-/*
|
|
|
|
- * Make a socket for nfsd and lockd
|
|
|
|
|
|
+/**
|
|
|
|
+ * svc_makesock - Make a socket for nfsd and lockd
|
|
|
|
+ * @serv: RPC server structure
|
|
|
|
+ * @protocol: transport protocol to use
|
|
|
|
+ * @port: port to use
|
|
|
|
+ *
|
|
*/
|
|
*/
|
|
-int
|
|
|
|
-svc_makesock(struct svc_serv *serv, int protocol, unsigned short port)
|
|
|
|
|
|
+int svc_makesock(struct svc_serv *serv, int protocol, unsigned short port)
|
|
{
|
|
{
|
|
- struct sockaddr_in sin;
|
|
|
|
|
|
+ struct sockaddr_in sin = {
|
|
|
|
+ .sin_family = AF_INET,
|
|
|
|
+ .sin_addr.s_addr = INADDR_ANY,
|
|
|
|
+ .sin_port = htons(port),
|
|
|
|
+ };
|
|
|
|
|
|
dprintk("svc: creating socket proto = %d\n", protocol);
|
|
dprintk("svc: creating socket proto = %d\n", protocol);
|
|
- sin.sin_family = AF_INET;
|
|
|
|
- sin.sin_addr.s_addr = INADDR_ANY;
|
|
|
|
- sin.sin_port = htons(port);
|
|
|
|
- return svc_create_socket(serv, protocol, &sin);
|
|
|
|
|
|
+ return svc_create_socket(serv, protocol, &sin, SVC_SOCK_DEFAULTS);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|