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