| // 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 "src/storage/minfs/vnode_allocation.h" |
| |
| namespace minfs { |
| |
| void PendingAllocationData::Reset(blk_t size) { |
| new_blocks_ = 0; |
| node_size_ = size; |
| block_map_.ClearAll(); |
| } |
| |
| 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 = range->bitoff; |
| *count = range->bitlen; |
| return ZX_OK; |
| } |
| |
| 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 |