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
Unified · Split
| @@ -2440,7 +2440,9 @@ nfsd4_encode_fattr(struct xdr_stream *xdr, struct svc_fh *fhp, · 2439 unmodified lines | |||
| 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; |
| @@ -66,6 +66,7 @@ struct svc_xprt { · 65 unmodified lines | |||
| 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 */ |
| @@ -1489,7 +1489,7 @@ svcauth_gss_accept(struct svc_rqst *rqstp, __be32 *authp) · 1488 unmodified lines | |||
| 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; |
| @@ -799,6 +799,8 @@ static int svc_handle_xprt(struct svc_rqst *rqstp, struct svc_xprt *xprt) · 798 unmodified lines | |||
| 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) · 215 unmodified lines | |||
| 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); |
| @@ -347,8 +347,6 @@ int rdma_read_chunk_frmr(struct svcxprt_rdma *xprt, · 346 unmodified lines | |||
| 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; |