aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc/svcsock.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/sunrpc/svcsock.c')
-rw-r--r--net/sunrpc/svcsock.c39
1 files changed, 18 insertions, 21 deletions
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
index e43412bb07ae..b1cb97bbbd34 100644
--- a/net/sunrpc/svcsock.c
+++ b/net/sunrpc/svcsock.c
@@ -94,6 +94,7 @@ static int svc_deferred_recv(struct svc_rqst *rqstp);
94static struct cache_deferred_req *svc_defer(struct cache_req *req); 94static struct cache_deferred_req *svc_defer(struct cache_req *req);
95static struct svc_xprt *svc_create_socket(struct svc_serv *, int, 95static struct svc_xprt *svc_create_socket(struct svc_serv *, int,
96 struct sockaddr *, int, int); 96 struct sockaddr *, int, int);
97static void svc_age_temp_xprts(unsigned long closure);
97 98
98/* apparently the "standard" is that clients close 99/* apparently the "standard" is that clients close
99 * idle connections after 5 minutes, servers after 100 * idle connections after 5 minutes, servers after
@@ -1573,6 +1574,19 @@ svc_recv(struct svc_rqst *rqstp, long timeout)
1573 */ 1574 */
1574 __module_get(newxpt->xpt_class->xcl_owner); 1575 __module_get(newxpt->xpt_class->xcl_owner);
1575 svc_check_conn_limits(xprt->xpt_server); 1576 svc_check_conn_limits(xprt->xpt_server);
1577 spin_lock_bh(&serv->sv_lock);
1578 set_bit(XPT_TEMP, &newxpt->xpt_flags);
1579 list_add(&newxpt->xpt_list, &serv->sv_tempsocks);
1580 serv->sv_tmpcnt++;
1581 if (serv->sv_temptimer.function == NULL) {
1582 /* setup timer to age temp sockets */
1583 setup_timer(&serv->sv_temptimer,
1584 svc_age_temp_xprts,
1585 (unsigned long)serv);
1586 mod_timer(&serv->sv_temptimer,
1587 jiffies + svc_conn_age_period * HZ);
1588 }
1589 spin_unlock_bh(&serv->sv_lock);
1576 svc_xprt_received(newxpt); 1590 svc_xprt_received(newxpt);
1577 } 1591 }
1578 svc_xprt_received(xprt); 1592 svc_xprt_received(xprt);
@@ -1716,7 +1730,6 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv,
1716 struct svc_sock *svsk; 1730 struct svc_sock *svsk;
1717 struct sock *inet; 1731 struct sock *inet;
1718 int pmap_register = !(flags & SVC_SOCK_ANONYMOUS); 1732 int pmap_register = !(flags & SVC_SOCK_ANONYMOUS);
1719 int is_temporary = flags & SVC_SOCK_TEMPORARY;
1720 1733
1721 dprintk("svc: svc_setup_socket %p\n", sock); 1734 dprintk("svc: svc_setup_socket %p\n", sock);
1722 if (!(svsk = kzalloc(sizeof(*svsk), GFP_KERNEL))) { 1735 if (!(svsk = kzalloc(sizeof(*svsk), GFP_KERNEL))) {
@@ -1736,7 +1749,6 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv,
1736 return NULL; 1749 return NULL;
1737 } 1750 }
1738 1751
1739 set_bit(XPT_BUSY, &svsk->sk_xprt.xpt_flags);
1740 inet->sk_user_data = svsk; 1752 inet->sk_user_data = svsk;
1741 svsk->sk_sock = sock; 1753 svsk->sk_sock = sock;
1742 svsk->sk_sk = inet; 1754 svsk->sk_sk = inet;
@@ -1750,24 +1762,6 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv,
1750 else 1762 else
1751 svc_tcp_init(svsk, serv); 1763 svc_tcp_init(svsk, serv);
1752 1764
1753 spin_lock_bh(&serv->sv_lock);
1754 if (is_temporary) {
1755 set_bit(XPT_TEMP, &svsk->sk_xprt.xpt_flags);
1756 list_add(&svsk->sk_xprt.xpt_list, &serv->sv_tempsocks);
1757 serv->sv_tmpcnt++;
1758 if (serv->sv_temptimer.function == NULL) {
1759 /* setup timer to age temp sockets */
1760 setup_timer(&serv->sv_temptimer, svc_age_temp_xprts,
1761 (unsigned long)serv);
1762 mod_timer(&serv->sv_temptimer,
1763 jiffies + svc_conn_age_period * HZ);
1764 }
1765 } else {
1766 clear_bit(XPT_TEMP, &svsk->sk_xprt.xpt_flags);
1767 list_add(&svsk->sk_xprt.xpt_list, &serv->sv_permsocks);
1768 }
1769 spin_unlock_bh(&serv->sv_lock);
1770
1771 dprintk("svc: svc_setup_socket created %p (inet %p)\n", 1765 dprintk("svc: svc_setup_socket created %p (inet %p)\n",
1772 svsk, svsk->sk_sk); 1766 svsk, svsk->sk_sk);
1773 1767
@@ -1800,6 +1794,10 @@ int svc_addsock(struct svc_serv *serv,
1800 int salen; 1794 int salen;
1801 if (kernel_getsockname(svsk->sk_sock, sin, &salen) == 0) 1795 if (kernel_getsockname(svsk->sk_sock, sin, &salen) == 0)
1802 svc_xprt_set_local(&svsk->sk_xprt, sin, salen); 1796 svc_xprt_set_local(&svsk->sk_xprt, sin, salen);
1797 clear_bit(XPT_TEMP, &svsk->sk_xprt.xpt_flags);
1798 spin_lock_bh(&serv->sv_lock);
1799 list_add(&svsk->sk_xprt.xpt_list, &serv->sv_permsocks);
1800 spin_unlock_bh(&serv->sv_lock);
1803 svc_xprt_received(&svsk->sk_xprt); 1801 svc_xprt_received(&svsk->sk_xprt);
1804 err = 0; 1802 err = 0;
1805 } 1803 }
@@ -1865,7 +1863,6 @@ static struct svc_xprt *svc_create_socket(struct svc_serv *serv,
1865 1863
1866 if ((svsk = svc_setup_socket(serv, sock, &error, flags)) != NULL) { 1864 if ((svsk = svc_setup_socket(serv, sock, &error, flags)) != NULL) {
1867 svc_xprt_set_local(&svsk->sk_xprt, newsin, newlen); 1865 svc_xprt_set_local(&svsk->sk_xprt, newsin, newlen);
1868 svc_xprt_received(&svsk->sk_xprt);
1869 return (struct svc_xprt *)svsk; 1866 return (struct svc_xprt *)svsk;
1870 } 1867 }
1871 1868