|
|
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: * Mach Operating System
24: * Copyright (c) 1987 Carnegie-Mellon University
25: * All rights reserved. The CMU software License Agreement specifies
26: * the terms and conditions for use and redistribution.
27: */
28: /*
29: * File: mapfs.c
30: * Author: Avadis Tevanian, Jr.
31: *
32: * Copyright (C) 1987, Avadis Tevanian, Jr.
33: *
34: * Support for mapped file system implementation.
35: *
36: * HISTORY
37: * 6-Dev-1997 A.Ramesh at Apple
38: * Made the chages for MacOSX; Reanamed mfs to mapfs to avoid confusion
39: * with memory based filesystem.
40: *
41: * 18-Nov-92 Phillip Dibner at NeXT
42: * Made the i/o throttle global. This is a hack on top of a hack and
43: * should be fixed properly, probably in the vm system.
44: *
45: * 3-Sep-92 Joe Murdock at NeXT
46: * Added an i/o throttle to mfs_io as a cheap work-around for a i/o buffer
47: * resource conflict with usr-space system bottle-necks (nfs servers, etc)
48: *
49: * 7-Feb-92 Jim Hays
50: * There are still bugs in this code dealing with vmp_pushing wired
51: * pages. We need to modify the sound drivers locks to be breakable
52: * except during the actual playing.
53: *
54: * 3-Aug-90 Doug Mitchell at NeXT
55: * Added primitives for loadable file system support.
56: *
57: * 7-Mar-90 Brian Pinkerton (bpinker) at NeXT
58: * Changed mfs_trunc to return an indication of change.
59: *
60: * 9-Mar-88 John Seamons (jks) at NeXT
61: * SUN_VFS: allocate vm_info structures from a zone.
62: *
63: * 29-Jan-88 David Golub (dbg) at Carnegie-Mellon University
64: * Corrected calls to inode_pager_setup and kmem_alloc.
65: *
66: * 15-Sep-87 Michael Young (mwyoung) at Carnegie-Mellon University
67: * De-linted.
68: *
69: * 18-Jun-87 Michael Young (mwyoung) at Carnegie-Mellon University
70: * Make most of this file dependent on MACH_NBC.
71: *
72: * 30-Apr-87 Avadis Tevanian (avie) at Carnegie-Mellon University
73: * Created.
74: */
75:
76:
77: #include <kern/mapfs.h>
78: #include <sys/param.h>
79: #include <sys/systm.h>
80: #include <sys/mount.h>
81: #include <sys/proc.h>
82: #include <sys/user.h>
83: #include <sys/vnode.h>
84: #include <sys/uio.h>
85: #include <ufs/ufs/quota.h>
86: #include <ufs/ufs/inode.h>
87: #include <sys/dir.h>
88: #include <vm/vm_kern.h>
89: #include <mach/vm_param.h>
90: #include <mach/machine.h>
91: #include <vm/vnode_pager.h>
92: #include <sys/lock.h>
93:
94: struct zone *vm_info_zone;
95:
96: /*
97: * Private variables and macros.
98: */
99:
100: queue_head_t vm_info_queue; /* lru list of structures */
101: decl_simple_lock_data(, vm_info_lock_data) /* lock for lru list */
102: int vm_info_version = 0; /* version number */
103:
104: #define vm_info_lock() simple_lock(&vm_info_lock_data)
105: #define vm_info_unlock() simple_unlock(&vm_info_lock_data)
106:
107:
108:
109:
110: /*
111: * mapfs_init:
112: *
113: * Initialize the mapped FS module.
114: */
115: int
116: mapfs_init()
117: {
118: int i;
119:
120: queue_init(&vm_info_queue);
121: simple_lock_init(&vm_info_lock_data);
122:
123: i = (vm_size_t) sizeof (struct vm_info);
124: vm_info_zone = zinit (i, 10000*i, 8192, "vm_info zone");
125: return(0);
126: }
127:
128: /*
129: * vm_info_init:
130: *
131: * Initialize a vm_info structure for a vnode.
132: */
133: int
134: vm_info_init(vp)
135: struct vnode *vp;
136: {
137: register struct vm_info *vmp;
138:
139: vmp = vp->v_vm_info;
140: if (vmp == VM_INFO_NULL)
141: vmp = (struct vm_info *) zalloc(vm_info_zone);
142: vmp->pager = 0;
143: vmp->map_count = 0;
144: vmp->use_count = 0;
145: vmp->va = 0;
146: vmp->size = 0;
147: vmp->offset = 0;
148: vmp->cred = (struct ucred *) NULL;
149: vmp->error = 0;
150: vmp->queued = FALSE;
151: vmp->dirty = FALSE;
152: vmp->close_flush = TRUE; /* for safety, reconsider later */
153: vmp->mapped = FALSE;
154: vmp->invalidate = FALSE;
155: vmp->vnode_size = 0;
156: #if FIXME
157: lock_init(&vmp->lock, TRUE); /* sleep lock */
158: #endif /* FIXME */
159: vmp->object = VM_OBJECT_NULL;
160: vp->v_vm_info = vmp;
161: return(0);
162: }
163:
164: /*
165: * Loadable file system support to avoid exporting struct vm_info.
166: */
167: void vm_info_free(struct vnode *vp)
168: {
169: zfree(vm_info_zone, (vm_offset_t)vp->v_vm_info);
170: }
171:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.