mirror of
https://github.com/torvalds/linux.git
synced 2026-01-12 00:42:35 +08:00
Merge tag 'nfsd-6.16-1' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux
Pull nfsd fixes from Chuck Lever: - Two fixes for commits in the nfsd-6.16 merge - One fix for the recently-added NFSD netlink facility - One fix for a remote SunRPC crasher * tag 'nfsd-6.16-1' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux: sunrpc: handle SVC_GARBAGE during svc auth processing as auth error nfsd: use threads array as-is in netlink interface SUNRPC: Cleanup/fix initial rq_pages allocation NFSD: Avoid corruption of a referring call list
This commit is contained in:
@@ -1409,6 +1409,7 @@ void nfsd41_cb_referring_call(struct nfsd4_callback *cb,
|
||||
out:
|
||||
if (!rcl->__nr_referring_calls) {
|
||||
cb->cb_nr_referring_call_list--;
|
||||
list_del(&rcl->__list);
|
||||
kfree(rcl);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1611,7 +1611,7 @@ out_unlock:
|
||||
*/
|
||||
int nfsd_nl_threads_set_doit(struct sk_buff *skb, struct genl_info *info)
|
||||
{
|
||||
int *nthreads, count = 0, nrpools, i, ret = -EOPNOTSUPP, rem;
|
||||
int *nthreads, nrpools = 0, i, ret = -EOPNOTSUPP, rem;
|
||||
struct net *net = genl_info_net(info);
|
||||
struct nfsd_net *nn = net_generic(net, nfsd_net_id);
|
||||
const struct nlattr *attr;
|
||||
@@ -1623,12 +1623,11 @@ int nfsd_nl_threads_set_doit(struct sk_buff *skb, struct genl_info *info)
|
||||
/* count number of SERVER_THREADS values */
|
||||
nlmsg_for_each_attr(attr, info->nlhdr, GENL_HDRLEN, rem) {
|
||||
if (nla_type(attr) == NFSD_A_SERVER_THREADS)
|
||||
count++;
|
||||
nrpools++;
|
||||
}
|
||||
|
||||
mutex_lock(&nfsd_mutex);
|
||||
|
||||
nrpools = max(count, nfsd_nrpools(net));
|
||||
nthreads = kcalloc(nrpools, sizeof(int), GFP_KERNEL);
|
||||
if (!nthreads) {
|
||||
ret = -ENOMEM;
|
||||
|
||||
@@ -638,8 +638,6 @@ EXPORT_SYMBOL_GPL(svc_destroy);
|
||||
static bool
|
||||
svc_init_buffer(struct svc_rqst *rqstp, const struct svc_serv *serv, int node)
|
||||
{
|
||||
unsigned long ret;
|
||||
|
||||
rqstp->rq_maxpages = svc_serv_maxpages(serv);
|
||||
|
||||
/* rq_pages' last entry is NULL for historical reasons. */
|
||||
@@ -649,9 +647,7 @@ svc_init_buffer(struct svc_rqst *rqstp, const struct svc_serv *serv, int node)
|
||||
if (!rqstp->rq_pages)
|
||||
return false;
|
||||
|
||||
ret = alloc_pages_bulk_node(GFP_KERNEL, node, rqstp->rq_maxpages,
|
||||
rqstp->rq_pages);
|
||||
return ret == rqstp->rq_maxpages;
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1375,7 +1371,8 @@ svc_process_common(struct svc_rqst *rqstp)
|
||||
case SVC_OK:
|
||||
break;
|
||||
case SVC_GARBAGE:
|
||||
goto err_garbage_args;
|
||||
rqstp->rq_auth_stat = rpc_autherr_badcred;
|
||||
goto err_bad_auth;
|
||||
case SVC_SYSERR:
|
||||
goto err_system_err;
|
||||
case SVC_DENIED:
|
||||
@@ -1516,14 +1513,6 @@ err_bad_proc:
|
||||
*rqstp->rq_accept_statp = rpc_proc_unavail;
|
||||
goto sendit;
|
||||
|
||||
err_garbage_args:
|
||||
svc_printk(rqstp, "failed to decode RPC header\n");
|
||||
|
||||
if (serv->sv_stats)
|
||||
serv->sv_stats->rpcbadfmt++;
|
||||
*rqstp->rq_accept_statp = rpc_garbage_args;
|
||||
goto sendit;
|
||||
|
||||
err_system_err:
|
||||
if (serv->sv_stats)
|
||||
serv->sv_stats->rpcbadfmt++;
|
||||
|
||||
Reference in New Issue
Block a user