|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
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.
11: *
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
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*
23: * Copyright 1997,1998 Julian Elischer. All rights reserved.
24: * [email protected]
25: *
26: * Redistribution and use in source and binary forms, with or without
27: * modification, are permitted provided that the following conditions are
28: * met:
29: * 1. Redistributions of source code must retain the above copyright
30: * notice, this list of conditions and the following disclaimer.
31: * 2. Redistributions in binary form must reproduce the above copyright notice,
32: * this list of conditions and the following disclaimer in the documentation
33: * and/or other materials provided with the distribution.
34: *
35: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ``AS IS'' AND ANY EXPRESS
36: * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
37: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
38: * DISCLAIMED. IN NO EVENT SHALL THE HOLDER OR CONTRIBUTORS BE LIABLE FOR
39: * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
40: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
41: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
42: * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
43: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
44: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
45: * SUCH DAMAGE.
46: *
47: * devfsdefs.h
48: */
49:
50: /*
51: * HISTORY
52: * 8-April-1999 Dieter Siegmund ([email protected])
53: * Ported to from FreeBSD 3.1
54: * Removed unnecessary/unused defines
55: * Renamed structures/elements to clarify usage in code.
56: */
57:
58:
59: #define DEVMAXNAMESIZE 32 /* XXX */
60: #define DEVMAXPATHSIZE 128 /* XXX */
61:
62: typedef enum {
63: DEV_DIR,
64: DEV_BDEV,
65: DEV_CDEV,
66: DEV_SLNK,
67: } devfstype_t;
68:
69: extern int (**devfs_vnodeop_p)(); /* our own vector array for dirs */
70: extern int (**devfs_spec_vnodeop_p)(); /* our own vector array for devs */
71: extern struct vfsops devfs_vfsops;
72:
73: typedef struct devnode devnode_t;
74: typedef struct devdirent devdirent_t;
75: typedef union devnode_type devnode_type_t;
76:
77: struct devfs_stats {
78: int nodes;
79: int entries;
80: int mounts;
81: int stringspace;
82: };
83:
84: union devnode_type {
85: dev_t dev;
86: struct {
87: devdirent_t * dirlist;
88: devdirent_t * * dirlast;
89: devnode_t * parent;
90: devdirent_t * myname; /* my entry in .. */
91: int entrycount;
92: }Dir;
93: struct {
94: char * name; /* must be allocated separately */
95: int namelen;
96: }Slnk;
97: };
98:
99: #define DN_ACCESS 0x0001 /* Access time update request. */
100: #define DN_CHANGE 0x0002 /* Inode change time update request. */
101: #define DN_UPDATE 0x0004 /* Modification time update request. */
102: #define DN_MODIFIED 0x0008 /* Inode has been modified. */
103: #define DN_RENAME 0x0010 /* Inode is being renamed. */
104:
105: struct devnode
106: {
107: devfstype_t dn_type;
108: int dn_flags;
109: u_short dn_mode;
110: u_short dn_uid;
111: u_short dn_gid;
112: struct timespec dn_atime;/* time of last access */
113: struct timespec dn_mtime;/* time of last modification */
114: struct timespec dn_ctime;/* time file changed */
115: int (***dn_ops)(void *);/* yuk... pointer to pointer(s) to funcs */
116: int dn_links;/* how many file links does this node have? */
117: struct devfsmount * dn_dvm; /* the mount structure for this 'plane' */
118: struct vnode * dn_vn; /* address of last vnode that represented us */
119: int dn_len; /* of any associated info (e.g. dir data) */
120: devdirent_t * dn_linklist;/* circular list of hardlinks to this node */
121: devdirent_t * dn_last_lookup; /* name I was last looked up from */
122: devnode_t * dn_nextsibling; /* the list of equivalent nodes */
123: devnode_t * * dn_prevsiblingp;/* backpointer for the above */
124: devnode_type_t dn_typeinfo;
125: int dn_delete; /* mark for deletion */
126: };
127:
128: struct devdirent
129: {
130: /*-----------------------directory entry fields-------------*/
131: char de_name[DEVMAXNAMESIZE];
132: devnode_t * de_dnp; /* the "inode" (devnode) pointer */
133: devnode_t * de_parent; /* backpointer to the directory itself */
134: devdirent_t * de_next; /* next object in this directory */
135: devdirent_t * *de_prevp; /* previous pointer in directory linked list */
136: devdirent_t * de_nextlink; /* next hardlink to this node */
137: devdirent_t * *de_prevlinkp; /* previous hardlink pointer for this node */
138: };
139:
140: extern devdirent_t * dev_root;
141: extern struct lock__bsd__ devfs_lock;
142: extern struct devfs_stats devfs_stats;
143:
144: /*
145: * Rules for front nodes:
146: * Dirs hava a strict 1:1 relationship with their OWN devnode
147: * Symlinks similarly
148: * Device Nodes ALWAYS point to the devnode that is linked
149: * to the Backing node. (with a ref count)
150: */
151:
152: /*
153: * DEVFS specific per/mount information, used to link a monted fs to a
154: * particular 'plane' of front nodes.
155: */
156: struct devfsmount
157: {
158: struct mount * mount; /* vfs mount struct for this fs */
159: devdirent_t * plane_root;/* the root of this 'plane' */
160: };
161:
162: /*
163: * Prototypes for DEVFS virtual filesystem operations
164: */
165: #include <sys/lock.h>
166: #include <miscfs/devfs/devfs_proto.h>
167:
168: //#define HIDDEN_MOUNTPOINT 1
169:
170: /* misc */
171: #define M_DEVFSNAME M_DEVFS
172: #define M_DEVFSNODE M_DEVFS
173: #define M_DEVFSMNT M_DEVFS
174:
175: static __inline__ void
176: getnanotime(struct timespec * t_p)
177: {
178: struct timeval tv;
179:
180: microtime(&tv);
181: t_p->tv_sec = tv.tv_sec;
182: t_p->tv_nsec = tv.tv_usec * 1000;
183: return;
184: }
185:
186: #define VTODN(vp) ((devnode_t *)(vp)->v_data)
187: extern void cache_purge(struct vnode *vp); /* vfs_cache.c */
188:
189: static __inline__ int
190: DEVFS_LOCK(struct proc * p)
191: {
192: return (lockmgr(&devfs_lock, LK_EXCLUSIVE, NULL, p));
193: }
194:
195: static __inline__ int
196: DEVFS_UNLOCK(struct proc * p)
197: {
198: return (lockmgr(&devfs_lock, LK_RELEASE, NULL, p));
199: }
200:
201: static __inline__ void
202: DEVFS_INCR_ENTRIES()
203: {
204: devfs_stats.entries++;
205: }
206:
207: static __inline__ void
208: DEVFS_DECR_ENTRIES()
209: {
210: devfs_stats.entries--;
211: }
212:
213: static __inline__ void
214: DEVFS_INCR_NODES()
215: {
216: devfs_stats.nodes++;
217: }
218:
219: static __inline__ void
220: DEVFS_DECR_NODES()
221: {
222: devfs_stats.nodes--;
223: }
224:
225: static __inline__ void
226: DEVFS_INCR_MOUNTS()
227: {
228: devfs_stats.mounts++;
229: }
230:
231: static __inline__ void
232: DEVFS_DECR_MOUNTS()
233: {
234: devfs_stats.mounts--;
235: }
236:
237: static __inline__ void
238: DEVFS_INCR_STRINGSPACE(int space)
239: {
240: devfs_stats.stringspace += space;
241: }
242:
243: static __inline__ void
244: DEVFS_DECR_STRINGSPACE(int space)
245: {
246: devfs_stats.stringspace -= space;
247: if (devfs_stats.stringspace < 0) {
248: printf("DEVFS_DECR_STRINGSPACE: (%d - %d < 0)\n",
249: devfs_stats.stringspace + space, space);
250: devfs_stats.stringspace = 0;
251: }
252: }
253:
254: static __inline__ void
255: dn_times(devnode_t * dnp, struct timeval t1, struct timeval t2)
256: {
257: if (dnp->dn_flags & (DN_ACCESS | DN_CHANGE | DN_UPDATE)) {
258: if (dnp->dn_flags & DN_ACCESS) {
259: dnp->dn_atime.tv_sec = t1.tv_sec;
260: dnp->dn_atime.tv_nsec = t1.tv_usec * 1000;
261: }
262: if (dnp->dn_flags & DN_UPDATE) {
263: dnp->dn_mtime.tv_sec = t2.tv_sec;
264: dnp->dn_mtime.tv_nsec = t2.tv_usec * 1000;
265: }
266: if (dnp->dn_flags & DN_CHANGE) {
267: dnp->dn_ctime.tv_sec = time.tv_sec;
268: dnp->dn_ctime.tv_nsec = time.tv_usec * 1000;
269: }
270: dnp->dn_flags &= ~(DN_ACCESS | DN_CHANGE | DN_UPDATE);
271: }
272: return;
273: }
274:
275: static __inline__ void
276: dn_copy_times(devnode_t * target, devnode_t * source)
277: {
278: target->dn_atime = source->dn_atime;
279: target->dn_mtime = source->dn_mtime;
280: target->dn_ctime = source->dn_ctime;
281: return;
282: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.