Merge tag 'nfsd-4.5' of git://linux-nfs.org/~bfields/linux
Pull nfsd updates from Bruce Fields: "Smaller bugfixes and cleanup, including a fix for a failures of kerberized NFSv4.1 mounts, and Scott Mayhew's work addressing ACK storms that can affect some high-availability NFS setups" * tag 'nfsd-4.5' of git://linux-nfs.org/~bfields/linux: nfsd: add new io class tracepoint nfsd: give up on CB_LAYOUTRECALLs after two lease periods nfsd: Fix nfsd leaks sunrpc module references lockd: constify nlmsvc_binding structure lockd: use to_delayed_work nfsd: use to_delayed_work Revert "svcrdma: Do not send XDR roundup bytes for a write chunk" lockd: Register callbacks on the inetaddr_chain and inet6addr_chain nfsd: Register callbacks on the inetaddr_chain and inet6addr_chain sunrpc: Add a function to close temporary transports immediately nfsd: don't base cl_cb_status on stale information nfsd4: fix gss-proxy 4.1 mounts for some AD principals nfsd: fix unlikely NULL deref in mach_creds_match nfsd: minor consolidation of mach_cred handling code nfsd: helper for dup of possibly NULL string svcrpc: move some initialization to common code nfsd: fix a warning message nfsd: constify nfsd4_callback_ops structure nfsd: recover: constify nfsd4_client_tracking_ops structures svcrdma: Do not send XDR roundup bytes for a write chunk
This commit is contained in:
@@ -326,6 +326,9 @@ int gssp_accept_sec_context_upcall(struct net *net,
|
||||
if (data->found_creds && client_name.data != NULL) {
|
||||
char *c;
|
||||
|
||||
data->creds.cr_raw_principal = kstrndup(client_name.data,
|
||||
client_name.len, GFP_KERNEL);
|
||||
|
||||
data->creds.cr_principal = kstrndup(client_name.data,
|
||||
client_name.len, GFP_KERNEL);
|
||||
if (data->creds.cr_principal) {
|
||||
|
@@ -10,11 +10,13 @@
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/slab.h>
|
||||
#include <net/sock.h>
|
||||
#include <linux/sunrpc/addr.h>
|
||||
#include <linux/sunrpc/stats.h>
|
||||
#include <linux/sunrpc/svc_xprt.h>
|
||||
#include <linux/sunrpc/svcsock.h>
|
||||
#include <linux/sunrpc/xprt.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <trace/events/sunrpc.h>
|
||||
|
||||
#define RPCDBG_FACILITY RPCDBG_SVCXPRT
|
||||
@@ -938,6 +940,49 @@ static void svc_age_temp_xprts(unsigned long closure)
|
||||
mod_timer(&serv->sv_temptimer, jiffies + svc_conn_age_period * HZ);
|
||||
}
|
||||
|
||||
/* Close temporary transports whose xpt_local matches server_addr immediately
|
||||
* instead of waiting for them to be picked up by the timer.
|
||||
*
|
||||
* This is meant to be called from a notifier_block that runs when an ip
|
||||
* address is deleted.
|
||||
*/
|
||||
void svc_age_temp_xprts_now(struct svc_serv *serv, struct sockaddr *server_addr)
|
||||
{
|
||||
struct svc_xprt *xprt;
|
||||
struct svc_sock *svsk;
|
||||
struct socket *sock;
|
||||
struct list_head *le, *next;
|
||||
LIST_HEAD(to_be_closed);
|
||||
struct linger no_linger = {
|
||||
.l_onoff = 1,
|
||||
.l_linger = 0,
|
||||
};
|
||||
|
||||
spin_lock_bh(&serv->sv_lock);
|
||||
list_for_each_safe(le, next, &serv->sv_tempsocks) {
|
||||
xprt = list_entry(le, struct svc_xprt, xpt_list);
|
||||
if (rpc_cmp_addr(server_addr, (struct sockaddr *)
|
||||
&xprt->xpt_local)) {
|
||||
dprintk("svc_age_temp_xprts_now: found %p\n", xprt);
|
||||
list_move(le, &to_be_closed);
|
||||
}
|
||||
}
|
||||
spin_unlock_bh(&serv->sv_lock);
|
||||
|
||||
while (!list_empty(&to_be_closed)) {
|
||||
le = to_be_closed.next;
|
||||
list_del_init(le);
|
||||
xprt = list_entry(le, struct svc_xprt, xpt_list);
|
||||
dprintk("svc_age_temp_xprts_now: closing %p\n", xprt);
|
||||
svsk = container_of(xprt, struct svc_sock, sk_xprt);
|
||||
sock = svsk->sk_sock;
|
||||
kernel_setsockopt(sock, SOL_SOCKET, SO_LINGER,
|
||||
(char *)&no_linger, sizeof(no_linger));
|
||||
svc_close_xprt(xprt);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(svc_age_temp_xprts_now);
|
||||
|
||||
static void call_xpt_users(struct svc_xprt *xprt)
|
||||
{
|
||||
struct svc_xpt_user *u;
|
||||
|
@@ -55,6 +55,7 @@ svc_authenticate(struct svc_rqst *rqstp, __be32 *authp)
|
||||
spin_unlock(&authtab_lock);
|
||||
|
||||
rqstp->rq_auth_slack = 0;
|
||||
init_svc_cred(&rqstp->rq_cred);
|
||||
|
||||
rqstp->rq_authop = aops;
|
||||
return aops->accept(rqstp, authp);
|
||||
@@ -63,6 +64,7 @@ EXPORT_SYMBOL_GPL(svc_authenticate);
|
||||
|
||||
int svc_set_client(struct svc_rqst *rqstp)
|
||||
{
|
||||
rqstp->rq_client = NULL;
|
||||
return rqstp->rq_authop->set_client(rqstp);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(svc_set_client);
|
||||
|
@@ -728,10 +728,6 @@ svcauth_null_accept(struct svc_rqst *rqstp, __be32 *authp)
|
||||
struct kvec *resv = &rqstp->rq_res.head[0];
|
||||
struct svc_cred *cred = &rqstp->rq_cred;
|
||||
|
||||
cred->cr_group_info = NULL;
|
||||
cred->cr_principal = NULL;
|
||||
rqstp->rq_client = NULL;
|
||||
|
||||
if (argv->iov_len < 3*4)
|
||||
return SVC_GARBAGE;
|
||||
|
||||
@@ -794,10 +790,6 @@ svcauth_unix_accept(struct svc_rqst *rqstp, __be32 *authp)
|
||||
u32 slen, i;
|
||||
int len = argv->iov_len;
|
||||
|
||||
cred->cr_group_info = NULL;
|
||||
cred->cr_principal = NULL;
|
||||
rqstp->rq_client = NULL;
|
||||
|
||||
if ((len -= 3*4) < 0)
|
||||
return SVC_GARBAGE;
|
||||
|
||||
|
Reference in New Issue
Block a user