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
10 * MACOS inode operations
15 #include <afsconfig.h>
16 #include "afs/param.h"
21 #include "afs/sysincludes.h" /* Standard vendor system headers */
22 #include "afsincludes.h" /* Afs-based standard headers */
23 #include "afs/osi_inode.h"
24 #include "afs/afs_stats.h" /* statistics stuff */
25 #include <ufs/ufs/ufsmount.h>
26 extern struct ucred afs_osi_cred;
28 getinode(fs, dev, inode, vpp, perror)
41 register struct ufsmount *ump;
43 register struct hfsmount *hmp;
45 register struct vnode *vp;
46 register struct mount *mp;
47 extern struct mount *rootfs;
51 * XXX Also do the test for MFS
53 if (!strcmp(mp->mnt_vfc->vfc_name, "ufs")) {
55 if (ump->um_fs == NULL)
57 if (ump->um_dev == dev) {
62 if (!strcmp(mp->mnt_vfc->vfc_name, "hfs")) {
65 if (hmp->hfs_mp == NULL)
68 if (hmp->hfs_raw_dev == dev) {
74 mp = CIRCLEQ_NEXT(mp, mnt_list);
75 } while (mp != rootfs);
79 code = VFS_VGET(fs, (void *)inode, &vp);
88 extern int afs_CacheFSType;
89 igetinode(vfsp, dev, inode, vpp, va, perror)
97 struct vnode *pvp, *vp;
98 extern struct osi_dev cacheDev;
99 register int code = 0;
103 AFS_STATCNT(igetinode);
104 if ((code = getinode(vfsp, dev, inode, &vp, perror)) != 0) {
107 if (vp->v_type != VREG && vp->v_type != VDIR && vp->v_type != VLNK) {
108 printf("igetinode: bad type %d\n", vp->v_type);
112 VOP_GETATTR(vp, va, &afs_osi_cred, current_proc());
113 if (va->va_mode == 0) {
114 /* Not an allocated inode */
118 if (vfsp && afs_CacheFSType == AFS_APPL_HFS_CACHE && va->va_nlink == 0) {
119 printf("igetinode: hfs nlink 0\n");
121 if (va->va_nlink == 0) {
126 VOP_UNLOCK(vp, 0, current_proc());
135 AFS_STATCNT(iforget);
136 /* XXX could sleep */
137 vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, current_proc());
138 /* this whole thing is too wierd. Why??? XXX */
139 if (vp->v_usecount == 1) {
141 VOP_UNLOCK(vp, 0, current_proc());
143 simple_lock(&vnode_free_list_slock);
144 TAILQ_INSERT_TAIL(&vnode_free_list, vp, v_freelist);
146 simple_unlock(&vnode_free_list_slock);
148 printf("iforget: leaking vnode\n");
157 * icreate system call -- create an inode
159 afs_syscall_icreate(dev, near_inode, param1, param2, param3, param4, retval)
161 long dev, near_inode, param1, param2, param3, param4;
164 struct inode *ip, *newip;
168 AFS_STATCNT(afs_syscall_icreate);
170 if (!afs_suser(NULL))
173 code = getinode(0, (dev_t) dev, 2, &ip, &dummy);
177 code = ialloc(ip, (ino_t) near_inode, 0, &newip);
183 newip->i_flag |= IACC | IUPD | ICHG;
187 newip->i_mode = IFREG;
196 extern struct vfs_ubcops ufs_ubcops;
197 extern struct vm_ubc_object *ubc_object_allocate();
198 struct vm_ubc_object *vop;
199 vop = ubc_object_allocate(&vp, &ufs_ubcops, vp->v_mount->m_funnel);
207 newip->i_flags |= IC_XUID | IC_XGID;
208 newip->i_flags &= ~IC_PROPLIST;
209 newip->i_vicep1 = param1;
210 if (param2 == 0x1fffffff /*INODESPECIAL*/) {
211 newip->i_vicep2 = ((0x1fffffff << 3) + (param4 & 0x3));
212 newip->i_vicep3a = (u_short) (param3 >> 16);
213 newip->i_vicep3b = (u_short) param3;
216 (((param2 >> 16) & 0x1f) << 27) +
217 (((param4 >> 16) & 0x1f) << 22) + (param3 & 0x3fffff);
218 newip->i_vicep3a = (u_short) param4;
219 newip->i_vicep3b = (u_short) param2;
221 newip->i_vicemagic = VICEMAGIC;
223 *retval = newip->i_number;
230 afs_syscall_iopen(dev, inode, usrmod, retval)
232 int dev, inode, usrmod;
236 struct vnode *vp = NULL;
239 extern struct fileops vnops;
242 AFS_STATCNT(afs_syscall_iopen);
244 if (!afs_suser(NULL))
247 code = igetinode(0, (dev_t) dev, (ino_t) inode, &ip, &dummy);
251 if ((code = falloc(&fp, &fd)) != 0) {
258 fp->f_flag = (usrmod - FOPEN) & FMASK;
259 fp->f_type = DTYPE_VNODE;
261 fp->f_data = (caddr_t) ITOV(ip);
264 U_FD_SET(fd, fp, &u.u_file_state);
271 * Support for iinc() and idec() system calls--increment or decrement
273 * Restricted to super user.
274 * Only VICEMAGIC type inodes.
276 afs_syscall_iincdec(dev, inode, inode_p1, amount)
277 int dev, inode, inode_p1, amount;
283 if (!afs_suser(NULL))
286 code = igetinode(0, (dev_t) dev, (ino_t) inode, &ip, &dummy);
290 if (!IS_VICEMAGIC(ip)) {
292 } else if (ip->i_vicep1 != inode_p1) {
295 ip->i_nlink += amount;
296 if (ip->i_nlink == 0) {
304 afs_syscall_icreate(dev, near_inode, param1, param2, param3, param4, retval)
306 long dev, near_inode, param1, param2, param3, param4;
311 afs_syscall_iopen(dev, inode, usrmod, retval)
313 int dev, inode, usrmod;
318 afs_syscall_iincdec(dev, inode, inode_p1, amount)
319 int dev, inode, inode_p1, amount;