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"
16 /* Ugly Ugly Ugly but precludes conflicting XDR macros; We want kernel xdr */
17 #define __XDR_INCLUDE__
19 #include "afs/sysincludes.h" /* Standard vendor system headers */
20 #if defined(AFS_SUN55_ENV) && !defined(AFS_NONFSTRANS)
21 #include "rpc/types.h"
23 #include "rpc/auth_unix.h"
24 #include "rpc/auth_des.h"
25 #if !defined(AFS_SUN58_ENV)
26 #include "rpc/auth_kerb.h"
28 #include "sys/tiuser.h"
32 #include "nfs/export.h"
33 #include "nfs/nfs_clnt.h"
34 #include "nfs/nfs_acl.h"
35 #include "afs/afsincludes.h"
36 #include "afs/afs_stats.h"
37 #include "afs/exporter.h"
39 static int xlatorinit_v2_done = 0;
40 static int xlatorinit_v3_done = 0;
41 extern int afs_nobody;
42 extern int afs_NFSRootOnly;
46 xdrproc_t dis_xdrargs;
47 xdrproc_t dis_fastxdrargs;
50 xdrproc_t dis_fastxdrres;
52 void (*dis_resfree) ();
54 fhandle_t(*dis_getfh) ();
57 struct afs_nfs_disp_tbl {
61 struct afs_nfs2_resp {
68 struct afs_nfs_disp_tbl afs_rfs_disp_tbl[RFS_NPROC];
69 struct afs_nfs_disp_tbl afs_acl_disp_tbl[ACL2_NPROC];
72 is_afs_fh(fhandle_t * fhp)
74 if ((fhp->fh_fsid.val[0] == AFS_VFSMAGIC)
75 && (fhp->fh_fsid.val[1] == AFS_VFSFSID))
81 nfs2_to_afs_call(int which, caddr_t * args, fhandle_t ** fhpp,
89 afs_Trace1(afs_iclSetp, CM_TRACE_NFSIN, ICL_TYPE_INT32, which);
90 *fh2pp = (fhandle_t *) 0;
95 fhp1 = (fhandle_t *) args;
99 struct nfssaargs *sargs = (struct nfssaargs *)args;
100 fhp1 = (fhandle_t *) & sargs->saa_fh;
105 struct nfsdiropargs *sargs = (struct nfsdiropargs *)args;
106 fhp1 = sargs->da_fhandle;
111 struct nfsreadargs *sargs = (struct nfsreadargs *)args;
112 fhp1 = (fhandle_t *) & sargs->ra_fhandle;
117 struct nfswriteargs *sargs = (struct nfswriteargs *)args;
118 fhp1 = (fhandle_t *) & sargs->wa_fhandle;
123 struct nfscreatargs *sargs = (struct nfscreatargs *)args;
124 fhp1 = sargs->ca_da.da_fhandle;
129 struct nfsdiropargs *sargs = (struct nfsdiropargs *)args;
130 fhp1 = sargs->da_fhandle;
135 struct nfsrnmargs *sargs = (struct nfsrnmargs *)args;
136 fhp1 = sargs->rna_from.da_fhandle;
137 fhp2 = sargs->rna_to.da_fhandle;
142 struct nfslinkargs *sargs = (struct nfslinkargs *)args;
143 fhp1 = sargs->la_from;
144 fhp2 = sargs->la_to.da_fhandle;
149 struct nfsslargs *sargs = (struct nfsslargs *)args;
150 fhp1 = sargs->sla_from.da_fhandle;
155 struct nfscreatargs *sargs = (struct nfscreatargs *)args;
156 fhp1 = sargs->ca_da.da_fhandle;
161 struct nfsdiropargs *sargs = (struct nfsdiropargs *)args;
162 fhp1 = sargs->da_fhandle;
167 struct nfsrddirargs *sargs = (struct nfsrddirargs *)args;
168 fhp1 = (fhandle_t *) & sargs->rda_fh;
175 /* Ok if arg 1 is in AFS or if 2 args and arg 2 is in AFS */
176 if (is_afs_fh(fhp1)) {
182 if (fhp2 && is_afs_fh(fhp2)) {
191 acl2_to_afs_call(int which, caddr_t * args, fhandle_t ** fhpp)
200 case ACLPROC2_GETACL:
202 struct GETACL2args *sargs = (struct GETACL2args *)args;
206 case ACLPROC2_SETACL:
208 struct SETACL2args *sargs = (struct SETACL2args *)args;
212 case ACLPROC2_GETATTR:
214 struct GETATTR2args *sargs = (struct GETATTR2args *)args;
218 case ACLPROC2_ACCESS:
220 struct ACCESS2args *sargs = (struct ACCESS2args *)args;
228 if (is_afs_fh(fhp)) {
237 afs_nfs2_dispatcher(int type, afs_int32 which, char *argp,
238 struct exportinfo **expp, struct svc_req *rp,
239 struct AFS_UCRED *crp)
243 afs_int32 client = 0;
245 fhandle_t *fh = (fhandle_t *) argp;
246 fhandle_t *fh2 = (fhandle_t *) 0;
248 if (!xlatorinit_v2_done)
251 sa = (struct sockaddr *)svc_getrpccaller(rp->rq_xprt)->buf;
252 if (sa->sa_family == AF_INET)
253 client = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
259 code = (client && nfs2_to_afs_call(which, argp, &fh, &fh2));
262 code = (client && acl2_to_afs_call(which, argp, &fh));
269 struct afs_exporter *out = 0;
272 struct SmallFid Sfid;
274 memcpy((char *)&Sfid, fh->fh_data, SIZEOF_SMALLFID);
276 afs_Trace2(afs_iclSetp, CM_TRACE_NFSIN1, ICL_TYPE_POINTER, client,
277 ICL_TYPE_FID, &Sfid);
281 if (!once && *expp) {
282 afs_nobody = (*expp)->exi_export.ex_anon;
286 afs_nfsclient_reqhandler((struct afs_exporter *)0, &crp, client,
301 afs_nfs2_smallfidder(struct nfsdiropres *dr)
303 register fhandle_t *fhp = (fhandle_t *) & dr->dr_fhandle;
307 #if defined(AFS_SUN57_64BIT_ENV)
308 /* See also afs_fid() */
309 memcpy((char *)addr, fhp->fh_data, SIZEOF_SMALLFID);
310 addr[1] = (addr[1] >> 48) & 0xffff;
312 memcpy((char *)addr, fhp->fh_data, 2 * sizeof(long));
316 vcp = VTOAFS((struct vnode *)addr[0]);
318 if (addr[1] == AFS_XLATOR_MAGIC) {
319 if (dr->dr_status == NFS_OK) {
320 struct SmallFid Sfid;
323 /* Make up and copy out a SmallFid */
324 tcell = afs_GetCell(vcp->fid.Cell, READ_LOCK);
325 Sfid.Volume = vcp->fid.Fid.Volume;
327 ((tcell->cellIndex << 24) | (vcp->fid.Fid.Unique & 0xffffff));
328 afs_PutCell(tcell, READ_LOCK);
329 Sfid.Vnode = (u_short) (vcp->fid.Fid.Vnode & 0xffff);
330 fhp->fh_len = SIZEOF_SMALLFID;
331 memcpy(dr->dr_fhandle.fh_data, (char *)&Sfid, fhp->fh_len);
333 afs_Trace3(afs_iclSetp, CM_TRACE_NFSOUT, ICL_TYPE_INT32, 0,
334 ICL_TYPE_POINTER, vcp, ICL_TYPE_FID, &Sfid);
337 /* If we have a ref, release it */
338 if (vcp->vrefCount >= 1)
339 AFS_RELE(AFSTOV(vcp));
345 afs_nfs2_noaccess(struct afs_nfs2_resp *resp)
347 resp->status = NFSERR_ACCES;
351 afs_nfs2_null(char *args, char *xp, char *exp, char *rp, char *crp)
356 afs_nfs2_root(char *args, char *xp, char *exp, char *rp, char *crp)
361 afs_nfs2_writecache(char *args, char *xp, char *exp, char *rp, char *crp)
366 afs_nfs2_getattr(char *args, char *xp, char *exp, char *rp, char *crp)
369 struct cred *svcred = curthread->t_cred;
370 curthread->t_cred = (struct cred *)crp;
371 call = afs_nfs2_dispatcher(0, RFS_GETATTR, (char *)args, &exp, rp, crp);
373 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
375 (*afs_rfs_disp_tbl[RFS_GETATTR].orig_proc) (args, xp, exp, rp, crp);
376 curthread->t_cred = svcred;
381 afs_nfs2_setattr(char *args, char *xp, char *exp, char *rp, char *crp)
384 struct cred *svcred = curthread->t_cred;
385 curthread->t_cred = (struct cred *)crp;
386 call = afs_nfs2_dispatcher(0, RFS_SETATTR, (char *)args, &exp, rp, crp);
388 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
390 (*afs_rfs_disp_tbl[RFS_SETATTR].orig_proc) (args, xp, exp, rp, crp);
391 curthread->t_cred = svcred;
396 afs_nfs2_lookup(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(0, RFS_LOOKUP, (char *)args, &exp, rp, crp);
403 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
405 (*afs_rfs_disp_tbl[RFS_LOOKUP].orig_proc) (args, xp, exp, rp, crp);
406 if (afs_NFSRootOnly && call)
407 afs_nfs2_smallfidder(xp);
409 curthread->t_cred = svcred;
414 afs_nfs2_readlink(char *args, char *xp, char *exp, char *rp, char *crp)
417 struct cred *svcred = curthread->t_cred;
418 curthread->t_cred = (struct cred *)crp;
419 call = afs_nfs2_dispatcher(0, RFS_READLINK, (char *)args, &exp, rp, crp);
421 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
423 (*afs_rfs_disp_tbl[RFS_READLINK].orig_proc) (args, xp, exp, rp, crp);
424 curthread->t_cred = svcred;
429 afs_nfs2_read(char *args, char *xp, char *exp, char *rp, char *crp)
432 struct cred *svcred = curthread->t_cred;
433 curthread->t_cred = (struct cred *)crp;
434 call = afs_nfs2_dispatcher(0, RFS_READ, (char *)args, &exp, rp, crp);
436 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
438 (*afs_rfs_disp_tbl[RFS_READ].orig_proc) (args, xp, exp, rp, crp);
439 curthread->t_cred = svcred;
444 afs_nfs2_write(char *args, char *xp, char *exp, char *rp, char *crp)
447 struct cred *svcred = curthread->t_cred;
448 curthread->t_cred = (struct cred *)crp;
449 call = afs_nfs2_dispatcher(0, RFS_WRITE, (char *)args, &exp, rp, crp);
451 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
453 (*afs_rfs_disp_tbl[RFS_WRITE].orig_proc) (args, xp, exp, rp, crp);
454 curthread->t_cred = svcred;
459 afs_nfs2_create(char *args, char *xp, char *exp, char *rp, char *crp)
462 struct cred *svcred = curthread->t_cred;
463 curthread->t_cred = (struct cred *)crp;
464 call = afs_nfs2_dispatcher(0, RFS_CREATE, (char *)args, &exp, rp, crp);
466 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
468 (*afs_rfs_disp_tbl[RFS_CREATE].orig_proc) (args, xp, exp, rp, crp);
469 if (afs_NFSRootOnly && call)
470 afs_nfs2_smallfidder(xp);
472 curthread->t_cred = svcred;
477 afs_nfs2_remove(char *args, char *xp, char *exp, char *rp, char *crp)
480 struct cred *svcred = curthread->t_cred;
481 curthread->t_cred = (struct cred *)crp;
482 call = afs_nfs2_dispatcher(0, RFS_REMOVE, (char *)args, &exp, rp, crp);
484 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
486 (*afs_rfs_disp_tbl[RFS_REMOVE].orig_proc) (args, xp, exp, rp, crp);
487 curthread->t_cred = svcred;
492 afs_nfs2_rename(char *args, char *xp, char *exp, char *rp, char *crp)
495 struct cred *svcred = curthread->t_cred;
496 curthread->t_cred = (struct cred *)crp;
497 call = afs_nfs2_dispatcher(0, RFS_RENAME, (char *)args, &exp, rp, crp);
499 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
501 (*afs_rfs_disp_tbl[RFS_RENAME].orig_proc) (args, xp, exp, rp, crp);
502 curthread->t_cred = svcred;
507 afs_nfs2_link(char *args, char *xp, char *exp, char *rp, char *crp)
510 struct cred *svcred = curthread->t_cred;
511 curthread->t_cred = (struct cred *)crp;
512 call = afs_nfs2_dispatcher(0, RFS_LINK, (char *)args, &exp, rp, crp);
514 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
516 (*afs_rfs_disp_tbl[RFS_LINK].orig_proc) (args, xp, exp, rp, crp);
517 curthread->t_cred = svcred;
522 afs_nfs2_symlink(char *args, char *xp, char *exp, char *rp, char *crp)
525 struct cred *svcred = curthread->t_cred;
526 curthread->t_cred = (struct cred *)crp;
527 call = afs_nfs2_dispatcher(0, RFS_SYMLINK, (char *)args, &exp, rp, crp);
529 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
531 (*afs_rfs_disp_tbl[RFS_SYMLINK].orig_proc) (args, xp, exp, rp, crp);
532 curthread->t_cred = svcred;
537 afs_nfs2_mkdir(char *args, char *xp, char *exp, char *rp, char *crp)
540 struct cred *svcred = curthread->t_cred;
541 curthread->t_cred = (struct cred *)crp;
542 call = afs_nfs2_dispatcher(0, RFS_MKDIR, (char *)args, &exp, rp, crp);
544 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
546 (*afs_rfs_disp_tbl[RFS_MKDIR].orig_proc) (args, xp, exp, rp, crp);
547 if (afs_NFSRootOnly && call)
548 afs_nfs2_smallfidder(xp);
550 curthread->t_cred = svcred;
555 afs_nfs2_rmdir(char *args, char *xp, char *exp, char *rp, char *crp)
558 struct cred *svcred = curthread->t_cred;
559 curthread->t_cred = (struct cred *)crp;
560 call = afs_nfs2_dispatcher(0, RFS_RMDIR, (char *)args, &exp, rp, crp);
562 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
564 (*afs_rfs_disp_tbl[RFS_RMDIR].orig_proc) (args, xp, exp, rp, crp);
565 curthread->t_cred = svcred;
570 afs_nfs2_readdir(char *args, char *xp, char *exp, char *rp, char *crp)
573 struct cred *svcred = curthread->t_cred;
574 curthread->t_cred = (struct cred *)crp;
575 call = afs_nfs2_dispatcher(0, RFS_READDIR, (char *)args, &exp, rp, crp);
577 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
579 (*afs_rfs_disp_tbl[RFS_READDIR].orig_proc) (args, xp, exp, rp, crp);
580 curthread->t_cred = svcred;
585 afs_nfs2_statfs(char *args, char *xp, char *exp, char *rp, char *crp)
588 struct cred *svcred = curthread->t_cred;
589 curthread->t_cred = (struct cred *)crp;
590 call = afs_nfs2_dispatcher(0, RFS_STATFS, (char *)args, &exp, rp, crp);
592 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
594 (*afs_rfs_disp_tbl[RFS_STATFS].orig_proc) (args, xp, exp, rp, crp);
595 curthread->t_cred = svcred;
599 struct afs_nfs_disp_tbl afs_rfs_disp_tbl[RFS_NPROC] = {
607 {afs_nfs2_writecache},
621 afs_acl2_getacl(char *args, char *xp, char *exp, char *rp, char *crp)
624 struct cred *svcred = curthread->t_cred;
625 curthread->t_cred = (struct cred *)crp;
627 afs_nfs2_dispatcher(1, ACLPROC2_GETACL, (char *)args, &exp, rp, crp);
629 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
631 (*afs_acl_disp_tbl[ACLPROC2_GETACL].orig_proc) (args, xp, exp, rp,
633 curthread->t_cred = svcred;
638 afs_acl2_setacl(char *args, char *xp, char *exp, char *rp, char *crp)
641 struct cred *svcred = curthread->t_cred;
642 curthread->t_cred = (struct cred *)crp;
644 afs_nfs2_dispatcher(1, ACLPROC2_SETACL, (char *)args, &exp, rp, crp);
646 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
648 (*afs_acl_disp_tbl[ACLPROC2_SETACL].orig_proc) (args, xp, exp, rp,
650 curthread->t_cred = svcred;
655 afs_acl2_getattr(char *args, char *xp, char *exp, char *rp, char *crp)
658 struct cred *svcred = curthread->t_cred;
659 curthread->t_cred = (struct cred *)crp;
661 afs_nfs2_dispatcher(1, ACLPROC2_GETATTR, (char *)args, &exp, rp, crp);
663 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
665 (*afs_acl_disp_tbl[ACLPROC2_GETATTR].orig_proc) (args, xp, exp, rp,
667 curthread->t_cred = svcred;
672 afs_acl2_access(char *args, char *xp, char *exp, char *rp, char *crp)
675 struct cred *svcred = curthread->t_cred;
676 curthread->t_cred = (struct cred *)crp;
678 afs_nfs2_dispatcher(1, ACLPROC2_ACCESS, (char *)args, &exp, rp, crp);
680 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
682 (*afs_acl_disp_tbl[ACLPROC2_ACCESS].orig_proc) (args, xp, exp, rp,
684 curthread->t_cred = svcred;
688 struct afs_nfs_disp_tbl afs_acl_disp_tbl[5] = {
696 /* Munge the dispatch tables to link us in first */
698 afs_xlatorinit_v2(struct rfs_disp_tbl *_rfs_tbl,
699 struct rfs_disp_tbl *_acl_tbl)
703 if (xlatorinit_v2_done++)
706 for (i = 0; i < RFS_NPROC; i++) {
707 afs_rfs_disp_tbl[i].orig_proc = _rfs_tbl[i].dis_proc;
708 _rfs_tbl[i].dis_proc = afs_rfs_disp_tbl[i].afs_proc;
711 for (i = 0; i < 5; i++) {
712 afs_acl_disp_tbl[i].orig_proc = _acl_tbl[i].dis_proc;
713 _acl_tbl[i].dis_proc = afs_acl_disp_tbl[i].afs_proc;
718 #define RFS3_NPROC 22
725 struct afs_nfs_disp_tbl afs_rfs3_disp_tbl[RFS3_NPROC];
726 struct afs_nfs_disp_tbl afs_acl3_disp_tbl[ACL3_NPROC];
728 struct afs_nfs3_resp {
732 typedef struct afs_nfs3_resp afs_nfs3_resp;
735 is_afs_fh3(nfs_fh3 * fhp)
737 if ((fhp->fh3_fsid.val[0] == AFS_VFSMAGIC)
738 && (fhp->fh3_fsid.val[1] == AFS_VFSFSID))
744 afs_nfs3_noaccess(struct afs_nfs3_resp *resp)
746 resp->status = NFS3ERR_ACCES;
751 afs_nfs3_notsupp(struct afs_nfs3_resp *resp)
753 resp->status = NFS3ERR_NOTSUPP;
758 nfs3_to_afs_call(int which, caddr_t * args, nfs_fh3 ** fhpp, nfs_fh3 ** fh2pp)
765 afs_Trace1(afs_iclSetp, CM_TRACE_NFS3IN, ICL_TYPE_INT32, which);
766 *fh2pp = (nfs_fh3 *) 0;
768 case NFSPROC3_GETATTR:
770 GETATTR3args *arg = (GETATTR3args *) args;
771 fhp1 = (nfs_fh3 *) & arg->object;
774 case NFSPROC3_SETATTR:
776 SETATTR3args *arg = (SETATTR3args *) args;
777 fhp1 = (nfs_fh3 *) & arg->object;
780 case NFSPROC3_LOOKUP:
782 LOOKUP3args *arg = (LOOKUP3args *) args;
784 fhp1 = (nfs_fh3 *) arg->what.dirp;
786 fhp1 = (nfs_fh3 *) & arg->what.dir;
790 case NFSPROC3_ACCESS:
792 ACCESS3args *arg = (ACCESS3args *) args;
793 fhp1 = (nfs_fh3 *) & arg->object;
796 case NFSPROC3_READLINK:
798 READLINK3args *arg = (READLINK3args *) args;
799 fhp1 = (nfs_fh3 *) & arg->symlink;
804 READ3args *arg = (READ3args *) args;
805 fhp1 = (nfs_fh3 *) & arg->file;
810 WRITE3args *arg = (WRITE3args *) args;
811 fhp1 = (nfs_fh3 *) & arg->file;
814 case NFSPROC3_CREATE:
816 CREATE3args *arg = (CREATE3args *) args;
817 fhp1 = (nfs_fh3 *) & arg->where.dir;
822 MKDIR3args *arg = (MKDIR3args *) args;
823 fhp1 = (nfs_fh3 *) & arg->where.dir;
826 case NFSPROC3_SYMLINK:
828 SYMLINK3args *arg = (SYMLINK3args *) args;
829 fhp1 = (nfs_fh3 *) & arg->where.dir;
834 MKNOD3args *arg = (MKNOD3args *) args;
835 fhp1 = (nfs_fh3 *) & arg->where.dir;
838 case NFSPROC3_REMOVE:
840 REMOVE3args *arg = (REMOVE3args *) args;
841 fhp1 = (nfs_fh3 *) & arg->object.dir;
846 RMDIR3args *arg = (RMDIR3args *) args;
847 fhp1 = (nfs_fh3 *) & arg->object.dir;
850 case NFSPROC3_RENAME:
852 RENAME3args *arg = (RENAME3args *) args;
853 fhp1 = (nfs_fh3 *) & arg->from.dir;
854 fhp2 = (nfs_fh3 *) & arg->to.dir;
859 LINK3args *arg = (LINK3args *) args;
860 fhp1 = (nfs_fh3 *) & arg->file;
861 fhp2 = (nfs_fh3 *) & arg->link.dir;
864 case NFSPROC3_READDIR:
866 READDIR3args *arg = (READDIR3args *) args;
867 fhp1 = (nfs_fh3 *) & arg->dir;
870 case NFSPROC3_READDIRPLUS:
872 READDIRPLUS3args *arg = (READDIRPLUS3args *) args;
873 fhp1 = (nfs_fh3 *) & arg->dir;
876 case NFSPROC3_FSSTAT:
878 FSSTAT3args *arg = (FSSTAT3args *) args;
879 fhp1 = (nfs_fh3 *) & arg->fsroot;
882 case NFSPROC3_FSINFO:
884 FSINFO3args *arg = (FSINFO3args *) args;
885 fhp1 = (nfs_fh3 *) & arg->fsroot;
888 case NFSPROC3_PATHCONF:
890 PATHCONF3args *arg = (PATHCONF3args *) args;
891 fhp1 = (nfs_fh3 *) & arg->object;
894 case NFSPROC3_COMMIT:
896 COMMIT3args *arg = (COMMIT3args *) args;
897 fhp1 = (nfs_fh3 *) & arg->file;
904 if (is_afs_fh3(fhp1)) {
910 if (fhp2 && is_afs_fh3(fhp2)) {
919 acl3_to_afs_call(int which, caddr_t * args, nfs_fh3 ** fhpp)
924 case ACLPROC3_GETACL:
926 struct GETACL3args *sargs = (struct GETACL3args *)args;
930 case ACLPROC3_SETACL:
932 struct SETACL3args *sargs = (struct SETACL3args *)args;
940 if (is_afs_fh3(fhp)) {
949 afs_nfs3_dispatcher(int type, afs_int32 which, char *argp,
950 struct exportinfo **expp, struct svc_req *rp,
951 struct AFS_UCRED *crp)
955 afs_int32 client = 0;
957 nfs_fh3 *fh = (nfs_fh3 *) argp;
958 nfs_fh3 *fh2 = (nfs_fh3 *) 0;
960 if (!xlatorinit_v3_done)
963 sa = (struct sockaddr *)svc_getrpccaller(rp->rq_xprt)->buf;
964 if (sa->sa_family == AF_INET)
965 client = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
971 code = (client && nfs3_to_afs_call(which, argp, &fh, &fh2));
974 code = (client && acl3_to_afs_call(which, argp, &fh));
981 struct afs_exporter *out = 0;
984 struct SmallFid Sfid;
986 memcpy((char *)&Sfid, fh->fh3_data, SIZEOF_SMALLFID);
988 afs_Trace2(afs_iclSetp, CM_TRACE_NFS3IN1, ICL_TYPE_INT32, client,
989 ICL_TYPE_FID, &Sfid);
992 if (!once && *expp) {
993 afs_nobody = (*expp)->exi_export.ex_anon;
997 afs_nfsclient_reqhandler((struct afs_exporter *)0, &crp, client,
1013 afs_nfs3_smallfidder(struct nfs_fh3 *fhp, int status)
1018 #if defined(AFS_SUN57_64BIT_ENV)
1019 /* See also afs_fid() */
1020 memcpy((char *)addr, fhp->fh3_data, 10);
1021 addr[1] = (addr[1] >> 48) & 0xffff;
1023 memcpy((char *)addr, fhp->fh3_data, 2 * sizeof(long));
1027 vcp = VTOAFS((struct vnode *)addr[0]);
1029 /* See also afs_osi_vget */
1030 if (addr[1] == AFS_XLATOR_MAGIC) {
1031 if (status == NFS_OK) {
1032 struct SmallFid Sfid;
1035 /* Make up and copy out a SmallFid */
1036 tcell = afs_GetCell(vcp->fid.Cell, READ_LOCK);
1037 Sfid.Volume = vcp->fid.Fid.Volume;
1038 Sfid.CellAndUnique =
1039 ((tcell->cellIndex << 24) | (vcp->fid.Fid.Unique & 0xffffff));
1040 afs_PutCell(tcell, READ_LOCK);
1041 Sfid.Vnode = (u_short) (vcp->fid.Fid.Vnode & 0xffff);
1042 fhp->fh3_len = SIZEOF_SMALLFID;
1043 memcpy(fhp->fh3_data, (char *)&Sfid, fhp->fh3_len);
1045 afs_Trace3(afs_iclSetp, CM_TRACE_NFS3OUT, ICL_TYPE_INT32, status,
1046 ICL_TYPE_POINTER, vcp, ICL_TYPE_FID, &Sfid);
1049 /* If we have a ref, release it */
1050 if (vcp->vrefCount >= 1)
1051 AFS_RELE(AFSTOV(vcp));
1057 afs_nfs3_getattr(char *args, char *xp, char *exp, char *rp, char *crp)
1060 afs_nfs3_resp dummy;
1061 struct cred *svcred = curthread->t_cred;
1062 curthread->t_cred = (struct cred *)crp;
1064 afs_nfs3_dispatcher(0, NFSPROC3_GETATTR, (char *)args, &exp, rp, crp);
1066 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1068 (*afs_rfs3_disp_tbl[NFSPROC3_GETATTR].orig_proc) (args, xp, exp, rp,
1070 curthread->t_cred = svcred;
1075 afs_nfs3_setattr(char *args, char *xp, char *exp, char *rp, char *crp)
1078 afs_nfs3_resp dummy;
1079 struct cred *svcred = curthread->t_cred;
1080 curthread->t_cred = (struct cred *)crp;
1082 afs_nfs3_dispatcher(0, NFSPROC3_SETATTR, (char *)args, &exp, rp, crp);
1084 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1086 (*afs_rfs3_disp_tbl[NFSPROC3_SETATTR].orig_proc) (args, xp, exp, rp,
1088 curthread->t_cred = svcred;
1093 afs_nfs3_lookup(char *args, char *xp, char *exp, char *rp, char *crp)
1096 afs_nfs3_resp dummy;
1097 struct cred *svcred = curthread->t_cred;
1098 curthread->t_cred = (struct cred *)crp;
1100 afs_nfs3_dispatcher(0, NFSPROC3_LOOKUP, (char *)args, &exp, rp, crp);
1102 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1104 (*afs_rfs3_disp_tbl[NFSPROC3_LOOKUP].orig_proc) (args, xp, exp, rp,
1106 if (afs_NFSRootOnly && call) {
1107 LOOKUP3res *resp = (LOOKUP3res *) xp;
1108 afs_nfs3_smallfidder(&resp->resok.object, resp->status);
1111 curthread->t_cred = svcred;
1116 afs_nfs3_access(char *args, char *xp, char *exp, char *rp, char *crp)
1119 afs_nfs3_resp dummy;
1120 struct cred *svcred = curthread->t_cred;
1121 curthread->t_cred = (struct cred *)crp;
1123 afs_nfs3_dispatcher(0, NFSPROC3_ACCESS, (char *)args, &exp, rp, crp);
1125 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1127 (*afs_rfs3_disp_tbl[NFSPROC3_ACCESS].orig_proc) (args, xp, exp, rp,
1129 curthread->t_cred = svcred;
1134 afs_nfs3_readlink(char *args, char *xp, char *exp, char *rp, char *crp)
1137 afs_nfs3_resp dummy;
1138 struct cred *svcred = curthread->t_cred;
1139 curthread->t_cred = (struct cred *)crp;
1141 afs_nfs3_dispatcher(0, NFSPROC3_READLINK, (char *)args, &exp, rp,
1144 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1146 (*afs_rfs3_disp_tbl[NFSPROC3_READLINK].orig_proc) (args, xp, exp, rp,
1148 curthread->t_cred = svcred;
1153 afs_nfs3_read(char *args, char *xp, char *exp, char *rp, char *crp)
1156 afs_nfs3_resp dummy;
1157 struct cred *svcred = curthread->t_cred;
1158 curthread->t_cred = (struct cred *)crp;
1159 call = afs_nfs3_dispatcher(0, NFSPROC3_READ, (char *)args, &exp, rp, crp);
1161 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1163 (*afs_rfs3_disp_tbl[NFSPROC3_READ].orig_proc) (args, xp, exp, rp,
1165 curthread->t_cred = svcred;
1170 afs_nfs3_write(char *args, char *xp, char *exp, char *rp, char *crp)
1173 afs_nfs3_resp dummy;
1174 struct cred *svcred = curthread->t_cred;
1175 curthread->t_cred = (struct cred *)crp;
1177 afs_nfs3_dispatcher(0, NFSPROC3_WRITE, (char *)args, &exp, rp, crp);
1179 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1181 (*afs_rfs3_disp_tbl[NFSPROC3_WRITE].orig_proc) (args, xp, exp, rp,
1183 curthread->t_cred = svcred;
1188 afs_nfs3_create(char *args, char *xp, char *exp, char *rp, char *crp)
1191 afs_nfs3_resp dummy;
1192 struct cred *svcred = curthread->t_cred;
1193 curthread->t_cred = (struct cred *)crp;
1195 afs_nfs3_dispatcher(0, NFSPROC3_CREATE, (char *)args, &exp, rp, crp);
1197 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1199 (*afs_rfs3_disp_tbl[NFSPROC3_CREATE].orig_proc) (args, xp, exp, rp,
1201 if (afs_NFSRootOnly && call) {
1202 CREATE3res *resp = (CREATE3res *) xp;
1203 afs_nfs3_smallfidder(&resp->resok.obj.handle, resp->status);
1206 curthread->t_cred = svcred;
1211 afs_nfs3_mkdir(char *args, char *xp, char *exp, char *rp, char *crp)
1214 afs_nfs3_resp dummy;
1215 struct cred *svcred = curthread->t_cred;
1216 curthread->t_cred = (struct cred *)crp;
1218 afs_nfs3_dispatcher(0, NFSPROC3_MKDIR, (char *)args, &exp, rp, crp);
1220 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1222 (*afs_rfs3_disp_tbl[NFSPROC3_MKDIR].orig_proc) (args, xp, exp, rp,
1224 if (afs_NFSRootOnly && call) {
1225 MKDIR3res *resp = (MKDIR3res *) xp;
1226 afs_nfs3_smallfidder(&resp->resok.obj.handle, resp->status);
1229 curthread->t_cred = svcred;
1234 afs_nfs3_symlink(char *args, char *xp, char *exp, char *rp, char *crp)
1237 afs_nfs3_resp dummy;
1238 struct cred *svcred = curthread->t_cred;
1239 curthread->t_cred = (struct cred *)crp;
1241 afs_nfs3_dispatcher(0, NFSPROC3_SYMLINK, (char *)args, &exp, rp, crp);
1243 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1245 (*afs_rfs3_disp_tbl[NFSPROC3_SYMLINK].orig_proc) (args, xp, exp, rp,
1247 if (afs_NFSRootOnly && call) {
1248 SYMLINK3res *resp = (SYMLINK3res *) xp;
1249 afs_nfs3_smallfidder(&resp->resok.obj.handle, resp->status);
1252 curthread->t_cred = svcred;
1257 afs_nfs3_mknod(char *args, char *xp, char *exp, char *rp, char *crp)
1260 afs_nfs3_resp dummy;
1261 struct cred *svcred = curthread->t_cred;
1262 curthread->t_cred = (struct cred *)crp;
1264 afs_nfs3_dispatcher(0, NFSPROC3_MKNOD, (char *)args, &exp, rp, crp);
1266 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1268 (*afs_rfs3_disp_tbl[NFSPROC3_MKNOD].orig_proc) (args, xp, exp, rp,
1270 if (afs_NFSRootOnly && call) {
1271 MKNOD3res *resp = (MKNOD3res *) xp;
1272 afs_nfs3_smallfidder(&resp->resok.obj.handle, resp->status);
1275 curthread->t_cred = svcred;
1280 afs_nfs3_remove(char *args, char *xp, char *exp, char *rp, char *crp)
1283 afs_nfs3_resp dummy;
1284 struct cred *svcred = curthread->t_cred;
1285 curthread->t_cred = (struct cred *)crp;
1287 afs_nfs3_dispatcher(0, NFSPROC3_REMOVE, (char *)args, &exp, rp, crp);
1289 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1291 (*afs_rfs3_disp_tbl[NFSPROC3_REMOVE].orig_proc) (args, xp, exp, rp,
1293 curthread->t_cred = svcred;
1298 afs_nfs3_rmdir(char *args, char *xp, char *exp, char *rp, char *crp)
1301 afs_nfs3_resp dummy;
1302 struct cred *svcred = curthread->t_cred;
1303 curthread->t_cred = (struct cred *)crp;
1305 afs_nfs3_dispatcher(0, NFSPROC3_RMDIR, (char *)args, &exp, rp, crp);
1307 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1309 (*afs_rfs3_disp_tbl[NFSPROC3_RMDIR].orig_proc) (args, xp, exp, rp,
1311 curthread->t_cred = svcred;
1316 afs_nfs3_rename(char *args, char *xp, char *exp, char *rp, char *crp)
1319 afs_nfs3_resp dummy;
1320 struct cred *svcred = curthread->t_cred;
1321 curthread->t_cred = (struct cred *)crp;
1323 afs_nfs3_dispatcher(0, NFSPROC3_RENAME, (char *)args, &exp, rp, crp);
1325 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1327 (*afs_rfs3_disp_tbl[NFSPROC3_RENAME].orig_proc) (args, xp, exp, rp,
1329 curthread->t_cred = svcred;
1334 afs_nfs3_link(char *args, char *xp, char *exp, char *rp, char *crp)
1337 afs_nfs3_resp dummy;
1338 struct cred *svcred = curthread->t_cred;
1339 curthread->t_cred = (struct cred *)crp;
1340 call = afs_nfs3_dispatcher(0, NFSPROC3_LINK, (char *)args, &exp, rp, crp);
1342 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1344 (*afs_rfs3_disp_tbl[NFSPROC3_LINK].orig_proc) (args, xp, exp, rp,
1346 curthread->t_cred = svcred;
1351 afs_nfs3_readdir(char *args, char *xp, char *exp, char *rp, char *crp)
1354 afs_nfs3_resp dummy;
1355 struct cred *svcred = curthread->t_cred;
1356 curthread->t_cred = (struct cred *)crp;
1358 afs_nfs3_dispatcher(0, NFSPROC3_READDIR, (char *)args, &exp, rp, crp);
1360 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1362 (*afs_rfs3_disp_tbl[NFSPROC3_READDIR].orig_proc) (args, xp, exp, rp,
1364 curthread->t_cred = svcred;
1369 afs_nfs3_readdirplus(char *args, char *xp, char *exp, char *rp, char *crp)
1372 afs_nfs3_resp dummy;
1373 struct cred *svcred = curthread->t_cred;
1374 curthread->t_cred = (struct cred *)crp;
1376 afs_nfs3_dispatcher(0, NFSPROC3_READDIRPLUS, (char *)args, &exp, rp,
1379 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1381 afs_nfs3_notsupp((struct afs_nfs3_resp *)xp);
1383 (*afs_rfs3_disp_tbl[NFSPROC3_READDIRPLUS].orig_proc) (args, xp, exp,
1385 curthread->t_cred = svcred;
1390 afs_nfs3_fsstat(char *args, char *xp, char *exp, char *rp, char *crp)
1393 afs_nfs3_resp dummy;
1394 struct cred *svcred = curthread->t_cred;
1395 curthread->t_cred = (struct cred *)crp;
1397 afs_nfs3_dispatcher(0, NFSPROC3_FSSTAT, (char *)args, &exp, rp, crp);
1399 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1401 (*afs_rfs3_disp_tbl[NFSPROC3_FSSTAT].orig_proc) (args, xp, exp, rp,
1403 curthread->t_cred = svcred;
1408 afs_nfs3_fsinfo(char *args, char *xp, char *exp, char *rp, char *crp)
1411 afs_nfs3_resp dummy;
1412 struct cred *svcred = curthread->t_cred;
1413 curthread->t_cred = (struct cred *)crp;
1415 afs_nfs3_dispatcher(0, NFSPROC3_FSINFO, (char *)args, &exp, rp, crp);
1417 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1419 (*afs_rfs3_disp_tbl[NFSPROC3_FSINFO].orig_proc) (args, xp, exp, rp,
1421 curthread->t_cred = svcred;
1426 afs_nfs3_pathconf(char *args, char *xp, char *exp, char *rp, char *crp)
1429 afs_nfs3_resp dummy;
1430 struct cred *svcred = curthread->t_cred;
1431 curthread->t_cred = (struct cred *)crp;
1433 afs_nfs3_dispatcher(0, NFSPROC3_PATHCONF, (char *)args, &exp, rp,
1436 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1438 (*afs_rfs3_disp_tbl[NFSPROC3_PATHCONF].orig_proc) (args, xp, exp, rp,
1440 curthread->t_cred = svcred;
1445 afs_nfs3_commit(char *args, char *xp, char *exp, char *rp, char *crp)
1448 afs_nfs3_resp dummy;
1449 struct cred *svcred = curthread->t_cred;
1450 curthread->t_cred = (struct cred *)crp;
1452 afs_nfs3_dispatcher(0, NFSPROC3_COMMIT, (char *)args, &exp, rp, crp);
1454 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1456 (*afs_rfs3_disp_tbl[NFSPROC3_COMMIT].orig_proc) (args, xp, exp, rp,
1458 curthread->t_cred = svcred;
1462 struct afs_nfs_disp_tbl afs_rfs3_disp_tbl[22] = {
1468 {afs_nfs3_readlink},
1480 {afs_nfs3_readdirplus},
1483 {afs_nfs3_pathconf},
1488 afs_acl3_getacl(char *args, char *xp, char *exp, char *rp, char *crp)
1491 struct cred *svcred = curthread->t_cred;
1492 curthread->t_cred = (struct cred *)crp;
1494 afs_nfs3_dispatcher(1, ACLPROC3_GETACL, (char *)args, &exp, rp, crp);
1496 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1498 (*afs_acl3_disp_tbl[ACLPROC3_GETACL].orig_proc) (args, xp, exp, rp,
1500 curthread->t_cred = svcred;
1505 afs_acl3_setacl(char *args, char *xp, char *exp, char *rp, char *crp)
1508 struct cred *svcred = curthread->t_cred;
1509 curthread->t_cred = (struct cred *)crp;
1511 afs_nfs3_dispatcher(1, ACLPROC3_SETACL, (char *)args, &exp, rp, crp);
1513 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1515 (*afs_acl3_disp_tbl[ACLPROC3_SETACL].orig_proc) (args, xp, exp, rp,
1517 curthread->t_cred = svcred;
1521 struct afs_nfs_disp_tbl afs_acl3_disp_tbl[3] = {
1527 /* Munge the dispatch tables to link us in first */
1529 afs_xlatorinit_v3(struct rfs_disp_tbl *_rfs_tbl,
1530 struct rfs_disp_tbl *_acl_tbl)
1534 if (xlatorinit_v3_done++)
1537 for (i = 0; i < 22; i++) {
1538 afs_rfs3_disp_tbl[i].orig_proc = _rfs_tbl[i].dis_proc;
1539 _rfs_tbl[i].dis_proc = afs_rfs3_disp_tbl[i].afs_proc;
1542 for (i = 0; i < 3; i++) {
1543 afs_acl3_disp_tbl[i].orig_proc = _acl_tbl[i].dis_proc;
1544 _acl_tbl[i].dis_proc = afs_acl3_disp_tbl[i].afs_proc;
1547 #endif /* !defined(AFS_NONFSTRANS) */