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 #include <ufs/ufs/extattr.h>
28 #include <ufs/ufs/ufsmount.h>
31 getinode(fs
, dev
, inode
, ipp
, perror
)
51 mtx_lock(&mountlist_mtx
);
52 if ((mp
= TAILQ_FIRST(&mountlist
)) != NULL
)
55 * XXX Also do the test for MFS
59 if (!strcmp(mp
->mnt_stat
.f_fstypename
, MOUNT_UFS
)) {
61 if (ump
->um_fs
== NULL
)
63 if (ump
->um_dev
== dev
) {
67 mp
= TAILQ_NEXT(mp
, mnt_list
);
68 } while (mp
!= TAILQ_FIRST(&mountlist
));
69 mtx_unlock(&mountlist_mtx
);
73 code
= VFS_VGET(fs
, inode
, 0, &vp
);
84 igetinode(vfsp
, dev
, inode
, ipp
, perror
)
100 AFS_STATCNT(igetinode
);
102 if ((code
= getinode(vfsp
, dev
, inode
, &ip
, perror
)) != 0) {
106 if (ip
->i_mode
== 0) {
107 /* Not an allocated inode */
112 if (ip
->i_nlink
== 0 || (ip
->i_mode
& IFMT
) != IFREG
) {
123 * icreate system call -- create an inode
125 afs_syscall_icreate(dev
, near_inode
, param1
, param2
, param3
, param4
, retval
)
127 long dev
, near_inode
, param1
, param2
, param3
, param4
;
130 struct inode
*ip
, *newip
;
134 AFS_STATCNT(afs_syscall_icreate
);
136 if (!afs_suser(NULL
))
139 code
= getinode(0, (dev_t
) dev
, 2, &ip
, &dummy
);
143 code
= ialloc(ip
, (ino_t
) near_inode
, 0, &newip
);
149 newip
->i_flag
|= IACC
| IUPD
| ICHG
;
153 newip
->i_mode
= IFREG
;
162 * if ( !vp->v_object)
164 * extern struct vfs_ubcops ufs_ubcops;
165 * extern struct vm_ubc_object* ubc_object_allocate();
166 * struct vm_ubc_object* vop;
167 * vop = ubc_object_allocate(&vp, &ufs_ubcops,
168 * vp->v_mount->m_funnel);
170 * vp->v_object = vop;
176 /* newip->i_flags |= IC_XUID|IC_XGID; */
177 /* newip->i_flags &= ~IC_PROPLIST; */
178 newip
->i_vicep1
= param1
;
179 if (param2
== 0x1fffffff /*INODESPECIAL*/) {
180 newip
->i_vicep2
= ((0x1fffffff << 3) + (param4
& 0x3));
181 newip
->i_vicep3a
= (u_short
) (param3
>> 16);
182 newip
->i_vicep3b
= (u_short
) param3
;
185 (((param2
>> 16) & 0x1f) << 27) +
186 (((param4
>> 16) & 0x1f) << 22) + (param3
& 0x3fffff);
187 newip
->i_vicep3a
= (u_short
) param4
;
188 newip
->i_vicep3b
= (u_short
) param2
;
190 newip
->i_vicemagic
= VICEMAGIC
;
192 *retval
= newip
->i_number
;
200 afs_syscall_iopen(dev
, inode
, usrmod
, retval
)
202 int dev
, inode
, usrmod
;
206 struct vnode
*vp
= NULL
;
209 extern struct fileops vnops
;
212 AFS_STATCNT(afs_syscall_iopen
);
214 if (!afs_suser(NULL
))
217 code
= igetinode(0, (dev_t
) dev
, (ino_t
) inode
, &ip
, &dummy
);
221 if ((code
= falloc(curproc
, &fp
, &fd
)) != 0) {
227 /* FreeBSD doesn't do much mp stuff yet :( */
229 fp
->f_flag
= (usrmod
) & FMASK
;
230 fp
->f_type
= DTYPE_VNODE
;
232 fp
->f_data
= (caddr_t
) ITOV(ip
);
240 * Support for iinc() and idec() system calls--increment or decrement
242 * Restricted to super user.
243 * Only VICEMAGIC type inodes.
246 afs_syscall_iincdec(dev
, inode
, inode_p1
, amount
)
247 int dev
, inode
, inode_p1
, amount
;
253 if (!afs_suser(NULL
))
256 code
= igetinode(0, (dev_t
) dev
, (ino_t
) inode
, &ip
, &dummy
);
260 if (!IS_VICEMAGIC(ip
)) {
262 } else if (ip
->i_vicep1
!= inode_p1
) {
265 ip
->i_nlink
+= amount
;
266 if (ip
->i_nlink
== 0) {
275 afs_syscall_icreate(dev
, near_inode
, param1
, param2
, param3
, param4
, retval
)
277 long dev
, near_inode
, param1
, param2
, param3
, param4
;
283 afs_syscall_iopen(dev
, inode
, usrmod
, retval
)
285 int dev
, inode
, usrmod
;
291 afs_syscall_iincdec(dev
, inode
, inode_p1
, amount
)
292 int dev
, inode
, inode_p1
, amount
;