diff options
author | J. Bruce Fields <bfields@citi.umich.edu> | 2010-06-15 17:34:11 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2010-10-21 10:11:53 -0400 |
commit | d29c374cd20de620898d2936396048518809ae24 (patch) | |
tree | 4443f1cd02fa273b563f63b34fe9255aca551c74 /fs | |
parent | 86c3e16cc7aace4d1143952813b6cc2a80c51295 (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.c | 11 |
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 | ||
647 | static struct nfsd4_conn *alloc_conn(struct svc_rqst *rqstp) | 647 | static 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) | |||
682 | static __be32 nfsd4_new_conn(struct svc_rqst *rqstp, struct nfsd4_session *ses) | 682 | static __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); |