aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc/svcsock.c
diff options
context:
space:
mode:
authorTom Tucker <tom@opengridcomputing.com>2007-12-30 22:08:20 -0500
committerJ. Bruce Fields <bfields@citi.umich.edu>2008-02-01 16:42:13 -0500
commit4e5caaa5f24b3df1fe01097e1e7576461e70d491 (patch)
treec682473e9a40f4e8a8a1317906a516b41d47ec30 /net/sunrpc/svcsock.c
parent9f8bfae693c724120ffc8fb77564f6deb508daf3 (diff)
svc: Move create logic to common code
Move the svc transport list logic into common transport creation code. Refactor this code path to make the flow of control easier to read. Move the setting and clearing of the BUSY_BIT during transport creation to common code. Signed-off-by: Tom Tucker <tom@opengridcomputing.com> Acked-by: Neil Brown <neilb@suse.de> Reviewed-by: Chuck Lever <chuck.lever@oracle.com> Reviewed-by: Greg Banks <gnb@sgi.com> Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
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