diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-01-16 12:34:37 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-01-16 12:34:37 -0500 |
commit | 2eabb8b8d68bc9c7779ba8b04bec8d4f8baed0bc (patch) | |
tree | 4d8ea8e6ca52f1938269937834641205d8d888f0 | |
parent | 49def1853334396f948dcb4cedb9347abb318df5 (diff) | |
parent | ce1ca7d2d140a1f4aaffd297ac487f246963dd2f (diff) |
Merge tag 'nfsd-4.10-1' of git://linux-nfs.org/~bfields/linux
Pull nfsd fixes from Bruce Fields:
"Miscellaneous nfsd bugfixes, one for a 4.10 regression, three for
older bugs"
* tag 'nfsd-4.10-1' of git://linux-nfs.org/~bfields/linux:
svcrdma: avoid duplicate dma unmapping during error recovery
sunrpc: don't call sleeping functions from the notifier block callbacks
svcrpc: don't leak contexts on PROC_DESTROY
nfsd: fix supported attributes for acl & labels
-rw-r--r-- | fs/nfsd/nfs4xdr.c | 4 | ||||
-rw-r--r-- | include/linux/sunrpc/svc_xprt.h | 1 | ||||
-rw-r--r-- | net/sunrpc/auth_gss/svcauth_gss.c | 2 | ||||
-rw-r--r-- | net/sunrpc/svc_xprt.c | 10 | ||||
-rw-r--r-- | net/sunrpc/xprtrdma/svc_rdma_recvfrom.c | 2 |
5 files changed, 12 insertions, 7 deletions
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index 7ecf16be4a44..8fae53ce21d1 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c | |||
@@ -2440,7 +2440,9 @@ nfsd4_encode_fattr(struct xdr_stream *xdr, struct svc_fh *fhp, | |||
2440 | p++; /* to be backfilled later */ | 2440 | p++; /* to be backfilled later */ |
2441 | 2441 | ||
2442 | if (bmval0 & FATTR4_WORD0_SUPPORTED_ATTRS) { | 2442 | if (bmval0 & FATTR4_WORD0_SUPPORTED_ATTRS) { |
2443 | u32 *supp = nfsd_suppattrs[minorversion]; | 2443 | u32 supp[3]; |
2444 | |||
2445 | memcpy(supp, nfsd_suppattrs[minorversion], sizeof(supp)); | ||
2444 | 2446 | ||
2445 | if (!IS_POSIXACL(dentry->d_inode)) | 2447 | if (!IS_POSIXACL(dentry->d_inode)) |
2446 | supp[0] &= ~FATTR4_WORD0_ACL; | 2448 | supp[0] &= ~FATTR4_WORD0_ACL; |
diff --git a/include/linux/sunrpc/svc_xprt.h b/include/linux/sunrpc/svc_xprt.h index e5d193440374..7440290f64ac 100644 --- a/include/linux/sunrpc/svc_xprt.h +++ b/include/linux/sunrpc/svc_xprt.h | |||
@@ -66,6 +66,7 @@ struct svc_xprt { | |||
66 | #define XPT_LISTENER 10 /* listening endpoint */ | 66 | #define XPT_LISTENER 10 /* listening endpoint */ |
67 | #define XPT_CACHE_AUTH 11 /* cache auth info */ | 67 | #define XPT_CACHE_AUTH 11 /* cache auth info */ |
68 | #define XPT_LOCAL 12 /* connection from loopback interface */ | 68 | #define XPT_LOCAL 12 /* connection from loopback interface */ |
69 | #define XPT_KILL_TEMP 13 /* call xpo_kill_temp_xprt before closing */ | ||
69 | 70 | ||
70 | struct svc_serv *xpt_server; /* service for transport */ | 71 | struct svc_serv *xpt_server; /* service for transport */ |
71 | atomic_t xpt_reserved; /* space on outq that is rsvd */ | 72 | atomic_t xpt_reserved; /* space on outq that is rsvd */ |
diff --git a/net/sunrpc/auth_gss/svcauth_gss.c b/net/sunrpc/auth_gss/svcauth_gss.c index 886e9d381771..153082598522 100644 --- a/net/sunrpc/auth_gss/svcauth_gss.c +++ b/net/sunrpc/auth_gss/svcauth_gss.c | |||
@@ -1489,7 +1489,7 @@ svcauth_gss_accept(struct svc_rqst *rqstp, __be32 *authp) | |||
1489 | case RPC_GSS_PROC_DESTROY: | 1489 | case RPC_GSS_PROC_DESTROY: |
1490 | if (gss_write_verf(rqstp, rsci->mechctx, gc->gc_seq)) | 1490 | if (gss_write_verf(rqstp, rsci->mechctx, gc->gc_seq)) |
1491 | goto auth_err; | 1491 | goto auth_err; |
1492 | rsci->h.expiry_time = get_seconds(); | 1492 | rsci->h.expiry_time = seconds_since_boot(); |
1493 | set_bit(CACHE_NEGATIVE, &rsci->h.flags); | 1493 | set_bit(CACHE_NEGATIVE, &rsci->h.flags); |
1494 | if (resv->iov_len + 4 > PAGE_SIZE) | 1494 | if (resv->iov_len + 4 > PAGE_SIZE) |
1495 | goto drop; | 1495 | goto drop; |
diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c index 3bc1d61694cb..9c9db55a0c1e 100644 --- a/net/sunrpc/svc_xprt.c +++ b/net/sunrpc/svc_xprt.c | |||
@@ -799,6 +799,8 @@ static int svc_handle_xprt(struct svc_rqst *rqstp, struct svc_xprt *xprt) | |||
799 | 799 | ||
800 | if (test_bit(XPT_CLOSE, &xprt->xpt_flags)) { | 800 | if (test_bit(XPT_CLOSE, &xprt->xpt_flags)) { |
801 | dprintk("svc_recv: found XPT_CLOSE\n"); | 801 | dprintk("svc_recv: found XPT_CLOSE\n"); |
802 | if (test_and_clear_bit(XPT_KILL_TEMP, &xprt->xpt_flags)) | ||
803 | xprt->xpt_ops->xpo_kill_temp_xprt(xprt); | ||
802 | svc_delete_xprt(xprt); | 804 | svc_delete_xprt(xprt); |
803 | /* Leave XPT_BUSY set on the dead xprt: */ | 805 | /* Leave XPT_BUSY set on the dead xprt: */ |
804 | goto out; | 806 | goto out; |
@@ -1020,9 +1022,11 @@ void svc_age_temp_xprts_now(struct svc_serv *serv, struct sockaddr *server_addr) | |||
1020 | le = to_be_closed.next; | 1022 | le = to_be_closed.next; |
1021 | list_del_init(le); | 1023 | list_del_init(le); |
1022 | xprt = list_entry(le, struct svc_xprt, xpt_list); | 1024 | xprt = list_entry(le, struct svc_xprt, xpt_list); |
1023 | dprintk("svc_age_temp_xprts_now: closing %p\n", xprt); | 1025 | set_bit(XPT_CLOSE, &xprt->xpt_flags); |
1024 | xprt->xpt_ops->xpo_kill_temp_xprt(xprt); | 1026 | set_bit(XPT_KILL_TEMP, &xprt->xpt_flags); |
1025 | svc_close_xprt(xprt); | 1027 | dprintk("svc_age_temp_xprts_now: queuing xprt %p for closing\n", |
1028 | xprt); | ||
1029 | svc_xprt_enqueue(xprt); | ||
1026 | } | 1030 | } |
1027 | } | 1031 | } |
1028 | EXPORT_SYMBOL_GPL(svc_age_temp_xprts_now); | 1032 | EXPORT_SYMBOL_GPL(svc_age_temp_xprts_now); |
diff --git a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c index 57d35fbb1c28..172b537f8cfc 100644 --- a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c +++ b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c | |||
@@ -347,8 +347,6 @@ int rdma_read_chunk_frmr(struct svcxprt_rdma *xprt, | |||
347 | atomic_inc(&rdma_stat_read); | 347 | atomic_inc(&rdma_stat_read); |
348 | return ret; | 348 | return ret; |
349 | err: | 349 | err: |
350 | ib_dma_unmap_sg(xprt->sc_cm_id->device, | ||
351 | frmr->sg, frmr->sg_nents, frmr->direction); | ||
352 | svc_rdma_put_context(ctxt, 0); | 350 | svc_rdma_put_context(ctxt, 0); |
353 | svc_rdma_put_frmr(xprt, frmr); | 351 | svc_rdma_put_frmr(xprt, frmr); |
354 | return ret; | 352 | return ret; |