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