diff --git a/src/add-ons/kernel/file_systems/udf/Utils.cpp b/src/add-ons/kernel/file_systems/udf/Utils.cpp index e4df9cfee9..ec67fd0ee1 100644 --- a/src/add-ons/kernel/file_systems/udf/Utils.cpp +++ b/src/add-ons/kernel/file_systems/udf/Utils.cpp @@ -103,4 +103,29 @@ make_time(timestamp ×tamp) return result; } +/*! \brief Calculates the block shift amount for the given + block size, which must be a positive power of 2. +*/ +status_t +Udf::get_block_shift(uint32 blockSize, uint32 &blockShift) +{ + if (blockSize == 0) + return B_BAD_VALUE; + uint32 bitCount = 0; + uint32 result = 0; + for (int i = 0; i < 32; i++) { + // Zero out all bits except bit i + uint32 block = blockSize & (uint32(1) << i); + if (block) { + if (++bitCount > 1) { + return B_BAD_VALUE; + } else { + result = i; + } + } + } + blockShift = result; + return B_OK; +} + } // namespace Udf diff --git a/src/add-ons/kernel/file_systems/udf/Utils.h b/src/add-ons/kernel/file_systems/udf/Utils.h index ad4cb52e29..f3ca36be0e 100644 --- a/src/add-ons/kernel/file_systems/udf/Utils.h +++ b/src/add-ons/kernel/file_systems/udf/Utils.h @@ -20,7 +20,7 @@ extern "C" { #include } -#include "DiskStructures.h" +#include "UdfStructures.h" namespace Udf { @@ -30,6 +30,8 @@ vnode_id to_vnode_id(long_address address); time_t make_time(timestamp ×tamp); +status_t get_block_shift(uint32 blockSize, uint32 &blockShift); + } // namespace Udf #endif // _UDF_UTILS_H