|
|
|
@ -679,6 +679,23 @@ struct svc_xprt *svc_get_next_xprt(struct svc_rqst *rqstp, long timeout) |
|
|
|
|
return xprt; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void svc_add_new_temp_xprt(struct svc_serv *serv, struct svc_xprt *newxpt) |
|
|
|
|
{ |
|
|
|
|
spin_lock_bh(&serv->sv_lock); |
|
|
|
|
set_bit(XPT_TEMP, &newxpt->xpt_flags); |
|
|
|
|
list_add(&newxpt->xpt_list, &serv->sv_tempsocks); |
|
|
|
|
serv->sv_tmpcnt++; |
|
|
|
|
if (serv->sv_temptimer.function == NULL) { |
|
|
|
|
/* setup timer to age temp transports */ |
|
|
|
|
setup_timer(&serv->sv_temptimer, svc_age_temp_xprts, |
|
|
|
|
(unsigned long)serv); |
|
|
|
|
mod_timer(&serv->sv_temptimer, |
|
|
|
|
jiffies + svc_conn_age_period * HZ); |
|
|
|
|
} |
|
|
|
|
spin_unlock_bh(&serv->sv_lock); |
|
|
|
|
svc_xprt_received(newxpt); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int svc_handle_xprt(struct svc_rqst *rqstp, struct svc_xprt *xprt) |
|
|
|
|
{ |
|
|
|
|
struct svc_serv *serv = rqstp->rq_server; |
|
|
|
@ -692,29 +709,15 @@ static int svc_handle_xprt(struct svc_rqst *rqstp, struct svc_xprt *xprt) |
|
|
|
|
} |
|
|
|
|
if (test_bit(XPT_LISTENER, &xprt->xpt_flags)) { |
|
|
|
|
struct svc_xprt *newxpt; |
|
|
|
|
/*
|
|
|
|
|
* We know this module_get will succeed because the |
|
|
|
|
* listener holds a reference too |
|
|
|
|
*/ |
|
|
|
|
__module_get(xprt->xpt_class->xcl_owner); |
|
|
|
|
svc_check_conn_limits(xprt->xpt_server); |
|
|
|
|
newxpt = xprt->xpt_ops->xpo_accept(xprt); |
|
|
|
|
if (newxpt) { |
|
|
|
|
/*
|
|
|
|
|
* We know this module_get will succeed because the |
|
|
|
|
* listener holds a reference too |
|
|
|
|
*/ |
|
|
|
|
__module_get(newxpt->xpt_class->xcl_owner); |
|
|
|
|
svc_check_conn_limits(xprt->xpt_server); |
|
|
|
|
spin_lock_bh(&serv->sv_lock); |
|
|
|
|
set_bit(XPT_TEMP, &newxpt->xpt_flags); |
|
|
|
|
list_add(&newxpt->xpt_list, &serv->sv_tempsocks); |
|
|
|
|
serv->sv_tmpcnt++; |
|
|
|
|
if (serv->sv_temptimer.function == NULL) { |
|
|
|
|
/* setup timer to age temp transports */ |
|
|
|
|
setup_timer(&serv->sv_temptimer, |
|
|
|
|
svc_age_temp_xprts, |
|
|
|
|
(unsigned long)serv); |
|
|
|
|
mod_timer(&serv->sv_temptimer, |
|
|
|
|
jiffies + svc_conn_age_period * HZ); |
|
|
|
|
} |
|
|
|
|
spin_unlock_bh(&serv->sv_lock); |
|
|
|
|
svc_xprt_received(newxpt); |
|
|
|
|
} |
|
|
|
|
if (newxpt) |
|
|
|
|
svc_add_new_temp_xprt(serv, newxpt); |
|
|
|
|
} else if (xprt->xpt_ops->xpo_has_wspace(xprt)) { |
|
|
|
|
/* XPT_DATA|XPT_DEFERRED case: */ |
|
|
|
|
dprintk("svc: server %p, pool %u, transport %p, inuse=%d\n", |
|
|
|
|