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;
224 #if defined(AFS_SUN510_ENV)
225 case ACLPROC2_GETXATTRDIR:
227 struct GETXATTRDIR2args *sargs = (struct GETXATTRDIR2args *)args;
236 if (is_afs_fh(fhp)) {
245 afs_nfs2_dispatcher(int type, afs_int32 which, char *argp,
246 struct exportinfo **expp, struct svc_req *rp,
247 struct AFS_UCRED *crp)
251 afs_int32 client = 0;
253 fhandle_t *fh = (fhandle_t *) argp;
254 fhandle_t *fh2 = (fhandle_t *) 0;
256 if (!xlatorinit_v2_done)
259 sa = (struct sockaddr *)svc_getrpccaller(rp->rq_xprt)->buf;
260 if (sa->sa_family == AF_INET)
261 client = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
267 code = (client && nfs2_to_afs_call(which, argp, &fh, &fh2));
270 code = (client && acl2_to_afs_call(which, argp, &fh));
277 struct afs_exporter *out = 0;
280 struct SmallFid Sfid;
282 memcpy((char *)&Sfid, fh->fh_data, SIZEOF_SMALLFID);
284 afs_Trace2(afs_iclSetp, CM_TRACE_NFSIN1, ICL_TYPE_POINTER, client,
285 ICL_TYPE_FID, &Sfid);
289 if (!once && *expp) {
290 afs_nobody = (*expp)->exi_export.ex_anon;
294 afs_nfsclient_reqhandler((struct afs_exporter *)0, &crp, client,
309 afs_nfs2_smallfidder(struct nfsdiropres *dr)
311 register fhandle_t *fhp = (fhandle_t *) & dr->dr_fhandle;
315 #if defined(AFS_SUN57_64BIT_ENV)
316 /* See also afs_fid() */
317 memcpy((char *)addr, fhp->fh_data, SIZEOF_SMALLFID);
318 addr[1] = (addr[1] >> 48) & 0xffff;
320 memcpy((char *)addr, fhp->fh_data, 2 * sizeof(long));
324 vcp = VTOAFS((struct vnode *)addr[0]);
326 if (addr[1] == AFS_XLATOR_MAGIC) {
327 if (dr->dr_status == NFS_OK) {
328 struct SmallFid Sfid;
331 /* Make up and copy out a SmallFid */
332 tcell = afs_GetCell(vcp->fid.Cell, READ_LOCK);
333 Sfid.Volume = vcp->fid.Fid.Volume;
335 ((tcell->cellIndex << 24) | (vcp->fid.Fid.Unique & 0xffffff));
336 afs_PutCell(tcell, READ_LOCK);
337 Sfid.Vnode = (u_short) (vcp->fid.Fid.Vnode & 0xffff);
338 fhp->fh_len = SIZEOF_SMALLFID;
339 memcpy(dr->dr_fhandle.fh_data, (char *)&Sfid, fhp->fh_len);
341 afs_Trace3(afs_iclSetp, CM_TRACE_NFSOUT, ICL_TYPE_INT32, 0,
342 ICL_TYPE_POINTER, vcp, ICL_TYPE_FID, &Sfid);
345 /* If we have a ref, release it */
346 if (vcp->vrefCount >= 1)
347 AFS_RELE(AFSTOV(vcp));
353 afs_nfs2_noaccess(struct afs_nfs2_resp *resp)
355 resp->status = NFSERR_ACCES;
359 afs_nfs2_null(char *args, char *xp, char *exp, char *rp, char *crp)
364 afs_nfs2_root(char *args, char *xp, char *exp, char *rp, char *crp)
369 afs_nfs2_writecache(char *args, char *xp, char *exp, char *rp, char *crp)
374 afs_nfs2_getattr(char *args, char *xp, char *exp, char *rp, char *crp)
377 struct cred *svcred = curthread->t_cred;
378 curthread->t_cred = (struct cred *)crp;
379 call = afs_nfs2_dispatcher(0, RFS_GETATTR, (char *)args, &exp, rp, crp);
381 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
383 (*afs_rfs_disp_tbl[RFS_GETATTR].orig_proc) (args, xp, exp, rp, crp);
384 curthread->t_cred = svcred;
389 afs_nfs2_setattr(char *args, char *xp, char *exp, char *rp, char *crp)
392 struct cred *svcred = curthread->t_cred;
393 curthread->t_cred = (struct cred *)crp;
394 call = afs_nfs2_dispatcher(0, RFS_SETATTR, (char *)args, &exp, rp, crp);
396 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
398 (*afs_rfs_disp_tbl[RFS_SETATTR].orig_proc) (args, xp, exp, rp, crp);
399 curthread->t_cred = svcred;
404 afs_nfs2_lookup(char *args, char *xp, char *exp, char *rp, char *crp)
407 struct cred *svcred = curthread->t_cred;
408 curthread->t_cred = (struct cred *)crp;
409 call = afs_nfs2_dispatcher(0, RFS_LOOKUP, (char *)args, &exp, rp, crp);
411 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
413 (*afs_rfs_disp_tbl[RFS_LOOKUP].orig_proc) (args, xp, exp, rp, crp);
414 if (afs_NFSRootOnly && call)
415 afs_nfs2_smallfidder(xp);
417 curthread->t_cred = svcred;
422 afs_nfs2_readlink(char *args, char *xp, char *exp, char *rp, char *crp)
425 struct cred *svcred = curthread->t_cred;
426 curthread->t_cred = (struct cred *)crp;
427 call = afs_nfs2_dispatcher(0, RFS_READLINK, (char *)args, &exp, rp, crp);
429 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
431 (*afs_rfs_disp_tbl[RFS_READLINK].orig_proc) (args, xp, exp, rp, crp);
432 curthread->t_cred = svcred;
437 afs_nfs2_read(char *args, char *xp, char *exp, char *rp, char *crp)
440 struct cred *svcred = curthread->t_cred;
441 curthread->t_cred = (struct cred *)crp;
442 call = afs_nfs2_dispatcher(0, RFS_READ, (char *)args, &exp, rp, crp);
444 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
446 (*afs_rfs_disp_tbl[RFS_READ].orig_proc) (args, xp, exp, rp, crp);
447 curthread->t_cred = svcred;
452 afs_nfs2_write(char *args, char *xp, char *exp, char *rp, char *crp)
455 struct cred *svcred = curthread->t_cred;
456 curthread->t_cred = (struct cred *)crp;
457 call = afs_nfs2_dispatcher(0, RFS_WRITE, (char *)args, &exp, rp, crp);
459 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
461 (*afs_rfs_disp_tbl[RFS_WRITE].orig_proc) (args, xp, exp, rp, crp);
462 curthread->t_cred = svcred;
467 afs_nfs2_create(char *args, char *xp, char *exp, char *rp, char *crp)
470 struct cred *svcred = curthread->t_cred;
471 curthread->t_cred = (struct cred *)crp;
472 call = afs_nfs2_dispatcher(0, RFS_CREATE, (char *)args, &exp, rp, crp);
474 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
476 (*afs_rfs_disp_tbl[RFS_CREATE].orig_proc) (args, xp, exp, rp, crp);
477 if (afs_NFSRootOnly && call)
478 afs_nfs2_smallfidder(xp);
480 curthread->t_cred = svcred;
485 afs_nfs2_remove(char *args, char *xp, char *exp, char *rp, char *crp)
488 struct cred *svcred = curthread->t_cred;
489 curthread->t_cred = (struct cred *)crp;
490 call = afs_nfs2_dispatcher(0, RFS_REMOVE, (char *)args, &exp, rp, crp);
492 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
494 (*afs_rfs_disp_tbl[RFS_REMOVE].orig_proc) (args, xp, exp, rp, crp);
495 curthread->t_cred = svcred;
500 afs_nfs2_rename(char *args, char *xp, char *exp, char *rp, char *crp)
503 struct cred *svcred = curthread->t_cred;
504 curthread->t_cred = (struct cred *)crp;
505 call = afs_nfs2_dispatcher(0, RFS_RENAME, (char *)args, &exp, rp, crp);
507 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
509 (*afs_rfs_disp_tbl[RFS_RENAME].orig_proc) (args, xp, exp, rp, crp);
510 curthread->t_cred = svcred;
515 afs_nfs2_link(char *args, char *xp, char *exp, char *rp, char *crp)
518 struct cred *svcred = curthread->t_cred;
519 curthread->t_cred = (struct cred *)crp;
520 call = afs_nfs2_dispatcher(0, RFS_LINK, (char *)args, &exp, rp, crp);
522 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
524 (*afs_rfs_disp_tbl[RFS_LINK].orig_proc) (args, xp, exp, rp, crp);
525 curthread->t_cred = svcred;
530 afs_nfs2_symlink(char *args, char *xp, char *exp, char *rp, char *crp)
533 struct cred *svcred = curthread->t_cred;
534 curthread->t_cred = (struct cred *)crp;
535 call = afs_nfs2_dispatcher(0, RFS_SYMLINK, (char *)args, &exp, rp, crp);
537 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
539 (*afs_rfs_disp_tbl[RFS_SYMLINK].orig_proc) (args, xp, exp, rp, crp);
540 curthread->t_cred = svcred;
545 afs_nfs2_mkdir(char *args, char *xp, char *exp, char *rp, char *crp)
548 struct cred *svcred = curthread->t_cred;
549 curthread->t_cred = (struct cred *)crp;
550 call = afs_nfs2_dispatcher(0, RFS_MKDIR, (char *)args, &exp, rp, crp);
552 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
554 (*afs_rfs_disp_tbl[RFS_MKDIR].orig_proc) (args, xp, exp, rp, crp);
555 if (afs_NFSRootOnly && call)
556 afs_nfs2_smallfidder(xp);
558 curthread->t_cred = svcred;
563 afs_nfs2_rmdir(char *args, char *xp, char *exp, char *rp, char *crp)
566 struct cred *svcred = curthread->t_cred;
567 curthread->t_cred = (struct cred *)crp;
568 call = afs_nfs2_dispatcher(0, RFS_RMDIR, (char *)args, &exp, rp, crp);
570 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
572 (*afs_rfs_disp_tbl[RFS_RMDIR].orig_proc) (args, xp, exp, rp, crp);
573 curthread->t_cred = svcred;
578 afs_nfs2_readdir(char *args, char *xp, char *exp, char *rp, char *crp)
581 struct cred *svcred = curthread->t_cred;
582 curthread->t_cred = (struct cred *)crp;
583 call = afs_nfs2_dispatcher(0, RFS_READDIR, (char *)args, &exp, rp, crp);
585 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
587 (*afs_rfs_disp_tbl[RFS_READDIR].orig_proc) (args, xp, exp, rp, crp);
588 curthread->t_cred = svcred;
593 afs_nfs2_statfs(char *args, char *xp, char *exp, char *rp, char *crp)
596 struct cred *svcred = curthread->t_cred;
597 curthread->t_cred = (struct cred *)crp;
598 call = afs_nfs2_dispatcher(0, RFS_STATFS, (char *)args, &exp, rp, crp);
600 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
602 (*afs_rfs_disp_tbl[RFS_STATFS].orig_proc) (args, xp, exp, rp, crp);
603 curthread->t_cred = svcred;
607 struct afs_nfs_disp_tbl afs_rfs_disp_tbl[RFS_NPROC] = {
615 {afs_nfs2_writecache},
629 afs_acl2_getacl(char *args, char *xp, char *exp, char *rp, char *crp)
632 struct cred *svcred = curthread->t_cred;
633 curthread->t_cred = (struct cred *)crp;
635 afs_nfs2_dispatcher(1, ACLPROC2_GETACL, (char *)args, &exp, rp, crp);
637 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
639 (*afs_acl_disp_tbl[ACLPROC2_GETACL].orig_proc) (args, xp, exp, rp,
641 curthread->t_cred = svcred;
646 afs_acl2_setacl(char *args, char *xp, char *exp, char *rp, char *crp)
649 struct cred *svcred = curthread->t_cred;
650 curthread->t_cred = (struct cred *)crp;
652 afs_nfs2_dispatcher(1, ACLPROC2_SETACL, (char *)args, &exp, rp, crp);
654 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
656 (*afs_acl_disp_tbl[ACLPROC2_SETACL].orig_proc) (args, xp, exp, rp,
658 curthread->t_cred = svcred;
663 afs_acl2_getattr(char *args, char *xp, char *exp, char *rp, char *crp)
666 struct cred *svcred = curthread->t_cred;
667 curthread->t_cred = (struct cred *)crp;
669 afs_nfs2_dispatcher(1, ACLPROC2_GETATTR, (char *)args, &exp, rp, crp);
671 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
673 (*afs_acl_disp_tbl[ACLPROC2_GETATTR].orig_proc) (args, xp, exp, rp,
675 curthread->t_cred = svcred;
680 afs_acl2_access(char *args, char *xp, char *exp, char *rp, char *crp)
683 struct cred *svcred = curthread->t_cred;
684 curthread->t_cred = (struct cred *)crp;
686 afs_nfs2_dispatcher(1, ACLPROC2_ACCESS, (char *)args, &exp, rp, crp);
688 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
690 (*afs_acl_disp_tbl[ACLPROC2_ACCESS].orig_proc) (args, xp, exp, rp,
692 curthread->t_cred = svcred;
696 #if defined(AFS_SUN510_ENV)
698 afs_acl2_getxattrdir(char *args, char *xp, char *exp, char *rp, char *crp)
701 struct cred *svcred = curthread->t_cred;
702 curthread->t_cred = (struct cred *)crp;
704 afs_nfs2_dispatcher(1, ACLPROC2_GETXATTRDIR, (char *)args, &exp, rp, crp);
706 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
708 (*afs_acl_disp_tbl[ACLPROC2_GETXATTRDIR].orig_proc) (args, xp, exp, rp,
710 curthread->t_cred = svcred;
715 struct afs_nfs_disp_tbl afs_acl_disp_tbl[5] = {
721 #if defined(AFS_SUN510_ENV)
722 {afs_acl2_getxattrdir}
726 /* Munge the dispatch tables to link us in first */
728 afs_xlatorinit_v2(struct rfs_disp_tbl *_rfs_tbl,
729 struct rfs_disp_tbl *_acl_tbl)
733 if (xlatorinit_v2_done++)
736 for (i = 0; i < RFS_NPROC; i++) {
737 afs_rfs_disp_tbl[i].orig_proc = _rfs_tbl[i].dis_proc;
738 _rfs_tbl[i].dis_proc = afs_rfs_disp_tbl[i].afs_proc;
741 for (i = 0; i < 5; i++) {
742 afs_acl_disp_tbl[i].orig_proc = _acl_tbl[i].dis_proc;
743 _acl_tbl[i].dis_proc = afs_acl_disp_tbl[i].afs_proc;
748 #define RFS3_NPROC 22
755 struct afs_nfs_disp_tbl afs_rfs3_disp_tbl[RFS3_NPROC];
756 struct afs_nfs_disp_tbl afs_acl3_disp_tbl[ACL3_NPROC];
758 struct afs_nfs3_resp {
762 typedef struct afs_nfs3_resp afs_nfs3_resp;
765 is_afs_fh3(nfs_fh3 * fhp)
767 if ((fhp->fh3_fsid.val[0] == AFS_VFSMAGIC)
768 && (fhp->fh3_fsid.val[1] == AFS_VFSFSID))
774 afs_nfs3_noaccess(struct afs_nfs3_resp *resp)
776 resp->status = NFS3ERR_ACCES;
781 afs_nfs3_notsupp(struct afs_nfs3_resp *resp)
783 resp->status = NFS3ERR_NOTSUPP;
788 nfs3_to_afs_call(int which, caddr_t * args, nfs_fh3 ** fhpp, nfs_fh3 ** fh2pp)
795 afs_Trace1(afs_iclSetp, CM_TRACE_NFS3IN, ICL_TYPE_INT32, which);
796 *fh2pp = (nfs_fh3 *) 0;
798 case NFSPROC3_GETATTR:
800 GETATTR3args *arg = (GETATTR3args *) args;
801 fhp1 = (nfs_fh3 *) & arg->object;
804 case NFSPROC3_SETATTR:
806 SETATTR3args *arg = (SETATTR3args *) args;
807 fhp1 = (nfs_fh3 *) & arg->object;
810 case NFSPROC3_LOOKUP:
812 LOOKUP3args *arg = (LOOKUP3args *) args;
814 fhp1 = (nfs_fh3 *) arg->what.dirp;
816 fhp1 = (nfs_fh3 *) & arg->what.dir;
820 case NFSPROC3_ACCESS:
822 ACCESS3args *arg = (ACCESS3args *) args;
823 fhp1 = (nfs_fh3 *) & arg->object;
826 case NFSPROC3_READLINK:
828 READLINK3args *arg = (READLINK3args *) args;
829 fhp1 = (nfs_fh3 *) & arg->symlink;
834 READ3args *arg = (READ3args *) args;
835 fhp1 = (nfs_fh3 *) & arg->file;
840 WRITE3args *arg = (WRITE3args *) args;
841 fhp1 = (nfs_fh3 *) & arg->file;
844 case NFSPROC3_CREATE:
846 CREATE3args *arg = (CREATE3args *) args;
848 fhp1 = (nfs_fh3 *) arg->where.dirp;
850 fhp1 = (nfs_fh3 *) & arg->where.dir;
856 MKDIR3args *arg = (MKDIR3args *) args;
858 fhp1 = (nfs_fh3 *) arg->where.dirp;
860 fhp1 = (nfs_fh3 *) & arg->where.dir;
864 case NFSPROC3_SYMLINK:
866 SYMLINK3args *arg = (SYMLINK3args *) args;
868 fhp1 = (nfs_fh3 *) arg->where.dirp;
870 fhp1 = (nfs_fh3 *) & arg->where.dir;
876 MKNOD3args *arg = (MKNOD3args *) args;
878 fhp1 = (nfs_fh3 *) arg->where.dirp;
880 fhp1 = (nfs_fh3 *) & arg->where.dir;
884 case NFSPROC3_REMOVE:
886 REMOVE3args *arg = (REMOVE3args *) args;
888 fhp1 = (nfs_fh3 *) arg->object.dirp;
890 fhp1 = (nfs_fh3 *) & arg->object.dir;
896 RMDIR3args *arg = (RMDIR3args *) args;
898 fhp1 = (nfs_fh3 *) arg->object.dirp;
900 fhp1 = (nfs_fh3 *) & arg->object.dir;
904 case NFSPROC3_RENAME:
906 RENAME3args *arg = (RENAME3args *) args;
908 fhp1 = (nfs_fh3 *) arg->from.dirp;
909 fhp2 = (nfs_fh3 *) arg->to.dirp;
911 fhp1 = (nfs_fh3 *) & arg->from.dir;
912 fhp2 = (nfs_fh3 *) & arg->to.dir;
918 LINK3args *arg = (LINK3args *) args;
919 fhp1 = (nfs_fh3 *) & arg->file;
921 fhp2 = (nfs_fh3 *) arg->link.dirp;
923 fhp2 = (nfs_fh3 *) & arg->link.dir;
927 case NFSPROC3_READDIR:
929 READDIR3args *arg = (READDIR3args *) args;
930 fhp1 = (nfs_fh3 *) & arg->dir;
933 case NFSPROC3_READDIRPLUS:
935 READDIRPLUS3args *arg = (READDIRPLUS3args *) args;
936 fhp1 = (nfs_fh3 *) & arg->dir;
939 case NFSPROC3_FSSTAT:
941 FSSTAT3args *arg = (FSSTAT3args *) args;
942 fhp1 = (nfs_fh3 *) & arg->fsroot;
945 case NFSPROC3_FSINFO:
947 FSINFO3args *arg = (FSINFO3args *) args;
948 fhp1 = (nfs_fh3 *) & arg->fsroot;
951 case NFSPROC3_PATHCONF:
953 PATHCONF3args *arg = (PATHCONF3args *) args;
954 fhp1 = (nfs_fh3 *) & arg->object;
957 case NFSPROC3_COMMIT:
959 COMMIT3args *arg = (COMMIT3args *) args;
960 fhp1 = (nfs_fh3 *) & arg->file;
967 if (is_afs_fh3(fhp1)) {
973 if (fhp2 && is_afs_fh3(fhp2)) {
982 acl3_to_afs_call(int which, caddr_t * args, nfs_fh3 ** fhpp)
987 case ACLPROC3_GETACL:
989 struct GETACL3args *sargs = (struct GETACL3args *)args;
993 case ACLPROC3_SETACL:
995 struct SETACL3args *sargs = (struct SETACL3args *)args;
999 #if defined(AFS_SUN510_ENV)
1000 case ACLPROC3_GETXATTRDIR:
1002 struct GETXATTRDIR3args *sargs = (struct GETXATTRDIR3args *)args;
1011 if (is_afs_fh3(fhp)) {
1020 afs_nfs3_dispatcher(int type, afs_int32 which, char *argp,
1021 struct exportinfo **expp, struct svc_req *rp,
1022 struct AFS_UCRED *crp)
1026 afs_int32 client = 0;
1027 struct sockaddr *sa;
1028 nfs_fh3 *fh = (nfs_fh3 *) argp;
1029 nfs_fh3 *fh2 = (nfs_fh3 *) 0;
1031 if (!xlatorinit_v3_done)
1034 sa = (struct sockaddr *)svc_getrpccaller(rp->rq_xprt)->buf;
1038 if (sa->sa_family == AF_INET)
1039 client = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
1045 code = (client && nfs3_to_afs_call(which, argp, &fh, &fh2));
1048 code = (client && acl3_to_afs_call(which, argp, &fh));
1055 struct afs_exporter *out = 0;
1057 static int once = 0;
1058 struct SmallFid Sfid;
1060 memcpy((char *)&Sfid, fh->fh3_data, SIZEOF_SMALLFID);
1062 afs_Trace2(afs_iclSetp, CM_TRACE_NFS3IN1, ICL_TYPE_INT32, client,
1063 ICL_TYPE_FID, &Sfid);
1066 if (!once && *expp) {
1067 afs_nobody = (*expp)->exi_export.ex_anon;
1071 afs_nfsclient_reqhandler((struct afs_exporter *)0, &crp, client,
1087 afs_nfs3_smallfidder(struct nfs_fh3 *fhp, int status)
1092 #if defined(AFS_SUN57_64BIT_ENV)
1093 /* See also afs_fid() */
1094 memcpy((char *)addr, fhp->fh3_data, 10);
1095 addr[1] = (addr[1] >> 48) & 0xffff;
1097 memcpy((char *)addr, fhp->fh3_data, 2 * sizeof(long));
1101 vcp = VTOAFS((struct vnode *)addr[0]);
1103 /* See also afs_osi_vget */
1104 if (addr[1] == AFS_XLATOR_MAGIC) {
1105 if (status == NFS_OK) {
1106 struct SmallFid Sfid;
1109 /* Make up and copy out a SmallFid */
1110 tcell = afs_GetCell(vcp->fid.Cell, READ_LOCK);
1111 Sfid.Volume = vcp->fid.Fid.Volume;
1112 Sfid.CellAndUnique =
1113 ((tcell->cellIndex << 24) | (vcp->fid.Fid.Unique & 0xffffff));
1114 afs_PutCell(tcell, READ_LOCK);
1115 Sfid.Vnode = (u_short) (vcp->fid.Fid.Vnode & 0xffff);
1116 fhp->fh3_len = SIZEOF_SMALLFID;
1117 memcpy(fhp->fh3_data, (char *)&Sfid, fhp->fh3_len);
1119 afs_Trace3(afs_iclSetp, CM_TRACE_NFS3OUT, ICL_TYPE_INT32, status,
1120 ICL_TYPE_POINTER, vcp, ICL_TYPE_FID, &Sfid);
1123 /* If we have a ref, release it */
1124 if (vcp->vrefCount >= 1)
1125 AFS_RELE(AFSTOV(vcp));
1131 afs_nfs3_getattr(char *args, char *xp, char *exp, char *rp, char *crp)
1134 afs_nfs3_resp dummy;
1135 struct cred *svcred = curthread->t_cred;
1136 curthread->t_cred = (struct cred *)crp;
1138 afs_nfs3_dispatcher(0, NFSPROC3_GETATTR, (char *)args, &exp, rp, crp);
1140 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1142 (*afs_rfs3_disp_tbl[NFSPROC3_GETATTR].orig_proc) (args, xp, exp, rp,
1144 curthread->t_cred = svcred;
1149 afs_nfs3_setattr(char *args, char *xp, char *exp, char *rp, char *crp)
1152 afs_nfs3_resp dummy;
1153 struct cred *svcred = curthread->t_cred;
1154 curthread->t_cred = (struct cred *)crp;
1156 afs_nfs3_dispatcher(0, NFSPROC3_SETATTR, (char *)args, &exp, rp, crp);
1158 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1160 (*afs_rfs3_disp_tbl[NFSPROC3_SETATTR].orig_proc) (args, xp, exp, rp,
1162 curthread->t_cred = svcred;
1167 afs_nfs3_lookup(char *args, char *xp, char *exp, char *rp, char *crp)
1170 afs_nfs3_resp dummy;
1171 struct cred *svcred = curthread->t_cred;
1172 curthread->t_cred = (struct cred *)crp;
1174 afs_nfs3_dispatcher(0, NFSPROC3_LOOKUP, (char *)args, &exp, rp, crp);
1176 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1178 (*afs_rfs3_disp_tbl[NFSPROC3_LOOKUP].orig_proc) (args, xp, exp, rp,
1180 if (afs_NFSRootOnly && call) {
1181 LOOKUP3res *resp = (LOOKUP3res *) xp;
1182 afs_nfs3_smallfidder(&resp->resok.object, resp->status);
1185 curthread->t_cred = svcred;
1190 afs_nfs3_access(char *args, char *xp, char *exp, char *rp, char *crp)
1193 afs_nfs3_resp dummy;
1194 struct cred *svcred = curthread->t_cred;
1195 curthread->t_cred = (struct cred *)crp;
1197 afs_nfs3_dispatcher(0, NFSPROC3_ACCESS, (char *)args, &exp, rp, crp);
1199 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1201 (*afs_rfs3_disp_tbl[NFSPROC3_ACCESS].orig_proc) (args, xp, exp, rp,
1203 curthread->t_cred = svcred;
1208 afs_nfs3_readlink(char *args, char *xp, char *exp, char *rp, char *crp)
1211 afs_nfs3_resp dummy;
1212 struct cred *svcred = curthread->t_cred;
1213 curthread->t_cred = (struct cred *)crp;
1215 afs_nfs3_dispatcher(0, NFSPROC3_READLINK, (char *)args, &exp, rp,
1218 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1220 (*afs_rfs3_disp_tbl[NFSPROC3_READLINK].orig_proc) (args, xp, exp, rp,
1222 curthread->t_cred = svcred;
1227 afs_nfs3_read(char *args, char *xp, char *exp, char *rp, char *crp)
1230 afs_nfs3_resp dummy;
1231 struct cred *svcred = curthread->t_cred;
1232 curthread->t_cred = (struct cred *)crp;
1233 call = afs_nfs3_dispatcher(0, NFSPROC3_READ, (char *)args, &exp, rp, crp);
1235 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1237 (*afs_rfs3_disp_tbl[NFSPROC3_READ].orig_proc) (args, xp, exp, rp,
1239 curthread->t_cred = svcred;
1244 afs_nfs3_write(char *args, char *xp, char *exp, char *rp, char *crp)
1247 afs_nfs3_resp dummy;
1248 struct cred *svcred = curthread->t_cred;
1249 curthread->t_cred = (struct cred *)crp;
1251 afs_nfs3_dispatcher(0, NFSPROC3_WRITE, (char *)args, &exp, rp, crp);
1253 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1255 (*afs_rfs3_disp_tbl[NFSPROC3_WRITE].orig_proc) (args, xp, exp, rp,
1257 curthread->t_cred = svcred;
1262 afs_nfs3_create(char *args, char *xp, char *exp, char *rp, char *crp)
1265 afs_nfs3_resp dummy;
1266 struct cred *svcred = curthread->t_cred;
1267 curthread->t_cred = (struct cred *)crp;
1269 afs_nfs3_dispatcher(0, NFSPROC3_CREATE, (char *)args, &exp, rp, crp);
1271 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1273 (*afs_rfs3_disp_tbl[NFSPROC3_CREATE].orig_proc) (args, xp, exp, rp,
1275 if (afs_NFSRootOnly && call) {
1276 CREATE3res *resp = (CREATE3res *) xp;
1277 afs_nfs3_smallfidder(&resp->resok.obj.handle, resp->status);
1280 curthread->t_cred = svcred;
1285 afs_nfs3_mkdir(char *args, char *xp, char *exp, char *rp, char *crp)
1288 afs_nfs3_resp dummy;
1289 struct cred *svcred = curthread->t_cred;
1290 curthread->t_cred = (struct cred *)crp;
1292 afs_nfs3_dispatcher(0, NFSPROC3_MKDIR, (char *)args, &exp, rp, crp);
1294 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1296 (*afs_rfs3_disp_tbl[NFSPROC3_MKDIR].orig_proc) (args, xp, exp, rp,
1298 if (afs_NFSRootOnly && call) {
1299 MKDIR3res *resp = (MKDIR3res *) xp;
1300 afs_nfs3_smallfidder(&resp->resok.obj.handle, resp->status);
1303 curthread->t_cred = svcred;
1308 afs_nfs3_symlink(char *args, char *xp, char *exp, char *rp, char *crp)
1311 afs_nfs3_resp dummy;
1312 struct cred *svcred = curthread->t_cred;
1313 curthread->t_cred = (struct cred *)crp;
1315 afs_nfs3_dispatcher(0, NFSPROC3_SYMLINK, (char *)args, &exp, rp, crp);
1317 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1319 (*afs_rfs3_disp_tbl[NFSPROC3_SYMLINK].orig_proc) (args, xp, exp, rp,
1321 if (afs_NFSRootOnly && call) {
1322 SYMLINK3res *resp = (SYMLINK3res *) xp;
1323 afs_nfs3_smallfidder(&resp->resok.obj.handle, resp->status);
1326 curthread->t_cred = svcred;
1331 afs_nfs3_mknod(char *args, char *xp, char *exp, char *rp, char *crp)
1334 afs_nfs3_resp dummy;
1335 struct cred *svcred = curthread->t_cred;
1336 curthread->t_cred = (struct cred *)crp;
1338 afs_nfs3_dispatcher(0, NFSPROC3_MKNOD, (char *)args, &exp, rp, crp);
1340 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1342 (*afs_rfs3_disp_tbl[NFSPROC3_MKNOD].orig_proc) (args, xp, exp, rp,
1344 if (afs_NFSRootOnly && call) {
1345 MKNOD3res *resp = (MKNOD3res *) xp;
1346 afs_nfs3_smallfidder(&resp->resok.obj.handle, resp->status);
1349 curthread->t_cred = svcred;
1354 afs_nfs3_remove(char *args, char *xp, char *exp, char *rp, char *crp)
1357 afs_nfs3_resp dummy;
1358 struct cred *svcred = curthread->t_cred;
1359 curthread->t_cred = (struct cred *)crp;
1361 afs_nfs3_dispatcher(0, NFSPROC3_REMOVE, (char *)args, &exp, rp, crp);
1363 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1365 (*afs_rfs3_disp_tbl[NFSPROC3_REMOVE].orig_proc) (args, xp, exp, rp,
1367 curthread->t_cred = svcred;
1372 afs_nfs3_rmdir(char *args, char *xp, char *exp, char *rp, char *crp)
1375 afs_nfs3_resp dummy;
1376 struct cred *svcred = curthread->t_cred;
1377 curthread->t_cred = (struct cred *)crp;
1379 afs_nfs3_dispatcher(0, NFSPROC3_RMDIR, (char *)args, &exp, rp, crp);
1381 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1383 (*afs_rfs3_disp_tbl[NFSPROC3_RMDIR].orig_proc) (args, xp, exp, rp,
1385 curthread->t_cred = svcred;
1390 afs_nfs3_rename(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_RENAME, (char *)args, &exp, rp, crp);
1399 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1401 (*afs_rfs3_disp_tbl[NFSPROC3_RENAME].orig_proc) (args, xp, exp, rp,
1403 curthread->t_cred = svcred;
1408 afs_nfs3_link(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;
1414 call = afs_nfs3_dispatcher(0, NFSPROC3_LINK, (char *)args, &exp, rp, crp);
1416 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1418 (*afs_rfs3_disp_tbl[NFSPROC3_LINK].orig_proc) (args, xp, exp, rp,
1420 curthread->t_cred = svcred;
1425 afs_nfs3_readdir(char *args, char *xp, char *exp, char *rp, char *crp)
1428 afs_nfs3_resp dummy;
1429 struct cred *svcred = curthread->t_cred;
1430 curthread->t_cred = (struct cred *)crp;
1432 afs_nfs3_dispatcher(0, NFSPROC3_READDIR, (char *)args, &exp, rp, crp);
1434 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1436 (*afs_rfs3_disp_tbl[NFSPROC3_READDIR].orig_proc) (args, xp, exp, rp,
1438 curthread->t_cred = svcred;
1443 afs_nfs3_readdirplus(char *args, char *xp, char *exp, char *rp, char *crp)
1446 afs_nfs3_resp dummy;
1447 struct cred *svcred = curthread->t_cred;
1448 curthread->t_cred = (struct cred *)crp;
1450 afs_nfs3_dispatcher(0, NFSPROC3_READDIRPLUS, (char *)args, &exp, rp,
1453 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1455 afs_nfs3_notsupp((struct afs_nfs3_resp *)xp);
1457 (*afs_rfs3_disp_tbl[NFSPROC3_READDIRPLUS].orig_proc) (args, xp, exp,
1459 curthread->t_cred = svcred;
1464 afs_nfs3_fsstat(char *args, char *xp, char *exp, char *rp, char *crp)
1467 afs_nfs3_resp dummy;
1468 struct cred *svcred = curthread->t_cred;
1469 curthread->t_cred = (struct cred *)crp;
1471 afs_nfs3_dispatcher(0, NFSPROC3_FSSTAT, (char *)args, &exp, rp, crp);
1473 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1475 (*afs_rfs3_disp_tbl[NFSPROC3_FSSTAT].orig_proc) (args, xp, exp, rp,
1477 curthread->t_cred = svcred;
1482 afs_nfs3_fsinfo(char *args, char *xp, char *exp, char *rp, char *crp)
1485 afs_nfs3_resp dummy;
1486 struct cred *svcred = curthread->t_cred;
1487 curthread->t_cred = (struct cred *)crp;
1489 afs_nfs3_dispatcher(0, NFSPROC3_FSINFO, (char *)args, &exp, rp, crp);
1491 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1493 (*afs_rfs3_disp_tbl[NFSPROC3_FSINFO].orig_proc) (args, xp, exp, rp,
1495 curthread->t_cred = svcred;
1500 afs_nfs3_pathconf(char *args, char *xp, char *exp, char *rp, char *crp)
1503 afs_nfs3_resp dummy;
1504 struct cred *svcred = curthread->t_cred;
1505 curthread->t_cred = (struct cred *)crp;
1507 afs_nfs3_dispatcher(0, NFSPROC3_PATHCONF, (char *)args, &exp, rp,
1510 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1512 (*afs_rfs3_disp_tbl[NFSPROC3_PATHCONF].orig_proc) (args, xp, exp, rp,
1514 curthread->t_cred = svcred;
1519 afs_nfs3_commit(char *args, char *xp, char *exp, char *rp, char *crp)
1522 afs_nfs3_resp dummy;
1523 struct cred *svcred = curthread->t_cred;
1524 curthread->t_cred = (struct cred *)crp;
1526 afs_nfs3_dispatcher(0, NFSPROC3_COMMIT, (char *)args, &exp, rp, crp);
1528 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1530 (*afs_rfs3_disp_tbl[NFSPROC3_COMMIT].orig_proc) (args, xp, exp, rp,
1532 curthread->t_cred = svcred;
1536 struct afs_nfs_disp_tbl afs_rfs3_disp_tbl[22] = {
1542 {afs_nfs3_readlink},
1554 {afs_nfs3_readdirplus},
1557 {afs_nfs3_pathconf},
1562 afs_acl3_getacl(char *args, char *xp, char *exp, char *rp, char *crp)
1565 struct cred *svcred = curthread->t_cred;
1566 curthread->t_cred = (struct cred *)crp;
1568 afs_nfs3_dispatcher(1, ACLPROC3_GETACL, (char *)args, &exp, rp, crp);
1570 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1572 (*afs_acl3_disp_tbl[ACLPROC3_GETACL].orig_proc) (args, xp, exp, rp,
1574 curthread->t_cred = svcred;
1579 afs_acl3_setacl(char *args, char *xp, char *exp, char *rp, char *crp)
1582 struct cred *svcred = curthread->t_cred;
1583 curthread->t_cred = (struct cred *)crp;
1585 afs_nfs3_dispatcher(1, ACLPROC3_SETACL, (char *)args, &exp, rp, crp);
1587 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1589 (*afs_acl3_disp_tbl[ACLPROC3_SETACL].orig_proc) (args, xp, exp, rp,
1591 curthread->t_cred = svcred;
1595 #if defined(AFS_SUN510_ENV)
1597 afs_acl3_getxattrdir(char *args, char *xp, char *exp, char *rp, char *crp)
1600 struct cred *svcred = curthread->t_cred;
1601 curthread->t_cred = (struct cred *)crp;
1603 afs_nfs3_dispatcher(1, ACLPROC3_GETXATTRDIR, (char *)args, &exp, rp, crp);
1605 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1607 (*afs_acl3_disp_tbl[ACLPROC3_GETXATTRDIR].orig_proc) (args, xp, exp, rp,
1609 curthread->t_cred = svcred;
1614 struct afs_nfs_disp_tbl afs_acl3_disp_tbl[3] = {
1618 #if defined(AFS_SUN510_ENV)
1619 {afs_acl3_getxattrdir},
1623 /* Munge the dispatch tables to link us in first */
1625 afs_xlatorinit_v3(struct rfs_disp_tbl *_rfs_tbl,
1626 struct rfs_disp_tbl *_acl_tbl)
1630 if (xlatorinit_v3_done++)
1633 for (i = 0; i < 22; i++) {
1634 afs_rfs3_disp_tbl[i].orig_proc = _rfs_tbl[i].dis_proc;
1635 _rfs_tbl[i].dis_proc = afs_rfs3_disp_tbl[i].afs_proc;
1638 for (i = 0; i < 3; i++) {
1639 afs_acl3_disp_tbl[i].orig_proc = _acl_tbl[i].dis_proc;
1640 _acl_tbl[i].dis_proc = afs_acl3_disp_tbl[i].afs_proc;
1643 #endif /* !defined(AFS_NONFSTRANS) */