/* * Copyright 2003, Tyler Dauwalder, tyler@dauwalder.net. * Distributed under the terms of the MIT License. */ #include "SparablePartition.h" #define B_NOT_IMPLEMENTED B_ERROR /*! \brief Creates a new SparablePartition object. */ SparablePartition::SparablePartition(uint16 number, uint32 start, uint32 length, uint16 packetLength, uint8 tableCount, uint32 *tableLocations) : fNumber(number), fStart(start), fLength(length), fPacketLength(packetLength), fTableCount(tableCount), fInitStatus(B_NO_INIT) { TRACE(("SparablePartition::SparablePartition: number = %d, start = %" B_PRIu32 ",length = %" B_PRIu32 ", packetLength = %d\n", number, start, length, packetLength)); status_t status = (0 < TableCount() && TableCount() <= kMaxSparingTableCount) ? B_OK : B_BAD_VALUE; if (status != B_OK) return; for (uint8 i = 0; i < TableCount(); i++) fTableLocations[i] = tableLocations[i]; fInitStatus = B_OK; } /*! \brief Destroys the SparablePartition object. */ SparablePartition::~SparablePartition() { } /*! \brief Maps the given logical block to a physical block on disc. The sparing tables are first checked to see if the logical block has been remapped from a defective location to a non-defective one. If not, the given logical block is then simply treated as an offset from the start of the physical partition. */ status_t SparablePartition::MapBlock(uint32 logicalBlock, off_t &physicalBlock) { status_t status = InitCheck(); if (status != B_OK) return status; if (logicalBlock >= fLength) return B_BAD_ADDRESS; else { // Check for the logical block in the sparing tables. If not // found, map directly to physical space. //physicalBlock = fStart + logicalBlock; //return B_OK; status = B_ERROR; } return status; } /*! Returns the initialization status of the object. */ status_t SparablePartition::InitCheck() { return fInitStatus; }