From: Andreas Gruenbacher The NFS and NFSACL programs run on the same RPC transport. This patch adds support for this by converting svc_program into a chained list of programs (server-side). Signed-off-by: Andreas Gruenbacher Signed-off-by: Olaf Kirch Signed-off-by: Andrew Morton --- 25-akpm/include/linux/sunrpc/svc.h | 3 ++- 25-akpm/net/sunrpc/svc.c | 34 +++++++++++++++++++--------------- 2 files changed, 21 insertions(+), 16 deletions(-) diff -puN include/linux/sunrpc/svc.h~nfsacl-allow-multiple-programs-to-listen-on-the-same-port include/linux/sunrpc/svc.h --- 25/include/linux/sunrpc/svc.h~nfsacl-allow-multiple-programs-to-listen-on-the-same-port 2005-01-23 01:27:50.489630736 -0800 +++ 25-akpm/include/linux/sunrpc/svc.h 2005-01-23 01:27:50.494629976 -0800 @@ -240,9 +240,10 @@ struct svc_deferred_req { }; /* - * RPC program + * List of RPC programs on the same transport endpoint */ struct svc_program { + struct svc_program * pg_next; /* other programs (same xprt) */ u32 pg_prog; /* program number */ unsigned int pg_lovers; /* lowest version */ unsigned int pg_hivers; /* lowest version */ diff -puN net/sunrpc/svc.c~nfsacl-allow-multiple-programs-to-listen-on-the-same-port net/sunrpc/svc.c --- 25/net/sunrpc/svc.c~nfsacl-allow-multiple-programs-to-listen-on-the-same-port 2005-01-23 01:27:50.490630584 -0800 +++ 25-akpm/net/sunrpc/svc.c 2005-01-23 01:27:50.496629672 -0800 @@ -35,20 +35,24 @@ svc_create(struct svc_program *prog, uns if (!(serv = (struct svc_serv *) kmalloc(sizeof(*serv), GFP_KERNEL))) return NULL; memset(serv, 0, sizeof(*serv)); + serv->sv_name = prog->pg_name; serv->sv_program = prog; serv->sv_nrthreads = 1; serv->sv_stats = prog->pg_stats; serv->sv_bufsz = bufsize? bufsize : 4096; - prog->pg_lovers = prog->pg_nvers-1; xdrsize = 0; - for (vers=0; verspg_nvers ; vers++) - if (prog->pg_vers[vers]) { - prog->pg_hivers = vers; - if (prog->pg_lovers > vers) - prog->pg_lovers = vers; - if (prog->pg_vers[vers]->vs_xdrsize > xdrsize) - xdrsize = prog->pg_vers[vers]->vs_xdrsize; - } + while (prog) { + prog->pg_lovers = prog->pg_nvers-1; + for (vers=0; verspg_nvers ; vers++) + if (prog->pg_vers[vers]) { + prog->pg_hivers = vers; + if (prog->pg_lovers > vers) + prog->pg_lovers = vers; + if (prog->pg_vers[vers]->vs_xdrsize > xdrsize) + xdrsize = prog->pg_vers[vers]->vs_xdrsize; + } + prog = prog->pg_next; + } serv->sv_xdrsize = xdrsize; INIT_LIST_HEAD(&serv->sv_threads); INIT_LIST_HEAD(&serv->sv_sockets); @@ -56,8 +60,6 @@ svc_create(struct svc_program *prog, uns INIT_LIST_HEAD(&serv->sv_permsocks); spin_lock_init(&serv->sv_lock); - serv->sv_name = prog->pg_name; - /* Remove any stale portmap registrations */ svc_register(serv, 0, 0); @@ -332,7 +334,10 @@ svc_process(struct svc_serv *serv, struc goto sendit; } - if (prog != progp->pg_prog) + for (progp = serv->sv_program; progp; progp = progp->pg_next) + if (prog == progp->pg_prog) + break; + if (progp == NULL) goto err_bad_prog; if (vers >= progp->pg_nvers || @@ -445,9 +450,8 @@ err_bad_auth: err_bad_prog: #ifdef RPC_PARANOIA - if (prog != 100227 || progp->pg_prog != 100003) - printk("svc: unknown program %d (me %d)\n", prog, progp->pg_prog); - /* else it is just a Solaris client seeing if ACLs are supported */ + if (prog != NFSACL_PROGRAM || serv->sv_program->pg_prog != NFS_PROGRAM) + printk("svc: unknown program %d\n", prog); #endif serv->sv_stats->rpcbadfmt++; svc_putu32(resv, rpc_prog_unavail); _