BTRFS: Implement some space relevant helpers.
Signed-off-by: Augustin Cavalier <[email protected]>
This commit is contained in:
@@ -140,6 +140,64 @@ BTree::Node::SearchSlot(const btrfs_key& key, int* slot, btree_traversing type)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* calculate used space except the header.
|
||||||
|
* type is only for leaf node
|
||||||
|
* type 1: only item space
|
||||||
|
* type 2: only item data space
|
||||||
|
* type 3: both type 1 and 2
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
BTree::Node::_CalculateSpace(uint32 from, uint32 to, uint8 type) const
|
||||||
|
{
|
||||||
|
if (to < from || to >= ItemCount())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (Level() != 0)
|
||||||
|
return sizeof(btrfs_index) * (to - from + 1);
|
||||||
|
|
||||||
|
uint32 result = 0;
|
||||||
|
if ((type & 1) == 1) {
|
||||||
|
result += sizeof(btrfs_entry) * (to - from + 1);
|
||||||
|
}
|
||||||
|
if ((type & 2) == 2) {
|
||||||
|
result += Item(from)->Offset() + Item(from)->Size()
|
||||||
|
- Item(to)->Offset();
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
BTree::Node::SpaceUsed() const
|
||||||
|
{
|
||||||
|
if (Level() == 0)
|
||||||
|
return _CalculateSpace(0, ItemCount() - 1, 3);
|
||||||
|
return _CalculateSpace(0, ItemCount() - 1, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
BTree::Node::SpaceLeft() const
|
||||||
|
{
|
||||||
|
return fVolume->BlockSize() - SpaceUsed() - sizeof(btrfs_header);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
BTree::Node::_SpaceCheck(int length) const
|
||||||
|
{
|
||||||
|
// this is a little bit weird here because we can't find
|
||||||
|
// any suitable error code
|
||||||
|
if (length < 0 && std::abs(length) >= SpaceUsed())
|
||||||
|
return B_DIRECTORY_NOT_EMPTY; // not enough data to delete
|
||||||
|
if (length > 0 && length >= SpaceLeft())
|
||||||
|
return B_DEVICE_FULL; // no spare space
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark - BTree::Path implementation
|
// #pragma mark - BTree::Path implementation
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -128,18 +128,23 @@ public:
|
|||||||
|
|
||||||
void SetTo(off_t block);
|
void SetTo(off_t block);
|
||||||
void SetToWritable(off_t block, int32 transactionId, bool empty);
|
void SetToWritable(off_t block, int32 transactionId, bool empty);
|
||||||
|
int SpaceUsed() const;
|
||||||
|
int SpaceLeft() const;
|
||||||
|
|
||||||
off_t BlockNum() const { return fBlockNumber;}
|
off_t BlockNum() const { return fBlockNumber;}
|
||||||
bool IsWritable() const { return fWritable; }
|
bool IsWritable() const { return fWritable; }
|
||||||
|
|
||||||
status_t SearchSlot(const btrfs_key& key, int* slot,
|
status_t SearchSlot(const btrfs_key& key, int* slot,
|
||||||
btree_traversing type) const;
|
btree_traversing type) const;
|
||||||
private:
|
private:
|
||||||
Node(const Node&);
|
Node(const Node&);
|
||||||
Node& operator=(const Node&);
|
Node& operator=(const Node&);
|
||||||
//no implementation
|
//no implementation
|
||||||
|
|
||||||
btrfs_stream* fNode;
|
status_t _SpaceCheck(int length) const;
|
||||||
|
int _CalculateSpace(uint32 from, uint32 to, uint8 type = 1) const;
|
||||||
|
|
||||||
|
btrfs_stream* fNode;
|
||||||
Volume* fVolume;
|
Volume* fVolume;
|
||||||
off_t fBlockNumber;
|
off_t fBlockNumber;
|
||||||
bool fWritable;
|
bool fWritable;
|
||||||
|
|||||||
Reference in New Issue
Block a user