@@ -440,10 +440,11 @@ EXPORT_SYMBOL_GPL(svc_rpcb_cleanup);
440
440
441
441
static int svc_uses_rpcbind (struct svc_serv * serv )
442
442
{
443
- struct svc_program * progp ;
444
- unsigned int i ;
443
+ unsigned int p , i ;
444
+
445
+ for (p = 0 ; p < serv -> sv_nprogs ; p ++ ) {
446
+ struct svc_program * progp = & serv -> sv_programs [p ];
445
447
446
- for (progp = serv -> sv_program ; progp ; progp = progp -> pg_next ) {
447
448
for (i = 0 ; i < progp -> pg_nvers ; i ++ ) {
448
449
if (progp -> pg_vers [i ] == NULL )
449
450
continue ;
@@ -480,7 +481,7 @@ __svc_init_bc(struct svc_serv *serv)
480
481
* Create an RPC service
481
482
*/
482
483
static struct svc_serv *
483
- __svc_create (struct svc_program * prog , struct svc_stat * stats ,
484
+ __svc_create (struct svc_program * prog , int nprogs , struct svc_stat * stats ,
484
485
unsigned int bufsize , int npools , int (* threadfn )(void * data ))
485
486
{
486
487
struct svc_serv * serv ;
@@ -491,25 +492,27 @@ __svc_create(struct svc_program *prog, struct svc_stat *stats,
491
492
if (!(serv = kzalloc (sizeof (* serv ), GFP_KERNEL )))
492
493
return NULL ;
493
494
serv -> sv_name = prog -> pg_name ;
494
- serv -> sv_program = prog ;
495
+ serv -> sv_programs = prog ;
496
+ serv -> sv_nprogs = nprogs ;
495
497
serv -> sv_stats = stats ;
496
498
if (bufsize > RPCSVC_MAXPAYLOAD )
497
499
bufsize = RPCSVC_MAXPAYLOAD ;
498
500
serv -> sv_max_payload = bufsize ? bufsize : 4096 ;
499
501
serv -> sv_max_mesg = roundup (serv -> sv_max_payload + PAGE_SIZE , PAGE_SIZE );
500
502
serv -> sv_threadfn = threadfn ;
501
503
xdrsize = 0 ;
502
- while (prog ) {
503
- prog -> pg_lovers = prog -> pg_nvers - 1 ;
504
- for (vers = 0 ; vers < prog -> pg_nvers ; vers ++ )
505
- if (prog -> pg_vers [vers ]) {
506
- prog -> pg_hivers = vers ;
507
- if (prog -> pg_lovers > vers )
508
- prog -> pg_lovers = vers ;
509
- if (prog -> pg_vers [vers ]-> vs_xdrsize > xdrsize )
510
- xdrsize = prog -> pg_vers [vers ]-> vs_xdrsize ;
504
+ for (i = 0 ; i < nprogs ; i ++ ) {
505
+ struct svc_program * progp = & prog [i ];
506
+
507
+ progp -> pg_lovers = progp -> pg_nvers - 1 ;
508
+ for (vers = 0 ; vers < progp -> pg_nvers ; vers ++ )
509
+ if (progp -> pg_vers [vers ]) {
510
+ progp -> pg_hivers = vers ;
511
+ if (progp -> pg_lovers > vers )
512
+ progp -> pg_lovers = vers ;
513
+ if (progp -> pg_vers [vers ]-> vs_xdrsize > xdrsize )
514
+ xdrsize = progp -> pg_vers [vers ]-> vs_xdrsize ;
511
515
}
512
- prog = prog -> pg_next ;
513
516
}
514
517
serv -> sv_xdrsize = xdrsize ;
515
518
INIT_LIST_HEAD (& serv -> sv_tempsocks );
@@ -558,28 +561,30 @@ __svc_create(struct svc_program *prog, struct svc_stat *stats,
558
561
struct svc_serv * svc_create (struct svc_program * prog , unsigned int bufsize ,
559
562
int (* threadfn )(void * data ))
560
563
{
561
- return __svc_create (prog , NULL , bufsize , 1 , threadfn );
564
+ return __svc_create (prog , 1 , NULL , bufsize , 1 , threadfn );
562
565
}
563
566
EXPORT_SYMBOL_GPL (svc_create );
564
567
565
568
/**
566
569
* svc_create_pooled - Create an RPC service with pooled threads
567
- * @prog: the RPC program the new service will handle
570
+ * @prog: Array of RPC programs the new service will handle
571
+ * @nprogs: Number of programs in the array
568
572
* @stats: the stats struct if desired
569
573
* @bufsize: maximum message size for @prog
570
574
* @threadfn: a function to service RPC requests for @prog
571
575
*
572
576
* Returns an instantiated struct svc_serv object or NULL.
573
577
*/
574
578
struct svc_serv * svc_create_pooled (struct svc_program * prog ,
579
+ unsigned int nprogs ,
575
580
struct svc_stat * stats ,
576
581
unsigned int bufsize ,
577
582
int (* threadfn )(void * data ))
578
583
{
579
584
struct svc_serv * serv ;
580
585
unsigned int npools = svc_pool_map_get ();
581
586
582
- serv = __svc_create (prog , stats , bufsize , npools , threadfn );
587
+ serv = __svc_create (prog , nprogs , stats , bufsize , npools , threadfn );
583
588
if (!serv )
584
589
goto out_err ;
585
590
serv -> sv_is_pooled = true;
@@ -602,16 +607,16 @@ svc_destroy(struct svc_serv **servp)
602
607
603
608
* servp = NULL ;
604
609
605
- dprintk ("svc: svc_destroy(%s)\n" , serv -> sv_program -> pg_name );
610
+ dprintk ("svc: svc_destroy(%s)\n" , serv -> sv_programs -> pg_name );
606
611
timer_shutdown_sync (& serv -> sv_temptimer );
607
612
608
613
/*
609
614
* Remaining transports at this point are not expected.
610
615
*/
611
616
WARN_ONCE (!list_empty (& serv -> sv_permsocks ),
612
- "SVC: permsocks remain for %s\n" , serv -> sv_program -> pg_name );
617
+ "SVC: permsocks remain for %s\n" , serv -> sv_programs -> pg_name );
613
618
WARN_ONCE (!list_empty (& serv -> sv_tempsocks ),
614
- "SVC: tempsocks remain for %s\n" , serv -> sv_program -> pg_name );
619
+ "SVC: tempsocks remain for %s\n" , serv -> sv_programs -> pg_name );
615
620
616
621
cache_clean_deferred (serv );
617
622
@@ -1148,15 +1153,16 @@ int svc_register(const struct svc_serv *serv, struct net *net,
1148
1153
const int family , const unsigned short proto ,
1149
1154
const unsigned short port )
1150
1155
{
1151
- struct svc_program * progp ;
1152
- unsigned int i ;
1156
+ unsigned int p , i ;
1153
1157
int error = 0 ;
1154
1158
1155
1159
WARN_ON_ONCE (proto == 0 && port == 0 );
1156
1160
if (proto == 0 && port == 0 )
1157
1161
return - EINVAL ;
1158
1162
1159
- for (progp = serv -> sv_program ; progp ; progp = progp -> pg_next ) {
1163
+ for (p = 0 ; p < serv -> sv_nprogs ; p ++ ) {
1164
+ struct svc_program * progp = & serv -> sv_programs [p ];
1165
+
1160
1166
for (i = 0 ; i < progp -> pg_nvers ; i ++ ) {
1161
1167
1162
1168
error = progp -> pg_rpcbind_set (net , progp , i ,
@@ -1208,13 +1214,14 @@ static void __svc_unregister(struct net *net, const u32 program, const u32 versi
1208
1214
static void svc_unregister (const struct svc_serv * serv , struct net * net )
1209
1215
{
1210
1216
struct sighand_struct * sighand ;
1211
- struct svc_program * progp ;
1212
1217
unsigned long flags ;
1213
- unsigned int i ;
1218
+ unsigned int p , i ;
1214
1219
1215
1220
clear_thread_flag (TIF_SIGPENDING );
1216
1221
1217
- for (progp = serv -> sv_program ; progp ; progp = progp -> pg_next ) {
1222
+ for (p = 0 ; p < serv -> sv_nprogs ; p ++ ) {
1223
+ struct svc_program * progp = & serv -> sv_programs [p ];
1224
+
1218
1225
for (i = 0 ; i < progp -> pg_nvers ; i ++ ) {
1219
1226
if (progp -> pg_vers [i ] == NULL )
1220
1227
continue ;
@@ -1320,7 +1327,7 @@ svc_process_common(struct svc_rqst *rqstp)
1320
1327
struct svc_process_info process ;
1321
1328
enum svc_auth_status auth_res ;
1322
1329
unsigned int aoffset ;
1323
- int rc ;
1330
+ int pr , rc ;
1324
1331
__be32 * p ;
1325
1332
1326
1333
/* Will be turned off only when NFSv4 Sessions are used */
@@ -1344,9 +1351,12 @@ svc_process_common(struct svc_rqst *rqstp)
1344
1351
rqstp -> rq_vers = be32_to_cpup (p ++ );
1345
1352
rqstp -> rq_proc = be32_to_cpup (p );
1346
1353
1347
- for (progp = serv -> sv_program ; progp ; progp = progp -> pg_next )
1354
+ for (pr = 0 ; pr < serv -> sv_nprogs ; pr ++ ) {
1355
+ progp = & serv -> sv_programs [pr ];
1356
+
1348
1357
if (rqstp -> rq_prog == progp -> pg_prog )
1349
1358
break ;
1359
+ }
1350
1360
1351
1361
/*
1352
1362
* Decode auth data, and add verifier to reply buffer.
0 commit comments