31
31
struct nfs_callback_data {
32
32
unsigned int users ;
33
33
struct svc_serv * serv ;
34
- struct svc_rqst * rqst ;
35
- struct task_struct * task ;
36
34
};
37
35
38
36
static struct nfs_callback_data nfs_callback_info [NFS4_MAX_MINOR_VERSION + 1 ];
@@ -89,15 +87,6 @@ nfs4_callback_svc(void *vrqstp)
89
87
return 0 ;
90
88
}
91
89
92
- /*
93
- * Prepare to bring up the NFSv4 callback service
94
- */
95
- static struct svc_rqst *
96
- nfs4_callback_up (struct svc_serv * serv )
97
- {
98
- return svc_prepare_thread (serv , & serv -> sv_pools [0 ], NUMA_NO_NODE );
99
- }
100
-
101
90
#if defined(CONFIG_NFS_V4_1 )
102
91
/*
103
92
* The callback service for NFSv4.1 callbacks
@@ -139,19 +128,6 @@ nfs41_callback_svc(void *vrqstp)
139
128
return 0 ;
140
129
}
141
130
142
- /*
143
- * Bring up the NFSv4.1 callback service
144
- */
145
- static struct svc_rqst *
146
- nfs41_callback_up (struct svc_serv * serv )
147
- {
148
- struct svc_rqst * rqstp ;
149
-
150
- rqstp = svc_prepare_thread (serv , & serv -> sv_pools [0 ], NUMA_NO_NODE );
151
- dprintk ("--> %s return %d\n" , __func__ , PTR_ERR_OR_ZERO (rqstp ));
152
- return rqstp ;
153
- }
154
-
155
131
static inline void nfs_callback_bc_serv (u32 minorversion , struct rpc_xprt * xprt ,
156
132
struct svc_serv * serv )
157
133
{
@@ -163,12 +139,6 @@ static inline void nfs_callback_bc_serv(u32 minorversion, struct rpc_xprt *xprt,
163
139
xprt -> bc_serv = serv ;
164
140
}
165
141
#else
166
- static struct svc_rqst *
167
- nfs41_callback_up (struct svc_serv * serv )
168
- {
169
- return ERR_PTR (- ENOTSUPP );
170
- }
171
-
172
142
static inline void nfs_callback_bc_serv (u32 minorversion , struct rpc_xprt * xprt ,
173
143
struct svc_serv * serv )
174
144
{
@@ -178,42 +148,19 @@ static inline void nfs_callback_bc_serv(u32 minorversion, struct rpc_xprt *xprt,
178
148
static int nfs_callback_start_svc (int minorversion , struct rpc_xprt * xprt ,
179
149
struct svc_serv * serv )
180
150
{
181
- struct svc_rqst * rqstp ;
182
- struct nfs_callback_data * cb_info = & nfs_callback_info [minorversion ];
151
+ const int nrservs = NFS4_NR_CALLBACK_THREADS ;
183
152
int ret ;
184
153
185
154
nfs_callback_bc_serv (minorversion , xprt , serv );
186
155
187
- if (cb_info -> task )
156
+ if (serv -> sv_nrthreads - 1 == nrservs )
188
157
return 0 ;
189
158
190
- switch (minorversion ) {
191
- case 0 :
192
- /* v4.0 callback setup */
193
- rqstp = nfs4_callback_up (serv );
194
- break ;
195
- default :
196
- rqstp = nfs41_callback_up (serv );
197
- }
198
-
199
- if (IS_ERR (rqstp ))
200
- return PTR_ERR (rqstp );
201
-
202
- svc_sock_update_bufs (serv );
203
-
204
- cb_info -> rqst = rqstp ;
205
- cb_info -> task = kthread_create (serv -> sv_ops -> svo_function ,
206
- cb_info -> rqst ,
207
- "nfsv4.%u-svc" , minorversion );
208
- if (IS_ERR (cb_info -> task )) {
209
- ret = PTR_ERR (cb_info -> task );
210
- svc_exit_thread (cb_info -> rqst );
211
- cb_info -> rqst = NULL ;
212
- cb_info -> task = NULL ;
159
+ ret = serv -> sv_ops -> svo_setup (serv , NULL , nrservs );
160
+ if (ret ) {
161
+ serv -> sv_ops -> svo_setup (serv , NULL , 0 );
213
162
return ret ;
214
163
}
215
- rqstp -> rq_task = cb_info -> task ;
216
- wake_up_process (cb_info -> task );
217
164
dprintk ("nfs_callback_up: service started\n" );
218
165
return 0 ;
219
166
}
@@ -270,12 +217,14 @@ static int nfs_callback_up_net(int minorversion, struct svc_serv *serv,
270
217
static struct svc_serv_ops nfs40_cb_sv_ops = {
271
218
.svo_function = nfs4_callback_svc ,
272
219
.svo_enqueue_xprt = svc_xprt_do_enqueue ,
220
+ .svo_setup = svc_set_num_threads ,
273
221
.svo_module = THIS_MODULE ,
274
222
};
275
223
#if defined(CONFIG_NFS_V4_1 )
276
224
static struct svc_serv_ops nfs41_cb_sv_ops = {
277
225
.svo_function = nfs41_callback_svc ,
278
226
.svo_enqueue_xprt = svc_xprt_do_enqueue ,
227
+ .svo_setup = svc_set_num_threads ,
279
228
.svo_module = THIS_MODULE ,
280
229
};
281
230
@@ -394,20 +343,18 @@ int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt)
394
343
void nfs_callback_down (int minorversion , struct net * net )
395
344
{
396
345
struct nfs_callback_data * cb_info = & nfs_callback_info [minorversion ];
346
+ struct svc_serv * serv ;
397
347
398
348
mutex_lock (& nfs_callback_mutex );
399
- nfs_callback_down_net (minorversion , cb_info -> serv , net );
349
+ serv = cb_info -> serv ;
350
+ nfs_callback_down_net (minorversion , serv , net );
400
351
cb_info -> users -- ;
401
352
if (cb_info -> users == 0 ) {
402
- if (cb_info -> task != NULL ) {
403
- kthread_stop (cb_info -> task );
404
- dprintk ("nfs_callback_down: service stopped\n" );
405
- }
406
- svc_exit_thread (cb_info -> rqst );
353
+ svc_get (serv );
354
+ serv -> sv_ops -> svo_setup (serv , NULL , 0 );
355
+ svc_destroy (serv );
407
356
dprintk ("nfs_callback_down: service destroyed\n" );
408
357
cb_info -> serv = NULL ;
409
- cb_info -> rqst = NULL ;
410
- cb_info -> task = NULL ;
411
358
}
412
359
mutex_unlock (& nfs_callback_mutex );
413
360
}
0 commit comments