blob: 54929e07089b0e879e470938d813a7bdb58e2968 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "vnode-allocation.h"
namespace minfs {
void PendingAllocationData::Reset(blk_t size) {
new_blocks_ = 0;
node_size_ = size;
block_map_.ClearAll();
reservation_.Cancel();
}
zx_status_t PendingAllocationData::GetNextRange(blk_t* start, blk_t* count) const {
auto range = block_map_.begin();
if (range == block_map_.end()) {
return ZX_ERR_OUT_OF_RANGE;
}
*start = static_cast<blk_t>(range->bitoff);
*count = static_cast<blk_t>(range->bitlen);
return ZX_OK;
}
blk_t PendingAllocationData::GetLongestRange() const {
blk_t block_count = 0;
for (auto range = block_map_.begin(); range != block_map_.end(); range++) {
if (range->bitlen > block_count) {
block_count = static_cast<blk_t>(range->bitlen);
}
}
return block_count;
}
void PendingAllocationData::SetPending(blk_t block_num, bool allocated) {
size_t initial_bits = block_map_.num_bits();
ZX_ASSERT(block_map_.SetOne(block_num) == ZX_OK);
if (block_map_.num_bits() > initial_bits && !allocated) {
new_blocks_++;
}
}
bool PendingAllocationData::ClearPending(blk_t block_num, bool allocated) {
size_t initial_bits = block_map_.num_bits();
ZX_ASSERT(block_map_.ClearOne(block_num) == ZX_OK);
if (block_map_.num_bits() < initial_bits) {
if (!allocated) {
ZX_ASSERT(new_blocks_ > 0);
new_blocks_--;
}
return true;
}
return false;
}
} // namespace minfs