aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfsd/nfs4state.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfsd/nfs4state.c')
-rw-r--r--fs/nfsd/nfs4state.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index c484a2b6cd10..0462eeddfff9 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -2408,7 +2408,8 @@ nfsd4_exchange_id(struct svc_rqst *rqstp,
2408 default: /* checked by xdr code */ 2408 default: /* checked by xdr code */
2409 WARN_ON_ONCE(1); 2409 WARN_ON_ONCE(1);
2410 case SP4_SSV: 2410 case SP4_SSV:
2411 return nfserr_encr_alg_unsupp; 2411 status = nfserr_encr_alg_unsupp;
2412 goto out_nolock;
2412 } 2413 }
2413 2414
2414 /* Cases below refer to rfc 5661 section 18.35.4: */ 2415 /* Cases below refer to rfc 5661 section 18.35.4: */
@@ -2586,21 +2587,26 @@ static __be32 check_forechannel_attrs(struct nfsd4_channel_attrs *ca, struct nfs
2586 return nfs_ok; 2587 return nfs_ok;
2587} 2588}
2588 2589
2590/*
2591 * Server's NFSv4.1 backchannel support is AUTH_SYS-only for now.
2592 * These are based on similar macros in linux/sunrpc/msg_prot.h .
2593 */
2594#define RPC_MAX_HEADER_WITH_AUTH_SYS \
2595 (RPC_CALLHDRSIZE + 2 * (2 + UNX_CALLSLACK))
2596
2597#define RPC_MAX_REPHEADER_WITH_AUTH_SYS \
2598 (RPC_REPHDRSIZE + (2 + NUL_REPLYSLACK))
2599
2589#define NFSD_CB_MAX_REQ_SZ ((NFS4_enc_cb_recall_sz + \ 2600#define NFSD_CB_MAX_REQ_SZ ((NFS4_enc_cb_recall_sz + \
2590 RPC_MAX_HEADER_WITH_AUTH) * sizeof(__be32)) 2601 RPC_MAX_HEADER_WITH_AUTH_SYS) * sizeof(__be32))
2591#define NFSD_CB_MAX_RESP_SZ ((NFS4_dec_cb_recall_sz + \ 2602#define NFSD_CB_MAX_RESP_SZ ((NFS4_dec_cb_recall_sz + \
2592 RPC_MAX_REPHEADER_WITH_AUTH) * sizeof(__be32)) 2603 RPC_MAX_REPHEADER_WITH_AUTH_SYS) * \
2604 sizeof(__be32))
2593 2605
2594static __be32 check_backchannel_attrs(struct nfsd4_channel_attrs *ca) 2606static __be32 check_backchannel_attrs(struct nfsd4_channel_attrs *ca)
2595{ 2607{
2596 ca->headerpadsz = 0; 2608 ca->headerpadsz = 0;
2597 2609
2598 /*
2599 * These RPC_MAX_HEADER macros are overkill, especially since we
2600 * don't even do gss on the backchannel yet. But this is still
2601 * less than 1k. Tighten up this estimate in the unlikely event
2602 * it turns out to be a problem for some client:
2603 */
2604 if (ca->maxreq_sz < NFSD_CB_MAX_REQ_SZ) 2610 if (ca->maxreq_sz < NFSD_CB_MAX_REQ_SZ)
2605 return nfserr_toosmall; 2611 return nfserr_toosmall;
2606 if (ca->maxresp_sz < NFSD_CB_MAX_RESP_SZ) 2612 if (ca->maxresp_sz < NFSD_CB_MAX_RESP_SZ)
@@ -2710,10 +2716,9 @@ nfsd4_create_session(struct svc_rqst *rqstp,
2710 goto out_free_conn; 2716 goto out_free_conn;
2711 } 2717 }
2712 status = nfs_ok; 2718 status = nfs_ok;
2713 /* 2719 /* Persistent sessions are not supported */
2714 * We do not support RDMA or persistent sessions
2715 */
2716 cr_ses->flags &= ~SESSION4_PERSIST; 2720 cr_ses->flags &= ~SESSION4_PERSIST;
2721 /* Upshifting from TCP to RDMA is not supported */
2717 cr_ses->flags &= ~SESSION4_RDMA; 2722 cr_ses->flags &= ~SESSION4_RDMA;
2718 2723
2719 init_session(rqstp, new, conf, cr_ses); 2724 init_session(rqstp, new, conf, cr_ses);