Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
	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;
}
Beispiel #5
0
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());
		}
	}
}