mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 12:11:40 +00:00
SUNRPC: change svc_recv() to return void.
svc_recv() currently returns a 0 on success or one of two errors: - -EAGAIN means no message was successfully received - -EINTR means the thread has been told to stop Previously nfsd would stop as the result of a signal as well as following kthread_stop(). In that case the difference was useful: EINTR means stop unconditionally. EAGAIN means stop if kthread_should_stop(), continue otherwise. Now threads only exit when kthread_should_stop() so we don't need the distinction. Signed-off-by: NeilBrown <neilb@suse.de> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
parent
f78116d3bf
commit
7b719e2bf3
@ -116,7 +116,6 @@ static void set_grace_period(struct net *net)
|
||||
static int
|
||||
lockd(void *vrqstp)
|
||||
{
|
||||
int err = 0;
|
||||
struct svc_rqst *rqstp = vrqstp;
|
||||
struct net *net = &init_net;
|
||||
struct lockd_net *ln = net_generic(net, lockd_net_id);
|
||||
@ -138,13 +137,7 @@ lockd(void *vrqstp)
|
||||
|
||||
timeout = nlmsvc_retry_blocked();
|
||||
|
||||
/*
|
||||
* Find a socket with data available and call its
|
||||
* recvfrom routine.
|
||||
*/
|
||||
err = svc_recv(rqstp, timeout);
|
||||
if (err == -EAGAIN || err == -EINTR)
|
||||
continue;
|
||||
svc_recv(rqstp, timeout);
|
||||
}
|
||||
if (nlmsvc_ops)
|
||||
nlmsvc_invalidate_all();
|
||||
|
@ -74,19 +74,12 @@ out_err:
|
||||
static int
|
||||
nfs4_callback_svc(void *vrqstp)
|
||||
{
|
||||
int err;
|
||||
struct svc_rqst *rqstp = vrqstp;
|
||||
|
||||
set_freezable();
|
||||
|
||||
while (!kthread_freezable_should_stop(NULL)) {
|
||||
/*
|
||||
* Listen for a request on the socket
|
||||
*/
|
||||
err = svc_recv(rqstp, MAX_SCHEDULE_TIMEOUT);
|
||||
if (err == -EAGAIN || err == -EINTR)
|
||||
continue;
|
||||
}
|
||||
while (!kthread_freezable_should_stop(NULL))
|
||||
svc_recv(rqstp, MAX_SCHEDULE_TIMEOUT);
|
||||
|
||||
svc_exit_thread(rqstp);
|
||||
return 0;
|
||||
|
@ -939,7 +939,6 @@ nfsd(void *vrqstp)
|
||||
struct svc_xprt *perm_sock = list_entry(rqstp->rq_server->sv_permsocks.next, typeof(struct svc_xprt), xpt_list);
|
||||
struct net *net = perm_sock->xpt_net;
|
||||
struct nfsd_net *nn = net_generic(net, nfsd_net_id);
|
||||
int err;
|
||||
|
||||
/* At this point, the thread shares current->fs
|
||||
* with the init process. We need to create files with the
|
||||
@ -958,19 +957,11 @@ nfsd(void *vrqstp)
|
||||
/*
|
||||
* The main request loop
|
||||
*/
|
||||
for (;;) {
|
||||
while (!kthread_should_stop()) {
|
||||
/* Update sv_maxconn if it has changed */
|
||||
rqstp->rq_server->sv_maxconn = nn->max_connections;
|
||||
|
||||
/*
|
||||
* Find a socket with data available and call its
|
||||
* recvfrom routine.
|
||||
*/
|
||||
while ((err = svc_recv(rqstp, 60*60*HZ)) == -EAGAIN)
|
||||
;
|
||||
if (err == -EINTR)
|
||||
break;
|
||||
|
||||
svc_recv(rqstp, 60*60*HZ);
|
||||
validate_process_creds();
|
||||
}
|
||||
|
||||
|
@ -57,7 +57,7 @@ static inline u32 svc_sock_final_rec(struct svc_sock *svsk)
|
||||
* Function prototypes.
|
||||
*/
|
||||
void svc_close_net(struct svc_serv *, struct net *);
|
||||
int svc_recv(struct svc_rqst *, long);
|
||||
void svc_recv(struct svc_rqst *, long);
|
||||
void svc_send(struct svc_rqst *rqstp);
|
||||
void svc_drop(struct svc_rqst *);
|
||||
void svc_sock_update_bufs(struct svc_serv *serv);
|
||||
|
@ -679,7 +679,7 @@ static void svc_check_conn_limits(struct svc_serv *serv)
|
||||
}
|
||||
}
|
||||
|
||||
static int svc_alloc_arg(struct svc_rqst *rqstp)
|
||||
static bool svc_alloc_arg(struct svc_rqst *rqstp)
|
||||
{
|
||||
struct svc_serv *serv = rqstp->rq_server;
|
||||
struct xdr_buf *arg = &rqstp->rq_arg;
|
||||
@ -704,7 +704,7 @@ static int svc_alloc_arg(struct svc_rqst *rqstp)
|
||||
set_current_state(TASK_IDLE);
|
||||
if (kthread_should_stop()) {
|
||||
set_current_state(TASK_RUNNING);
|
||||
return -EINTR;
|
||||
return false;
|
||||
}
|
||||
trace_svc_alloc_arg_err(pages, ret);
|
||||
memalloc_retry_wait(GFP_KERNEL);
|
||||
@ -723,7 +723,7 @@ static int svc_alloc_arg(struct svc_rqst *rqstp)
|
||||
arg->tail[0].iov_len = 0;
|
||||
|
||||
rqstp->rq_xid = xdr_zero;
|
||||
return 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
@ -785,8 +785,8 @@ static struct svc_xprt *svc_get_next_xprt(struct svc_rqst *rqstp, long timeout)
|
||||
percpu_counter_inc(&pool->sp_threads_timedout);
|
||||
|
||||
if (kthread_should_stop())
|
||||
return ERR_PTR(-EINTR);
|
||||
return ERR_PTR(-EAGAIN);
|
||||
return NULL;
|
||||
return NULL;
|
||||
out_found:
|
||||
/* Normally we will wait up to 5 seconds for any required
|
||||
* cache information to be provided.
|
||||
@ -868,32 +868,27 @@ out:
|
||||
* organised not to touch any cachelines in the shared svc_serv
|
||||
* structure, only cachelines in the local svc_pool.
|
||||
*/
|
||||
int svc_recv(struct svc_rqst *rqstp, long timeout)
|
||||
void svc_recv(struct svc_rqst *rqstp, long timeout)
|
||||
{
|
||||
struct svc_xprt *xprt = NULL;
|
||||
struct svc_serv *serv = rqstp->rq_server;
|
||||
int len, err;
|
||||
int len;
|
||||
|
||||
err = svc_alloc_arg(rqstp);
|
||||
if (err)
|
||||
if (!svc_alloc_arg(rqstp))
|
||||
goto out;
|
||||
|
||||
try_to_freeze();
|
||||
cond_resched();
|
||||
err = -EINTR;
|
||||
if (kthread_should_stop())
|
||||
goto out;
|
||||
|
||||
xprt = svc_get_next_xprt(rqstp, timeout);
|
||||
if (IS_ERR(xprt)) {
|
||||
err = PTR_ERR(xprt);
|
||||
if (!xprt)
|
||||
goto out;
|
||||
}
|
||||
|
||||
len = svc_handle_xprt(rqstp, xprt);
|
||||
|
||||
/* No data, incomplete (TCP) read, or accept() */
|
||||
err = -EAGAIN;
|
||||
if (len <= 0)
|
||||
goto out_release;
|
||||
|
||||
@ -907,12 +902,11 @@ int svc_recv(struct svc_rqst *rqstp, long timeout)
|
||||
serv->sv_stats->netcnt++;
|
||||
rqstp->rq_stime = ktime_get();
|
||||
svc_process(rqstp);
|
||||
return 0;
|
||||
out:
|
||||
return;
|
||||
out_release:
|
||||
rqstp->rq_res.len = 0;
|
||||
svc_xprt_release(rqstp);
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(svc_recv);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user