2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
11 * osi_vfsops.c for AIX
13 #include <afsconfig.h>
14 #include "afs/param.h"
17 #include "afs/sysincludes.h" /* Standard vendor system headers */
18 #include "afsincludes.h" /* Afs-based standard headers */
19 #include "afs/afs_stats.h" /* statistics stuff */
22 #ifdef AFS_AIX_IAUTH_ENV
23 #include "afs/nfsclient.h"
24 #include "afs/exporter.h"
25 extern struct afs_exporter *afs_nfsexporter;
28 #define AFS_VFSLOCK_DECL register int glockOwner = ISAFS_GLOCK()
29 #define AFS_VFSLOCK() if (!glockOwner) AFS_GLOCK()
30 #define AFS_VFSUNLOCK() if (!glockOwner) AFS_GUNLOCK()
32 struct vfs *afs_globalVFS = 0;
33 struct vcache *afs_globalVp = 0;
35 static int afs_root_nolock(struct vfs *afsp, struct vnode **avpp);
38 afs_mount(afsp, path, data)
43 struct vnode *afsrootvp = NULL;
47 AFS_STATCNT(afs_mount);
50 /* Don't allow remounts since some system (like AIX) don't handle
54 return (setuerror(EBUSY));
59 afsp->vfs_bsize = 8192;
61 #ifdef AFS_64BIT_CLIENT
62 afsp->vfs_flag |= VFS_DEVMOUNT;
63 #endif /* AFS_64BIT_CLIENT */
65 afsp->vfs_fsid.val[0] = AFS_VFSMAGIC; /* magic */
66 afsp->vfs_fsid.val[1] = AFS_VFSFSID;
68 /* For AFS, we don't allow file over file mounts. */
69 if (afsp->vfs_mntdover->v_type != VDIR)
71 /* try to get the root vnode, but don't worry if you don't. The actual
72 * setting of the root vnode (vfs_mntd) is done in afs_root, so that it
73 * get re-eval'd at the right time if things aren't working when we
74 * first try the mount.
76 afs_root_nolock(afsp, &afsrootvp);
78 afsp->vfs_mntdover->v_mvfsp = afsp;
79 afsp->vfs_mdata->vmt_flags |= MNT_REMOTE;
83 afsp->vfs_mntd->v_count = 1;
85 #ifdef AFS_AIX_IAUTH_ENV
86 if (afs_iauth_register() < 0)
87 afs_warn("Can't register AFS iauth interface.\n");
94 afs_unmount(struct vfs *afsp, int flag)
98 AFS_STATCNT(afs_unmount);
101 afs_cold_shutdown = 1;
109 afs_root_nolock(struct vfs *afsp, struct vnode **avpp)
111 register afs_int32 code = 0;
112 struct vrequest treq;
113 register struct vcache *tvp = 0;
115 AFS_STATCNT(afs_root);
116 if (afs_globalVp && (afs_globalVp->f.states & CStatd)) {
121 afs_PutVCache(afs_globalVp);
125 if (!(code = afs_InitReq(&treq, credp)) && !(code = afs_CheckInit())) {
126 tvp = afs_GetVCache(&afs_rootFid, &treq, NULL, NULL);
127 /* we really want this to stay around */
136 VN_HOLD(AFSTOV(tvp));
138 VN_LOCK(AFSTOV(tvp));
139 AFSTOV(tvp)->v_flag |= VROOT; /* No-op on Ultrix 2.2 */
140 VN_UNLOCK(AFSTOV(tvp));
142 afs_globalVFS = afsp;
144 afsp->vfs_mntd = *avpp;
147 afs_Trace2(afs_iclSetp, CM_TRACE_VFSROOT, ICL_TYPE_POINTER, *avpp,
148 ICL_TYPE_INT32, code);
154 afs_root(struct vfs *afsp, struct vnode **avpp)
159 code = afs_root_nolock(afsp, avpp);
165 afs_statfs(struct vfs *afsp, struct statfs *abp, struct ucred *credp)
169 AFS_STATCNT(afs_statfs);
173 abp->f_bsize = afsp->vfs_bsize;
174 abp->f_blocks = abp->f_bfree = abp->f_bavail = abp->f_files =
175 abp->f_ffree = 9000000;
176 abp->f_vfstype = AFS_VFSFSID;
177 abp->f_vfsnumber = afsp->vfs_number;
178 abp->f_vfsoff = abp->f_vfslen = abp->f_vfsvers = -1;
179 abp->f_fsize = 4096; /* fundamental filesystem block size */
180 abp->f_fsid = afsp->vfs_fsid;
181 (void)strcpy(abp->f_fname, "/afs");
182 (void)strcpy(abp->f_fpack, "AFS");
183 abp->f_name_max = 256;
194 AFS_STATCNT(afs_sync);
201 /* Note that the cred is only for AIX 4.1.5+ and AIX 4.2+ */
203 afs_vget(struct vfs *vfsp, struct vnode **avcp, struct fileid *fidp,
207 struct vrequest treq;
210 AFS_STATCNT(afs_vget);
213 #ifdef AFS_AIX_IAUTH_ENV
214 /* If the exporter is off and this is an nfsd, fail immediately. */
215 if (AFS_NFSXLATORREQ(credp)
216 && !(afs_nfsexporter->exp_states & EXP_EXPORTED)) {
221 if ((code = afs_InitReq(&treq, credp)) == 0) {
222 code = afs_osi_vget((struct vcache **)avcp, fidp, &treq);
225 afs_Trace3(afs_iclSetp, CM_TRACE_VGET, ICL_TYPE_POINTER, *avcp,
226 ICL_TYPE_INT32, treq.uid, ICL_TYPE_FID, fidp);
227 code = afs_CheckCode(code, &treq, 42);
240 struct vfsops Afs_vfsops = {
247 afs_badop, /* vfs_cntl */
248 afs_badop /* vfs_quotactl */
250 , afs_badop /* vfs_syncvfs */
255 * VFS is initialized in osi_config.c