⛏️ index : haiku.git

/*
 * Copyright 2012, JΓ©rΓ΄me Duval, korli@users.berlios.de.
 * Copyright 2003 Tyler Dauwalder, tyler@dauwalder.net
 * This file may be used under the terms of the MIT License.
 */


#include "MetadataPartition.h"

#include "Icb.h"


/*! \brief Creates a new MetadataPartition object.
*/
MetadataPartition::MetadataPartition(Volume *volume,
	uint16 parentNumber, Partition &parentPartition, uint32 metadataFileLocation,
	uint32 metadataMirrorFileLocation, uint32 metadataBitmapFileLocation,
	uint32 allocationUnitSize, uint16 alignmentUnitSize,
	bool metadataIsDuplicated)
	: fPartition(parentNumber),
	fParentPartition(parentPartition),
	fAllocationUnitSize(allocationUnitSize),
	fAlignmentUnitSize(alignmentUnitSize),
	fMetadataIsDuplicated(metadataIsDuplicated),
	fInitStatus(B_NO_INIT),
	fMetadataIcb(NULL)
{
	long_address address;
	address.set_to(metadataFileLocation, fPartition);
	
	fMetadataIcb = new(nothrow) Icb(volume, address);
	if (fMetadataIcb == NULL || fMetadataIcb->InitCheck() != B_OK)
		fInitStatus = B_NO_MEMORY;
	else
		fInitStatus = B_OK;

	address.set_to(metadataMirrorFileLocation, fPartition);
	
	fMetadataMirrorIcb = new(nothrow) Icb(volume, address);
	if (fMetadataMirrorIcb == NULL
		|| fMetadataMirrorIcb->InitCheck() != B_OK) {
		fInitStatus = B_NO_MEMORY;
	}
}

/*! \brief Destroys the MetadataPartition object.
*/
MetadataPartition::~MetadataPartition()
{
	delete fMetadataIcb;
	delete fMetadataMirrorIcb;
}

/*! \brief Maps the given logical block to a physical block on disc.
*/
status_t
MetadataPartition::MapBlock(uint32 logicalBlock, off_t &physicalBlock)
{
	off_t block = 0;
	bool isRecorded;
	status_t status = fMetadataIcb->FindBlock(logicalBlock, block, isRecorded);
	if (status != B_OK)
		return status;
	if (!isRecorded) {
		status = fMetadataMirrorIcb->FindBlock(logicalBlock, block, isRecorded);
		if (status != B_OK)
			return status;
		if (!isRecorded)
			return B_BAD_DATA;
	}
	return fParentPartition.MapBlock(block, physicalBlock);
}

/*! Returns the initialization status of the object.
*/
status_t
MetadataPartition::InitCheck()
{
	return fInitStatus;
}