1 /* Copyright (C) 1995, 1998 Transarc Corporation - All rights reserved. */
3 * (C) COPYRIGHT IBM CORPORATION 1987, 1988
4 * LICENSED MATERIALS - PROPERTY OF IBM
9 #include "../afs/param.h" /* Should be always first */
10 #include "../afs/sysincludes.h" /* Standard vendor system headers */
11 #include "../afs/afsincludes.h" /* Afs-based standard headers */
12 #include "../afs/afs_stats.h" /* statistics stuff */
15 #ifdef AFS_AIX_IAUTH_ENV
16 #include "../afs/nfsclient.h"
17 #include "../afs/exporter.h"
18 extern struct afs_exporter *afs_nfsexporter;
21 #define AFS_VFSLOCK_DECL register int glockOwner = ISAFS_GLOCK()
22 #define AFS_VFSLOCK() if (!glockOwner) AFS_GLOCK()
23 #define AFS_VFSUNLOCK() if (!glockOwner) AFS_GUNLOCK()
25 struct vfs *afs_globalVFS = 0;
26 struct vcache *afs_globalVp = 0;
29 static int afs_root_nolock (struct vfs *afsp, struct vnode **avpp);
31 static int afs_mount(afsp, path, data)
36 struct vnode *afsrootvp = NULL;
40 AFS_STATCNT(afs_mount);
43 /* Don't allow remounts since some system (like AIX) don't handle
47 return (setuerror(EBUSY));
52 afsp->vfs_bsize = 8192;
54 afsp->vfs_fsid.val[0] = AFS_VFSMAGIC; /* magic */
55 afsp->vfs_fsid.val[1] = AFS_VFSFSID;
57 /* For AFS, we don't allow file over file mounts. */
58 if (afsp->vfs_mntdover->v_type != VDIR)
60 /* try to get the root vnode, but don't worry if you don't. The actual
61 * setting of the root vnode (vfs_mntd) is done in afs_root, so that it
62 * get re-eval'd at the right time if things aren't working when we
63 * first try the mount.
65 afs_root_nolock(afsp, &afsrootvp);
67 afsp->vfs_mntdover->v_mvfsp = afsp;
68 afsp->vfs_mdata->vmt_flags |= MNT_REMOTE;
70 #ifdef AFS_AIX_IAUTH_ENV
71 if (afs_iauth_register()<0)
72 afs_warn("Can't register AFS iauth interface.\n");
78 static int afs_unmount (struct vfs *afsp, int flag)
82 AFS_STATCNT(afs_unmount);
91 static int afs_root_nolock (struct vfs *afsp, struct vnode **avpp)
93 register afs_int32 code = 0;
95 register struct vcache *tvp=0;
97 AFS_STATCNT(afs_root);
98 if (afs_globalVp && (afs_globalVp->states & CStatd)) {
103 if (!(code = afs_InitReq(&treq, credp)) &&
104 !(code = afs_CheckInit())) {
105 tvp = afs_GetVCache(&afs_rootFid, &treq, (afs_int32 *)0,
106 (struct vcache*)0, WRITE_LOCK);
107 /* we really want this to stay around */
116 VN_HOLD((struct vnode *)tvp);
118 VN_LOCK((struct vnode *)tvp);
119 tvp->v.v_flag |= VROOT; /* No-op on Ultrix 2.2 */
120 VN_UNLOCK((struct vnode *)tvp);
122 afs_globalVFS = afsp;
123 *avpp = (struct vnode *) tvp;
124 afsp->vfs_mntd = *avpp;
127 afs_Trace2(afs_iclSetp, CM_TRACE_VFSROOT, ICL_TYPE_POINTER, *avpp,
128 ICL_TYPE_INT32, code);
133 static int afs_root (struct vfs *afsp, struct vnode **avpp)
138 code = afs_root_nolock(afsp, avpp);
143 static int afs_statfs(struct vfs *afsp, struct statfs *abp,
148 AFS_STATCNT(afs_statfs);
152 abp->f_bsize = afsp->vfs_bsize;
153 abp->f_blocks = abp->f_bfree = abp->f_bavail = abp->f_files =
154 abp->f_ffree = 9000000;
155 abp->f_vfstype = AFS_VFSFSID;
156 abp->f_vfsnumber = afsp->vfs_number;
157 abp->f_vfsoff = abp->f_vfslen = abp->f_vfsvers = -1;
158 abp->f_fsize = 4096; /* fundamental filesystem block size */
159 abp->f_fsid = afsp->vfs_fsid;
160 (void) strcpy(abp->f_fname, "/afs");
161 (void) strcpy(abp->f_fpack, "AFS");
162 abp->f_name_max = 256;
168 static int afs_sync()
172 AFS_STATCNT(afs_sync);
179 /* Note that the cred is only for AIX 4.1.5+ and AIX 4.2+ */
180 static int afs_vget(struct vfs *vfsp, struct vnode **avcp, struct fileid *fidp,
184 struct vrequest treq;
187 AFS_STATCNT(afs_vget);
190 #ifdef AFS_AIX_IAUTH_ENV
191 /* If the exporter is off and this is an nfsd, fail immediately. */
192 if (AFS_NFSXLATORREQ(credp)
193 && !(afs_nfsexporter->exp_states & EXP_EXPORTED)) {
198 if ((code = afs_InitReq(&treq, credp))==0) {
199 code = afs_osi_vget((struct vcache**)avcp, fidp, &treq);
202 afs_Trace3(afs_iclSetp, CM_TRACE_VGET, ICL_TYPE_POINTER, *avcp,
203 ICL_TYPE_INT32, treq.uid, ICL_TYPE_FID, fidp);
204 code = afs_CheckCode(code, &treq, 42);
210 static int afs_badop()
216 struct vfsops Afs_vfsops = {
223 afs_badop, /* vfs_cntl */
224 afs_badop /* vfs_quotactl */
228 * VFS is initialized in osi_config.c