aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorJ. Bruce Fields <bfields@citi.umich.edu>2010-06-15 17:34:11 -0400
committerJ. Bruce Fields <bfields@redhat.com>2010-10-21 10:11:53 -0400
commitd29c374cd20de620898d2936396048518809ae24 (patch)
tree4443f1cd02fa273b563f63b34fe9255aca551c74 /fs
parent86c3e16cc7aace4d1143952813b6cc2a80c51295 (diff)
nfsd4: track backchannel connections
We need to keep track of which connections are available for use with the backchannel, which for the forechannel, and which for both. Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Diffstat (limited to 'fs')
-rw-r--r--fs/nfsd/nfs4state.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 7e817d13cd82..c470cb78c6c1 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -644,7 +644,7 @@ static void nfsd4_conn_lost(struct svc_xpt_user *u)
644 spin_unlock(&clp->cl_lock); 644 spin_unlock(&clp->cl_lock);
645} 645}
646 646
647static struct nfsd4_conn *alloc_conn(struct svc_rqst *rqstp) 647static struct nfsd4_conn *alloc_conn(struct svc_rqst *rqstp, u32 flags)
648{ 648{
649 struct nfsd4_conn *conn; 649 struct nfsd4_conn *conn;
650 650
@@ -653,7 +653,7 @@ static struct nfsd4_conn *alloc_conn(struct svc_rqst *rqstp)
653 return NULL; 653 return NULL;
654 svc_xprt_get(rqstp->rq_xprt); 654 svc_xprt_get(rqstp->rq_xprt);
655 conn->cn_xprt = rqstp->rq_xprt; 655 conn->cn_xprt = rqstp->rq_xprt;
656 conn->cn_flags = NFS4_CDFC4_FORE; 656 conn->cn_flags = flags;
657 INIT_LIST_HEAD(&conn->cn_xpt_user.list); 657 INIT_LIST_HEAD(&conn->cn_xpt_user.list);
658 return conn; 658 return conn;
659} 659}
@@ -682,8 +682,11 @@ static void nfsd4_register_conn(struct nfsd4_conn *conn)
682static __be32 nfsd4_new_conn(struct svc_rqst *rqstp, struct nfsd4_session *ses) 682static __be32 nfsd4_new_conn(struct svc_rqst *rqstp, struct nfsd4_session *ses)
683{ 683{
684 struct nfsd4_conn *conn; 684 struct nfsd4_conn *conn;
685 u32 flags = NFS4_CDFC4_FORE;
685 686
686 conn = alloc_conn(rqstp); 687 if (ses->se_flags & SESSION4_BACK_CHAN)
688 flags |= NFS4_CDFC4_BACK;
689 conn = alloc_conn(rqstp, flags);
687 if (!conn) 690 if (!conn)
688 return nfserr_jukebox; 691 return nfserr_jukebox;
689 nfsd4_hash_conn(conn, ses); 692 nfsd4_hash_conn(conn, ses);
@@ -1640,7 +1643,7 @@ static void nfsd4_sequence_check_conn(struct svc_rqst *rqstp, struct nfsd4_sessi
1640 if (c) 1643 if (c)
1641 return; 1644 return;
1642 1645
1643 new = alloc_conn(rqstp); 1646 new = alloc_conn(rqstp, NFS4_CDFC4_FORE);
1644 1647
1645 spin_lock(&clp->cl_lock); 1648 spin_lock(&clp->cl_lock);
1646 c = __nfsd4_find_conn(rqstp, ses); 1649 c = __nfsd4_find_conn(rqstp, ses);