@@ -121,27 +121,27 @@ static void svc_reclassify_socket(struct socket *sock)
121121#endif
122122
123123/**
124- * svc_tcp_release_rqst - Release transport-related resources
125- * @rqstp: request structure with resources to be released
124+ * svc_tcp_release_ctxt - Release transport-related resources
125+ * @xprt: the transport which owned the context
126+ * @ctxt: the context from rqstp->rq_xprt_ctxt or dr->xprt_ctxt
126127 *
127128 */
128- static void svc_tcp_release_rqst (struct svc_rqst * rqstp )
129+ static void svc_tcp_release_ctxt (struct svc_xprt * xprt , void * ctxt )
129130{
130131}
131132
132133/**
133- * svc_udp_release_rqst - Release transport-related resources
134- * @rqstp: request structure with resources to be released
134+ * svc_udp_release_ctxt - Release transport-related resources
135+ * @xprt: the transport which owned the context
136+ * @ctxt: the context from rqstp->rq_xprt_ctxt or dr->xprt_ctxt
135137 *
136138 */
137- static void svc_udp_release_rqst (struct svc_rqst * rqstp )
139+ static void svc_udp_release_ctxt (struct svc_xprt * xprt , void * ctxt )
138140{
139- struct sk_buff * skb = rqstp -> rq_xprt_ctxt ;
141+ struct sk_buff * skb = ctxt ;
140142
141- if (skb ) {
142- rqstp -> rq_xprt_ctxt = NULL ;
143+ if (skb )
143144 consume_skb (skb );
144- }
145145}
146146
147147union svc_pktinfo_u {
@@ -696,7 +696,8 @@ static int svc_udp_sendto(struct svc_rqst *rqstp)
696696 unsigned int sent ;
697697 int err ;
698698
699- svc_udp_release_rqst (rqstp );
699+ svc_udp_release_ctxt (xprt , rqstp -> rq_xprt_ctxt );
700+ rqstp -> rq_xprt_ctxt = NULL ;
700701
701702 svc_set_cmsg_data (rqstp , cmh );
702703
@@ -768,7 +769,7 @@ static const struct svc_xprt_ops svc_udp_ops = {
768769 .xpo_recvfrom = svc_udp_recvfrom ,
769770 .xpo_sendto = svc_udp_sendto ,
770771 .xpo_result_payload = svc_sock_result_payload ,
771- .xpo_release_rqst = svc_udp_release_rqst ,
772+ .xpo_release_ctxt = svc_udp_release_ctxt ,
772773 .xpo_detach = svc_sock_detach ,
773774 .xpo_free = svc_sock_free ,
774775 .xpo_has_wspace = svc_udp_has_wspace ,
@@ -895,6 +896,9 @@ static struct svc_xprt *svc_tcp_accept(struct svc_xprt *xprt)
895896 trace_svcsock_accept_err (xprt , serv -> sv_name , err );
896897 return NULL ;
897898 }
899+ if (IS_ERR (sock_alloc_file (newsock , O_NONBLOCK , NULL )))
900+ return NULL ;
901+
898902 set_bit (XPT_CONN , & svsk -> sk_xprt .xpt_flags );
899903
900904 err = kernel_getpeername (newsock , sin );
@@ -935,7 +939,7 @@ static struct svc_xprt *svc_tcp_accept(struct svc_xprt *xprt)
935939 return & newsvsk -> sk_xprt ;
936940
937941failed :
938- sock_release (newsock );
942+ sockfd_put (newsock );
939943 return NULL ;
940944}
941945
@@ -1298,7 +1302,8 @@ static int svc_tcp_sendto(struct svc_rqst *rqstp)
12981302 unsigned int sent ;
12991303 int err ;
13001304
1301- svc_tcp_release_rqst (rqstp );
1305+ svc_tcp_release_ctxt (xprt , rqstp -> rq_xprt_ctxt );
1306+ rqstp -> rq_xprt_ctxt = NULL ;
13021307
13031308 atomic_inc (& svsk -> sk_sendqlen );
13041309 mutex_lock (& xprt -> xpt_mutex );
@@ -1343,7 +1348,7 @@ static const struct svc_xprt_ops svc_tcp_ops = {
13431348 .xpo_recvfrom = svc_tcp_recvfrom ,
13441349 .xpo_sendto = svc_tcp_sendto ,
13451350 .xpo_result_payload = svc_sock_result_payload ,
1346- .xpo_release_rqst = svc_tcp_release_rqst ,
1351+ .xpo_release_ctxt = svc_tcp_release_ctxt ,
13471352 .xpo_detach = svc_tcp_sock_detach ,
13481353 .xpo_free = svc_sock_free ,
13491354 .xpo_has_wspace = svc_tcp_has_wspace ,
@@ -1430,7 +1435,6 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv,
14301435 struct socket * sock ,
14311436 int flags )
14321437{
1433- struct file * filp = NULL ;
14341438 struct svc_sock * svsk ;
14351439 struct sock * inet ;
14361440 int pmap_register = !(flags & SVC_SOCK_ANONYMOUS );
@@ -1439,14 +1443,6 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv,
14391443 if (!svsk )
14401444 return ERR_PTR (- ENOMEM );
14411445
1442- if (!sock -> file ) {
1443- filp = sock_alloc_file (sock , O_NONBLOCK , NULL );
1444- if (IS_ERR (filp )) {
1445- kfree (svsk );
1446- return ERR_CAST (filp );
1447- }
1448- }
1449-
14501446 inet = sock -> sk ;
14511447
14521448 if (pmap_register ) {
@@ -1456,8 +1452,6 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv,
14561452 inet -> sk_protocol ,
14571453 ntohs (inet_sk (inet )-> inet_sport ));
14581454 if (err < 0 ) {
1459- if (filp )
1460- fput (filp );
14611455 kfree (svsk );
14621456 return ERR_PTR (err );
14631457 }
0 commit comments