status_t Volume::ClusterToBlock(cluster_t cluster, fsblock_t &block) { if (cluster < 2) return B_BAD_VALUE; block = ((cluster - 2) << SuperBlock().BlocksPerClusterShift()) + SuperBlock().FirstDataBlock(); TRACE("Volume::ClusterToBlock() cluster %" B_PRIu32 " %u %" B_PRIu32 ": %" B_PRIu64 ", %" B_PRIu32 "\n", cluster, SuperBlock().BlocksPerClusterShift(), SuperBlock().FirstDataBlock(), block, SuperBlock().FirstFatBlock()); return B_OK; }
cluster_t Volume::NextCluster(cluster_t _cluster) { uint32 clusterPerBlock = fBlockSize / sizeof(cluster_t); CachedBlock block(this); fsblock_t blockNum = SuperBlock().FirstFatBlock() + _cluster / clusterPerBlock; cluster_t *cluster = (cluster_t *)block.SetTo(blockNum); cluster += _cluster % clusterPerBlock; TRACE("Volume::NextCluster() cluster %" B_PRIu32 " next %" B_PRIu32 "\n", _cluster, *cluster); return *cluster; }
bool DiskMultiMap::createNew(const std::string &filename, unsigned int numBuckets) { m_superBlock = SuperBlock(numBuckets); if (!m_file.createNew(filename)) { return false; } if (!m_file.write(m_superBlock, 0)) { return false; } for (int i = 0; i < numBuckets; i++) { BinaryFile::Offset emptyOffset = NULLOFFSET; if (!m_file.write(emptyOffset, (BinaryFile::Offset) (i * sizeof(BinaryFile::Offset) + sizeof(SuperBlock)))) { return false; } } return true; }