Support multiple program numbers on one RPC transport The NFS and NFSACL programs run on the same RPC transport. This patch adds support for this by changing svc_program into a chained list of programs instead of a single program (on the server side). On the client side, the same RPC transport can now be shared among multiple RPC clients, so reference count the transport to determine when it can be destroyed. Andreas Gruenbacher , SuSE Labs Index: linux-2.6.0-test11/fs/nfsd/nfsproc.c =================================================================== --- linux-2.6.0-test11.orig/fs/nfsd/nfsproc.c 2003-12-17 21:37:32.155017440 +0100 +++ linux-2.6.0-test11/fs/nfsd/nfsproc.c 2003-12-17 21:48:01.175256768 +0100 @@ -587,6 +587,8 @@ nfserrno (int errno) { nfserr_stale, -ESTALE }, { nfserr_dropit, -EAGAIN }, { nfserr_dropit, -ENOMEM }, + { nfserr_notsupp, -ENOTSUPP }, + { nfserr_notsupp, -EOPNOTSUPP }, { -1, -EIO } }; int i; Index: linux-2.6.0-test11/net/sunrpc/svc.c =================================================================== --- linux-2.6.0-test11.orig/net/sunrpc/svc.c 2003-11-26 21:45:36.000000000 +0100 +++ linux-2.6.0-test11/net/sunrpc/svc.c 2003-12-17 21:36:49.678474856 +0100 @@ -324,8 +324,10 @@ svc_process(struct svc_serv *serv, struc goto dropit; } - progp = serv->sv_program; - 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 || @@ -438,7 +440,7 @@ err_bad_auth: err_bad_prog: #ifdef RPC_PARANOIA - if (prog != 100227 || progp->pg_prog != 100003) + if (prog != 100227 || serv->sv_program->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 */ #endif Index: linux-2.6.0-test11/include/linux/sunrpc/svc.h =================================================================== --- linux-2.6.0-test11.orig/include/linux/sunrpc/svc.h 2003-11-26 21:44:18.000000000 +0100 +++ linux-2.6.0-test11/include/linux/sunrpc/svc.h 2003-12-17 21:36:49.689473184 +0100 @@ -231,9 +231,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 */