2 * This software has been released under the terms of the IBM Public
3 * License. For details, see the LICENSE file in the top-level source
4 * directory or online at http://www.openafs.org/dl/license10.html
10 #include <afsconfig.h>
11 #include "../afs/param.h"
15 #include "../afs/stds.h"
16 #include "../afs/sysincludes.h" /* Standard vendor system headers */
17 #if defined(AFS_SUN55_ENV) && !defined(AFS_NONFSTRANS)
18 #include "../rpc/types.h"
19 #include "../rpc/auth.h"
20 #include "../rpc/auth_unix.h"
21 #include "../rpc/auth_des.h"
22 #include "../rpc/auth_kerb.h"
23 #include "../sys/tiuser.h"
24 #include "../rpc/xdr.h"
25 #include "../rpc/svc.h"
26 #include "../nfs/nfs.h"
27 #include "../nfs/export.h"
28 #include "../nfs/nfs_clnt.h"
29 #include "../nfs/nfs_acl.h"
30 #include "../afs/afsincludes.h"
31 #include "../afs/afs_stats.h"
32 #include "../afs/exporter.h"
34 static int xlatorinit_v2_done=0;
35 static int xlatorinit_v3_done=0;
37 extern int afs_nobody;
38 extern int afs_NFSRootOnly;
40 /* It's bigger than this, but we don't care about anything else */
45 struct afs_nfs_disp_tbl {
50 struct afs_nfs2_resp {
58 struct afs_nfs_disp_tbl afs_rfs_disp_tbl[RFS_NPROC];
59 struct afs_nfs_disp_tbl afs_acl_disp_tbl[ACL2_NPROC];
62 is_afs_fh(fhandle_t *fhp) {
63 if ((fhp->fh_fsid.val[0] == AFS_VFSMAGIC) &&
64 (fhp->fh_fsid.val[1] == AFS_VFSFSID))
70 nfs2_to_afs_call(int which, caddr_t *args, fhandle_t **fhpp, fhandle_t **fh2pp)
77 *fh2pp = (fhandle_t *)0;
82 fhp1 = (fhandle_t *)args;
86 struct nfssaargs *sargs = (struct nfssaargs *)args;
87 fhp1 = (fhandle_t *)&sargs->saa_fh;
92 struct nfsdiropargs *sargs = (struct nfsdiropargs *)args;
93 fhp1 = (fhandle_t *)&sargs->da_fhandle;
98 struct nfsreadargs *sargs = (struct nfsreadargs *)args;
99 fhp1 = (fhandle_t *)&sargs->ra_fhandle;
104 struct nfswriteargs *sargs = (struct nfswriteargs *)args;
105 fhp1 = (fhandle_t *)&sargs->wa_fhandle;
110 struct nfscreatargs *sargs = (struct nfscreatargs *)args;
111 fhp1 = (fhandle_t *)&sargs->ca_da.da_fhandle;
116 struct nfsdiropargs *sargs = (struct nfsdiropargs *)args;
117 fhp1 = (fhandle_t *)&sargs->da_fhandle;
122 struct nfsrnmargs *sargs = (struct nfsrnmargs *)args;
123 fhp1 = (fhandle_t *)&sargs->rna_from.da_fhandle;
124 fhp2 = (fhandle_t *)&sargs->rna_to.da_fhandle;
129 struct nfslinkargs *sargs = (struct nfslinkargs *)args;
130 fhp1 = (fhandle_t *)&sargs->la_from;
131 fhp2 = (fhandle_t *)&sargs->la_to.da_fhandle;
136 struct nfsslargs *sargs = (struct nfsslargs *)args;
137 fhp1 = (fhandle_t *)&sargs->sla_from.da_fhandle;
142 struct nfscreatargs *sargs = (struct nfscreatargs *)args;
143 fhp1 = (fhandle_t *)&sargs->ca_da.da_fhandle;
148 struct nfsdiropargs *sargs = (struct nfsdiropargs *)args;
149 fhp1 = (fhandle_t *)&sargs->da_fhandle;
154 struct nfsrddirargs *sargs = (struct nfsrddirargs *)args;
155 fhp1 = (fhandle_t *)&sargs->rda_fh;
162 /* Ok if arg 1 is in AFS or if 2 args and arg 2 is in AFS */
163 if (is_afs_fh(fhp1)) {
169 if (is_afs_fh(fhp2)) {
178 acl2_to_afs_call(int which, caddr_t *args, fhandle_t **fhpp)
187 case ACLPROC2_GETACL:
189 struct GETACL2args *sargs = (struct GETACL2args *) args;
193 case ACLPROC2_SETACL:
195 struct SETACL2args *sargs = (struct SETACL2args *) args;
199 case ACLPROC2_GETATTR:
201 struct GETATTR2args *sargs = (struct GETATTR2args *) args;
205 case ACLPROC2_ACCESS:
207 struct ACCESS2args *sargs = (struct ACCESS2args *) args;
215 if (is_afs_fh(fhp)) {
224 afs_nfs2_dispatcher(int type, afs_int32 which, char *argp,
225 struct exportinfo **expp,
226 struct svc_req *rp, struct AFS_UCRED *crp)
230 afs_int32 client = 0;
232 fhandle_t *fh = (fhandle_t *)argp;
233 fhandle_t *fh2 = (fhandle_t *)0;
235 if (!xlatorinit_v2_done)
238 sa = (struct sockaddr *)svc_getrpccaller(rp->rq_xprt)->buf;
239 client = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
245 code = nfs2_to_afs_call(which, argp, &fh, &fh2);
248 code = acl2_to_afs_call(which, argp, &fh);
255 struct afs_exporter *out = 0;
258 struct SmallFid Sfid;
260 memcpy((char *)&Sfid, fh->fh_data, SIZEOF_SMALLFID);
264 if (!once && *expp) {
265 afs_nobody = (*expp)->exi_export.ex_anon;
268 code = afs_nfsclient_reqhandler((struct afs_exporter *)0, &crp,
269 client, &dummy, &out);
270 /* Be careful to release this */
274 /* We ran and failed */
284 afs_nfs2_smallfidder(struct nfsdiropres *dr)
286 register fhandle_t *fhp = (fhandle_t *)&dr->dr_fhandle;
290 #if defined(AFS_SUN57_64BIT_ENV)
291 /* See also afs_fid() */
292 memcpy((char *)addr, fhp->fh_data, 10);
293 addr[1] = (addr[1] >> 48) & 0xffff;
295 memcpy((char *)addr, fhp->fh_data, 2 * sizeof(long));
299 vcp = (struct vcache *)addr[0];
301 /* See also afs_osi_vget */
302 if (addr[1] == AFS_XLATOR_MAGIC)
304 if (dr->dr_status == NFS_OK) {
305 struct SmallFid Sfid;
308 /* Make up and copy out a SmallFid */
309 tcell = afs_GetCell(vcp->fid.Cell, READ_LOCK);
310 Sfid.Volume = vcp->fid.Fid.Volume;
311 Sfid.CellAndUnique = ((tcell->cellIndex << 24) |
312 (vcp->fid.Fid.Unique & 0xffffff));
313 afs_PutCell(tcell, READ_LOCK);
314 Sfid.Vnode = (u_short)(vcp->fid.Fid.Vnode & 0xffff);
315 fhp->fh_len = SIZEOF_SMALLFID;
316 memcpy(dr->dr_fhandle.fh_data, (char*)&Sfid, fhp->fh_len);
319 /* If we have a ref, release it */
320 if (vcp->vrefCount >= 1)
321 AFS_RELE((struct vnode *) vcp);
327 afs_nfs2_noaccess(struct afs_nfs2_resp *resp)
329 r->status = NFSERR_ACCES;
332 void afs_nfs2_null(char *args, char *xp, char *exp, char *rp, char *crp)
337 afs_nfs2_root(char *args, char *xp, char *exp, char *rp, char *crp)
342 afs_nfs2_writecache(char *args, char *xp, char *exp, char *rp, char *crp)
346 #define NFS_V2_REQ(FUNCNAME, RFSOP, POST) \
347 void FUNCNAME(char *args, char *xp, char *exp, char *rp, char *crp) { \
349 struct cred *svcred = curthread->t_cred; \
350 curthread->t_cred = (struct cred*)crp; \
351 call=afs_nfs2_dispatcher(0, RFSOP, (char *)args, &exp, rp, crp); \
352 if (call>1) afs_nfs2_noaccess((struct afs_nfs2_resp *)xp); \
353 else { (*afs_rfs_disp_tbl[RFSOP].orig_proc)(args, xp, exp, rp, crp); \
354 if (POST && afs_NFSRootOnly && call) afs_nfs2_smallfidder(xp); } \
355 curthread->t_cred = svcred; \
359 NFS_V2_REQ(afs_nfs2_getattr, RFS_GETATTR, 0)
360 NFS_V2_REQ(afs_nfs2_setattr, RFS_SETATTR, 0)
361 NFS_V2_REQ(afs_nfs2_lookup, RFS_LOOKUP, 1)
362 NFS_V2_REQ(afs_nfs2_readlink, RFS_READLINK, 0);
363 NFS_V2_REQ(afs_nfs2_read, RFS_READ, 0);
364 NFS_V2_REQ(afs_nfs2_write, RFS_WRITE, 0);
365 NFS_V2_REQ(afs_nfs2_create, RFS_CREATE, 1);
366 NFS_V2_REQ(afs_nfs2_remove, RFS_REMOVE, 0);
367 NFS_V2_REQ(afs_nfs2_rename, RFS_RENAME, 0);
368 NFS_V2_REQ(afs_nfs2_link, RFS_LINK, 0);
369 NFS_V2_REQ(afs_nfs2_symlink, RFS_SYMLINK, 0);
370 NFS_V2_REQ(afs_nfs2_mkdir, RFS_MKDIR, 1);
371 NFS_V2_REQ(afs_nfs2_rmdir, RFS_RMDIR, 0);
372 NFS_V2_REQ(afs_nfs2_readdir, RFS_READDIR, 0);
373 NFS_V2_REQ(afs_nfs2_statfs, RFS_STATFS, 0);
375 struct afs_nfs_disp_tbl afs_rfs_disp_tbl[RFS_NPROC] = {
377 { afs_nfs2_getattr },
378 { afs_nfs2_setattr },
381 { afs_nfs2_readlink },
383 { afs_nfs2_writecache },
389 { afs_nfs2_symlink },
392 { afs_nfs2_readdir },
396 #define ACL_V2_REQ(FUNCNAME, ACLOP) \
397 void FUNCNAME(char *args, char *xp, char *exp, char *rp, char *crp) { \
399 struct cred *svcred = curthread->t_cred; \
400 curthread->t_cred = (struct cred*)crp; \
401 call=afs_nfs2_dispatcher(1, ACLOP, (char *)args, &exp, rp, crp); \
402 if (call>1) afs_nfs2_noaccess((struct afs_nfs2_resp *)xp); \
403 else (*afs_rfs_disp_tbl[ACLOP].orig_proc)(args, xp, exp, rp, crp); \
404 curthread->t_cred = svcred; \
408 ACL_V2_REQ(afs_acl2_getacl, ACLPROC2_GETACL)
409 ACL_V2_REQ(afs_acl2_setacl, ACLPROC2_SETACL)
410 ACL_V2_REQ(afs_acl2_getattr, ACLPROC2_GETATTR)
411 ACL_V2_REQ(afs_acl2_access, ACLPROC2_ACCESS)
413 struct afs_nfs_disp_tbl afs_acl_disp_tbl[ACL2_NPROC] = {
417 { afs_acl2_getattr },
421 /* Munge the dispatch tables to link us in first */
423 afs_xlatorinit_v2(struct rfs_disp_tbl *_rfs_tbl,
424 struct rfs_disp_tbl *_acl_tbl)
428 if (xlatorinit_v2_done++) return;
430 for (i=0; i < RFS_NPROC; i++) {
431 afs_rfs_disp_tbl[i].orig_proc = _rfs_tbl[i].dis_proc;
432 _rfs_tbl[i].dis_proc = afs_rfs_disp_tbl[i].afs_proc;
435 for (i=0; i < ACL2_NPROC; i++) {
436 afs_acl_disp_tbl[i].orig_proc = _acl_tbl[i].dis_proc;
437 _acl_tbl[i].dis_proc = afs_acl_disp_tbl[i].afs_proc;
442 #define RFS3_NPROC 22
449 struct afs_nfs_disp_tbl afs_rfs3_disp_tbl[RFS3_NPROC];
450 struct afs_nfs_disp_tbl afs_acl3_disp_tbl[ACL3_NPROC];
452 struct afs_nfs3_resp {
458 is_afs_fh3(nfs_fh3 *fhp) {
459 if ((fhp->fh3_fsid.val[0] == AFS_VFSMAGIC) &&
460 (fhp->fh3_fsid.val[1] == AFS_VFSFSID))
466 afs_nfs3_noaccess(struct afs_nfs3_resp *resp)
468 resp->status = NFS3ERR_ACCES;
473 nfs3_to_afs_call(int which, caddr_t *args, nfs_fh3 **fhpp, nfs_fh3 **fh2pp)
480 *fh2pp = (nfs_fh3 *)0;
482 case NFSPROC3_GETATTR:
484 GETATTR3args *arg = (GETATTR3args *)args;
485 fhp1 = (nfs_fh3 *) &arg->object;
488 case NFSPROC3_SETATTR:
490 SETATTR3args *arg = (SETATTR3args *)args;
491 fhp1 = (nfs_fh3 *) &arg->object;
494 case NFSPROC3_LOOKUP:
496 LOOKUP3args *arg = (LOOKUP3args *)args;
497 fhp1 = (nfs_fh3 *) &arg->what.dirp;
500 case NFSPROC3_ACCESS:
502 ACCESS3args *arg = (ACCESS3args *)args;
503 fhp1 = (nfs_fh3 *) &arg->object;
506 case NFSPROC3_READLINK:
508 READLINK3args *arg = (READLINK3args *)args;
509 fhp1 = (nfs_fh3 *) &arg->symlink;
514 READ3args *arg = (READ3args *)args;
515 fhp1 = (nfs_fh3 *) &arg->file;
520 WRITE3args *arg = (WRITE3args *)args;
521 fhp1 = (nfs_fh3 *) &arg->file;
524 case NFSPROC3_CREATE:
526 CREATE3args *arg = (CREATE3args *)args;
527 fhp1 = (nfs_fh3 *) &arg->where.dir;
532 MKDIR3args *arg = (MKDIR3args *)args;
533 fhp1 = (nfs_fh3 *) &arg->where.dir;
536 case NFSPROC3_SYMLINK:
538 SYMLINK3args *arg = (SYMLINK3args *)args;
539 fhp1 = (nfs_fh3 *) &arg->where.dir;
544 MKNOD3args *arg = (MKNOD3args *)args;
545 fhp1 = (nfs_fh3 *) &arg->where.dir;
548 case NFSPROC3_REMOVE:
550 REMOVE3args *arg = (REMOVE3args *)args;
551 fhp1 = (nfs_fh3 *) &arg->object.dir;
556 RMDIR3args *arg = (RMDIR3args *)args;
557 fhp1 = (nfs_fh3 *) &arg->object.dir;
560 case NFSPROC3_RENAME:
562 RENAME3args *arg = (RENAME3args *)args;
563 fhp1 = (nfs_fh3 *) &arg->from.dir;
564 fhp2 = (nfs_fh3 *) &arg->to.dir;
569 LINK3args *arg = (LINK3args *)args;
570 fhp1 = (nfs_fh3 *) &arg->file;
571 fhp2 = (nfs_fh3 *) &arg->link.dir;
574 case NFSPROC3_READDIR:
576 READDIR3args *arg = (READDIR3args *)args;
577 fhp1 = (nfs_fh3 *) &arg->dir;
580 case NFSPROC3_READDIRPLUS:
582 READDIRPLUS3args *arg = (READDIRPLUS3args *)args;
583 fhp1 = (nfs_fh3 *) &arg->dir;
586 case NFSPROC3_FSSTAT:
588 FSSTAT3args *arg = (FSSTAT3args *)args;
589 fhp1 = (nfs_fh3 *) &arg->fsroot;
592 case NFSPROC3_FSINFO:
594 FSINFO3args *arg = (FSINFO3args *)args;
595 fhp1 = (nfs_fh3 *) &arg->fsroot;
598 case NFSPROC3_PATHCONF:
600 PATHCONF3args *arg = (PATHCONF3args *)args;
601 fhp1 = (nfs_fh3 *) &arg->object;
604 case NFSPROC3_COMMIT:
606 COMMIT3args *arg = (COMMIT3args *)args;
607 fhp1 = (nfs_fh3 *) &arg->file;
614 /* Ok if arg 1 is in AFS or if 2 args and arg 2 is in AFS */
615 if (is_afs_fh3(fhp1)) {
621 if (is_afs_fh3(fhp2)) {
630 acl2_to_afs_call(int which, caddr_t *args, nfs_fh3 **fhpp)
635 case ACLPROC3_GETACL:
637 struct GETACL3args *sargs = (struct GETACL3args *) args;
641 case ACLPROC3_SETACL:
643 struct SETACL3args *sargs = (struct SETACL3args *) args;
651 if (is_afs_fh3(fhp)) {
660 afs_nfs3_dispatcher(int type, afs_int32 which, char *argp,
661 struct exportinfo **expp,
662 struct svc_req *rp, struct AFS_UCRED *crp)
666 afs_int32 client = 0;
668 nfs_fh3 *fh = (nfs_fh3 *)argp;
669 nfs_fh3 *fh2 = (nfs_fh3 *)0;
671 if (!xlatorinit_v3_done)
674 sa = (struct sockaddr *)svc_getrpccaller(rp->rq_xprt)->buf;
675 client = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
681 code = nfs3_to_afs_call(which, argp, &fh, &fh2);
684 code = acl3_to_afs_call(which, argp, &fh);
691 struct afs_exporter *out = 0;
694 struct SmallFid Sfid;
696 memcpy((char *)&Sfid, fh->fh_data, SIZEOF_SMALLFID);
700 if (!once && *expp) {
701 afs_nobody = (*expp)->exi_export.ex_anon;
704 code = afs_nfsclient_reqhandler((struct afs_exporter *)0, &crp,
705 client, &dummy, &out);
706 /* Be careful to release this */
710 /* We ran and failed */
720 afs_nfs3_smallfidder(struct nfs_fh3 *fhp int status)
725 #if defined(AFS_SUN57_64BIT_ENV)
726 /* See also afs_fid() */
727 memcpy((char *)addr, fhp->fh3_data, 10);
728 addr[1] = (addr[1] >> 48) & 0xffff;
730 memcpy((char *)addr, fhp->fh3_data, 2 * sizeof(long));
734 vcp = (struct vcache *)addr[0];
736 /* See also afs_osi_vget */
737 if (addr[1] == AFS_XLATOR_MAGIC)
739 if (status == NFS_OK) {
740 struct SmallFid Sfid;
743 /* Make up and copy out a SmallFid */
744 tcell = afs_GetCell(vcp->fid.Cell, READ_LOCK);
745 Sfid.Volume = vcp->fid.Fid.Volume;
746 Sfid.CellAndUnique = ((tcell->cellIndex << 24) |
747 (vcp->fid.Fid.Unique & 0xffffff));
748 afs_PutCell(tcell, READ_LOCK);
749 Sfid.Vnode = (u_short)(vcp->fid.Fid.Vnode & 0xffff);
750 fhp->fh3_len = SIZEOF_SMALLFID;
751 memcpy(fhp->fh3_data, (char*)&Sfid, fhp->fh3_len);
754 /* If we have a ref, release it */
755 if (vcp->vrefCount >= 1)
756 AFS_RELE((struct vnode *) vcp);
761 #define NFS_V3_REQ(FUNCNAME, NFSOP, POST, RESP, RESPP) \
762 void FUNCNAME(char *args, char *xp, char *exp, char *rp, char *crp) { \
764 struct cred *svcred = curthread->t_cred; \
765 curthread->t_cred = (struct cred*)crp; \
766 call=afs_nfs3_dispatcher(0, NFSOP, (char *)args, &exp, rp, crp); \
767 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp); \
768 else { (*afs_rfs3_disp_tbl[NFSOP].orig_proc)(args, xp, exp, rp, crp); \
769 if (POST && afs_NFSRootOnly && call) { \
770 RESP *resp = ( RESP *)xp; \
771 afs_nfs3_smallfidder( RESPP , resp->status); } \
772 curthread->t_cred = svcred; \
776 NFS_V3_REQ(afs_nfs3_getattr, NFSPROC3_GETATTR, 0, x, x)
777 NFS_V3_REQ(afs_nfs3_setattr, NFSPROC3_SETATTR, 0, x, x)
778 NFS_V3_REQ(afs_nfs3_lookup, NFSPROC3_LOOKUP, 1, LOOKUP3res, &resp->resok.object)
779 NFS_V3_REQ(afs_nfs3_access, NFSPROC3_ACCESS, 0, x, x);
780 NFS_V3_REQ(afs_nfs3_readlink, NFSPROC3_READLINK, 0, x, x);
781 NFS_V3_REQ(afs_nfs3_read, NFSPROC3_READ, 0, x, x);
782 NFS_V3_REQ(afs_nfs3_write, NFSPROC3_WRITE, 0, x, x);
783 NFS_V3_REQ(afs_nfs3_create, NFSPROC3_CREATE, 1, CREATE3res, &resp->resok.obj.handle);
784 NFS_V3_REQ(afs_nfs3_mkdir, NFSPROC3_MKDIR, 1, MKDIR3res, &resp->resok.obj.handle);
785 NFS_V3_REQ(afs_nfs3_symlink, NFSPROC3_SYMLINK, 0, x, x);
786 NFS_V3_REQ(afs_nfs3_mknod, NFSPROC3_MKNOD, 0, x, x);
787 NFS_V3_REQ(afs_nfs3_remove, NFSPROC3_REMOVE, 0, x, x);
788 NFS_V3_REQ(afs_nfs3_rmdir, NFSPROC3_RMDIR, 0, x, x);
789 NFS_V3_REQ(afs_nfs3_rename, NFSPROC3_RENAME, 0, x, x);
790 NFS_V3_REQ(afs_nfs3_link, NFSPROC3_LINK, 0, x, x);
791 NFS_V3_REQ(afs_nfs3_readdir, NFSPROC3_READDIR, 0, x, x);
792 NFS_V3_REQ(afs_nfs3_readdirplus, NFSPROC3_READDIRPLUS, 0, x, x);
793 NFS_V3_REQ(afs_nfs3_fsstat, NFSPROC3_FSSTAT, 0, x, x);
794 NFS_V3_REQ(afs_nfs3_fsinfo, NFSPROC3_FSINFO, 0, x, x);
795 NFS_V3_REQ(afs_nfs3_pathconf, NFSPROC3_PATHCONF, 0, x, x);
796 NFS_V3_REQ(afs_nfs3_commit, NFSPROC3_COMMIT, 0, x, x);
798 struct afs_nfs_disp_tbl afs_rfs3_disp_tbl[RFS_NPROC] = {
800 { afs_nfs3_getattr },
801 { afs_nfs3_setattr },
804 { afs_nfs3_readlink },
809 { afs_nfs3_symlink },
815 { afs_nfs3_readdir },
816 { afs_nfs3_readdirplus },
819 { afs_nfs3_pathconf },
823 #define ACL_V3_REQ(FUNCNAME, NFSOP) \
824 void FUNCNAME(char *args, char *xp, char *exp, char *rp, char *crp) { \
826 struct cred *svcred = curthread->t_cred; \
827 curthread->t_cred = (struct cred*)crp; \
828 call=afs_nfs3_dispatcher(1, NFSOP, (char *)args, &exp, rp, crp); \
829 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp); \
830 else (*afs_rfs3_disp_tbl[NFSOP].orig_proc)(args, xp, exp, rp, crp); \
831 curthread->t_cred = svcred; \
835 ACL_V3_REQ(afs_acl3_getacl, ACLPROC3_GETACL)
836 ACL_V3_REQ(afs_acl3_setacl, ACLPROC3_SETACL)
838 struct afs_nfs_disp_tbl afs_acl3_disp_tbl[ACL3_NPROC] = {
844 /* Munge the dispatch tables to link us in first */
846 afs_xlatorinit_v3(struct rfs_disp_tbl *_rfs_tbl,
847 struct rfs_disp_tbl *_acl_tbl)
851 if (xlatorinit_v3_done++) return;
853 for (i=0; i < RFS3_NPROC; i++) {
854 afs_rfs3_disp_tbl[i].orig_proc = _rfs_tbl[i].dis_proc;
855 _rfs_tbl[i].dis_proc = afs_rfs3_disp_tbl[i].afs_proc;
858 for (i=0; i < ACL3_NPROC; i++) {
859 afs_acl3_disp_tbl[i].orig_proc = _acl_tbl[i].dis_proc;
860 _acl_tbl[i].dis_proc = afs_acl3_disp_tbl[i].afs_proc;
863 #endif /* !defined(AFS_NONFSTRANS)