Commit 739a6c93 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
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
parents 1f9378d4 94d10a4d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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);
	}
}
+2 −3
Original line number Diff line number Diff line
@@ -1611,7 +1611,7 @@ int nfsd_nl_rpc_status_get_dumpit(struct sk_buff *skb,
 */
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;
+3 −14
Original line number Diff line number Diff line
@@ -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 @@ svc_process_common(struct svc_rqst *rqstp)
	*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++;