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 | 2440 | p++; /* to be backfilled later */ |
| 2441 | 2441 | |
| 2442 | 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 | 2447 | if (!IS_POSIXACL(dentry->d_inode)) |
| 2446 | 2448 | supp[0] &= ~FATTR4_WORD0_ACL; |
| @@ -66,6 +66,7 @@ struct svc_xprt { · 65 unmodified lines | ||
| 66 | 66 | #define XPT_LISTENER 10 /* listening endpoint */ |
| 67 | 67 | #define XPT_CACHE_AUTH 11 /* cache auth info */ |
| 68 | 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 | 71 | struct svc_serv *xpt_server; /* service for transport */ |
| 71 | 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 | 1489 | case RPC_GSS_PROC_DESTROY: |
| 1490 | 1490 | if (gss_write_verf(rqstp, rsci->mechctx, gc->gc_seq)) |
| 1491 | 1491 | goto auth_err; |
| 1492 | − rsci->h.expiry_time = get_seconds(); | |
| 1492 | + rsci->h.expiry_time = seconds_since_boot(); | |
| 1493 | 1493 | set_bit(CACHE_NEGATIVE, &rsci->h.flags); |
| 1494 | 1494 | if (resv->iov_len + 4 > PAGE_SIZE) |
| 1495 | 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 | 800 | if (test_bit(XPT_CLOSE, &xprt->xpt_flags)) { |
| 801 | 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 | 804 | svc_delete_xprt(xprt); |
| 803 | 805 | /* Leave XPT_BUSY set on the dead xprt: */ |
| 804 | 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 | 1022 | le = to_be_closed.next; |
| 1021 | 1023 | list_del_init(le); |
| 1022 | 1024 | xprt = list_entry(le, struct svc_xprt, xpt_list); |
| 1023 | − dprintk("svc_age_temp_xprts_now: closing %p\n", xprt); | |
| 1024 | − xprt->xpt_ops->xpo_kill_temp_xprt(xprt); | |
| 1025 | − svc_close_xprt(xprt); | |
| 1025 | + set_bit(XPT_CLOSE, &xprt->xpt_flags); | |
| 1026 | + set_bit(XPT_KILL_TEMP, &xprt->xpt_flags); | |
| 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 | 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 | 347 | atomic_inc(&rdma_stat_read); |
| 348 | 348 | return ret; |
| 349 | 349 | err: |
| 350 | − ib_dma_unmap_sg(xprt->sc_cm_id->device, | |
| 351 | − frmr->sg, frmr->sg_nents, frmr->direction); | |
| 352 | 350 | svc_rdma_put_context(ctxt, 0); |
| 353 | 351 | svc_rdma_put_frmr(xprt, frmr); |
| 354 | 352 | return ret; |