Skip to content

Commit 2eabb8b

Browse files
committed
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
2 parents 49def18 + ce1ca7d commit 2eabb8b

File tree

5 files changed

+12
-7
lines changed

5 files changed

+12
-7
lines changed

fs/nfsd/nfs4xdr.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2440,7 +2440,9 @@ nfsd4_encode_fattr(struct xdr_stream *xdr, struct svc_fh *fhp,
24402440
p++; /* to be backfilled later */
24412441

24422442
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));
24442446

24452447
if (!IS_POSIXACL(dentry->d_inode))
24462448
supp[0] &= ~FATTR4_WORD0_ACL;

include/linux/sunrpc/svc_xprt.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ struct svc_xprt {
6666
#define XPT_LISTENER 10 /* listening endpoint */
6767
#define XPT_CACHE_AUTH 11 /* cache auth info */
6868
#define XPT_LOCAL 12 /* connection from loopback interface */
69+
#define XPT_KILL_TEMP 13 /* call xpo_kill_temp_xprt before closing */
6970

7071
struct svc_serv *xpt_server; /* service for transport */
7172
atomic_t xpt_reserved; /* space on outq that is rsvd */

net/sunrpc/auth_gss/svcauth_gss.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1489,7 +1489,7 @@ svcauth_gss_accept(struct svc_rqst *rqstp, __be32 *authp)
14891489
case RPC_GSS_PROC_DESTROY:
14901490
if (gss_write_verf(rqstp, rsci->mechctx, gc->gc_seq))
14911491
goto auth_err;
1492-
rsci->h.expiry_time = get_seconds();
1492+
rsci->h.expiry_time = seconds_since_boot();
14931493
set_bit(CACHE_NEGATIVE, &rsci->h.flags);
14941494
if (resv->iov_len + 4 > PAGE_SIZE)
14951495
goto drop;

net/sunrpc/svc_xprt.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -799,6 +799,8 @@ static int svc_handle_xprt(struct svc_rqst *rqstp, struct svc_xprt *xprt)
799799

800800
if (test_bit(XPT_CLOSE, &xprt->xpt_flags)) {
801801
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);
802804
svc_delete_xprt(xprt);
803805
/* Leave XPT_BUSY set on the dead xprt: */
804806
goto out;
@@ -1020,9 +1022,11 @@ void svc_age_temp_xprts_now(struct svc_serv *serv, struct sockaddr *server_addr)
10201022
le = to_be_closed.next;
10211023
list_del_init(le);
10221024
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);
10261030
}
10271031
}
10281032
EXPORT_SYMBOL_GPL(svc_age_temp_xprts_now);

net/sunrpc/xprtrdma/svc_rdma_recvfrom.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -347,8 +347,6 @@ int rdma_read_chunk_frmr(struct svcxprt_rdma *xprt,
347347
atomic_inc(&rdma_stat_read);
348348
return ret;
349349
err:
350-
ib_dma_unmap_sg(xprt->sc_cm_id->device,
351-
frmr->sg, frmr->sg_nents, frmr->direction);
352350
svc_rdma_put_context(ctxt, 0);
353351
svc_rdma_put_frmr(xprt, frmr);
354352
return ret;

0 commit comments

Comments
 (0)