diff options
author | Andy Adamson <andros@netapp.com> | 2011-01-05 21:04:28 -0500 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2011-01-06 14:46:24 -0500 |
commit | 01c9a0bc60507af7f28cb9138a81836de4528199 (patch) | |
tree | 9416e3bd29645a5a06552ff52702e4c67cef0e36 /fs | |
parent | 16b2d1e1d12de000404d7c845d0db1226511f84d (diff) |
NFS use svc_create_xprt for NFSv4.1 callback service
The new back channel transport means we call the normal creation routine as
well as svc_xprt_put.
Signed-off-by: Andy Adamson <andros@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/nfs/callback.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c index 93a8b3bd69e3..0e9fae831dfa 100644 --- a/fs/nfs/callback.c +++ b/fs/nfs/callback.c | |||
@@ -177,30 +177,38 @@ nfs41_callback_svc(void *vrqstp) | |||
177 | struct svc_rqst * | 177 | struct svc_rqst * |
178 | nfs41_callback_up(struct svc_serv *serv, struct rpc_xprt *xprt) | 178 | nfs41_callback_up(struct svc_serv *serv, struct rpc_xprt *xprt) |
179 | { | 179 | { |
180 | struct svc_xprt *bc_xprt; | 180 | struct svc_rqst *rqstp; |
181 | struct svc_rqst *rqstp = ERR_PTR(-ENOMEM); | 181 | int ret; |
182 | 182 | ||
183 | dprintk("--> %s\n", __func__); | 183 | /* |
184 | /* Create a svc_sock for the service */ | 184 | * Create an svc_sock for the back channel service that shares the |
185 | bc_xprt = svc_sock_create(serv, xprt->prot); | 185 | * fore channel connection. |
186 | if (!bc_xprt) | 186 | * Returns the input port (0) and sets the svc_serv bc_xprt on success |
187 | */ | ||
188 | ret = svc_create_xprt(serv, "tcp-bc", &init_net, PF_INET, 0, | ||
189 | SVC_SOCK_ANONYMOUS); | ||
190 | if (ret < 0) { | ||
191 | rqstp = ERR_PTR(ret); | ||
187 | goto out; | 192 | goto out; |
193 | } | ||
188 | 194 | ||
189 | /* | 195 | /* |
190 | * Save the svc_serv in the transport so that it can | 196 | * Save the svc_serv in the transport so that it can |
191 | * be referenced when the session backchannel is initialized | 197 | * be referenced when the session backchannel is initialized |
192 | */ | 198 | */ |
193 | serv->bc_xprt = bc_xprt; | ||
194 | xprt->bc_serv = serv; | 199 | xprt->bc_serv = serv; |
195 | 200 | ||
196 | INIT_LIST_HEAD(&serv->sv_cb_list); | 201 | INIT_LIST_HEAD(&serv->sv_cb_list); |
197 | spin_lock_init(&serv->sv_cb_lock); | 202 | spin_lock_init(&serv->sv_cb_lock); |
198 | init_waitqueue_head(&serv->sv_cb_waitq); | 203 | init_waitqueue_head(&serv->sv_cb_waitq); |
199 | rqstp = svc_prepare_thread(serv, &serv->sv_pools[0]); | 204 | rqstp = svc_prepare_thread(serv, &serv->sv_pools[0]); |
200 | if (IS_ERR(rqstp)) | 205 | if (IS_ERR(rqstp)) { |
201 | svc_sock_destroy(bc_xprt); | 206 | svc_xprt_put(serv->bc_xprt); |
207 | serv->bc_xprt = NULL; | ||
208 | } | ||
202 | out: | 209 | out: |
203 | dprintk("--> %s return %p\n", __func__, rqstp); | 210 | dprintk("--> %s return %ld\n", __func__, |
211 | IS_ERR(rqstp) ? PTR_ERR(rqstp) : 0); | ||
204 | return rqstp; | 212 | return rqstp; |
205 | } | 213 | } |
206 | 214 | ||