diff options
author | Trond Myklebust <trond.myklebust@primarydata.com> | 2016-08-29 20:03:48 -0400 |
---|---|---|
committer | Anna Schumaker <Anna.Schumaker@Netapp.com> | 2016-09-19 13:08:36 -0400 |
commit | f4b52bb0842642a781a23dd36ae364253e03fdb4 (patch) | |
tree | 99b715574d580e37a7aad57960fe7bce0628c9af /fs/nfs/callback.c | |
parent | 3132e49ecef9dab43d858d8e7066662c6a1efb16 (diff) |
NFSv4.x: Set up struct svc_serv_ops for the callback channel
In order to manage the threads using svc_set_num_threads, we need to
fill in a few extra fields.
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Diffstat (limited to 'fs/nfs/callback.c')
-rw-r--r-- | fs/nfs/callback.c | 57 |
1 files changed, 39 insertions, 18 deletions
diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c index 52a28311e2a4..478bb0a7effe 100644 --- a/fs/nfs/callback.c +++ b/fs/nfs/callback.c | |||
@@ -155,13 +155,6 @@ nfs41_callback_up(struct svc_serv *serv) | |||
155 | return rqstp; | 155 | return rqstp; |
156 | } | 156 | } |
157 | 157 | ||
158 | static void nfs_minorversion_callback_svc_setup(struct svc_serv *serv, | ||
159 | struct svc_rqst **rqstpp, int (**callback_svc)(void *vrqstp)) | ||
160 | { | ||
161 | *rqstpp = nfs41_callback_up(serv); | ||
162 | *callback_svc = nfs41_callback_svc; | ||
163 | } | ||
164 | |||
165 | static inline void nfs_callback_bc_serv(u32 minorversion, struct rpc_xprt *xprt, | 158 | static inline void nfs_callback_bc_serv(u32 minorversion, struct rpc_xprt *xprt, |
166 | struct svc_serv *serv) | 159 | struct svc_serv *serv) |
167 | { | 160 | { |
@@ -173,11 +166,10 @@ static inline void nfs_callback_bc_serv(u32 minorversion, struct rpc_xprt *xprt, | |||
173 | xprt->bc_serv = serv; | 166 | xprt->bc_serv = serv; |
174 | } | 167 | } |
175 | #else | 168 | #else |
176 | static void nfs_minorversion_callback_svc_setup(struct svc_serv *serv, | 169 | static struct svc_rqst * |
177 | struct svc_rqst **rqstpp, int (**callback_svc)(void *vrqstp)) | 170 | nfs41_callback_up(struct svc_serv *serv) |
178 | { | 171 | { |
179 | *rqstpp = ERR_PTR(-ENOTSUPP); | 172 | return ERR_PTR(-ENOTSUPP); |
180 | *callback_svc = ERR_PTR(-ENOTSUPP); | ||
181 | } | 173 | } |
182 | 174 | ||
183 | static inline void nfs_callback_bc_serv(u32 minorversion, struct rpc_xprt *xprt, | 175 | static inline void nfs_callback_bc_serv(u32 minorversion, struct rpc_xprt *xprt, |
@@ -190,7 +182,6 @@ static int nfs_callback_start_svc(int minorversion, struct rpc_xprt *xprt, | |||
190 | struct svc_serv *serv) | 182 | struct svc_serv *serv) |
191 | { | 183 | { |
192 | struct svc_rqst *rqstp; | 184 | struct svc_rqst *rqstp; |
193 | int (*callback_svc)(void *vrqstp); | ||
194 | struct nfs_callback_data *cb_info = &nfs_callback_info[minorversion]; | 185 | struct nfs_callback_data *cb_info = &nfs_callback_info[minorversion]; |
195 | int ret; | 186 | int ret; |
196 | 187 | ||
@@ -203,11 +194,9 @@ static int nfs_callback_start_svc(int minorversion, struct rpc_xprt *xprt, | |||
203 | case 0: | 194 | case 0: |
204 | /* v4.0 callback setup */ | 195 | /* v4.0 callback setup */ |
205 | rqstp = nfs4_callback_up(serv); | 196 | rqstp = nfs4_callback_up(serv); |
206 | callback_svc = nfs4_callback_svc; | ||
207 | break; | 197 | break; |
208 | default: | 198 | default: |
209 | nfs_minorversion_callback_svc_setup(serv, | 199 | rqstp = nfs41_callback_up(serv); |
210 | &rqstp, &callback_svc); | ||
211 | } | 200 | } |
212 | 201 | ||
213 | if (IS_ERR(rqstp)) | 202 | if (IS_ERR(rqstp)) |
@@ -217,7 +206,8 @@ static int nfs_callback_start_svc(int minorversion, struct rpc_xprt *xprt, | |||
217 | 206 | ||
218 | cb_info->serv = serv; | 207 | cb_info->serv = serv; |
219 | cb_info->rqst = rqstp; | 208 | cb_info->rqst = rqstp; |
220 | cb_info->task = kthread_create(callback_svc, cb_info->rqst, | 209 | cb_info->task = kthread_create(serv->sv_ops->svo_function, |
210 | cb_info->rqst, | ||
221 | "nfsv4.%u-svc", minorversion); | 211 | "nfsv4.%u-svc", minorversion); |
222 | if (IS_ERR(cb_info->task)) { | 212 | if (IS_ERR(cb_info->task)) { |
223 | ret = PTR_ERR(cb_info->task); | 213 | ret = PTR_ERR(cb_info->task); |
@@ -281,14 +271,34 @@ err_bind: | |||
281 | return ret; | 271 | return ret; |
282 | } | 272 | } |
283 | 273 | ||
284 | static struct svc_serv_ops nfs_cb_sv_ops = { | 274 | static struct svc_serv_ops nfs40_cb_sv_ops = { |
275 | .svo_function = nfs4_callback_svc, | ||
285 | .svo_enqueue_xprt = svc_xprt_do_enqueue, | 276 | .svo_enqueue_xprt = svc_xprt_do_enqueue, |
277 | .svo_module = THIS_MODULE, | ||
278 | }; | ||
279 | #if defined(CONFIG_NFS_V4_1) | ||
280 | static struct svc_serv_ops nfs41_cb_sv_ops = { | ||
281 | .svo_function = nfs41_callback_svc, | ||
282 | .svo_enqueue_xprt = svc_xprt_do_enqueue, | ||
283 | .svo_module = THIS_MODULE, | ||
286 | }; | 284 | }; |
287 | 285 | ||
286 | struct svc_serv_ops *nfs4_cb_sv_ops[] = { | ||
287 | [0] = &nfs40_cb_sv_ops, | ||
288 | [1] = &nfs41_cb_sv_ops, | ||
289 | }; | ||
290 | #else | ||
291 | struct svc_serv_ops *nfs4_cb_sv_ops[] = { | ||
292 | [0] = &nfs40_cb_sv_ops, | ||
293 | [1] = NULL, | ||
294 | }; | ||
295 | #endif | ||
296 | |||
288 | static struct svc_serv *nfs_callback_create_svc(int minorversion) | 297 | static struct svc_serv *nfs_callback_create_svc(int minorversion) |
289 | { | 298 | { |
290 | struct nfs_callback_data *cb_info = &nfs_callback_info[minorversion]; | 299 | struct nfs_callback_data *cb_info = &nfs_callback_info[minorversion]; |
291 | struct svc_serv *serv; | 300 | struct svc_serv *serv; |
301 | struct svc_serv_ops *sv_ops; | ||
292 | 302 | ||
293 | /* | 303 | /* |
294 | * Check whether we're already up and running. | 304 | * Check whether we're already up and running. |
@@ -302,6 +312,17 @@ static struct svc_serv *nfs_callback_create_svc(int minorversion) | |||
302 | return cb_info->serv; | 312 | return cb_info->serv; |
303 | } | 313 | } |
304 | 314 | ||
315 | switch (minorversion) { | ||
316 | case 0: | ||
317 | sv_ops = nfs4_cb_sv_ops[0]; | ||
318 | break; | ||
319 | default: | ||
320 | sv_ops = nfs4_cb_sv_ops[1]; | ||
321 | } | ||
322 | |||
323 | if (sv_ops == NULL) | ||
324 | return ERR_PTR(-ENOTSUPP); | ||
325 | |||
305 | /* | 326 | /* |
306 | * Sanity check: if there's no task, | 327 | * Sanity check: if there's no task, |
307 | * we should be the first user ... | 328 | * we should be the first user ... |
@@ -310,7 +331,7 @@ static struct svc_serv *nfs_callback_create_svc(int minorversion) | |||
310 | printk(KERN_WARNING "nfs_callback_create_svc: no kthread, %d users??\n", | 331 | printk(KERN_WARNING "nfs_callback_create_svc: no kthread, %d users??\n", |
311 | cb_info->users); | 332 | cb_info->users); |
312 | 333 | ||
313 | serv = svc_create(&nfs4_callback_program, NFS4_CALLBACK_BUFSIZE, &nfs_cb_sv_ops); | 334 | serv = svc_create(&nfs4_callback_program, NFS4_CALLBACK_BUFSIZE, sv_ops); |
314 | if (!serv) { | 335 | if (!serv) { |
315 | printk(KERN_ERR "nfs_callback_create_svc: create service failed\n"); | 336 | printk(KERN_ERR "nfs_callback_create_svc: create service failed\n"); |
316 | return ERR_PTR(-ENOMEM); | 337 | return ERR_PTR(-ENOMEM); |