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 HPUX
13 #include "../afs/param.h" /* Should be always first */
14 #include <afsconfig.h>
18 #include "../afs/sysincludes.h" /* Standard vendor system headers */
19 #include "../afs/afsincludes.h" /* Afs-based standard headers */
20 #include "../afs/afs_stats.h" /* statistics stuff */
21 #include <sys/scall_kernprivate.h>
24 static char afs_mountpath[512];
25 struct vfs *afs_globalVFS = 0;
26 struct vcache *afs_globalVp = 0;
28 int afs_mount(struct vfs *afsp, char *path, smountargs_t *data)
31 AFS_STATCNT(afs_mount);
33 if (afs_globalVFS) { /* Don't allow remounts. */
35 return (setuerror(EBUSY));
39 afsp->vfs_bsize = 8192;
40 afsp->vfs_fsid[0] = AFS_VFSMAGIC; /* magic */
41 afsp->vfs_fsid[1] = AFS_VFSFSID;
42 strcpy(afsp->vfs_name, "AFS");
43 afsp->vfs_name[3] = '\0';
45 strncpy(afs_mountpath, path, sizeof(afs_mountpath));
46 afs_mountpath[sizeof afs_mountpath - 1] = '\0';
48 #ifndef AFS_NONFSTRANS
49 /* Set up the xlator in case it wasn't done elsewhere */
58 int afs_unmount(struct vfs *afsp)
61 AFS_STATCNT(afs_unmount);
70 int afs_root (struct vfs *afsp, struct vnode **avpp, char *unused1)
74 register struct vcache *tvp=0;
76 AFS_STATCNT(afs_root);
78 if (afs_globalVp && (afs_globalVp->states & CStatd)) {
81 if (!(code = afs_InitReq(&treq, p_cred(u.u_procp))) &&
82 !(code = afs_CheckInit())) {
83 tvp = afs_GetVCache(&afs_rootFid, &treq, (afs_int32 *)0,
84 (struct vcache*)0, WRITE_LOCK);
85 /* we really want this to stay around */
93 VN_HOLD((struct vnode *)tvp);
94 SET_V_FLAG( ((struct vnode *)tvp), VROOT);
97 *avpp = (struct vnode *) tvp;
100 afs_Trace2(afs_iclSetp, CM_TRACE_VFSROOT, ICL_TYPE_POINTER, *avpp,
101 ICL_TYPE_INT32, code);
107 int afs_statfs(register struct vfs *afsp, struct k_statvfs *abp)
110 AFS_STATCNT(afs_statfs);
113 abp->f_frsize = 1024;
114 abp->f_bsize = afsp->vfs_bsize;
115 /* Fake a high number below to satisfy programs that use the statfs
116 * call to make sure that there's enough space in the device partition
117 * before storing something there.
119 abp->f_blocks = abp->f_bfree = abp->f_bavail = abp->f_files =
120 abp->f_ffree = abp->f_favail = 9000000;
121 abp->f_fsid = (AFS_VFSMAGIC << 16) || AFS_VFSFSID;
127 int afs_sync(struct vfs *unused1, int unused2)
129 AFS_STATCNT(afs_sync);
133 int afs_vget(struct vfs *afsp, struct vnode **avcp, struct fid *fidp)
136 struct vrequest treq;
138 AFS_STATCNT(afs_vget);
142 if ((code = afs_InitReq(&treq, p_cred(u.u_procp)))==0) {
143 code = afs_osi_vget((struct vcache**)avcp, fidp, &treq);
146 afs_Trace3(afs_iclSetp, CM_TRACE_VGET, ICL_TYPE_POINTER, *avcp,
147 ICL_TYPE_INT32, treq.uid, ICL_TYPE_FID, fidp);
148 code = afs_CheckCode(code, &treq, 42);
154 int afs_getmount(struct vfs *vfsp, char *fsmntdir, struct mount_data *mdp, char *unused1)
161 return(copyoutstr(afs_mountpath, fsmntdir, strlen(afs_mountpath)+1, &l));
165 struct vfsops Afs_vfsops = {
173 (vfs_freeze_t *)0, /* vfs_freeze */
174 (vfs_thaw_t *)0, /* vfs_thaw */
175 (vfs_quota_t *)0, /* vfs_quota */
176 (vfs_mountroot_t *)0, /* vfs_mountroot. Note: afs_mountroot_nullop in this
177 * position panicked HP 11.00+
179 (vfs_size_t *)0 /* vfs_size */
182 static int afs_Starting = 0;
185 sema_t afs_global_sema = {
186 NULL, 0, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, /* sa_type */
187 0, 0, 0, 0, 0, 0, 0, NULL, /* sa_link */
197 register ulong_t context;
199 SPINLOCK_USAV(sched_lock, context);
200 if ( !afs_Starting ) {
202 SPINUNLOCK_USAV(sched_lock, context);
203 initsema(&afs_global_sema, 1, FILESYS_SEMA_PRI, FILESYS_SEMA_ORDER);
204 afsHash(64); /* 64 buckets */
206 SPINUNLOCK_USAV(sched_lock, context);
209 osi_Panic("osi_Init lost initialization race");
214 * afsc_link - Initialize VFS
221 extern int Afs_syscall(), afs_xioctl(), Afs_xsetgroups();
223 /* For now nothing special is required during AFS initialization. */
224 AFS_STATCNT(afsc_link);
226 if ( (afs_vfs_slot=add_vfs_type("afs", &Afs_vfsops)) < 0 )
228 sysent_assign_function(AFS_SYSCALL, 7, (void (*)())Afs_syscall, "Afs_syscall");
229 sysent_define_arg(AFS_SYSCALL, 0, longArg);
230 sysent_define_arg(AFS_SYSCALL, 1, longArg);
231 sysent_define_arg(AFS_SYSCALL, 2, longArg);
232 sysent_define_arg(AFS_SYSCALL, 3, longArg);
233 sysent_define_arg(AFS_SYSCALL, 4, longArg);
234 sysent_define_arg(AFS_SYSCALL, 5, longArg);
235 sysent_define_arg(AFS_SYSCALL, 6, longArg);
236 sysent_returns_long(AFS_SYSCALL);
239 sysent_assign_function(80, 2, (void (*)())Afs_xsetgroups, "setgroups");
240 sysent_define_arg(80, 0, longArg);
241 sysent_define_arg(80, 1, longArg);
242 sysent_returns_long(80);