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 * FreeBSD inode operations
16 #include <afsconfig.h>
17 #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 <sys/queue.h>
27 #include <ufs/ufsmount.h>
28 #include <ufs/ufs/dinode.h>
30 getinode(fs, dev, inode, ipp, perror)
43 register struct ufsmount *ump;
44 register struct mount *mp;
46 simple_lock(&mountlist_slock);
47 if (mp = TAILQ_FIRST(&mountlist)) do {
49 * XXX Also do the test for MFS
53 if (mp->mnt_stat.f_type == MOUNT_UFS) {
55 if (ump->um_fs == NULL)
57 if (ump->um_dev == dev) {
61 mp = TAILQ_NEXT(mp, mnt_list);
62 } while (mp != TAILQ_FIRST(&mountlist));
63 simple_unlock(&mountlist_slock);
67 code = VFS_VGET(fs,inode, &vp);
77 igetinode(vfsp, dev, inode, ipp, perror)
84 struct inode *pip, *ip;
85 extern struct osi_dev cacheDev;
86 register int code = 0;
90 AFS_STATCNT(igetinode);
92 if ((code = getinode(vfsp, dev, inode, &ip, perror)) != 0) {
96 if (ip->i_mode == 0) {
97 /* Not an allocated inode */
102 if (ip->i_nlink == 0 || (ip->i_mode&IFMT) != IFREG) {
113 * icreate system call -- create an inode
115 afs_syscall_icreate(dev, near_inode, param1, param2, param3, param4, retval)
117 long dev, near_inode, param1, param2, param3, param4;
120 struct inode *ip, *newip;
124 AFS_STATCNT(afs_syscall_icreate);
129 code = getinode(0, (dev_t)dev, 2, &ip, &dummy);
133 code = ialloc(ip, (ino_t)near_inode, 0, &newip);
139 newip->i_flag |= IACC|IUPD|ICHG;
143 newip->i_mode = IFREG;
154 extern struct vfs_ubcops ufs_ubcops;
155 extern struct vm_ubc_object* ubc_object_allocate();
156 struct vm_ubc_object* vop;
157 vop = ubc_object_allocate(&vp, &ufs_ubcops,
158 vp->v_mount->m_funnel);
166 /* newip->i_flags |= IC_XUID|IC_XGID; */
167 /* newip->i_flags &= ~IC_PROPLIST; */
168 newip->i_vicep1 = param1;
169 if (param2 == 0x1fffffff/*INODESPECIAL*/) {
170 newip->i_vicep2 = ((0x1fffffff << 3) + (param4 & 0x3));
171 newip->i_vicep3a = (u_short)(param3 >> 16);
172 newip->i_vicep3b = (u_short)param3;
174 newip->i_vicep2 = (((param2 >> 16) & 0x1f) << 27) +
175 (((param4 >> 16) & 0x1f) << 22) +
177 newip->i_vicep3a = (u_short)param4;
178 newip->i_vicep3b = (u_short)param2;
180 newip->i_vicemagic = VICEMAGIC;
182 *retval = newip->i_number;
189 afs_syscall_iopen(dev, inode, usrmod, retval)
191 int dev, inode, usrmod;
195 struct vnode *vp = NULL;
198 extern struct fileops vnops;
201 AFS_STATCNT(afs_syscall_iopen);
206 code = igetinode(0, (dev_t)dev, (ino_t)inode, &ip, &dummy);
210 if ((code = falloc(curproc, &fp, &fd)) != 0) {
216 /* FreeBSD doesn't do much mp stuff yet :( */
218 fp->f_flag = (usrmod) & FMASK;
219 fp->f_type = DTYPE_VNODE;
221 fp->f_data = (caddr_t)ITOV(ip);
229 * Support for iinc() and idec() system calls--increment or decrement
231 * Restricted to super user.
232 * Only VICEMAGIC type inodes.
234 afs_syscall_iincdec(dev, inode, inode_p1, amount)
235 int dev, inode, inode_p1, amount;
244 code = igetinode(0, (dev_t)dev, (ino_t)inode, &ip, &dummy);
248 if (!IS_VICEMAGIC(ip)) {
250 } else if (ip->i_vicep1 != inode_p1) {
253 ip->i_nlink += amount;
254 if (ip->i_nlink == 0) {
262 afs_syscall_icreate(dev, near_inode, param1, param2, param3, param4, retval)
264 long dev, near_inode, param1, param2, param3, param4;
268 afs_syscall_iopen(dev, inode, usrmod, retval)
270 int dev, inode, usrmod;
274 afs_syscall_iincdec(dev, inode, inode_p1, amount)
275 int dev, inode, inode_p1, amount;