1/*
2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6#include <fs_cache.h>
7
8#include <new>
9
10#include "AutoDeleter.h"
11#include "Debug.h"
12
13#include "../kernel_emu.h"
14
15
16struct FileCache {
17	dev_t	mountID;
18	ino_t	vnodeID;
19	bool	enabled;
20
21	FileCache(dev_t mountID, ino_t vnodeID)
22		:
23		mountID(mountID),
24		vnodeID(vnodeID),
25		enabled(true)
26	{
27	}
28};
29
30
31void*
32file_cache_create(dev_t mountID, ino_t vnodeID, off_t size)
33{
34	PRINT(("file_cache_create(%ld, %lld, %lld)\n", mountID, vnodeID, size));
35
36	// create the client-side object
37	FileCache* fileCache = new(std::nothrow) FileCache(mountID, vnodeID);
38	if (fileCache == NULL)
39		return NULL;
40	ObjectDeleter<FileCache> cacheDeleter(fileCache);
41
42	// create the kernel-size file cache
43	status_t error = UserlandFS::KernelEmu::file_cache_create(mountID, vnodeID,
44		size);
45	if (error != B_OK) {
46		REPORT_ERROR(error);
47		return NULL;
48	}
49
50	cacheDeleter.Detach();
51
52	PRINT(("file_cache_create() -> %p\n", fileCache));
53	return fileCache;
54}
55
56
57void
58file_cache_delete(void *cacheRef)
59{
60	if (cacheRef == NULL)
61		return;
62
63	PRINT(("file_cache_delete(%p)\n", cacheRef));
64
65	FileCache* fileCache = (FileCache*)cacheRef;
66
67	UserlandFS::KernelEmu::file_cache_delete(fileCache->mountID,
68		fileCache->vnodeID);
69
70	delete fileCache;
71}
72
73
74void
75file_cache_enable(void *cacheRef)
76{
77	PRINT(("file_cache_enable(%p)\n", cacheRef));
78
79	FileCache* fileCache = (FileCache*)cacheRef;
80
81	if (fileCache->enabled)
82		return;
83
84	if (UserlandFS::KernelEmu::file_cache_set_enabled(fileCache->mountID,
85			fileCache->vnodeID, true) == B_OK) {
86		fileCache->enabled = true;
87	}
88}
89
90
91bool
92file_cache_is_enabled(void *cacheRef)
93{
94	FileCache* fileCache = (FileCache*)cacheRef;
95
96	return fileCache->enabled;
97}
98
99
100status_t
101file_cache_disable(void *cacheRef)
102{
103	PRINT(("file_cache_disable(%p)\n", cacheRef));
104
105	FileCache* fileCache = (FileCache*)cacheRef;
106
107	if (!fileCache->enabled)
108		return B_OK;
109
110	status_t error = UserlandFS::KernelEmu::file_cache_set_enabled(
111		fileCache->mountID, fileCache->vnodeID, false);
112	if (error == B_OK)
113		fileCache->enabled = false;
114
115	return error;
116}
117
118
119status_t
120file_cache_set_size(void *cacheRef, off_t size)
121{
122	if (cacheRef == NULL)
123		return B_BAD_VALUE;
124
125	PRINT(("file_cache_set_size(%p)\n", cacheRef));
126
127	FileCache* fileCache = (FileCache*)cacheRef;
128
129	return UserlandFS::KernelEmu::file_cache_set_size(fileCache->mountID,
130		fileCache->vnodeID, size);
131}
132
133
134status_t
135file_cache_sync(void *cacheRef)
136{
137	if (cacheRef == NULL)
138		return B_BAD_VALUE;
139
140	PRINT(("file_cache_sync(%p)\n", cacheRef));
141
142	FileCache* fileCache = (FileCache*)cacheRef;
143
144	return UserlandFS::KernelEmu::file_cache_sync(fileCache->mountID,
145		fileCache->vnodeID);
146}
147
148
149status_t
150file_cache_read(void *cacheRef, void *cookie, off_t offset, void *bufferBase,
151	size_t *_size)
152{
153	PRINT(("file_cache_read(%p, %p, %lld, %p, %lu)\n", cacheRef, cookie, offset,
154		bufferBase, *_size));
155
156	FileCache* fileCache = (FileCache*)cacheRef;
157
158	return UserlandFS::KernelEmu::file_cache_read(fileCache->mountID,
159		fileCache->vnodeID, cookie, offset, bufferBase, _size);
160}
161
162
163status_t
164file_cache_write(void *cacheRef, void *cookie, off_t offset, const void *buffer,
165	size_t *_size)
166{
167	PRINT(("file_cache_write(%p, %p, %lld, %p, %lu)\n", cacheRef, cookie,
168		offset, buffer, *_size));
169
170	FileCache* fileCache = (FileCache*)cacheRef;
171
172	return UserlandFS::KernelEmu::file_cache_write(fileCache->mountID,
173		fileCache->vnodeID, cookie, offset, buffer, _size);
174}
175