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"
20 #include "afs/sysincludes.h" /* Standard vendor system headers */
21 #include "afsincludes.h" /* Afs-based standard headers */
22 #include "afs/osi_inode.h"
23 #include "afs/afs_stats.h" /* statistics stuff */
24 #include <sys/queue.h>
26 #include <ufs/ufs/dinode.h>
27 #if defined(AFS_FBSD50_ENV)
28 #include <ufs/ufs/extattr.h>
30 #include <ufs/ufsmount.h>
33 getinode(fs, dev, inode, ipp, perror)
50 register struct ufsmount *ump;
51 register struct mount *mp;
53 #if defined(AFS_FBSD50_ENV)
54 mtx_lock(&mountlist_mtx);
56 simple_lock(&mountlist_slock);
58 if ((mp = TAILQ_FIRST(&mountlist)) != NULL)
61 * XXX Also do the test for MFS
65 if (!strcmp(mp->mnt_stat.f_fstypename, MOUNT_UFS)) {
67 if (ump->um_fs == NULL)
69 if (ump->um_dev == dev) {
73 mp = TAILQ_NEXT(mp, mnt_list);
74 } while (mp != TAILQ_FIRST(&mountlist));
75 #if defined(AFS_FBSD50_ENV)
76 mtx_unlock(&mountlist_mtx);
78 simple_unlock(&mountlist_slock);
83 #if defined(AFS_FBSD50_ENV)
84 code = VFS_VGET(fs, inode, 0, &vp);
86 code = VFS_VGET(fs, inode, &vp);
98 igetinode(vfsp, dev, inode, ipp, perror)
101 #ifdef AFS_FBSD53_ENV
110 register int code = 0;
114 AFS_STATCNT(igetinode);
116 if ((code = getinode(vfsp, dev, inode, &ip, perror)) != 0) {
120 if (ip->i_mode == 0) {
121 /* Not an allocated inode */
126 if (ip->i_nlink == 0 || (ip->i_mode & IFMT) != IFREG) {
137 * icreate system call -- create an inode
139 afs_syscall_icreate(dev, near_inode, param1, param2, param3, param4, retval)
141 long dev, near_inode, param1, param2, param3, param4;
144 struct inode *ip, *newip;
148 AFS_STATCNT(afs_syscall_icreate);
150 if (!afs_suser(NULL))
153 code = getinode(0, (dev_t) dev, 2, &ip, &dummy);
157 code = ialloc(ip, (ino_t) near_inode, 0, &newip);
163 newip->i_flag |= IACC | IUPD | ICHG;
167 newip->i_mode = IFREG;
176 * if ( !vp->v_object)
178 * extern struct vfs_ubcops ufs_ubcops;
179 * extern struct vm_ubc_object* ubc_object_allocate();
180 * struct vm_ubc_object* vop;
181 * vop = ubc_object_allocate(&vp, &ufs_ubcops,
182 * vp->v_mount->m_funnel);
184 * vp->v_object = vop;
190 /* newip->i_flags |= IC_XUID|IC_XGID; */
191 /* newip->i_flags &= ~IC_PROPLIST; */
192 newip->i_vicep1 = param1;
193 if (param2 == 0x1fffffff /*INODESPECIAL*/) {
194 newip->i_vicep2 = ((0x1fffffff << 3) + (param4 & 0x3));
195 newip->i_vicep3a = (u_short) (param3 >> 16);
196 newip->i_vicep3b = (u_short) param3;
199 (((param2 >> 16) & 0x1f) << 27) +
200 (((param4 >> 16) & 0x1f) << 22) + (param3 & 0x3fffff);
201 newip->i_vicep3a = (u_short) param4;
202 newip->i_vicep3b = (u_short) param2;
204 newip->i_vicemagic = VICEMAGIC;
206 *retval = newip->i_number;
214 afs_syscall_iopen(dev, inode, usrmod, retval)
216 int dev, inode, usrmod;
220 struct vnode *vp = NULL;
223 extern struct fileops vnops;
226 AFS_STATCNT(afs_syscall_iopen);
228 if (!afs_suser(NULL))
231 code = igetinode(0, (dev_t) dev, (ino_t) inode, &ip, &dummy);
235 if ((code = falloc(curproc, &fp, &fd)) != 0) {
241 /* FreeBSD doesn't do much mp stuff yet :( */
243 fp->f_flag = (usrmod) & FMASK;
244 fp->f_type = DTYPE_VNODE;
246 fp->f_data = (caddr_t) ITOV(ip);
254 * Support for iinc() and idec() system calls--increment or decrement
256 * Restricted to super user.
257 * Only VICEMAGIC type inodes.
260 afs_syscall_iincdec(dev, inode, inode_p1, amount)
261 int dev, inode, inode_p1, amount;
267 if (!afs_suser(NULL))
270 code = igetinode(0, (dev_t) dev, (ino_t) inode, &ip, &dummy);
274 if (!IS_VICEMAGIC(ip)) {
276 } else if (ip->i_vicep1 != inode_p1) {
279 ip->i_nlink += amount;
280 if (ip->i_nlink == 0) {
289 afs_syscall_icreate(dev, near_inode, param1, param2, param3, param4, retval)
291 long dev, near_inode, param1, param2, param3, param4;
297 afs_syscall_iopen(dev, inode, usrmod, retval)
299 int dev, inode, usrmod;
305 afs_syscall_iincdec(dev, inode, inode_p1, amount)
306 int dev, inode, inode_p1, amount;