status_t Inode::EnableFileCache() { TRACE("Inode::EnableFileCache()\n"); if (fCached) return B_OK; if (fCache != NULL) { fCached = true; return B_OK; } TRACE("Inode::EnableFileCache(): Creating file cache: %ld, %lld, %lld\n", fVolume->ID(), ID(), Size()); fCache = file_cache_create(fVolume->ID(), ID(), Size()); fMap = file_map_create(fVolume->ID(), ID(), Size()); if (fCache == NULL) { ERROR("Inode::EnableFileCache(): Failed to create file cache\n"); fCached = false; return B_ERROR; } fCached = true; TRACE("Inode::EnableFileCache(): Done\n"); return B_OK; }
status_t Inode::CreateFileCache() { TRACE("Inode::CreateFileCache()\n"); if (fCache != NULL) return B_OK; TRACE("Inode::CreateFileCache(): Creating file cache: %" B_PRIu32 ", %" B_PRIdINO ", %" B_PRIdOFF "\n", fVolume->ID(), ID(), Size()); fCache = file_cache_create(fVolume->ID(), ID(), Size()); if (fCache == NULL) { ERROR("Inode::CreateFileCache(): Failed to create file cache\n"); return B_ERROR; } fMap = file_map_create(fVolume->ID(), ID(), Size()); if (fMap == NULL) { ERROR("Inode::CreateFileCache(): Failed to create file map\n"); file_cache_delete(fCache); fCache = NULL; return B_ERROR; } TRACE("Inode::CreateFileCache(): Done\n"); return B_OK; }
status_t Init(dev_t deviceID, ino_t nodeID, int fd) { // create a DataReader for the compressed data if (fData->IsEncodedInline()) { fDataReader = new(std::nothrow) BufferDataReader( fData->InlineData(), fData->CompressedSize()); } else fDataReader = new(std::nothrow) FDDataReader(fd); if (fDataReader == NULL) RETURN_ERROR(B_NO_MEMORY); // create a PackageDataReader status_t error = GlobalFactory::Default()->CreatePackageDataReader( fDataReader, *fData, fReader); if (error != B_OK) RETURN_ERROR(error); // create a file cache fFileCache = file_cache_create(deviceID, nodeID, fData->UncompressedSize()); if (fFileCache == NULL) RETURN_ERROR(B_NO_MEMORY); return B_OK; }
static status_t fs_read_vnode(fs_volume* _volume, ino_t vnodeID, fs_vnode* _node, int* _type, uint32* _flags, bool reenter) { iso9660_volume* volume = (iso9660_volume*)_volume->private_volume; iso9660_inode* newNode = (iso9660_inode*)calloc(sizeof(iso9660_inode), 1); if (newNode == NULL) return B_NO_MEMORY; uint32 pos = vnodeID & 0x3fffffff; uint32 block = vnodeID >> 30; TRACE(("fs_read_vnode - block = %u, pos = %u, raw = %Lu node %p\n", (unsigned)block, (unsigned) pos, vnodeID, newNode)); if (pos > volume->logicalBlkSize[FS_DATA_FORMAT]) { free(newNode); return B_BAD_VALUE; } char* data = (char*)block_cache_get(volume->fBlockCache, block); if (data == NULL) { free(newNode); return B_IO_ERROR; } status_t result = InitNode(volume, newNode, data + pos, NULL); block_cache_put(volume->fBlockCache, block); if (result < B_OK) { free(newNode); return result; } newNode->volume = volume; newNode->id = vnodeID; _node->private_node = newNode; _node->ops = &gISO9660VnodeOps; *_type = newNode->attr.stat[FS_DATA_FORMAT].st_mode & ~(S_IWUSR | S_IWGRP | S_IWOTH); *_flags = 0; if ((newNode->flags & ISO_IS_DIR) == 0) { newNode->cache = file_cache_create(volume->id, vnodeID, newNode->dataLen[FS_DATA_FORMAT]); } return B_OK; }
Inode::Inode(Volume* volume, ino_t id) : fVolume(volume), fID(id), fCache(NULL), fMap(NULL) { rw_lock_init(&fLock, "btrfs inode"); fInitStatus = UpdateNodeFromDisk(); if (fInitStatus == B_OK) { if (!IsDirectory() && !IsSymLink()) { fCache = file_cache_create(fVolume->ID(), ID(), Size()); fMap = file_map_create(fVolume->ID(), ID(), Size()); } } }