2 * Copyright (c) 2000-2002 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
20 * @APPLE_LICENSE_HEADER_END@
22 /* Copyright (c) 1998, Apple Computer, Inc. All rights reserved. */
24 * Header file for synthfs data structures
28 * 17-Aug-1999 Pat Dirks New today.
35 #include <sys/appleapiopts.h>
37 #ifdef __APPLE_API_PRIVATE
38 #include <sys/param.h>
40 #include <sys/queue.h>
45 extern void Debugger(const char *message
); /* Private to pexpert... */
49 /* XXX Get rid of this as soon as sys/malloc.h can be updated to define a real M_SYNTHFS */
50 #define M_SYNTHFS M_TEMP
52 /* XXX Get rid of this as soon as sys/vnode.h can be updated to define a real VT_SYNTHFS */
53 #define VT_SYNTHFS (VT_OTHER+1)
56 struct synthfs_mntdata
58 struct mount
*synthfs_mp
; /* filesystem vfs structure */
59 struct vnode
*synthfs_rootvp
;
60 dev_t synthfs_mounteddev
;
61 unsigned long synthfs_nextid
;
62 unsigned long synthfs_filecount
;
63 unsigned long synthfs_dircount
;
64 unsigned long synthfs_encodingsused
;
65 LIST_HEAD(synthfs_fsvnodelist
, vnode
) synthfs_fsvnodes
;
69 * Various sorts of synthfs vnodes:
71 enum synthfsnodetype
{
72 SYNTHFS_DIRECTORY
= 1,
77 struct synthfs_dir_node
{
78 unsigned long d_entrycount
;
79 TAILQ_HEAD(synthfs_d_subnodelist
, synthfsnode
) d_subnodes
;
83 struct synthfs_file_node
{
87 struct synthfs_symlink_node
{
89 char *s_symlinktarget
; /* Dynamically allocated */
95 TAILQ_ENTRY(synthfsnode
) s_sibling
; /* synthfsnodes in a given directory */
96 enum synthfsnodetype s_type
;
97 struct synthfsnode
*s_parent
;
100 struct lock__bsd__ s_lock
;
101 unsigned long s_nodeflags
; /* Internal synthfs flags: IN_CHANGED, IN_MODIFIED, etc. */
102 unsigned long s_pflags
; /* File system flags: IMMUTABLE, etc. */
103 unsigned long s_nodeid
;
104 unsigned long s_generation
;
110 struct timeval s_createtime
;
111 struct timeval s_accesstime
;
112 struct timeval s_modificationtime
;
113 struct timeval s_changetime
;
114 struct timeval s_backuptime
;
115 unsigned long s_flags
; /* inode flags: IMMUTABLE, APPEND, etc. */
116 unsigned long s_script
;
117 unsigned long s_finderInfo
[8];
119 struct synthfs_dir_node d
;
120 struct synthfs_file_node f
;
121 struct synthfs_symlink_node s
;
126 #define FIRST_SYNTHFS_ID 0x10
128 /* These flags are kept in flags. */
129 #define IN_ACCESS 0x0001 /* Access time update request. */
130 #define IN_CHANGE 0x0002 /* Change time update request. */
131 #define IN_UPDATE 0x0004 /* Modification time update request. */
132 #define IN_MODIFIED 0x0008 /* Node has been modified. */
133 #define IN_RENAME 0x0010 /* Node is being renamed. */
134 //#define IN_SHLOCK 0x0020 /* File has shared lock. */
135 //#define IN_EXLOCK 0x0040 /* File has exclusive lock. */
136 //#define IN_ALLOCATING 0x1000 /* vnode is in transit, wait or ignore */
137 //#define IN_WANT 0x2000 /* Its being waited for */
139 #define SYNTHFSTIMES(sp, t1, t2) { \
140 if ((sp)->s_nodeflags & (IN_ACCESS | IN_CHANGE | IN_UPDATE)) { \
141 (sp)->s_nodeflags |= IN_MODIFIED; \
142 if ((sp)->s_nodeflags & IN_ACCESS) { \
143 (sp)->s_accesstime = *(t1); \
145 if ((sp)->s_nodeflags & IN_UPDATE) { \
146 (sp)->s_modificationtime = *(t2); \
148 if ((sp)->s_nodeflags & IN_CHANGE) { \
149 (sp)->s_changetime = time; \
151 (sp)->s_nodeflags &= ~(IN_ACCESS | IN_CHANGE | IN_UPDATE); \
155 #define ATTR_REF_DATA(attrrefptr) (((char *)(attrrefptr)) + ((attrrefptr)->attr_dataoffset))
157 #define STOV(SP) ((SP)->s_vp)
159 #define VTOS(VP) ((struct synthfsnode *)((VP)->v_data))
161 #define VTOVFS(VP) ((VP)->v_mount)
162 #define STOVFS(HP) ((SP)->s_vp->v_mount)
163 #define SFSTOVFS(SFSMP) ((SFSMP)->sfs_mp)
165 #define VTOSFS(VP) ((struct synthfs_mntdata *)((VP)->v_mount->mnt_data))
166 #define STOTFS(SP) ((struct synthfs_mntdata *)(SP)->s_vp->v_mount->mnt_data)
167 #define VFSTOSFS(MP) ((struct synthfs_mntdata *)(MP)->mnt_data)
170 #define DBG_TRACE(P) printf P;
171 #define DBG_INIT(P) printf P;
172 #define DBG_VOP(P) printf P;
173 //#define DBG_ASSERT(a) { if (!(a)) { panic("File "__FILE__", line %d: assertion '%s' failed.\n", __LINE__, #a); } }
174 #define DBG_ASSERT(a) { if (!(a)) { Debugger("Oops - File __FILE__ , line __LINE__: assertion '"#a"' failed."); } }
179 #define DBG_ASSERT(a)
182 extern int (**synthfs_vnodeop_p
)(void *);
185 int synthfs_mount
__P((struct mount
*, char *, caddr_t
, struct nameidata
*, struct proc
*));
186 int synthfs_start
__P((struct mount
*, int, struct proc
*));
187 int synthfs_unmount
__P((struct mount
*, int, struct proc
*));
188 int synthfs_root
__P((struct mount
*, struct vnode
**));
189 int synthfs_quotactl
__P((struct mount
*, int, uid_t
, caddr_t
, struct proc
*));
190 int synthfs_statfs
__P((struct mount
*, struct statfs
*, struct proc
*));
191 int synthfs_sync
__P((struct mount
*, int, struct ucred
*, struct proc
*));
192 int synthfs_vget
__P((struct mount
*, void *ino
, struct vnode
**));
193 int synthfs_fhtovp
__P((struct mount
*, struct fid
*, struct mbuf
*, struct vnode
**, int *, struct ucred
**));
194 int synthfs_vptofh
__P((struct vnode
*, struct fid
*));
195 int synthfs_init
__P((struct vfsconf
*));
196 int synthfs_sysctl
__P((int *, u_int
, void *, size_t *, void *, size_t, struct proc
*));
198 int synthfs_create
__P((struct vop_create_args
*));
199 int synthfs_open
__P((struct vop_open_args
*));
200 int synthfs_mmap
__P((struct vop_mmap_args
*));
201 int synthfs_access
__P((struct vop_access_args
*));
202 int synthfs_getattr
__P((struct vop_getattr_args
*));
203 int synthfs_setattr
__P((struct vop_setattr_args
*));
204 int synthfs_rename
__P((struct vop_rename_args
*));
205 int synthfs_select
__P((struct vop_select_args
*));
206 int synthfs_remove
__P((struct vop_remove_args
*));
207 int synthfs_mkdir
__P((struct vop_mkdir_args
*));
208 int synthfs_rmdir
__P((struct vop_rmdir_args
*));
209 int synthfs_symlink
__P((struct vop_symlink_args
*));
210 int synthfs_readlink
__P((struct vop_readlink_args
*));
211 int synthfs_readdir
__P((struct vop_readdir_args
*));
212 int synthfs_cached_lookup
__P((struct vop_cachedlookup_args
*));
213 int synthfs_lookup
__P((struct vop_cachedlookup_args
*));
214 int synthfs_pathconf
__P((struct vop_pathconf_args
*));
215 int synthfs_update
__P((struct vop_update_args
*));
217 int synthfs_lock
__P((struct vop_lock_args
*));
218 int synthfs_unlock
__P((struct vop_unlock_args
*));
219 int synthfs_islocked
__P((struct vop_islocked_args
*));
221 int synthfs_inactive
__P((struct vop_inactive_args
*));
222 int synthfs_reclaim
__P((struct vop_reclaim_args
*));
224 void synthfs_setupuio
__P((struct iovec
*iov
, struct uio
*uio
, void *buffer
, size_t bufsize
, enum uio_seg space
, enum uio_rw direction
, struct proc
*p
));
225 int synthfs_new_directory
__P((struct mount
*mp
, struct vnode
*dp
, const char *name
, unsigned long nodeid
, mode_t mode
, struct proc
*p
, struct vnode
**vpp
));
226 int synthfs_new_symlink
__P((struct mount
*mp
, struct vnode
*dp
, const char *name
, unsigned long nodeid
, char *targetstring
, struct proc
*p
, struct vnode
**vpp
));
227 long synthfs_adddirentry
__P((u_int32_t fileno
, u_int8_t type
, const char *name
, struct uio
*uio
));
228 int synthfs_remove_entry
__P((struct vnode
*vp
));
229 int synthfs_remove_directory
__P((struct vnode
*vp
));
230 int synthfs_remove_symlink
__P((struct vnode
*vp
));
231 int synthfs_move_rename_entry
__P((struct vnode
*source_vp
, struct vnode
*newparent_vp
, char *newname
));
232 int synthfs_derive_vnode_path
__P((struct vnode
*vp
, char *vnpath
, size_t pathbuffersize
));
234 #endif /* __APPLE_API_PRIVATE */
235 #endif /* __SYNTHFS_H__ */