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_SUN5_ENV) && !defined(AFS_NONFSTRANS)
19 #include "rpc/types.h"
21 #include "rpc/auth_unix.h"
22 #include "rpc/auth_des.h"
23 #include "sys/tiuser.h"
27 #include "nfs/export.h"
28 #include "nfs/nfs_clnt.h"
29 #include "nfs/nfs_acl.h"
30 #include "afs/afsincludes.h"
31 #include "afs/afs_stats.h"
32 #include "afs/exporter.h"
34 static int xlatorinit_v2_done = 0;
35 static int xlatorinit_v3_done = 0;
36 extern int afs_nobody;
37 extern int afs_NFSRootOnly;
41 xdrproc_t dis_xdrargs;
42 xdrproc_t dis_fastxdrargs;
45 xdrproc_t dis_fastxdrres;
47 void (*dis_resfree) ();
49 fhandle_t(*dis_getfh) ();
52 struct afs_nfs_disp_tbl {
56 struct afs_nfs2_resp {
61 #if defined(AFS_SUN510_ENV)
67 struct afs_nfs_disp_tbl afs_rfs_disp_tbl[RFS_NPROC];
68 struct afs_nfs_disp_tbl afs_acl_disp_tbl[ACL2_NPROC];
71 is_afs_fh(fhandle_t * fhp)
73 if ((fhp->fh_fsid.val[0] == AFS_VFSMAGIC)
74 && (fhp->fh_fsid.val[1] == AFS_VFSFSID))
80 nfs2_to_afs_call(int which, caddr_t * args, fhandle_t ** fhpp,
88 afs_Trace1(afs_iclSetp, CM_TRACE_NFSIN, ICL_TYPE_INT32, which);
89 *fh2pp = (fhandle_t *) 0;
94 fhp1 = (fhandle_t *) args;
98 struct nfssaargs *sargs = (struct nfssaargs *)args;
99 fhp1 = (fhandle_t *) & sargs->saa_fh;
104 struct nfsdiropargs *sargs = (struct nfsdiropargs *)args;
105 fhp1 = sargs->da_fhandle;
110 struct nfsreadargs *sargs = (struct nfsreadargs *)args;
111 fhp1 = (fhandle_t *) & sargs->ra_fhandle;
116 struct nfswriteargs *sargs = (struct nfswriteargs *)args;
117 fhp1 = (fhandle_t *) & sargs->wa_fhandle;
122 struct nfscreatargs *sargs = (struct nfscreatargs *)args;
123 fhp1 = sargs->ca_da.da_fhandle;
128 struct nfsdiropargs *sargs = (struct nfsdiropargs *)args;
129 fhp1 = sargs->da_fhandle;
134 struct nfsrnmargs *sargs = (struct nfsrnmargs *)args;
135 fhp1 = sargs->rna_from.da_fhandle;
136 fhp2 = sargs->rna_to.da_fhandle;
141 struct nfslinkargs *sargs = (struct nfslinkargs *)args;
142 fhp1 = sargs->la_from;
143 fhp2 = sargs->la_to.da_fhandle;
148 struct nfsslargs *sargs = (struct nfsslargs *)args;
149 fhp1 = sargs->sla_from.da_fhandle;
154 struct nfscreatargs *sargs = (struct nfscreatargs *)args;
155 fhp1 = sargs->ca_da.da_fhandle;
160 struct nfsdiropargs *sargs = (struct nfsdiropargs *)args;
161 fhp1 = sargs->da_fhandle;
166 struct nfsrddirargs *sargs = (struct nfsrddirargs *)args;
167 fhp1 = (fhandle_t *) & sargs->rda_fh;
174 /* Ok if arg 1 is in AFS or if 2 args and arg 2 is in AFS */
175 if (fhp1 && is_afs_fh(fhp1)) {
181 if (fhp2 && is_afs_fh(fhp2)) {
190 acl2_to_afs_call(int which, caddr_t * args, fhandle_t ** fhpp)
199 case ACLPROC2_GETACL:
201 struct GETACL2args *sargs = (struct GETACL2args *)args;
205 case ACLPROC2_SETACL:
207 struct SETACL2args *sargs = (struct SETACL2args *)args;
211 case ACLPROC2_GETATTR:
213 struct GETATTR2args *sargs = (struct GETATTR2args *)args;
217 case ACLPROC2_ACCESS:
219 struct ACCESS2args *sargs = (struct ACCESS2args *)args;
223 #if defined(AFS_SUN510_ENV)
224 case ACLPROC2_GETXATTRDIR:
226 struct GETXATTRDIR2args *sargs = (struct GETXATTRDIR2args *)args;
235 if (fhp && is_afs_fh(fhp)) {
244 afs_nfs2_dispatcher(int type, afs_int32 which, char *argp,
245 struct exportinfo **expp, struct svc_req *rp,
250 afs_int32 client = 0;
252 fhandle_t *fh = (fhandle_t *) argp;
253 fhandle_t *fh2 = (fhandle_t *) 0;
255 if (!xlatorinit_v2_done)
258 sa = (struct sockaddr *)svc_getrpccaller(rp->rq_xprt)->buf;
259 if (sa->sa_family == AF_INET)
260 client = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
266 code = (client && nfs2_to_afs_call(which, argp, &fh, &fh2));
269 code = (client && acl2_to_afs_call(which, argp, &fh));
276 struct afs_exporter *out = 0;
279 struct SmallFid Sfid;
281 memcpy((char *)&Sfid, fh->fh_data, SIZEOF_SMALLFID);
283 afs_Trace2(afs_iclSetp, CM_TRACE_NFSIN1, ICL_TYPE_POINTER, client,
284 ICL_TYPE_FID, &Sfid);
288 if (!once && *expp) {
289 afs_nobody = (*expp)->exi_export.ex_anon;
293 afs_nfsclient_reqhandler((struct afs_exporter *)0, &crp, client,
308 afs_nfs2_smallfidder(struct nfsdiropres *dr)
310 fhandle_t *fhp = (fhandle_t *) & dr->dr_fhandle;
314 #if defined(AFS_SUN5_64BIT_ENV)
315 /* See also afs_fid() */
316 memcpy((char *)addr, fhp->fh_data, SIZEOF_SMALLFID);
317 addr[1] = (addr[1] >> 48) & 0xffff;
319 memcpy((char *)addr, fhp->fh_data, 2 * sizeof(long));
323 vcp = VTOAFS((struct vnode *)addr[0]);
325 if (addr[1] == AFS_XLATOR_MAGIC) {
326 if (dr->dr_status == NFS_OK) {
327 struct SmallFid Sfid;
330 /* Make up and copy out a SmallFid */
331 tcell = afs_GetCell(vcp->f.fid.Cell, READ_LOCK);
332 Sfid.Volume = vcp->f.fid.Fid.Volume;
334 ((tcell->cellIndex << 24) | (vcp->f.fid.Fid.Unique & 0xffffff));
335 afs_PutCell(tcell, READ_LOCK);
336 Sfid.Vnode = (u_short) (vcp->f.fid.Fid.Vnode & 0xffff);
337 fhp->fh_len = SIZEOF_SMALLFID;
338 memcpy(dr->dr_fhandle.fh_data, (char *)&Sfid, fhp->fh_len);
340 afs_Trace3(afs_iclSetp, CM_TRACE_NFSOUT, ICL_TYPE_INT32, 0,
341 ICL_TYPE_POINTER, vcp, ICL_TYPE_FID, &Sfid);
344 /* If we have a ref, release it */
345 if (vcp->vrefCount >= 1)
346 AFS_RELE(AFSTOV(vcp));
352 afs_nfs2_noaccess(struct afs_nfs2_resp *resp)
354 resp->status = NFSERR_ACCES;
358 afs_nfs2_null(char *args, char *xp, char *exp, char *rp, char *crp)
363 afs_nfs2_root(char *args, char *xp, char *exp, char *rp, char *crp)
368 afs_nfs2_writecache(char *args, char *xp, char *exp, char *rp, char *crp)
373 afs_nfs2_getattr(char *args, char *xp, char *exp, char *rp, char *crp)
376 afs_ucred_t *svcred = curthread->t_cred;
377 curthread->t_cred = (afs_ucred_t *)crp;
378 call = afs_nfs2_dispatcher(0, RFS_GETATTR, (char *)args, &exp, rp, crp);
380 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
382 (*afs_rfs_disp_tbl[RFS_GETATTR].orig_proc) (args, xp, exp, rp, crp);
383 curthread->t_cred = svcred;
388 afs_nfs2_setattr(char *args, char *xp, char *exp, char *rp, char *crp)
391 afs_ucred_t *svcred = curthread->t_cred;
392 curthread->t_cred = (afs_ucred_t *)crp;
393 call = afs_nfs2_dispatcher(0, RFS_SETATTR, (char *)args, &exp, rp, crp);
395 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
397 (*afs_rfs_disp_tbl[RFS_SETATTR].orig_proc) (args, xp, exp, rp, crp);
398 curthread->t_cred = svcred;
403 afs_nfs2_lookup(char *args, char *xp, char *exp, char *rp, char *crp)
406 afs_ucred_t *svcred = curthread->t_cred;
407 curthread->t_cred = (afs_ucred_t *)crp;
408 call = afs_nfs2_dispatcher(0, RFS_LOOKUP, (char *)args, &exp, rp, crp);
410 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
412 (*afs_rfs_disp_tbl[RFS_LOOKUP].orig_proc) (args, xp, exp, rp, crp);
413 if (afs_NFSRootOnly && call)
414 afs_nfs2_smallfidder(xp);
416 curthread->t_cred = svcred;
421 afs_nfs2_readlink(char *args, char *xp, char *exp, char *rp, char *crp)
424 afs_ucred_t *svcred = curthread->t_cred;
425 curthread->t_cred = (afs_ucred_t *)crp;
426 call = afs_nfs2_dispatcher(0, RFS_READLINK, (char *)args, &exp, rp, crp);
428 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
430 (*afs_rfs_disp_tbl[RFS_READLINK].orig_proc) (args, xp, exp, rp, crp);
431 curthread->t_cred = svcred;
436 afs_nfs2_read(char *args, char *xp, char *exp, char *rp, char *crp)
439 afs_ucred_t *svcred = curthread->t_cred;
440 curthread->t_cred = (afs_ucred_t *)crp;
441 call = afs_nfs2_dispatcher(0, RFS_READ, (char *)args, &exp, rp, crp);
443 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
445 (*afs_rfs_disp_tbl[RFS_READ].orig_proc) (args, xp, exp, rp, crp);
446 curthread->t_cred = svcred;
451 afs_nfs2_write(char *args, char *xp, char *exp, char *rp, char *crp)
454 afs_ucred_t *svcred = curthread->t_cred;
455 curthread->t_cred = (afs_ucred_t *)crp;
456 call = afs_nfs2_dispatcher(0, RFS_WRITE, (char *)args, &exp, rp, crp);
458 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
460 (*afs_rfs_disp_tbl[RFS_WRITE].orig_proc) (args, xp, exp, rp, crp);
461 curthread->t_cred = svcred;
466 afs_nfs2_create(char *args, char *xp, char *exp, char *rp, char *crp)
469 afs_ucred_t *svcred = curthread->t_cred;
470 curthread->t_cred = (afs_ucred_t *)crp;
471 call = afs_nfs2_dispatcher(0, RFS_CREATE, (char *)args, &exp, rp, crp);
473 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
475 (*afs_rfs_disp_tbl[RFS_CREATE].orig_proc) (args, xp, exp, rp, crp);
476 if (afs_NFSRootOnly && call)
477 afs_nfs2_smallfidder(xp);
479 curthread->t_cred = svcred;
484 afs_nfs2_remove(char *args, char *xp, char *exp, char *rp, char *crp)
487 afs_ucred_t *svcred = curthread->t_cred;
488 curthread->t_cred = (afs_ucred_t *)crp;
489 call = afs_nfs2_dispatcher(0, RFS_REMOVE, (char *)args, &exp, rp, crp);
491 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
493 (*afs_rfs_disp_tbl[RFS_REMOVE].orig_proc) (args, xp, exp, rp, crp);
494 curthread->t_cred = svcred;
499 afs_nfs2_rename(char *args, char *xp, char *exp, char *rp, char *crp)
502 afs_ucred_t *svcred = curthread->t_cred;
503 curthread->t_cred = (afs_ucred_t *)crp;
504 call = afs_nfs2_dispatcher(0, RFS_RENAME, (char *)args, &exp, rp, crp);
506 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
508 (*afs_rfs_disp_tbl[RFS_RENAME].orig_proc) (args, xp, exp, rp, crp);
509 curthread->t_cred = svcred;
514 afs_nfs2_link(char *args, char *xp, char *exp, char *rp, char *crp)
517 afs_ucred_t *svcred = curthread->t_cred;
518 curthread->t_cred = (afs_ucred_t *)crp;
519 call = afs_nfs2_dispatcher(0, RFS_LINK, (char *)args, &exp, rp, crp);
521 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
523 (*afs_rfs_disp_tbl[RFS_LINK].orig_proc) (args, xp, exp, rp, crp);
524 curthread->t_cred = svcred;
529 afs_nfs2_symlink(char *args, char *xp, char *exp, char *rp, char *crp)
532 afs_ucred_t *svcred = curthread->t_cred;
533 curthread->t_cred = (afs_ucred_t *)crp;
534 call = afs_nfs2_dispatcher(0, RFS_SYMLINK, (char *)args, &exp, rp, crp);
536 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
538 (*afs_rfs_disp_tbl[RFS_SYMLINK].orig_proc) (args, xp, exp, rp, crp);
539 curthread->t_cred = svcred;
544 afs_nfs2_mkdir(char *args, char *xp, char *exp, char *rp, char *crp)
547 afs_ucred_t *svcred = curthread->t_cred;
548 curthread->t_cred = (afs_ucred_t *)crp;
549 call = afs_nfs2_dispatcher(0, RFS_MKDIR, (char *)args, &exp, rp, crp);
551 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
553 (*afs_rfs_disp_tbl[RFS_MKDIR].orig_proc) (args, xp, exp, rp, crp);
554 if (afs_NFSRootOnly && call)
555 afs_nfs2_smallfidder(xp);
557 curthread->t_cred = svcred;
562 afs_nfs2_rmdir(char *args, char *xp, char *exp, char *rp, char *crp)
565 afs_ucred_t *svcred = curthread->t_cred;
566 curthread->t_cred = (afs_ucred_t *)crp;
567 call = afs_nfs2_dispatcher(0, RFS_RMDIR, (char *)args, &exp, rp, crp);
569 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
571 (*afs_rfs_disp_tbl[RFS_RMDIR].orig_proc) (args, xp, exp, rp, crp);
572 curthread->t_cred = svcred;
577 afs_nfs2_readdir(char *args, char *xp, char *exp, char *rp, char *crp)
580 afs_ucred_t *svcred = curthread->t_cred;
581 curthread->t_cred = (afs_ucred_t *)crp;
582 call = afs_nfs2_dispatcher(0, RFS_READDIR, (char *)args, &exp, rp, crp);
584 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
586 (*afs_rfs_disp_tbl[RFS_READDIR].orig_proc) (args, xp, exp, rp, crp);
587 curthread->t_cred = svcred;
592 afs_nfs2_statfs(char *args, char *xp, char *exp, char *rp, char *crp)
595 afs_ucred_t *svcred = curthread->t_cred;
596 curthread->t_cred = (afs_ucred_t *)crp;
597 call = afs_nfs2_dispatcher(0, RFS_STATFS, (char *)args, &exp, rp, crp);
599 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
601 (*afs_rfs_disp_tbl[RFS_STATFS].orig_proc) (args, xp, exp, rp, crp);
602 curthread->t_cred = svcred;
606 struct afs_nfs_disp_tbl afs_rfs_disp_tbl[RFS_NPROC] = {
614 {afs_nfs2_writecache},
628 afs_acl2_getacl(char *args, char *xp, char *exp, char *rp, char *crp)
631 afs_ucred_t *svcred = curthread->t_cred;
632 curthread->t_cred = (afs_ucred_t *)crp;
634 afs_nfs2_dispatcher(1, ACLPROC2_GETACL, (char *)args, &exp, rp, crp);
636 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
638 (*afs_acl_disp_tbl[ACLPROC2_GETACL].orig_proc) (args, xp, exp, rp,
640 curthread->t_cred = svcred;
645 afs_acl2_setacl(char *args, char *xp, char *exp, char *rp, char *crp)
648 afs_ucred_t *svcred = curthread->t_cred;
649 curthread->t_cred = (afs_ucred_t *)crp;
651 afs_nfs2_dispatcher(1, ACLPROC2_SETACL, (char *)args, &exp, rp, crp);
653 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
655 (*afs_acl_disp_tbl[ACLPROC2_SETACL].orig_proc) (args, xp, exp, rp,
657 curthread->t_cred = svcred;
662 afs_acl2_getattr(char *args, char *xp, char *exp, char *rp, char *crp)
665 afs_ucred_t *svcred = curthread->t_cred;
666 curthread->t_cred = (afs_ucred_t *)crp;
668 afs_nfs2_dispatcher(1, ACLPROC2_GETATTR, (char *)args, &exp, rp, crp);
670 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
672 (*afs_acl_disp_tbl[ACLPROC2_GETATTR].orig_proc) (args, xp, exp, rp,
674 curthread->t_cred = svcred;
679 afs_acl2_access(char *args, char *xp, char *exp, char *rp, char *crp)
682 afs_ucred_t *svcred = curthread->t_cred;
683 curthread->t_cred = (afs_ucred_t *)crp;
685 afs_nfs2_dispatcher(1, ACLPROC2_ACCESS, (char *)args, &exp, rp, crp);
687 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
689 (*afs_acl_disp_tbl[ACLPROC2_ACCESS].orig_proc) (args, xp, exp, rp,
691 curthread->t_cred = svcred;
695 #if defined(AFS_SUN510_ENV)
697 afs_acl2_getxattrdir(char *args, char *xp, char *exp, char *rp, char *crp)
700 afs_ucred_t *svcred = curthread->t_cred;
701 curthread->t_cred = (afs_ucred_t *)crp;
703 afs_nfs2_dispatcher(1, ACLPROC2_GETXATTRDIR, (char *)args, &exp, rp, crp);
705 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
707 (*afs_acl_disp_tbl[ACLPROC2_GETXATTRDIR].orig_proc) (args, xp, exp, rp,
709 curthread->t_cred = svcred;
714 struct afs_nfs_disp_tbl afs_acl_disp_tbl[ACL2_NPROC] = {
720 #if defined(AFS_SUN510_ENV)
721 {afs_acl2_getxattrdir}
725 /* Munge the dispatch tables to link us in first */
727 afs_xlatorinit_v2(struct rfs_disp_tbl *_rfs_tbl,
728 struct rfs_disp_tbl *_acl_tbl)
732 if (xlatorinit_v2_done++)
735 for (i = 0; i < RFS_NPROC; i++) {
736 afs_rfs_disp_tbl[i].orig_proc = _rfs_tbl[i].dis_proc;
737 _rfs_tbl[i].dis_proc = afs_rfs_disp_tbl[i].afs_proc;
740 for (i = 0; i < 5; i++) {
741 afs_acl_disp_tbl[i].orig_proc = _acl_tbl[i].dis_proc;
742 _acl_tbl[i].dis_proc = afs_acl_disp_tbl[i].afs_proc;
747 #define RFS3_NPROC 22
751 #if defined(AFS_SUN510_ENV)
758 struct afs_nfs_disp_tbl afs_rfs3_disp_tbl[RFS3_NPROC];
759 struct afs_nfs_disp_tbl afs_acl3_disp_tbl[ACL3_NPROC];
761 struct afs_nfs3_resp {
765 typedef struct afs_nfs3_resp afs_nfs3_resp;
768 is_afs_fh3(nfs_fh3 * fhp)
770 if ((fhp->fh3_fsid.val[0] == AFS_VFSMAGIC)
771 && (fhp->fh3_fsid.val[1] == AFS_VFSFSID))
777 afs_nfs3_noaccess(struct afs_nfs3_resp *resp)
779 resp->status = NFS3ERR_ACCES;
784 afs_nfs3_notsupp(struct afs_nfs3_resp *resp)
786 resp->status = NFS3ERR_NOTSUPP;
791 nfs3_to_afs_call(int which, caddr_t * args, nfs_fh3 ** fhpp, nfs_fh3 ** fh2pp)
798 afs_Trace1(afs_iclSetp, CM_TRACE_NFS3IN, ICL_TYPE_INT32, which);
799 *fh2pp = (nfs_fh3 *) 0;
801 case NFSPROC3_GETATTR:
803 GETATTR3args *arg = (GETATTR3args *) args;
804 fhp1 = (nfs_fh3 *) & arg->object;
807 case NFSPROC3_SETATTR:
809 SETATTR3args *arg = (SETATTR3args *) args;
810 fhp1 = (nfs_fh3 *) & arg->object;
813 case NFSPROC3_LOOKUP:
815 LOOKUP3args *arg = (LOOKUP3args *) args;
816 fhp1 = (nfs_fh3 *) arg->what.dirp;
819 case NFSPROC3_ACCESS:
821 ACCESS3args *arg = (ACCESS3args *) args;
822 fhp1 = (nfs_fh3 *) & arg->object;
825 case NFSPROC3_READLINK:
827 READLINK3args *arg = (READLINK3args *) args;
828 fhp1 = (nfs_fh3 *) & arg->symlink;
833 READ3args *arg = (READ3args *) args;
834 fhp1 = (nfs_fh3 *) & arg->file;
839 WRITE3args *arg = (WRITE3args *) args;
840 fhp1 = (nfs_fh3 *) & arg->file;
843 case NFSPROC3_CREATE:
845 CREATE3args *arg = (CREATE3args *) args;
846 fhp1 = (nfs_fh3 *) arg->where.dirp;
851 MKDIR3args *arg = (MKDIR3args *) args;
852 fhp1 = (nfs_fh3 *) arg->where.dirp;
855 case NFSPROC3_SYMLINK:
857 SYMLINK3args *arg = (SYMLINK3args *) args;
858 fhp1 = (nfs_fh3 *) arg->where.dirp;
863 MKNOD3args *arg = (MKNOD3args *) args;
864 fhp1 = (nfs_fh3 *) arg->where.dirp;
867 case NFSPROC3_REMOVE:
869 REMOVE3args *arg = (REMOVE3args *) args;
870 fhp1 = (nfs_fh3 *) arg->object.dirp;
875 RMDIR3args *arg = (RMDIR3args *) args;
876 fhp1 = (nfs_fh3 *) arg->object.dirp;
879 case NFSPROC3_RENAME:
881 RENAME3args *arg = (RENAME3args *) args;
882 fhp1 = (nfs_fh3 *) arg->from.dirp;
883 fhp2 = (nfs_fh3 *) arg->to.dirp;
888 LINK3args *arg = (LINK3args *) args;
889 fhp1 = (nfs_fh3 *) & arg->file;
890 fhp2 = (nfs_fh3 *) arg->link.dirp;
893 case NFSPROC3_READDIR:
895 READDIR3args *arg = (READDIR3args *) args;
896 fhp1 = (nfs_fh3 *) & arg->dir;
899 case NFSPROC3_READDIRPLUS:
901 READDIRPLUS3args *arg = (READDIRPLUS3args *) args;
902 fhp1 = (nfs_fh3 *) & arg->dir;
905 case NFSPROC3_FSSTAT:
907 FSSTAT3args *arg = (FSSTAT3args *) args;
908 fhp1 = (nfs_fh3 *) & arg->fsroot;
911 case NFSPROC3_FSINFO:
913 FSINFO3args *arg = (FSINFO3args *) args;
914 fhp1 = (nfs_fh3 *) & arg->fsroot;
917 case NFSPROC3_PATHCONF:
919 PATHCONF3args *arg = (PATHCONF3args *) args;
920 fhp1 = (nfs_fh3 *) & arg->object;
923 case NFSPROC3_COMMIT:
925 COMMIT3args *arg = (COMMIT3args *) args;
926 fhp1 = (nfs_fh3 *) & arg->file;
933 if (fhp1 && is_afs_fh3(fhp1)) {
939 if (fhp2 && is_afs_fh3(fhp2)) {
948 acl3_to_afs_call(int which, caddr_t * args, nfs_fh3 ** fhpp)
953 case ACLPROC3_GETACL:
955 struct GETACL3args *sargs = (struct GETACL3args *)args;
959 case ACLPROC3_SETACL:
961 struct SETACL3args *sargs = (struct SETACL3args *)args;
965 #if defined(AFS_SUN510_ENV)
966 case ACLPROC3_GETXATTRDIR:
968 struct GETXATTRDIR3args *sargs = (struct GETXATTRDIR3args *)args;
977 if (fhp && is_afs_fh3(fhp)) {
986 afs_nfs3_dispatcher(int type, afs_int32 which, char *argp,
987 struct exportinfo **expp, struct svc_req *rp,
992 afs_int32 client = 0;
994 nfs_fh3 *fh = (nfs_fh3 *) argp;
995 nfs_fh3 *fh2 = (nfs_fh3 *) 0;
997 if (!xlatorinit_v3_done)
1000 sa = (struct sockaddr *)svc_getrpccaller(rp->rq_xprt)->buf;
1004 if (sa->sa_family == AF_INET)
1005 client = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
1011 code = (client && nfs3_to_afs_call(which, argp, &fh, &fh2));
1014 code = (client && acl3_to_afs_call(which, argp, &fh));
1021 struct afs_exporter *out = 0;
1023 static int once = 0;
1024 struct SmallFid Sfid;
1026 memcpy((char *)&Sfid, fh->fh3_data, SIZEOF_SMALLFID);
1028 afs_Trace2(afs_iclSetp, CM_TRACE_NFS3IN1, ICL_TYPE_INT32, client,
1029 ICL_TYPE_FID, &Sfid);
1032 if (!once && *expp) {
1033 afs_nobody = (*expp)->exi_export.ex_anon;
1037 afs_nfsclient_reqhandler((struct afs_exporter *)0, &crp, client,
1053 afs_nfs3_smallfidder(struct nfs_fh3 *fhp, int status)
1058 #if defined(AFS_SUN5_64BIT_ENV)
1059 /* See also afs_fid() */
1060 memcpy((char *)addr, fhp->fh3_data, 10);
1061 addr[1] = (addr[1] >> 48) & 0xffff;
1063 memcpy((char *)addr, fhp->fh3_data, 2 * sizeof(long));
1067 vcp = VTOAFS((struct vnode *)addr[0]);
1069 /* See also afs_osi_vget */
1070 if (addr[1] == AFS_XLATOR_MAGIC) {
1071 if (status == NFS_OK) {
1072 struct SmallFid Sfid;
1075 /* Make up and copy out a SmallFid */
1076 tcell = afs_GetCell(vcp->f.fid.Cell, READ_LOCK);
1077 Sfid.Volume = vcp->f.fid.Fid.Volume;
1078 Sfid.CellAndUnique =
1079 ((tcell->cellIndex << 24) | (vcp->f.fid.Fid.Unique & 0xffffff));
1080 afs_PutCell(tcell, READ_LOCK);
1081 Sfid.Vnode = (u_short) (vcp->f.fid.Fid.Vnode & 0xffff);
1082 fhp->fh3_len = SIZEOF_SMALLFID;
1083 memcpy(fhp->fh3_data, (char *)&Sfid, fhp->fh3_len);
1085 afs_Trace3(afs_iclSetp, CM_TRACE_NFS3OUT, ICL_TYPE_INT32, status,
1086 ICL_TYPE_POINTER, vcp, ICL_TYPE_FID, &Sfid);
1089 /* If we have a ref, release it */
1090 if (vcp->vrefCount >= 1)
1091 AFS_RELE(AFSTOV(vcp));
1097 afs_nfs3_getattr(char *args, char *xp, char *exp, char *rp, char *crp)
1100 afs_nfs3_resp dummy;
1101 afs_ucred_t *svcred = curthread->t_cred;
1102 curthread->t_cred = (afs_ucred_t *)crp;
1104 afs_nfs3_dispatcher(0, NFSPROC3_GETATTR, (char *)args, &exp, rp, crp);
1106 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1108 (*afs_rfs3_disp_tbl[NFSPROC3_GETATTR].orig_proc) (args, xp, exp, rp,
1110 curthread->t_cred = svcred;
1115 afs_nfs3_setattr(char *args, char *xp, char *exp, char *rp, char *crp)
1118 afs_nfs3_resp dummy;
1119 afs_ucred_t *svcred = curthread->t_cred;
1120 curthread->t_cred = (afs_ucred_t *)crp;
1122 afs_nfs3_dispatcher(0, NFSPROC3_SETATTR, (char *)args, &exp, rp, crp);
1124 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1126 (*afs_rfs3_disp_tbl[NFSPROC3_SETATTR].orig_proc) (args, xp, exp, rp,
1128 curthread->t_cred = svcred;
1133 afs_nfs3_lookup(char *args, char *xp, char *exp, char *rp, char *crp)
1136 afs_nfs3_resp dummy;
1137 afs_ucred_t *svcred = curthread->t_cred;
1138 curthread->t_cred = (afs_ucred_t *)crp;
1140 afs_nfs3_dispatcher(0, NFSPROC3_LOOKUP, (char *)args, &exp, rp, crp);
1142 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1144 (*afs_rfs3_disp_tbl[NFSPROC3_LOOKUP].orig_proc) (args, xp, exp, rp,
1146 if (afs_NFSRootOnly && call) {
1147 LOOKUP3res *resp = (LOOKUP3res *) xp;
1148 afs_nfs3_smallfidder(&resp->resok.object, resp->status);
1151 curthread->t_cred = svcred;
1156 afs_nfs3_access(char *args, char *xp, char *exp, char *rp, char *crp)
1159 afs_nfs3_resp dummy;
1160 afs_ucred_t *svcred = curthread->t_cred;
1161 curthread->t_cred = (afs_ucred_t *)crp;
1163 afs_nfs3_dispatcher(0, NFSPROC3_ACCESS, (char *)args, &exp, rp, crp);
1165 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1167 (*afs_rfs3_disp_tbl[NFSPROC3_ACCESS].orig_proc) (args, xp, exp, rp,
1169 curthread->t_cred = svcred;
1174 afs_nfs3_readlink(char *args, char *xp, char *exp, char *rp, char *crp)
1177 afs_nfs3_resp dummy;
1178 afs_ucred_t *svcred = curthread->t_cred;
1179 curthread->t_cred = (afs_ucred_t *)crp;
1181 afs_nfs3_dispatcher(0, NFSPROC3_READLINK, (char *)args, &exp, rp,
1184 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1186 (*afs_rfs3_disp_tbl[NFSPROC3_READLINK].orig_proc) (args, xp, exp, rp,
1188 curthread->t_cred = svcred;
1193 afs_nfs3_read(char *args, char *xp, char *exp, char *rp, char *crp)
1196 afs_nfs3_resp dummy;
1197 afs_ucred_t *svcred = curthread->t_cred;
1198 curthread->t_cred = (afs_ucred_t *)crp;
1199 call = afs_nfs3_dispatcher(0, NFSPROC3_READ, (char *)args, &exp, rp, crp);
1201 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1203 (*afs_rfs3_disp_tbl[NFSPROC3_READ].orig_proc) (args, xp, exp, rp,
1205 curthread->t_cred = svcred;
1210 afs_nfs3_write(char *args, char *xp, char *exp, char *rp, char *crp)
1213 afs_nfs3_resp dummy;
1214 afs_ucred_t *svcred = curthread->t_cred;
1215 curthread->t_cred = (afs_ucred_t *)crp;
1217 afs_nfs3_dispatcher(0, NFSPROC3_WRITE, (char *)args, &exp, rp, crp);
1219 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1221 (*afs_rfs3_disp_tbl[NFSPROC3_WRITE].orig_proc) (args, xp, exp, rp,
1223 curthread->t_cred = svcred;
1228 afs_nfs3_create(char *args, char *xp, char *exp, char *rp, char *crp)
1231 afs_nfs3_resp dummy;
1232 afs_ucred_t *svcred = curthread->t_cred;
1233 curthread->t_cred = (afs_ucred_t *)crp;
1235 afs_nfs3_dispatcher(0, NFSPROC3_CREATE, (char *)args, &exp, rp, crp);
1237 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1239 (*afs_rfs3_disp_tbl[NFSPROC3_CREATE].orig_proc) (args, xp, exp, rp,
1241 if (afs_NFSRootOnly && call) {
1242 CREATE3res *resp = (CREATE3res *) xp;
1243 afs_nfs3_smallfidder(&resp->resok.obj.handle, resp->status);
1246 curthread->t_cred = svcred;
1251 afs_nfs3_mkdir(char *args, char *xp, char *exp, char *rp, char *crp)
1254 afs_nfs3_resp dummy;
1255 afs_ucred_t *svcred = curthread->t_cred;
1256 curthread->t_cred = (afs_ucred_t *)crp;
1258 afs_nfs3_dispatcher(0, NFSPROC3_MKDIR, (char *)args, &exp, rp, crp);
1260 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1262 (*afs_rfs3_disp_tbl[NFSPROC3_MKDIR].orig_proc) (args, xp, exp, rp,
1264 if (afs_NFSRootOnly && call) {
1265 MKDIR3res *resp = (MKDIR3res *) xp;
1266 afs_nfs3_smallfidder(&resp->resok.obj.handle, resp->status);
1269 curthread->t_cred = svcred;
1274 afs_nfs3_symlink(char *args, char *xp, char *exp, char *rp, char *crp)
1277 afs_nfs3_resp dummy;
1278 afs_ucred_t *svcred = curthread->t_cred;
1279 curthread->t_cred = (afs_ucred_t *)crp;
1281 afs_nfs3_dispatcher(0, NFSPROC3_SYMLINK, (char *)args, &exp, rp, crp);
1283 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1285 (*afs_rfs3_disp_tbl[NFSPROC3_SYMLINK].orig_proc) (args, xp, exp, rp,
1287 if (afs_NFSRootOnly && call) {
1288 SYMLINK3res *resp = (SYMLINK3res *) xp;
1289 afs_nfs3_smallfidder(&resp->resok.obj.handle, resp->status);
1292 curthread->t_cred = svcred;
1297 afs_nfs3_mknod(char *args, char *xp, char *exp, char *rp, char *crp)
1300 afs_nfs3_resp dummy;
1301 afs_ucred_t *svcred = curthread->t_cred;
1302 curthread->t_cred = (afs_ucred_t *)crp;
1304 afs_nfs3_dispatcher(0, NFSPROC3_MKNOD, (char *)args, &exp, rp, crp);
1306 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1308 (*afs_rfs3_disp_tbl[NFSPROC3_MKNOD].orig_proc) (args, xp, exp, rp,
1310 if (afs_NFSRootOnly && call) {
1311 MKNOD3res *resp = (MKNOD3res *) xp;
1312 afs_nfs3_smallfidder(&resp->resok.obj.handle, resp->status);
1315 curthread->t_cred = svcred;
1320 afs_nfs3_remove(char *args, char *xp, char *exp, char *rp, char *crp)
1323 afs_nfs3_resp dummy;
1324 afs_ucred_t *svcred = curthread->t_cred;
1325 curthread->t_cred = (afs_ucred_t *)crp;
1327 afs_nfs3_dispatcher(0, NFSPROC3_REMOVE, (char *)args, &exp, rp, crp);
1329 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1331 (*afs_rfs3_disp_tbl[NFSPROC3_REMOVE].orig_proc) (args, xp, exp, rp,
1333 curthread->t_cred = svcred;
1338 afs_nfs3_rmdir(char *args, char *xp, char *exp, char *rp, char *crp)
1341 afs_nfs3_resp dummy;
1342 afs_ucred_t *svcred = curthread->t_cred;
1343 curthread->t_cred = (afs_ucred_t *)crp;
1345 afs_nfs3_dispatcher(0, NFSPROC3_RMDIR, (char *)args, &exp, rp, crp);
1347 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1349 (*afs_rfs3_disp_tbl[NFSPROC3_RMDIR].orig_proc) (args, xp, exp, rp,
1351 curthread->t_cred = svcred;
1356 afs_nfs3_rename(char *args, char *xp, char *exp, char *rp, char *crp)
1359 afs_nfs3_resp dummy;
1360 afs_ucred_t *svcred = curthread->t_cred;
1361 curthread->t_cred = (afs_ucred_t *)crp;
1363 afs_nfs3_dispatcher(0, NFSPROC3_RENAME, (char *)args, &exp, rp, crp);
1365 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1367 (*afs_rfs3_disp_tbl[NFSPROC3_RENAME].orig_proc) (args, xp, exp, rp,
1369 curthread->t_cred = svcred;
1374 afs_nfs3_link(char *args, char *xp, char *exp, char *rp, char *crp)
1377 afs_nfs3_resp dummy;
1378 afs_ucred_t *svcred = curthread->t_cred;
1379 curthread->t_cred = (afs_ucred_t *)crp;
1380 call = afs_nfs3_dispatcher(0, NFSPROC3_LINK, (char *)args, &exp, rp, crp);
1382 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1384 (*afs_rfs3_disp_tbl[NFSPROC3_LINK].orig_proc) (args, xp, exp, rp,
1386 curthread->t_cred = svcred;
1391 afs_nfs3_readdir(char *args, char *xp, char *exp, char *rp, char *crp)
1394 afs_nfs3_resp dummy;
1395 afs_ucred_t *svcred = curthread->t_cred;
1396 curthread->t_cred = (afs_ucred_t *)crp;
1398 afs_nfs3_dispatcher(0, NFSPROC3_READDIR, (char *)args, &exp, rp, crp);
1400 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1402 (*afs_rfs3_disp_tbl[NFSPROC3_READDIR].orig_proc) (args, xp, exp, rp,
1404 curthread->t_cred = svcred;
1409 afs_nfs3_readdirplus(char *args, char *xp, char *exp, char *rp, char *crp)
1412 afs_nfs3_resp dummy;
1413 afs_ucred_t *svcred = curthread->t_cred;
1414 curthread->t_cred = (afs_ucred_t *)crp;
1416 afs_nfs3_dispatcher(0, NFSPROC3_READDIRPLUS, (char *)args, &exp, rp,
1419 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1421 afs_nfs3_notsupp((struct afs_nfs3_resp *)xp);
1423 (*afs_rfs3_disp_tbl[NFSPROC3_READDIRPLUS].orig_proc) (args, xp, exp,
1425 curthread->t_cred = svcred;
1430 afs_nfs3_fsstat(char *args, char *xp, char *exp, char *rp, char *crp)
1433 afs_nfs3_resp dummy;
1434 afs_ucred_t *svcred = curthread->t_cred;
1435 curthread->t_cred = (afs_ucred_t *)crp;
1437 afs_nfs3_dispatcher(0, NFSPROC3_FSSTAT, (char *)args, &exp, rp, crp);
1439 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1441 (*afs_rfs3_disp_tbl[NFSPROC3_FSSTAT].orig_proc) (args, xp, exp, rp,
1443 curthread->t_cred = svcred;
1448 afs_nfs3_fsinfo(char *args, char *xp, char *exp, char *rp, char *crp)
1451 afs_nfs3_resp dummy;
1452 afs_ucred_t *svcred = curthread->t_cred;
1453 curthread->t_cred = (afs_ucred_t *)crp;
1455 afs_nfs3_dispatcher(0, NFSPROC3_FSINFO, (char *)args, &exp, rp, crp);
1457 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1459 (*afs_rfs3_disp_tbl[NFSPROC3_FSINFO].orig_proc) (args, xp, exp, rp,
1461 curthread->t_cred = svcred;
1466 afs_nfs3_pathconf(char *args, char *xp, char *exp, char *rp, char *crp)
1469 afs_nfs3_resp dummy;
1470 afs_ucred_t *svcred = curthread->t_cred;
1471 curthread->t_cred = (afs_ucred_t *)crp;
1473 afs_nfs3_dispatcher(0, NFSPROC3_PATHCONF, (char *)args, &exp, rp,
1476 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1478 (*afs_rfs3_disp_tbl[NFSPROC3_PATHCONF].orig_proc) (args, xp, exp, rp,
1480 curthread->t_cred = svcred;
1485 afs_nfs3_commit(char *args, char *xp, char *exp, char *rp, char *crp)
1488 afs_nfs3_resp dummy;
1489 afs_ucred_t *svcred = curthread->t_cred;
1490 curthread->t_cred = (afs_ucred_t *)crp;
1492 afs_nfs3_dispatcher(0, NFSPROC3_COMMIT, (char *)args, &exp, rp, crp);
1494 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1496 (*afs_rfs3_disp_tbl[NFSPROC3_COMMIT].orig_proc) (args, xp, exp, rp,
1498 curthread->t_cred = svcred;
1502 struct afs_nfs_disp_tbl afs_rfs3_disp_tbl[22] = {
1508 {afs_nfs3_readlink},
1520 {afs_nfs3_readdirplus},
1523 {afs_nfs3_pathconf},
1528 afs_acl3_getacl(char *args, char *xp, char *exp, char *rp, char *crp)
1531 afs_ucred_t *svcred = curthread->t_cred;
1532 curthread->t_cred = (afs_ucred_t *)crp;
1534 afs_nfs3_dispatcher(1, ACLPROC3_GETACL, (char *)args, &exp, rp, crp);
1536 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1538 (*afs_acl3_disp_tbl[ACLPROC3_GETACL].orig_proc) (args, xp, exp, rp,
1540 curthread->t_cred = svcred;
1545 afs_acl3_setacl(char *args, char *xp, char *exp, char *rp, char *crp)
1548 afs_ucred_t *svcred = curthread->t_cred;
1549 curthread->t_cred = (afs_ucred_t *)crp;
1551 afs_nfs3_dispatcher(1, ACLPROC3_SETACL, (char *)args, &exp, rp, crp);
1553 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1555 (*afs_acl3_disp_tbl[ACLPROC3_SETACL].orig_proc) (args, xp, exp, rp,
1557 curthread->t_cred = svcred;
1561 #if defined(AFS_SUN510_ENV)
1563 afs_acl3_getxattrdir(char *args, char *xp, char *exp, char *rp, char *crp)
1566 afs_ucred_t *svcred = curthread->t_cred;
1567 curthread->t_cred = (afs_ucred_t *)crp;
1569 afs_nfs3_dispatcher(1, ACLPROC3_GETXATTRDIR, (char *)args, &exp, rp, crp);
1571 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1573 (*afs_acl3_disp_tbl[ACLPROC3_GETXATTRDIR].orig_proc) (args, xp, exp, rp,
1575 curthread->t_cred = svcred;
1580 struct afs_nfs_disp_tbl afs_acl3_disp_tbl[ACL3_NPROC] = {
1584 #if defined(AFS_SUN510_ENV)
1585 {afs_acl3_getxattrdir},
1589 /* Munge the dispatch tables to link us in first */
1591 afs_xlatorinit_v3(struct rfs_disp_tbl *_rfs_tbl,
1592 struct rfs_disp_tbl *_acl_tbl)
1596 if (xlatorinit_v3_done++)
1599 for (i = 0; i < 22; i++) {
1600 afs_rfs3_disp_tbl[i].orig_proc = _rfs_tbl[i].dis_proc;
1601 _rfs_tbl[i].dis_proc = afs_rfs3_disp_tbl[i].afs_proc;
1604 for (i = 0; i < 3; i++) {
1605 afs_acl3_disp_tbl[i].orig_proc = _acl_tbl[i].dis_proc;
1606 _acl_tbl[i].dis_proc = afs_acl3_disp_tbl[i].afs_proc;
1609 #endif /* !defined(AFS_NONFSTRANS) */