diff options
Diffstat (limited to 'net/sunrpc/svcsock.c')
-rw-r--r-- | net/sunrpc/svcsock.c | 39 |
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); | |||
94 | static struct cache_deferred_req *svc_defer(struct cache_req *req); | 94 | static struct cache_deferred_req *svc_defer(struct cache_req *req); |
95 | static struct svc_xprt *svc_create_socket(struct svc_serv *, int, | 95 | static struct svc_xprt *svc_create_socket(struct svc_serv *, int, |
96 | struct sockaddr *, int, int); | 96 | struct sockaddr *, int, int); |
97 | static 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 | ||