2 ** Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
3 ** Distributed under the terms of the NewOS License.
5 #include <kernel/kernel.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
{
21 static void vnode_destroy(struct vm_store
*store
)
28 static off_t
vnode_commit(struct vm_store
*store
, off_t size
)
30 VERIFY_VM_STORE(store
);
31 store
->committed_size
= 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
);
54 static int vnode_fault(struct vm_store *store, struct vm_address_space *aspace, off_t offset)
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
= {
83 vm_store
*vm_store_create_vnode(void *vnode
)
86 struct vnode_store_data
*d
;
88 store
= kmalloc(sizeof(vm_store
) + sizeof(struct vnode_store_data
));
90 vfs_put_vnode_ptr(vnode
);
94 store
->magic
= VM_STORE_MAGIC
;
95 store
->ops
= &vnode_ops
;
97 store
->data
= (void *)((addr_t
)store
+ sizeof(vm_store
));
98 store
->committed_size
= 0;
100 d
= (struct vnode_store_data
*)store
->data
;