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"
14 /* Ugly Ugly Ugly but precludes conflicting XDR macros; We want kernel xdr */
15 #define __XDR_INCLUDE__
17 #include "afs/sysincludes.h" /* Standard vendor system headers */
18 #if defined(AFS_SUN55_ENV) && !defined(AFS_NONFSTRANS)
19 #include "rpc/types.h"
21 #include "rpc/auth_unix.h"
22 #include "rpc/auth_des.h"
23 #if !defined(AFS_SUN58_ENV)
24 #include "rpc/auth_kerb.h"
26 #include "sys/tiuser.h"
30 #include "nfs/export.h"
31 #include "nfs/nfs_clnt.h"
32 #include "nfs/nfs_acl.h"
33 #include "afs/afsincludes.h"
34 #include "afs/afs_stats.h"
35 #include "afs/exporter.h"
37 static int xlatorinit_v2_done = 0;
38 static int xlatorinit_v3_done = 0;
39 extern int afs_nobody;
40 extern int afs_NFSRootOnly;
44 xdrproc_t dis_xdrargs;
45 xdrproc_t dis_fastxdrargs;
48 xdrproc_t dis_fastxdrres;
50 void (*dis_resfree) ();
52 fhandle_t(*dis_getfh) ();
55 struct afs_nfs_disp_tbl {
59 struct afs_nfs2_resp {
64 #if defined(AFS_SUN510_ENV)
70 struct afs_nfs_disp_tbl afs_rfs_disp_tbl[RFS_NPROC];
71 struct afs_nfs_disp_tbl afs_acl_disp_tbl[ACL2_NPROC];
74 is_afs_fh(fhandle_t * fhp)
76 if ((fhp->fh_fsid.val[0] == AFS_VFSMAGIC)
77 && (fhp->fh_fsid.val[1] == AFS_VFSFSID))
83 nfs2_to_afs_call(int which, caddr_t * args, fhandle_t ** fhpp,
91 afs_Trace1(afs_iclSetp, CM_TRACE_NFSIN, ICL_TYPE_INT32, which);
92 *fh2pp = (fhandle_t *) 0;
97 fhp1 = (fhandle_t *) args;
101 struct nfssaargs *sargs = (struct nfssaargs *)args;
102 fhp1 = (fhandle_t *) & sargs->saa_fh;
107 struct nfsdiropargs *sargs = (struct nfsdiropargs *)args;
108 fhp1 = sargs->da_fhandle;
113 struct nfsreadargs *sargs = (struct nfsreadargs *)args;
114 fhp1 = (fhandle_t *) & sargs->ra_fhandle;
119 struct nfswriteargs *sargs = (struct nfswriteargs *)args;
120 fhp1 = (fhandle_t *) & sargs->wa_fhandle;
125 struct nfscreatargs *sargs = (struct nfscreatargs *)args;
126 fhp1 = sargs->ca_da.da_fhandle;
131 struct nfsdiropargs *sargs = (struct nfsdiropargs *)args;
132 fhp1 = sargs->da_fhandle;
137 struct nfsrnmargs *sargs = (struct nfsrnmargs *)args;
138 fhp1 = sargs->rna_from.da_fhandle;
139 fhp2 = sargs->rna_to.da_fhandle;
144 struct nfslinkargs *sargs = (struct nfslinkargs *)args;
145 fhp1 = sargs->la_from;
146 fhp2 = sargs->la_to.da_fhandle;
151 struct nfsslargs *sargs = (struct nfsslargs *)args;
152 fhp1 = sargs->sla_from.da_fhandle;
157 struct nfscreatargs *sargs = (struct nfscreatargs *)args;
158 fhp1 = sargs->ca_da.da_fhandle;
163 struct nfsdiropargs *sargs = (struct nfsdiropargs *)args;
164 fhp1 = sargs->da_fhandle;
169 struct nfsrddirargs *sargs = (struct nfsrddirargs *)args;
170 fhp1 = (fhandle_t *) & sargs->rda_fh;
177 /* Ok if arg 1 is in AFS or if 2 args and arg 2 is in AFS */
178 if (fhp1 && is_afs_fh(fhp1)) {
184 if (fhp2 && is_afs_fh(fhp2)) {
193 acl2_to_afs_call(int which, caddr_t * args, fhandle_t ** fhpp)
202 case ACLPROC2_GETACL:
204 struct GETACL2args *sargs = (struct GETACL2args *)args;
208 case ACLPROC2_SETACL:
210 struct SETACL2args *sargs = (struct SETACL2args *)args;
214 case ACLPROC2_GETATTR:
216 struct GETATTR2args *sargs = (struct GETATTR2args *)args;
220 case ACLPROC2_ACCESS:
222 struct ACCESS2args *sargs = (struct ACCESS2args *)args;
226 #if defined(AFS_SUN510_ENV)
227 case ACLPROC2_GETXATTRDIR:
229 struct GETXATTRDIR2args *sargs = (struct GETXATTRDIR2args *)args;
238 if (fhp && is_afs_fh(fhp)) {
247 afs_nfs2_dispatcher(int type, afs_int32 which, char *argp,
248 struct exportinfo **expp, struct svc_req *rp,
253 afs_int32 client = 0;
255 fhandle_t *fh = (fhandle_t *) argp;
256 fhandle_t *fh2 = (fhandle_t *) 0;
258 if (!xlatorinit_v2_done)
261 sa = (struct sockaddr *)svc_getrpccaller(rp->rq_xprt)->buf;
262 if (sa->sa_family == AF_INET)
263 client = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
269 code = (client && nfs2_to_afs_call(which, argp, &fh, &fh2));
272 code = (client && acl2_to_afs_call(which, argp, &fh));
279 struct afs_exporter *out = 0;
282 struct SmallFid Sfid;
284 memcpy((char *)&Sfid, fh->fh_data, SIZEOF_SMALLFID);
286 afs_Trace2(afs_iclSetp, CM_TRACE_NFSIN1, ICL_TYPE_POINTER, client,
287 ICL_TYPE_FID, &Sfid);
291 if (!once && *expp) {
292 afs_nobody = (*expp)->exi_export.ex_anon;
296 afs_nfsclient_reqhandler((struct afs_exporter *)0, &crp, client,
311 afs_nfs2_smallfidder(struct nfsdiropres *dr)
313 register fhandle_t *fhp = (fhandle_t *) & dr->dr_fhandle;
317 #if defined(AFS_SUN57_64BIT_ENV)
318 /* See also afs_fid() */
319 memcpy((char *)addr, fhp->fh_data, SIZEOF_SMALLFID);
320 addr[1] = (addr[1] >> 48) & 0xffff;
322 memcpy((char *)addr, fhp->fh_data, 2 * sizeof(long));
326 vcp = VTOAFS((struct vnode *)addr[0]);
328 if (addr[1] == AFS_XLATOR_MAGIC) {
329 if (dr->dr_status == NFS_OK) {
330 struct SmallFid Sfid;
333 /* Make up and copy out a SmallFid */
334 tcell = afs_GetCell(vcp->f.fid.Cell, READ_LOCK);
335 Sfid.Volume = vcp->f.fid.Fid.Volume;
337 ((tcell->cellIndex << 24) | (vcp->f.fid.Fid.Unique & 0xffffff));
338 afs_PutCell(tcell, READ_LOCK);
339 Sfid.Vnode = (u_short) (vcp->f.fid.Fid.Vnode & 0xffff);
340 fhp->fh_len = SIZEOF_SMALLFID;
341 memcpy(dr->dr_fhandle.fh_data, (char *)&Sfid, fhp->fh_len);
343 afs_Trace3(afs_iclSetp, CM_TRACE_NFSOUT, ICL_TYPE_INT32, 0,
344 ICL_TYPE_POINTER, vcp, ICL_TYPE_FID, &Sfid);
347 /* If we have a ref, release it */
348 if (vcp->vrefCount >= 1)
349 AFS_RELE(AFSTOV(vcp));
355 afs_nfs2_noaccess(struct afs_nfs2_resp *resp)
357 resp->status = NFSERR_ACCES;
361 afs_nfs2_null(char *args, char *xp, char *exp, char *rp, char *crp)
366 afs_nfs2_root(char *args, char *xp, char *exp, char *rp, char *crp)
371 afs_nfs2_writecache(char *args, char *xp, char *exp, char *rp, char *crp)
376 afs_nfs2_getattr(char *args, char *xp, char *exp, char *rp, char *crp)
379 afs_ucred_t *svcred = curthread->t_cred;
380 curthread->t_cred = (afs_ucred_t *)crp;
381 call = afs_nfs2_dispatcher(0, RFS_GETATTR, (char *)args, &exp, rp, crp);
383 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
385 (*afs_rfs_disp_tbl[RFS_GETATTR].orig_proc) (args, xp, exp, rp, crp);
386 curthread->t_cred = svcred;
391 afs_nfs2_setattr(char *args, char *xp, char *exp, char *rp, char *crp)
394 afs_ucred_t *svcred = curthread->t_cred;
395 curthread->t_cred = (afs_ucred_t *)crp;
396 call = afs_nfs2_dispatcher(0, RFS_SETATTR, (char *)args, &exp, rp, crp);
398 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
400 (*afs_rfs_disp_tbl[RFS_SETATTR].orig_proc) (args, xp, exp, rp, crp);
401 curthread->t_cred = svcred;
406 afs_nfs2_lookup(char *args, char *xp, char *exp, char *rp, char *crp)
409 afs_ucred_t *svcred = curthread->t_cred;
410 curthread->t_cred = (afs_ucred_t *)crp;
411 call = afs_nfs2_dispatcher(0, RFS_LOOKUP, (char *)args, &exp, rp, crp);
413 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
415 (*afs_rfs_disp_tbl[RFS_LOOKUP].orig_proc) (args, xp, exp, rp, crp);
416 if (afs_NFSRootOnly && call)
417 afs_nfs2_smallfidder(xp);
419 curthread->t_cred = svcred;
424 afs_nfs2_readlink(char *args, char *xp, char *exp, char *rp, char *crp)
427 afs_ucred_t *svcred = curthread->t_cred;
428 curthread->t_cred = (afs_ucred_t *)crp;
429 call = afs_nfs2_dispatcher(0, RFS_READLINK, (char *)args, &exp, rp, crp);
431 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
433 (*afs_rfs_disp_tbl[RFS_READLINK].orig_proc) (args, xp, exp, rp, crp);
434 curthread->t_cred = svcred;
439 afs_nfs2_read(char *args, char *xp, char *exp, char *rp, char *crp)
442 afs_ucred_t *svcred = curthread->t_cred;
443 curthread->t_cred = (afs_ucred_t *)crp;
444 call = afs_nfs2_dispatcher(0, RFS_READ, (char *)args, &exp, rp, crp);
446 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
448 (*afs_rfs_disp_tbl[RFS_READ].orig_proc) (args, xp, exp, rp, crp);
449 curthread->t_cred = svcred;
454 afs_nfs2_write(char *args, char *xp, char *exp, char *rp, char *crp)
457 afs_ucred_t *svcred = curthread->t_cred;
458 curthread->t_cred = (afs_ucred_t *)crp;
459 call = afs_nfs2_dispatcher(0, RFS_WRITE, (char *)args, &exp, rp, crp);
461 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
463 (*afs_rfs_disp_tbl[RFS_WRITE].orig_proc) (args, xp, exp, rp, crp);
464 curthread->t_cred = svcred;
469 afs_nfs2_create(char *args, char *xp, char *exp, char *rp, char *crp)
472 afs_ucred_t *svcred = curthread->t_cred;
473 curthread->t_cred = (afs_ucred_t *)crp;
474 call = afs_nfs2_dispatcher(0, RFS_CREATE, (char *)args, &exp, rp, crp);
476 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
478 (*afs_rfs_disp_tbl[RFS_CREATE].orig_proc) (args, xp, exp, rp, crp);
479 if (afs_NFSRootOnly && call)
480 afs_nfs2_smallfidder(xp);
482 curthread->t_cred = svcred;
487 afs_nfs2_remove(char *args, char *xp, char *exp, char *rp, char *crp)
490 afs_ucred_t *svcred = curthread->t_cred;
491 curthread->t_cred = (afs_ucred_t *)crp;
492 call = afs_nfs2_dispatcher(0, RFS_REMOVE, (char *)args, &exp, rp, crp);
494 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
496 (*afs_rfs_disp_tbl[RFS_REMOVE].orig_proc) (args, xp, exp, rp, crp);
497 curthread->t_cred = svcred;
502 afs_nfs2_rename(char *args, char *xp, char *exp, char *rp, char *crp)
505 afs_ucred_t *svcred = curthread->t_cred;
506 curthread->t_cred = (afs_ucred_t *)crp;
507 call = afs_nfs2_dispatcher(0, RFS_RENAME, (char *)args, &exp, rp, crp);
509 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
511 (*afs_rfs_disp_tbl[RFS_RENAME].orig_proc) (args, xp, exp, rp, crp);
512 curthread->t_cred = svcred;
517 afs_nfs2_link(char *args, char *xp, char *exp, char *rp, char *crp)
520 afs_ucred_t *svcred = curthread->t_cred;
521 curthread->t_cred = (afs_ucred_t *)crp;
522 call = afs_nfs2_dispatcher(0, RFS_LINK, (char *)args, &exp, rp, crp);
524 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
526 (*afs_rfs_disp_tbl[RFS_LINK].orig_proc) (args, xp, exp, rp, crp);
527 curthread->t_cred = svcred;
532 afs_nfs2_symlink(char *args, char *xp, char *exp, char *rp, char *crp)
535 afs_ucred_t *svcred = curthread->t_cred;
536 curthread->t_cred = (afs_ucred_t *)crp;
537 call = afs_nfs2_dispatcher(0, RFS_SYMLINK, (char *)args, &exp, rp, crp);
539 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
541 (*afs_rfs_disp_tbl[RFS_SYMLINK].orig_proc) (args, xp, exp, rp, crp);
542 curthread->t_cred = svcred;
547 afs_nfs2_mkdir(char *args, char *xp, char *exp, char *rp, char *crp)
550 afs_ucred_t *svcred = curthread->t_cred;
551 curthread->t_cred = (afs_ucred_t *)crp;
552 call = afs_nfs2_dispatcher(0, RFS_MKDIR, (char *)args, &exp, rp, crp);
554 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
556 (*afs_rfs_disp_tbl[RFS_MKDIR].orig_proc) (args, xp, exp, rp, crp);
557 if (afs_NFSRootOnly && call)
558 afs_nfs2_smallfidder(xp);
560 curthread->t_cred = svcred;
565 afs_nfs2_rmdir(char *args, char *xp, char *exp, char *rp, char *crp)
568 afs_ucred_t *svcred = curthread->t_cred;
569 curthread->t_cred = (afs_ucred_t *)crp;
570 call = afs_nfs2_dispatcher(0, RFS_RMDIR, (char *)args, &exp, rp, crp);
572 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
574 (*afs_rfs_disp_tbl[RFS_RMDIR].orig_proc) (args, xp, exp, rp, crp);
575 curthread->t_cred = svcred;
580 afs_nfs2_readdir(char *args, char *xp, char *exp, char *rp, char *crp)
583 afs_ucred_t *svcred = curthread->t_cred;
584 curthread->t_cred = (afs_ucred_t *)crp;
585 call = afs_nfs2_dispatcher(0, RFS_READDIR, (char *)args, &exp, rp, crp);
587 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
589 (*afs_rfs_disp_tbl[RFS_READDIR].orig_proc) (args, xp, exp, rp, crp);
590 curthread->t_cred = svcred;
595 afs_nfs2_statfs(char *args, char *xp, char *exp, char *rp, char *crp)
598 afs_ucred_t *svcred = curthread->t_cred;
599 curthread->t_cred = (afs_ucred_t *)crp;
600 call = afs_nfs2_dispatcher(0, RFS_STATFS, (char *)args, &exp, rp, crp);
602 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
604 (*afs_rfs_disp_tbl[RFS_STATFS].orig_proc) (args, xp, exp, rp, crp);
605 curthread->t_cred = svcred;
609 struct afs_nfs_disp_tbl afs_rfs_disp_tbl[RFS_NPROC] = {
617 {afs_nfs2_writecache},
631 afs_acl2_getacl(char *args, char *xp, char *exp, char *rp, char *crp)
634 afs_ucred_t *svcred = curthread->t_cred;
635 curthread->t_cred = (afs_ucred_t *)crp;
637 afs_nfs2_dispatcher(1, ACLPROC2_GETACL, (char *)args, &exp, rp, crp);
639 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
641 (*afs_acl_disp_tbl[ACLPROC2_GETACL].orig_proc) (args, xp, exp, rp,
643 curthread->t_cred = svcred;
648 afs_acl2_setacl(char *args, char *xp, char *exp, char *rp, char *crp)
651 afs_ucred_t *svcred = curthread->t_cred;
652 curthread->t_cred = (afs_ucred_t *)crp;
654 afs_nfs2_dispatcher(1, ACLPROC2_SETACL, (char *)args, &exp, rp, crp);
656 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
658 (*afs_acl_disp_tbl[ACLPROC2_SETACL].orig_proc) (args, xp, exp, rp,
660 curthread->t_cred = svcred;
665 afs_acl2_getattr(char *args, char *xp, char *exp, char *rp, char *crp)
668 afs_ucred_t *svcred = curthread->t_cred;
669 curthread->t_cred = (afs_ucred_t *)crp;
671 afs_nfs2_dispatcher(1, ACLPROC2_GETATTR, (char *)args, &exp, rp, crp);
673 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
675 (*afs_acl_disp_tbl[ACLPROC2_GETATTR].orig_proc) (args, xp, exp, rp,
677 curthread->t_cred = svcred;
682 afs_acl2_access(char *args, char *xp, char *exp, char *rp, char *crp)
685 afs_ucred_t *svcred = curthread->t_cred;
686 curthread->t_cred = (afs_ucred_t *)crp;
688 afs_nfs2_dispatcher(1, ACLPROC2_ACCESS, (char *)args, &exp, rp, crp);
690 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
692 (*afs_acl_disp_tbl[ACLPROC2_ACCESS].orig_proc) (args, xp, exp, rp,
694 curthread->t_cred = svcred;
698 #if defined(AFS_SUN510_ENV)
700 afs_acl2_getxattrdir(char *args, char *xp, char *exp, char *rp, char *crp)
703 afs_ucred_t *svcred = curthread->t_cred;
704 curthread->t_cred = (afs_ucred_t *)crp;
706 afs_nfs2_dispatcher(1, ACLPROC2_GETXATTRDIR, (char *)args, &exp, rp, crp);
708 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
710 (*afs_acl_disp_tbl[ACLPROC2_GETXATTRDIR].orig_proc) (args, xp, exp, rp,
712 curthread->t_cred = svcred;
717 struct afs_nfs_disp_tbl afs_acl_disp_tbl[ACL2_NPROC] = {
723 #if defined(AFS_SUN510_ENV)
724 {afs_acl2_getxattrdir}
728 /* Munge the dispatch tables to link us in first */
730 afs_xlatorinit_v2(struct rfs_disp_tbl *_rfs_tbl,
731 struct rfs_disp_tbl *_acl_tbl)
735 if (xlatorinit_v2_done++)
738 for (i = 0; i < RFS_NPROC; i++) {
739 afs_rfs_disp_tbl[i].orig_proc = _rfs_tbl[i].dis_proc;
740 _rfs_tbl[i].dis_proc = afs_rfs_disp_tbl[i].afs_proc;
743 for (i = 0; i < 5; i++) {
744 afs_acl_disp_tbl[i].orig_proc = _acl_tbl[i].dis_proc;
745 _acl_tbl[i].dis_proc = afs_acl_disp_tbl[i].afs_proc;
750 #define RFS3_NPROC 22
754 #if defined(AFS_SUN510_ENV)
761 struct afs_nfs_disp_tbl afs_rfs3_disp_tbl[RFS3_NPROC];
762 struct afs_nfs_disp_tbl afs_acl3_disp_tbl[ACL3_NPROC];
764 struct afs_nfs3_resp {
768 typedef struct afs_nfs3_resp afs_nfs3_resp;
771 is_afs_fh3(nfs_fh3 * fhp)
773 if ((fhp->fh3_fsid.val[0] == AFS_VFSMAGIC)
774 && (fhp->fh3_fsid.val[1] == AFS_VFSFSID))
780 afs_nfs3_noaccess(struct afs_nfs3_resp *resp)
782 resp->status = NFS3ERR_ACCES;
787 afs_nfs3_notsupp(struct afs_nfs3_resp *resp)
789 resp->status = NFS3ERR_NOTSUPP;
794 nfs3_to_afs_call(int which, caddr_t * args, nfs_fh3 ** fhpp, nfs_fh3 ** fh2pp)
801 afs_Trace1(afs_iclSetp, CM_TRACE_NFS3IN, ICL_TYPE_INT32, which);
802 *fh2pp = (nfs_fh3 *) 0;
804 case NFSPROC3_GETATTR:
806 GETATTR3args *arg = (GETATTR3args *) args;
807 fhp1 = (nfs_fh3 *) & arg->object;
810 case NFSPROC3_SETATTR:
812 SETATTR3args *arg = (SETATTR3args *) args;
813 fhp1 = (nfs_fh3 *) & arg->object;
816 case NFSPROC3_LOOKUP:
818 LOOKUP3args *arg = (LOOKUP3args *) args;
820 fhp1 = (nfs_fh3 *) arg->what.dirp;
822 fhp1 = (nfs_fh3 *) & arg->what.dir;
826 case NFSPROC3_ACCESS:
828 ACCESS3args *arg = (ACCESS3args *) args;
829 fhp1 = (nfs_fh3 *) & arg->object;
832 case NFSPROC3_READLINK:
834 READLINK3args *arg = (READLINK3args *) args;
835 fhp1 = (nfs_fh3 *) & arg->symlink;
840 READ3args *arg = (READ3args *) args;
841 fhp1 = (nfs_fh3 *) & arg->file;
846 WRITE3args *arg = (WRITE3args *) args;
847 fhp1 = (nfs_fh3 *) & arg->file;
850 case NFSPROC3_CREATE:
852 CREATE3args *arg = (CREATE3args *) args;
854 fhp1 = (nfs_fh3 *) arg->where.dirp;
856 fhp1 = (nfs_fh3 *) & arg->where.dir;
862 MKDIR3args *arg = (MKDIR3args *) args;
864 fhp1 = (nfs_fh3 *) arg->where.dirp;
866 fhp1 = (nfs_fh3 *) & arg->where.dir;
870 case NFSPROC3_SYMLINK:
872 SYMLINK3args *arg = (SYMLINK3args *) args;
874 fhp1 = (nfs_fh3 *) arg->where.dirp;
876 fhp1 = (nfs_fh3 *) & arg->where.dir;
882 MKNOD3args *arg = (MKNOD3args *) args;
884 fhp1 = (nfs_fh3 *) arg->where.dirp;
886 fhp1 = (nfs_fh3 *) & arg->where.dir;
890 case NFSPROC3_REMOVE:
892 REMOVE3args *arg = (REMOVE3args *) args;
894 fhp1 = (nfs_fh3 *) arg->object.dirp;
896 fhp1 = (nfs_fh3 *) & arg->object.dir;
902 RMDIR3args *arg = (RMDIR3args *) args;
904 fhp1 = (nfs_fh3 *) arg->object.dirp;
906 fhp1 = (nfs_fh3 *) & arg->object.dir;
910 case NFSPROC3_RENAME:
912 RENAME3args *arg = (RENAME3args *) args;
914 fhp1 = (nfs_fh3 *) arg->from.dirp;
915 fhp2 = (nfs_fh3 *) arg->to.dirp;
917 fhp1 = (nfs_fh3 *) & arg->from.dir;
918 fhp2 = (nfs_fh3 *) & arg->to.dir;
924 LINK3args *arg = (LINK3args *) args;
925 fhp1 = (nfs_fh3 *) & arg->file;
927 fhp2 = (nfs_fh3 *) arg->link.dirp;
929 fhp2 = (nfs_fh3 *) & arg->link.dir;
933 case NFSPROC3_READDIR:
935 READDIR3args *arg = (READDIR3args *) args;
936 fhp1 = (nfs_fh3 *) & arg->dir;
939 case NFSPROC3_READDIRPLUS:
941 READDIRPLUS3args *arg = (READDIRPLUS3args *) args;
942 fhp1 = (nfs_fh3 *) & arg->dir;
945 case NFSPROC3_FSSTAT:
947 FSSTAT3args *arg = (FSSTAT3args *) args;
948 fhp1 = (nfs_fh3 *) & arg->fsroot;
951 case NFSPROC3_FSINFO:
953 FSINFO3args *arg = (FSINFO3args *) args;
954 fhp1 = (nfs_fh3 *) & arg->fsroot;
957 case NFSPROC3_PATHCONF:
959 PATHCONF3args *arg = (PATHCONF3args *) args;
960 fhp1 = (nfs_fh3 *) & arg->object;
963 case NFSPROC3_COMMIT:
965 COMMIT3args *arg = (COMMIT3args *) args;
966 fhp1 = (nfs_fh3 *) & arg->file;
973 if (fhp1 && is_afs_fh3(fhp1)) {
979 if (fhp2 && is_afs_fh3(fhp2)) {
988 acl3_to_afs_call(int which, caddr_t * args, nfs_fh3 ** fhpp)
993 case ACLPROC3_GETACL:
995 struct GETACL3args *sargs = (struct GETACL3args *)args;
999 case ACLPROC3_SETACL:
1001 struct SETACL3args *sargs = (struct SETACL3args *)args;
1005 #if defined(AFS_SUN510_ENV)
1006 case ACLPROC3_GETXATTRDIR:
1008 struct GETXATTRDIR3args *sargs = (struct GETXATTRDIR3args *)args;
1017 if (fhp && is_afs_fh3(fhp)) {
1026 afs_nfs3_dispatcher(int type, afs_int32 which, char *argp,
1027 struct exportinfo **expp, struct svc_req *rp,
1032 afs_int32 client = 0;
1033 struct sockaddr *sa;
1034 nfs_fh3 *fh = (nfs_fh3 *) argp;
1035 nfs_fh3 *fh2 = (nfs_fh3 *) 0;
1037 if (!xlatorinit_v3_done)
1040 sa = (struct sockaddr *)svc_getrpccaller(rp->rq_xprt)->buf;
1044 if (sa->sa_family == AF_INET)
1045 client = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
1051 code = (client && nfs3_to_afs_call(which, argp, &fh, &fh2));
1054 code = (client && acl3_to_afs_call(which, argp, &fh));
1061 struct afs_exporter *out = 0;
1063 static int once = 0;
1064 struct SmallFid Sfid;
1066 memcpy((char *)&Sfid, fh->fh3_data, SIZEOF_SMALLFID);
1068 afs_Trace2(afs_iclSetp, CM_TRACE_NFS3IN1, ICL_TYPE_INT32, client,
1069 ICL_TYPE_FID, &Sfid);
1072 if (!once && *expp) {
1073 afs_nobody = (*expp)->exi_export.ex_anon;
1077 afs_nfsclient_reqhandler((struct afs_exporter *)0, &crp, client,
1093 afs_nfs3_smallfidder(struct nfs_fh3 *fhp, int status)
1098 #if defined(AFS_SUN57_64BIT_ENV)
1099 /* See also afs_fid() */
1100 memcpy((char *)addr, fhp->fh3_data, 10);
1101 addr[1] = (addr[1] >> 48) & 0xffff;
1103 memcpy((char *)addr, fhp->fh3_data, 2 * sizeof(long));
1107 vcp = VTOAFS((struct vnode *)addr[0]);
1109 /* See also afs_osi_vget */
1110 if (addr[1] == AFS_XLATOR_MAGIC) {
1111 if (status == NFS_OK) {
1112 struct SmallFid Sfid;
1115 /* Make up and copy out a SmallFid */
1116 tcell = afs_GetCell(vcp->f.fid.Cell, READ_LOCK);
1117 Sfid.Volume = vcp->f.fid.Fid.Volume;
1118 Sfid.CellAndUnique =
1119 ((tcell->cellIndex << 24) | (vcp->f.fid.Fid.Unique & 0xffffff));
1120 afs_PutCell(tcell, READ_LOCK);
1121 Sfid.Vnode = (u_short) (vcp->f.fid.Fid.Vnode & 0xffff);
1122 fhp->fh3_len = SIZEOF_SMALLFID;
1123 memcpy(fhp->fh3_data, (char *)&Sfid, fhp->fh3_len);
1125 afs_Trace3(afs_iclSetp, CM_TRACE_NFS3OUT, ICL_TYPE_INT32, status,
1126 ICL_TYPE_POINTER, vcp, ICL_TYPE_FID, &Sfid);
1129 /* If we have a ref, release it */
1130 if (vcp->vrefCount >= 1)
1131 AFS_RELE(AFSTOV(vcp));
1137 afs_nfs3_getattr(char *args, char *xp, char *exp, char *rp, char *crp)
1140 afs_nfs3_resp dummy;
1141 afs_ucred_t *svcred = curthread->t_cred;
1142 curthread->t_cred = (afs_ucred_t *)crp;
1144 afs_nfs3_dispatcher(0, NFSPROC3_GETATTR, (char *)args, &exp, rp, crp);
1146 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1148 (*afs_rfs3_disp_tbl[NFSPROC3_GETATTR].orig_proc) (args, xp, exp, rp,
1150 curthread->t_cred = svcred;
1155 afs_nfs3_setattr(char *args, char *xp, char *exp, char *rp, char *crp)
1158 afs_nfs3_resp dummy;
1159 afs_ucred_t *svcred = curthread->t_cred;
1160 curthread->t_cred = (afs_ucred_t *)crp;
1162 afs_nfs3_dispatcher(0, NFSPROC3_SETATTR, (char *)args, &exp, rp, crp);
1164 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1166 (*afs_rfs3_disp_tbl[NFSPROC3_SETATTR].orig_proc) (args, xp, exp, rp,
1168 curthread->t_cred = svcred;
1173 afs_nfs3_lookup(char *args, char *xp, char *exp, char *rp, char *crp)
1176 afs_nfs3_resp dummy;
1177 afs_ucred_t *svcred = curthread->t_cred;
1178 curthread->t_cred = (afs_ucred_t *)crp;
1180 afs_nfs3_dispatcher(0, NFSPROC3_LOOKUP, (char *)args, &exp, rp, crp);
1182 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1184 (*afs_rfs3_disp_tbl[NFSPROC3_LOOKUP].orig_proc) (args, xp, exp, rp,
1186 if (afs_NFSRootOnly && call) {
1187 LOOKUP3res *resp = (LOOKUP3res *) xp;
1188 afs_nfs3_smallfidder(&resp->resok.object, resp->status);
1191 curthread->t_cred = svcred;
1196 afs_nfs3_access(char *args, char *xp, char *exp, char *rp, char *crp)
1199 afs_nfs3_resp dummy;
1200 afs_ucred_t *svcred = curthread->t_cred;
1201 curthread->t_cred = (afs_ucred_t *)crp;
1203 afs_nfs3_dispatcher(0, NFSPROC3_ACCESS, (char *)args, &exp, rp, crp);
1205 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1207 (*afs_rfs3_disp_tbl[NFSPROC3_ACCESS].orig_proc) (args, xp, exp, rp,
1209 curthread->t_cred = svcred;
1214 afs_nfs3_readlink(char *args, char *xp, char *exp, char *rp, char *crp)
1217 afs_nfs3_resp dummy;
1218 afs_ucred_t *svcred = curthread->t_cred;
1219 curthread->t_cred = (afs_ucred_t *)crp;
1221 afs_nfs3_dispatcher(0, NFSPROC3_READLINK, (char *)args, &exp, rp,
1224 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1226 (*afs_rfs3_disp_tbl[NFSPROC3_READLINK].orig_proc) (args, xp, exp, rp,
1228 curthread->t_cred = svcred;
1233 afs_nfs3_read(char *args, char *xp, char *exp, char *rp, char *crp)
1236 afs_nfs3_resp dummy;
1237 afs_ucred_t *svcred = curthread->t_cred;
1238 curthread->t_cred = (afs_ucred_t *)crp;
1239 call = afs_nfs3_dispatcher(0, NFSPROC3_READ, (char *)args, &exp, rp, crp);
1241 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1243 (*afs_rfs3_disp_tbl[NFSPROC3_READ].orig_proc) (args, xp, exp, rp,
1245 curthread->t_cred = svcred;
1250 afs_nfs3_write(char *args, char *xp, char *exp, char *rp, char *crp)
1253 afs_nfs3_resp dummy;
1254 afs_ucred_t *svcred = curthread->t_cred;
1255 curthread->t_cred = (afs_ucred_t *)crp;
1257 afs_nfs3_dispatcher(0, NFSPROC3_WRITE, (char *)args, &exp, rp, crp);
1259 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1261 (*afs_rfs3_disp_tbl[NFSPROC3_WRITE].orig_proc) (args, xp, exp, rp,
1263 curthread->t_cred = svcred;
1268 afs_nfs3_create(char *args, char *xp, char *exp, char *rp, char *crp)
1271 afs_nfs3_resp dummy;
1272 afs_ucred_t *svcred = curthread->t_cred;
1273 curthread->t_cred = (afs_ucred_t *)crp;
1275 afs_nfs3_dispatcher(0, NFSPROC3_CREATE, (char *)args, &exp, rp, crp);
1277 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1279 (*afs_rfs3_disp_tbl[NFSPROC3_CREATE].orig_proc) (args, xp, exp, rp,
1281 if (afs_NFSRootOnly && call) {
1282 CREATE3res *resp = (CREATE3res *) xp;
1283 afs_nfs3_smallfidder(&resp->resok.obj.handle, resp->status);
1286 curthread->t_cred = svcred;
1291 afs_nfs3_mkdir(char *args, char *xp, char *exp, char *rp, char *crp)
1294 afs_nfs3_resp dummy;
1295 afs_ucred_t *svcred = curthread->t_cred;
1296 curthread->t_cred = (afs_ucred_t *)crp;
1298 afs_nfs3_dispatcher(0, NFSPROC3_MKDIR, (char *)args, &exp, rp, crp);
1300 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1302 (*afs_rfs3_disp_tbl[NFSPROC3_MKDIR].orig_proc) (args, xp, exp, rp,
1304 if (afs_NFSRootOnly && call) {
1305 MKDIR3res *resp = (MKDIR3res *) xp;
1306 afs_nfs3_smallfidder(&resp->resok.obj.handle, resp->status);
1309 curthread->t_cred = svcred;
1314 afs_nfs3_symlink(char *args, char *xp, char *exp, char *rp, char *crp)
1317 afs_nfs3_resp dummy;
1318 afs_ucred_t *svcred = curthread->t_cred;
1319 curthread->t_cred = (afs_ucred_t *)crp;
1321 afs_nfs3_dispatcher(0, NFSPROC3_SYMLINK, (char *)args, &exp, rp, crp);
1323 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1325 (*afs_rfs3_disp_tbl[NFSPROC3_SYMLINK].orig_proc) (args, xp, exp, rp,
1327 if (afs_NFSRootOnly && call) {
1328 SYMLINK3res *resp = (SYMLINK3res *) xp;
1329 afs_nfs3_smallfidder(&resp->resok.obj.handle, resp->status);
1332 curthread->t_cred = svcred;
1337 afs_nfs3_mknod(char *args, char *xp, char *exp, char *rp, char *crp)
1340 afs_nfs3_resp dummy;
1341 afs_ucred_t *svcred = curthread->t_cred;
1342 curthread->t_cred = (afs_ucred_t *)crp;
1344 afs_nfs3_dispatcher(0, NFSPROC3_MKNOD, (char *)args, &exp, rp, crp);
1346 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1348 (*afs_rfs3_disp_tbl[NFSPROC3_MKNOD].orig_proc) (args, xp, exp, rp,
1350 if (afs_NFSRootOnly && call) {
1351 MKNOD3res *resp = (MKNOD3res *) xp;
1352 afs_nfs3_smallfidder(&resp->resok.obj.handle, resp->status);
1355 curthread->t_cred = svcred;
1360 afs_nfs3_remove(char *args, char *xp, char *exp, char *rp, char *crp)
1363 afs_nfs3_resp dummy;
1364 afs_ucred_t *svcred = curthread->t_cred;
1365 curthread->t_cred = (afs_ucred_t *)crp;
1367 afs_nfs3_dispatcher(0, NFSPROC3_REMOVE, (char *)args, &exp, rp, crp);
1369 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1371 (*afs_rfs3_disp_tbl[NFSPROC3_REMOVE].orig_proc) (args, xp, exp, rp,
1373 curthread->t_cred = svcred;
1378 afs_nfs3_rmdir(char *args, char *xp, char *exp, char *rp, char *crp)
1381 afs_nfs3_resp dummy;
1382 afs_ucred_t *svcred = curthread->t_cred;
1383 curthread->t_cred = (afs_ucred_t *)crp;
1385 afs_nfs3_dispatcher(0, NFSPROC3_RMDIR, (char *)args, &exp, rp, crp);
1387 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1389 (*afs_rfs3_disp_tbl[NFSPROC3_RMDIR].orig_proc) (args, xp, exp, rp,
1391 curthread->t_cred = svcred;
1396 afs_nfs3_rename(char *args, char *xp, char *exp, char *rp, char *crp)
1399 afs_nfs3_resp dummy;
1400 afs_ucred_t *svcred = curthread->t_cred;
1401 curthread->t_cred = (afs_ucred_t *)crp;
1403 afs_nfs3_dispatcher(0, NFSPROC3_RENAME, (char *)args, &exp, rp, crp);
1405 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1407 (*afs_rfs3_disp_tbl[NFSPROC3_RENAME].orig_proc) (args, xp, exp, rp,
1409 curthread->t_cred = svcred;
1414 afs_nfs3_link(char *args, char *xp, char *exp, char *rp, char *crp)
1417 afs_nfs3_resp dummy;
1418 afs_ucred_t *svcred = curthread->t_cred;
1419 curthread->t_cred = (afs_ucred_t *)crp;
1420 call = afs_nfs3_dispatcher(0, NFSPROC3_LINK, (char *)args, &exp, rp, crp);
1422 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1424 (*afs_rfs3_disp_tbl[NFSPROC3_LINK].orig_proc) (args, xp, exp, rp,
1426 curthread->t_cred = svcred;
1431 afs_nfs3_readdir(char *args, char *xp, char *exp, char *rp, char *crp)
1434 afs_nfs3_resp dummy;
1435 afs_ucred_t *svcred = curthread->t_cred;
1436 curthread->t_cred = (afs_ucred_t *)crp;
1438 afs_nfs3_dispatcher(0, NFSPROC3_READDIR, (char *)args, &exp, rp, crp);
1440 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1442 (*afs_rfs3_disp_tbl[NFSPROC3_READDIR].orig_proc) (args, xp, exp, rp,
1444 curthread->t_cred = svcred;
1449 afs_nfs3_readdirplus(char *args, char *xp, char *exp, char *rp, char *crp)
1452 afs_nfs3_resp dummy;
1453 afs_ucred_t *svcred = curthread->t_cred;
1454 curthread->t_cred = (afs_ucred_t *)crp;
1456 afs_nfs3_dispatcher(0, NFSPROC3_READDIRPLUS, (char *)args, &exp, rp,
1459 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1461 afs_nfs3_notsupp((struct afs_nfs3_resp *)xp);
1463 (*afs_rfs3_disp_tbl[NFSPROC3_READDIRPLUS].orig_proc) (args, xp, exp,
1465 curthread->t_cred = svcred;
1470 afs_nfs3_fsstat(char *args, char *xp, char *exp, char *rp, char *crp)
1473 afs_nfs3_resp dummy;
1474 afs_ucred_t *svcred = curthread->t_cred;
1475 curthread->t_cred = (afs_ucred_t *)crp;
1477 afs_nfs3_dispatcher(0, NFSPROC3_FSSTAT, (char *)args, &exp, rp, crp);
1479 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1481 (*afs_rfs3_disp_tbl[NFSPROC3_FSSTAT].orig_proc) (args, xp, exp, rp,
1483 curthread->t_cred = svcred;
1488 afs_nfs3_fsinfo(char *args, char *xp, char *exp, char *rp, char *crp)
1491 afs_nfs3_resp dummy;
1492 afs_ucred_t *svcred = curthread->t_cred;
1493 curthread->t_cred = (afs_ucred_t *)crp;
1495 afs_nfs3_dispatcher(0, NFSPROC3_FSINFO, (char *)args, &exp, rp, crp);
1497 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1499 (*afs_rfs3_disp_tbl[NFSPROC3_FSINFO].orig_proc) (args, xp, exp, rp,
1501 curthread->t_cred = svcred;
1506 afs_nfs3_pathconf(char *args, char *xp, char *exp, char *rp, char *crp)
1509 afs_nfs3_resp dummy;
1510 afs_ucred_t *svcred = curthread->t_cred;
1511 curthread->t_cred = (afs_ucred_t *)crp;
1513 afs_nfs3_dispatcher(0, NFSPROC3_PATHCONF, (char *)args, &exp, rp,
1516 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1518 (*afs_rfs3_disp_tbl[NFSPROC3_PATHCONF].orig_proc) (args, xp, exp, rp,
1520 curthread->t_cred = svcred;
1525 afs_nfs3_commit(char *args, char *xp, char *exp, char *rp, char *crp)
1528 afs_nfs3_resp dummy;
1529 afs_ucred_t *svcred = curthread->t_cred;
1530 curthread->t_cred = (afs_ucred_t *)crp;
1532 afs_nfs3_dispatcher(0, NFSPROC3_COMMIT, (char *)args, &exp, rp, crp);
1534 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1536 (*afs_rfs3_disp_tbl[NFSPROC3_COMMIT].orig_proc) (args, xp, exp, rp,
1538 curthread->t_cred = svcred;
1542 struct afs_nfs_disp_tbl afs_rfs3_disp_tbl[22] = {
1548 {afs_nfs3_readlink},
1560 {afs_nfs3_readdirplus},
1563 {afs_nfs3_pathconf},
1568 afs_acl3_getacl(char *args, char *xp, char *exp, char *rp, char *crp)
1571 afs_ucred_t *svcred = curthread->t_cred;
1572 curthread->t_cred = (afs_ucred_t *)crp;
1574 afs_nfs3_dispatcher(1, ACLPROC3_GETACL, (char *)args, &exp, rp, crp);
1576 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1578 (*afs_acl3_disp_tbl[ACLPROC3_GETACL].orig_proc) (args, xp, exp, rp,
1580 curthread->t_cred = svcred;
1585 afs_acl3_setacl(char *args, char *xp, char *exp, char *rp, char *crp)
1588 afs_ucred_t *svcred = curthread->t_cred;
1589 curthread->t_cred = (afs_ucred_t *)crp;
1591 afs_nfs3_dispatcher(1, ACLPROC3_SETACL, (char *)args, &exp, rp, crp);
1593 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1595 (*afs_acl3_disp_tbl[ACLPROC3_SETACL].orig_proc) (args, xp, exp, rp,
1597 curthread->t_cred = svcred;
1601 #if defined(AFS_SUN510_ENV)
1603 afs_acl3_getxattrdir(char *args, char *xp, char *exp, char *rp, char *crp)
1606 afs_ucred_t *svcred = curthread->t_cred;
1607 curthread->t_cred = (afs_ucred_t *)crp;
1609 afs_nfs3_dispatcher(1, ACLPROC3_GETXATTRDIR, (char *)args, &exp, rp, crp);
1611 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1613 (*afs_acl3_disp_tbl[ACLPROC3_GETXATTRDIR].orig_proc) (args, xp, exp, rp,
1615 curthread->t_cred = svcred;
1620 struct afs_nfs_disp_tbl afs_acl3_disp_tbl[ACL3_NPROC] = {
1624 #if defined(AFS_SUN510_ENV)
1625 {afs_acl3_getxattrdir},
1629 /* Munge the dispatch tables to link us in first */
1631 afs_xlatorinit_v3(struct rfs_disp_tbl *_rfs_tbl,
1632 struct rfs_disp_tbl *_acl_tbl)
1636 if (xlatorinit_v3_done++)
1639 for (i = 0; i < 22; i++) {
1640 afs_rfs3_disp_tbl[i].orig_proc = _rfs_tbl[i].dis_proc;
1641 _rfs_tbl[i].dis_proc = afs_rfs3_disp_tbl[i].afs_proc;
1644 for (i = 0; i < 3; i++) {
1645 afs_acl3_disp_tbl[i].orig_proc = _acl_tbl[i].dis_proc;
1646 _acl_tbl[i].dis_proc = afs_acl3_disp_tbl[i].afs_proc;
1649 #endif /* !defined(AFS_NONFSTRANS) */