use the -newos toolchain even if -elf is present.
[newos.git] / kernel / vm / vm_store_vnode.c
blob4bd8425028a174a82a19a7dea33d43676bd36fb1
1 /*
2 ** Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
3 ** Distributed under the terms of the NewOS License.
4 */
5 #include <kernel/kernel.h>
6 #include <kernel/vm.h>
7 #include <kernel/vm_priv.h>
8 #include <kernel/heap.h>
9 #include <kernel/debug.h>
10 #include <kernel/lock.h>
11 #include <kernel/vm_store_vnode.h>
12 #include <kernel/vfs.h>
13 #include <newos/errors.h>
15 #define STORE_DATA(x) ((struct vnode_store_data *)(x->data))
17 struct vnode_store_data {
18 void *vn;
21 static void vnode_destroy(struct vm_store *store)
23 if(store) {
24 kfree(store);
28 static off_t vnode_commit(struct vm_store *store, off_t size)
30 VERIFY_VM_STORE(store);
31 store->committed_size = size;
32 return size;
35 static int vnode_has_page(struct vm_store *store, off_t offset)
37 VERIFY_VM_STORE(store);
38 return 1; // we always have the page, man
41 static ssize_t vnode_read(struct vm_store *store, off_t offset, iovecs *vecs)
43 VERIFY_VM_STORE(store);
44 return vfs_readpage(STORE_DATA(store)->vn, vecs, offset);
47 static ssize_t vnode_write(struct vm_store *store, off_t offset, iovecs *vecs)
49 VERIFY_VM_STORE(store);
50 return vfs_writepage(STORE_DATA(store)->vn, vecs, offset);
53 /* unused
54 static int vnode_fault(struct vm_store *store, struct vm_address_space *aspace, off_t offset)
56 return 0;
60 static void vnode_acquire_ref(struct vm_store *store)
62 VERIFY_VM_STORE(store);
63 vfs_vnode_acquire_ref(STORE_DATA(store)->vn);
66 static void vnode_release_ref(struct vm_store *store)
68 VERIFY_VM_STORE(store);
69 vfs_vnode_release_ref(STORE_DATA(store)->vn);
72 static vm_store_ops vnode_ops = {
73 &vnode_destroy,
74 &vnode_commit,
75 &vnode_has_page,
76 &vnode_read,
77 &vnode_write,
78 NULL,
79 &vnode_acquire_ref,
80 &vnode_release_ref
83 vm_store *vm_store_create_vnode(void *vnode)
85 vm_store *store;
86 struct vnode_store_data *d;
88 store = kmalloc(sizeof(vm_store) + sizeof(struct vnode_store_data));
89 if(store == NULL) {
90 vfs_put_vnode_ptr(vnode);
91 return NULL;
94 store->magic = VM_STORE_MAGIC;
95 store->ops = &vnode_ops;
96 store->cache = NULL;
97 store->data = (void *)((addr_t)store + sizeof(vm_store));
98 store->committed_size = 0;
100 d = (struct vnode_store_data *)store->data;
101 d->vn = vnode;
103 return store;