mirror of
https://github.com/torvalds/linux.git
synced 2024-12-28 13:51:44 +00:00
nfsd-6.4 fixes:
- A collection of minor bug fixes -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEKLLlsBKG3yQ88j7+M2qzM29mf5cFAmRiQVEACgkQM2qzM29m f5eYfBAAg5Qz45PL+fo1qWxkJ1ZKaNV1vPdi4tqCt9NEItDTjAnjj0am+rKNGZAz EOM2yFt4xaZGyMYgXe4VnYl0N+rSpbI/H+Rk/wOq4OHPURQD5EO9VeP86qZ7rmGl ECPqb39TFTwAiRomC/DHO4eNpoe1rQuXu0tW9+GmqDGxeuh8xdxTk33g17ZXwCFN tdPkkPjxVPdWd8X7HQg9kWm8AWfV+GyuzE2rKAoOjbs6Wv6d9GCY8Cb5HXkRsQhF 4Zh0PVQuTuXurZwtPXwnS0k4kfvQwjlTIKHlXuo0ZLh+SuFbrWHzv0fVyD+kUpSK HtWbJ8JcruUvz0WGMtZatzRLHCZLDguV6oVXPp7rtmuxTj4szzHSFpEeAV901sIm Nkvuomvd02K/fiTo7s3yr6t1VG2vju9LDwhBe197iA3leHAlockfbbxE3NJMGbzQ NoOPd+lu95cfsanOM1LZZLNfbLrZofoSLK9K1+HD0yAVdyq7u47FyHRrymvCaMrj GiheuqrBfBMEq+2mCwUn37aM0FblYEXQM0xTVXPQcHtBBN/nGZxPJukmpr7ScNlR aqMtDoOLu4OEFuo6fe2/94eNi+N5XAZgWmx/mSyaytE8Xw9LJxeQ83UTigaGcYKc 3YIuG1YXg9IyIoIdLkghB+Aj/6fivsGFK9Gud6g7I3xw4f15noA= =PiNG -----END PGP SIGNATURE----- Merge tag 'nfsd-6.4-1' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux Pull nfsd fixes from Chuck Lever: - A collection of minor bug fixes * tag 'nfsd-6.4-1' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux: NFSD: Remove open coding of string copy SUNRPC: Fix trace_svc_register() call site SUNRPC: always free ctxt when freeing deferred request SUNRPC: double free xprt_ctxt while still in use SUNRPC: Fix error handling in svc_setup_socket() SUNRPC: Fix encoding of accepted but unsuccessful RPC replies lockd: define nlm_port_min,max with CONFIG_SYSCTL nfsd: define exports_proc_ops with CONFIG_PROC_FS SUNRPC: Avoid relying on crypto API to derive CBC-CTS output IV
This commit is contained in:
commit
1b66c114d1
@ -77,9 +77,9 @@ static const unsigned long nlm_grace_period_min = 0;
|
||||
static const unsigned long nlm_grace_period_max = 240;
|
||||
static const unsigned long nlm_timeout_min = 3;
|
||||
static const unsigned long nlm_timeout_max = 20;
|
||||
static const int nlm_port_min = 0, nlm_port_max = 65535;
|
||||
|
||||
#ifdef CONFIG_SYSCTL
|
||||
static const int nlm_port_min = 0, nlm_port_max = 65535;
|
||||
static struct ctl_table_header * nlm_sysctl_table;
|
||||
#endif
|
||||
|
||||
|
@ -153,18 +153,6 @@ static int exports_net_open(struct net *net, struct file *file)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int exports_proc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return exports_net_open(current->nsproxy->net_ns, file);
|
||||
}
|
||||
|
||||
static const struct proc_ops exports_proc_ops = {
|
||||
.proc_open = exports_proc_open,
|
||||
.proc_read = seq_read,
|
||||
.proc_lseek = seq_lseek,
|
||||
.proc_release = seq_release,
|
||||
};
|
||||
|
||||
static int exports_nfsd_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return exports_net_open(inode->i_sb->s_fs_info, file);
|
||||
@ -1458,6 +1446,19 @@ static struct file_system_type nfsd_fs_type = {
|
||||
MODULE_ALIAS_FS("nfsd");
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
|
||||
static int exports_proc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return exports_net_open(current->nsproxy->net_ns, file);
|
||||
}
|
||||
|
||||
static const struct proc_ops exports_proc_ops = {
|
||||
.proc_open = exports_proc_open,
|
||||
.proc_read = seq_read,
|
||||
.proc_lseek = seq_lseek,
|
||||
.proc_release = seq_release,
|
||||
};
|
||||
|
||||
static int create_proc_exports_entry(void)
|
||||
{
|
||||
struct proc_dir_entry *entry;
|
||||
|
@ -1365,19 +1365,19 @@ TRACE_EVENT(nfsd_cb_setup,
|
||||
__field(u32, cl_id)
|
||||
__field(unsigned long, authflavor)
|
||||
__sockaddr(addr, clp->cl_cb_conn.cb_addrlen)
|
||||
__array(unsigned char, netid, 8)
|
||||
__string(netid, netid)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->cl_boot = clp->cl_clientid.cl_boot;
|
||||
__entry->cl_id = clp->cl_clientid.cl_id;
|
||||
strlcpy(__entry->netid, netid, sizeof(__entry->netid));
|
||||
__assign_str(netid, netid);
|
||||
__entry->authflavor = authflavor;
|
||||
__assign_sockaddr(addr, &clp->cl_cb_conn.cb_addr,
|
||||
clp->cl_cb_conn.cb_addrlen)
|
||||
),
|
||||
TP_printk("addr=%pISpc client %08x:%08x proto=%s flavor=%s",
|
||||
__get_sockaddr(addr), __entry->cl_boot, __entry->cl_id,
|
||||
__entry->netid, show_nfsd_authflavor(__entry->authflavor))
|
||||
__get_str(netid), show_nfsd_authflavor(__entry->authflavor))
|
||||
);
|
||||
|
||||
TRACE_EVENT(nfsd_cb_setup_err,
|
||||
|
@ -176,7 +176,7 @@ extern struct svc_rdma_recv_ctxt *
|
||||
extern void svc_rdma_recv_ctxt_put(struct svcxprt_rdma *rdma,
|
||||
struct svc_rdma_recv_ctxt *ctxt);
|
||||
extern void svc_rdma_flush_recv_queues(struct svcxprt_rdma *rdma);
|
||||
extern void svc_rdma_release_rqst(struct svc_rqst *rqstp);
|
||||
extern void svc_rdma_release_ctxt(struct svc_xprt *xprt, void *ctxt);
|
||||
extern int svc_rdma_recvfrom(struct svc_rqst *);
|
||||
|
||||
/* svc_rdma_rw.c */
|
||||
|
@ -23,7 +23,7 @@ struct svc_xprt_ops {
|
||||
int (*xpo_sendto)(struct svc_rqst *);
|
||||
int (*xpo_result_payload)(struct svc_rqst *, unsigned int,
|
||||
unsigned int);
|
||||
void (*xpo_release_rqst)(struct svc_rqst *);
|
||||
void (*xpo_release_ctxt)(struct svc_xprt *xprt, void *ctxt);
|
||||
void (*xpo_detach)(struct svc_xprt *);
|
||||
void (*xpo_free)(struct svc_xprt *);
|
||||
void (*xpo_kill_temp_xprt)(struct svc_xprt *);
|
||||
|
@ -639,6 +639,16 @@ gss_krb5_cts_crypt(struct crypto_sync_skcipher *cipher, struct xdr_buf *buf,
|
||||
|
||||
ret = write_bytes_to_xdr_buf(buf, offset, data, len);
|
||||
|
||||
#if IS_ENABLED(CONFIG_KUNIT)
|
||||
/*
|
||||
* CBC-CTS does not define an output IV but RFC 3962 defines it as the
|
||||
* penultimate block of ciphertext, so copy that into the IV buffer
|
||||
* before returning.
|
||||
*/
|
||||
if (encrypt)
|
||||
memcpy(iv, data, crypto_sync_skcipher_ivsize(cipher));
|
||||
#endif
|
||||
|
||||
out:
|
||||
kfree(data);
|
||||
return ret;
|
||||
|
@ -1052,7 +1052,7 @@ static int __svc_register(struct net *net, const char *progname,
|
||||
#endif
|
||||
}
|
||||
|
||||
trace_svc_register(progname, version, protocol, port, family, error);
|
||||
trace_svc_register(progname, version, family, protocol, port, error);
|
||||
return error;
|
||||
}
|
||||
|
||||
@ -1416,7 +1416,7 @@ err_bad_rpc:
|
||||
/* Only RPCv2 supported */
|
||||
xdr_stream_encode_u32(xdr, RPC_VERSION);
|
||||
xdr_stream_encode_u32(xdr, RPC_VERSION);
|
||||
goto sendit;
|
||||
return 1; /* don't wrap */
|
||||
|
||||
err_bad_auth:
|
||||
dprintk("svc: authentication failed (%d)\n",
|
||||
@ -1432,7 +1432,7 @@ err_bad_auth:
|
||||
err_bad_prog:
|
||||
dprintk("svc: unknown program %d\n", rqstp->rq_prog);
|
||||
serv->sv_stats->rpcbadfmt++;
|
||||
xdr_stream_encode_u32(xdr, RPC_PROG_UNAVAIL);
|
||||
*rqstp->rq_accept_statp = rpc_prog_unavail;
|
||||
goto sendit;
|
||||
|
||||
err_bad_vers:
|
||||
@ -1440,7 +1440,12 @@ err_bad_vers:
|
||||
rqstp->rq_vers, rqstp->rq_prog, progp->pg_name);
|
||||
|
||||
serv->sv_stats->rpcbadfmt++;
|
||||
xdr_stream_encode_u32(xdr, RPC_PROG_MISMATCH);
|
||||
*rqstp->rq_accept_statp = rpc_prog_mismatch;
|
||||
|
||||
/*
|
||||
* svc_authenticate() has already added the verifier and
|
||||
* advanced the stream just past rq_accept_statp.
|
||||
*/
|
||||
xdr_stream_encode_u32(xdr, process.mismatch.lovers);
|
||||
xdr_stream_encode_u32(xdr, process.mismatch.hivers);
|
||||
goto sendit;
|
||||
@ -1449,19 +1454,19 @@ err_bad_proc:
|
||||
svc_printk(rqstp, "unknown procedure (%d)\n", rqstp->rq_proc);
|
||||
|
||||
serv->sv_stats->rpcbadfmt++;
|
||||
xdr_stream_encode_u32(xdr, RPC_PROC_UNAVAIL);
|
||||
*rqstp->rq_accept_statp = rpc_proc_unavail;
|
||||
goto sendit;
|
||||
|
||||
err_garbage_args:
|
||||
svc_printk(rqstp, "failed to decode RPC header\n");
|
||||
|
||||
serv->sv_stats->rpcbadfmt++;
|
||||
xdr_stream_encode_u32(xdr, RPC_GARBAGE_ARGS);
|
||||
*rqstp->rq_accept_statp = rpc_garbage_args;
|
||||
goto sendit;
|
||||
|
||||
err_system_err:
|
||||
serv->sv_stats->rpcbadfmt++;
|
||||
xdr_stream_encode_u32(xdr, RPC_SYSTEM_ERR);
|
||||
*rqstp->rq_accept_statp = rpc_system_err;
|
||||
goto sendit;
|
||||
}
|
||||
|
||||
|
@ -532,13 +532,23 @@ void svc_reserve(struct svc_rqst *rqstp, int space)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(svc_reserve);
|
||||
|
||||
static void free_deferred(struct svc_xprt *xprt, struct svc_deferred_req *dr)
|
||||
{
|
||||
if (!dr)
|
||||
return;
|
||||
|
||||
xprt->xpt_ops->xpo_release_ctxt(xprt, dr->xprt_ctxt);
|
||||
kfree(dr);
|
||||
}
|
||||
|
||||
static void svc_xprt_release(struct svc_rqst *rqstp)
|
||||
{
|
||||
struct svc_xprt *xprt = rqstp->rq_xprt;
|
||||
|
||||
xprt->xpt_ops->xpo_release_rqst(rqstp);
|
||||
xprt->xpt_ops->xpo_release_ctxt(xprt, rqstp->rq_xprt_ctxt);
|
||||
rqstp->rq_xprt_ctxt = NULL;
|
||||
|
||||
kfree(rqstp->rq_deferred);
|
||||
free_deferred(xprt, rqstp->rq_deferred);
|
||||
rqstp->rq_deferred = NULL;
|
||||
|
||||
svc_rqst_release_pages(rqstp);
|
||||
@ -1054,7 +1064,7 @@ static void svc_delete_xprt(struct svc_xprt *xprt)
|
||||
spin_unlock_bh(&serv->sv_lock);
|
||||
|
||||
while ((dr = svc_deferred_dequeue(xprt)) != NULL)
|
||||
kfree(dr);
|
||||
free_deferred(xprt, dr);
|
||||
|
||||
call_xpt_users(xprt);
|
||||
svc_xprt_put(xprt);
|
||||
@ -1176,8 +1186,8 @@ static void svc_revisit(struct cache_deferred_req *dreq, int too_many)
|
||||
if (too_many || test_bit(XPT_DEAD, &xprt->xpt_flags)) {
|
||||
spin_unlock(&xprt->xpt_lock);
|
||||
trace_svc_defer_drop(dr);
|
||||
free_deferred(xprt, dr);
|
||||
svc_xprt_put(xprt);
|
||||
kfree(dr);
|
||||
return;
|
||||
}
|
||||
dr->xprt = NULL;
|
||||
@ -1222,14 +1232,14 @@ static struct cache_deferred_req *svc_defer(struct cache_req *req)
|
||||
dr->addrlen = rqstp->rq_addrlen;
|
||||
dr->daddr = rqstp->rq_daddr;
|
||||
dr->argslen = rqstp->rq_arg.len >> 2;
|
||||
dr->xprt_ctxt = rqstp->rq_xprt_ctxt;
|
||||
rqstp->rq_xprt_ctxt = NULL;
|
||||
|
||||
/* back up head to the start of the buffer and copy */
|
||||
skip = rqstp->rq_arg.len - rqstp->rq_arg.head[0].iov_len;
|
||||
memcpy(dr->args, rqstp->rq_arg.head[0].iov_base - skip,
|
||||
dr->argslen << 2);
|
||||
}
|
||||
dr->xprt_ctxt = rqstp->rq_xprt_ctxt;
|
||||
rqstp->rq_xprt_ctxt = NULL;
|
||||
trace_svc_defer(rqstp);
|
||||
svc_xprt_get(rqstp->rq_xprt);
|
||||
dr->xprt = rqstp->rq_xprt;
|
||||
@ -1262,6 +1272,8 @@ static noinline int svc_deferred_recv(struct svc_rqst *rqstp)
|
||||
rqstp->rq_daddr = dr->daddr;
|
||||
rqstp->rq_respages = rqstp->rq_pages;
|
||||
rqstp->rq_xprt_ctxt = dr->xprt_ctxt;
|
||||
|
||||
dr->xprt_ctxt = NULL;
|
||||
svc_xprt_received(rqstp->rq_xprt);
|
||||
return dr->argslen << 2;
|
||||
}
|
||||
|
@ -121,27 +121,27 @@ static void svc_reclassify_socket(struct socket *sock)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* svc_tcp_release_rqst - Release transport-related resources
|
||||
* @rqstp: request structure with resources to be released
|
||||
* svc_tcp_release_ctxt - Release transport-related resources
|
||||
* @xprt: the transport which owned the context
|
||||
* @ctxt: the context from rqstp->rq_xprt_ctxt or dr->xprt_ctxt
|
||||
*
|
||||
*/
|
||||
static void svc_tcp_release_rqst(struct svc_rqst *rqstp)
|
||||
static void svc_tcp_release_ctxt(struct svc_xprt *xprt, void *ctxt)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* svc_udp_release_rqst - Release transport-related resources
|
||||
* @rqstp: request structure with resources to be released
|
||||
* svc_udp_release_ctxt - Release transport-related resources
|
||||
* @xprt: the transport which owned the context
|
||||
* @ctxt: the context from rqstp->rq_xprt_ctxt or dr->xprt_ctxt
|
||||
*
|
||||
*/
|
||||
static void svc_udp_release_rqst(struct svc_rqst *rqstp)
|
||||
static void svc_udp_release_ctxt(struct svc_xprt *xprt, void *ctxt)
|
||||
{
|
||||
struct sk_buff *skb = rqstp->rq_xprt_ctxt;
|
||||
struct sk_buff *skb = ctxt;
|
||||
|
||||
if (skb) {
|
||||
rqstp->rq_xprt_ctxt = NULL;
|
||||
if (skb)
|
||||
consume_skb(skb);
|
||||
}
|
||||
}
|
||||
|
||||
union svc_pktinfo_u {
|
||||
@ -696,7 +696,8 @@ static int svc_udp_sendto(struct svc_rqst *rqstp)
|
||||
unsigned int sent;
|
||||
int err;
|
||||
|
||||
svc_udp_release_rqst(rqstp);
|
||||
svc_udp_release_ctxt(xprt, rqstp->rq_xprt_ctxt);
|
||||
rqstp->rq_xprt_ctxt = NULL;
|
||||
|
||||
svc_set_cmsg_data(rqstp, cmh);
|
||||
|
||||
@ -768,7 +769,7 @@ static const struct svc_xprt_ops svc_udp_ops = {
|
||||
.xpo_recvfrom = svc_udp_recvfrom,
|
||||
.xpo_sendto = svc_udp_sendto,
|
||||
.xpo_result_payload = svc_sock_result_payload,
|
||||
.xpo_release_rqst = svc_udp_release_rqst,
|
||||
.xpo_release_ctxt = svc_udp_release_ctxt,
|
||||
.xpo_detach = svc_sock_detach,
|
||||
.xpo_free = svc_sock_free,
|
||||
.xpo_has_wspace = svc_udp_has_wspace,
|
||||
@ -895,6 +896,9 @@ static struct svc_xprt *svc_tcp_accept(struct svc_xprt *xprt)
|
||||
trace_svcsock_accept_err(xprt, serv->sv_name, err);
|
||||
return NULL;
|
||||
}
|
||||
if (IS_ERR(sock_alloc_file(newsock, O_NONBLOCK, NULL)))
|
||||
return NULL;
|
||||
|
||||
set_bit(XPT_CONN, &svsk->sk_xprt.xpt_flags);
|
||||
|
||||
err = kernel_getpeername(newsock, sin);
|
||||
@ -935,7 +939,7 @@ static struct svc_xprt *svc_tcp_accept(struct svc_xprt *xprt)
|
||||
return &newsvsk->sk_xprt;
|
||||
|
||||
failed:
|
||||
sock_release(newsock);
|
||||
sockfd_put(newsock);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -1298,7 +1302,8 @@ static int svc_tcp_sendto(struct svc_rqst *rqstp)
|
||||
unsigned int sent;
|
||||
int err;
|
||||
|
||||
svc_tcp_release_rqst(rqstp);
|
||||
svc_tcp_release_ctxt(xprt, rqstp->rq_xprt_ctxt);
|
||||
rqstp->rq_xprt_ctxt = NULL;
|
||||
|
||||
atomic_inc(&svsk->sk_sendqlen);
|
||||
mutex_lock(&xprt->xpt_mutex);
|
||||
@ -1343,7 +1348,7 @@ static const struct svc_xprt_ops svc_tcp_ops = {
|
||||
.xpo_recvfrom = svc_tcp_recvfrom,
|
||||
.xpo_sendto = svc_tcp_sendto,
|
||||
.xpo_result_payload = svc_sock_result_payload,
|
||||
.xpo_release_rqst = svc_tcp_release_rqst,
|
||||
.xpo_release_ctxt = svc_tcp_release_ctxt,
|
||||
.xpo_detach = svc_tcp_sock_detach,
|
||||
.xpo_free = svc_sock_free,
|
||||
.xpo_has_wspace = svc_tcp_has_wspace,
|
||||
@ -1430,7 +1435,6 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv,
|
||||
struct socket *sock,
|
||||
int flags)
|
||||
{
|
||||
struct file *filp = NULL;
|
||||
struct svc_sock *svsk;
|
||||
struct sock *inet;
|
||||
int pmap_register = !(flags & SVC_SOCK_ANONYMOUS);
|
||||
@ -1439,14 +1443,6 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv,
|
||||
if (!svsk)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
if (!sock->file) {
|
||||
filp = sock_alloc_file(sock, O_NONBLOCK, NULL);
|
||||
if (IS_ERR(filp)) {
|
||||
kfree(svsk);
|
||||
return ERR_CAST(filp);
|
||||
}
|
||||
}
|
||||
|
||||
inet = sock->sk;
|
||||
|
||||
if (pmap_register) {
|
||||
@ -1456,8 +1452,6 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv,
|
||||
inet->sk_protocol,
|
||||
ntohs(inet_sk(inet)->inet_sport));
|
||||
if (err < 0) {
|
||||
if (filp)
|
||||
fput(filp);
|
||||
kfree(svsk);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
@ -239,21 +239,20 @@ void svc_rdma_recv_ctxt_put(struct svcxprt_rdma *rdma,
|
||||
}
|
||||
|
||||
/**
|
||||
* svc_rdma_release_rqst - Release transport-specific per-rqst resources
|
||||
* @rqstp: svc_rqst being released
|
||||
* svc_rdma_release_ctxt - Release transport-specific per-rqst resources
|
||||
* @xprt: the transport which owned the context
|
||||
* @vctxt: the context from rqstp->rq_xprt_ctxt or dr->xprt_ctxt
|
||||
*
|
||||
* Ensure that the recv_ctxt is released whether or not a Reply
|
||||
* was sent. For example, the client could close the connection,
|
||||
* or svc_process could drop an RPC, before the Reply is sent.
|
||||
*/
|
||||
void svc_rdma_release_rqst(struct svc_rqst *rqstp)
|
||||
void svc_rdma_release_ctxt(struct svc_xprt *xprt, void *vctxt)
|
||||
{
|
||||
struct svc_rdma_recv_ctxt *ctxt = rqstp->rq_xprt_ctxt;
|
||||
struct svc_xprt *xprt = rqstp->rq_xprt;
|
||||
struct svc_rdma_recv_ctxt *ctxt = vctxt;
|
||||
struct svcxprt_rdma *rdma =
|
||||
container_of(xprt, struct svcxprt_rdma, sc_xprt);
|
||||
|
||||
rqstp->rq_xprt_ctxt = NULL;
|
||||
if (ctxt)
|
||||
svc_rdma_recv_ctxt_put(rdma, ctxt);
|
||||
}
|
||||
|
@ -80,7 +80,7 @@ static const struct svc_xprt_ops svc_rdma_ops = {
|
||||
.xpo_recvfrom = svc_rdma_recvfrom,
|
||||
.xpo_sendto = svc_rdma_sendto,
|
||||
.xpo_result_payload = svc_rdma_result_payload,
|
||||
.xpo_release_rqst = svc_rdma_release_rqst,
|
||||
.xpo_release_ctxt = svc_rdma_release_ctxt,
|
||||
.xpo_detach = svc_rdma_detach,
|
||||
.xpo_free = svc_rdma_free,
|
||||
.xpo_has_wspace = svc_rdma_has_wspace,
|
||||
|
Loading…
Reference in New Issue
Block a user