From 91d7f850cfc67857395d449cf898e1438fb66259 Mon Sep 17 00:00:00 2001 From: hyche Date: Sun, 18 Jun 2017 22:44:08 +0700 Subject: [PATCH] BTRFS: Added binary search for item slot Signed-off-by: Adrien Destugues --- .../kernel/file_systems/btrfs/BTree.cpp | 33 +++++++++++++++++++ src/add-ons/kernel/file_systems/btrfs/BTree.h | 2 ++ 2 files changed, 35 insertions(+) diff --git a/src/add-ons/kernel/file_systems/btrfs/BTree.cpp b/src/add-ons/kernel/file_systems/btrfs/BTree.cpp index 7db8c2d04d..fc3a891da7 100644 --- a/src/add-ons/kernel/file_systems/btrfs/BTree.cpp +++ b/src/add-ons/kernel/file_systems/btrfs/BTree.cpp @@ -91,6 +91,39 @@ BNode::SetToWritable(off_t block, int32 transactionId, bool empty) } +int32 +BNode::SearchSlot(const btrfs_key& key, int* slot) const +{ + //binary search for item slot in a node + int entrySize = sizeof(btrfs_entry); + if (Level() != 0) { + // internal node + entrySize = sizeof(btrfs_index); + } + + int low = 0; + int high = ItemCount(); + int mid; + int base = sizeof(btrfs_header); + const btrfs_key* other; + while (low < high) { + mid = (low + high) / 2; + other = (const btrfs_key*)((uint8*)fNode + base + mid * entrySize); + int comp = key.Compare(*other); + if (comp < 0) + high = mid; + else if (comp > 0) + low = mid + 1; + else { + *slot = mid; + return B_OK; + } + } + *slot = low; + return B_ENTRY_NOT_FOUND; +} + + //-pragma mark diff --git a/src/add-ons/kernel/file_systems/btrfs/BTree.h b/src/add-ons/kernel/file_systems/btrfs/BTree.h index cf9e2cb616..ffddf1def1 100644 --- a/src/add-ons/kernel/file_systems/btrfs/BTree.h +++ b/src/add-ons/kernel/file_systems/btrfs/BTree.h @@ -79,6 +79,8 @@ public: off_t BlockNumber() const { return fBlockNumber; } bool IsWritable() const { return fWritable; } + + int32 SearchSlot(const btrfs_key& key, int* slot) const; private: BNode(const BNode&); BNode& operator=(const BNode&);