From 442298d4941d2f17abeaa6ed1cee928fc5710a63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sat, 25 Jun 2022 09:07:27 +0200 Subject: [PATCH] kernel/devfs: improve devfs_compute_geometry_size the old code could lead to an odd head count, thus a smaller partition size. with power of two, this works at least accurately if the size is aligned. we should probably introduce a new ioctl or extend the current one to avoid this problem. Change-Id: Ia6c034262b1756e901d6ad76ab17b278b2314631 Reviewed-on: https://review.haiku-os.org/c/haiku/+/5398 Reviewed-by: Adrien Destugues Tested-by: Commit checker robot --- src/system/kernel/device_manager/devfs.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/system/kernel/device_manager/devfs.cpp b/src/system/kernel/device_manager/devfs.cpp index 66c41a5555..61d8d04a62 100644 --- a/src/system/kernel/device_manager/devfs.cpp +++ b/src/system/kernel/device_manager/devfs.cpp @@ -2254,13 +2254,14 @@ void devfs_compute_geometry_size(device_geometry* geometry, uint64 blockCount, uint32 blockSize) { - if (blockCount > UINT32_MAX) - geometry->head_count = (blockCount + UINT32_MAX - 1) / UINT32_MAX; - else - geometry->head_count = 1; + geometry->head_count = 1; + while (blockCount > UINT32_MAX) { + geometry->head_count <<= 1; + blockCount >>= 1; + } geometry->cylinder_count = 1; - geometry->sectors_per_track = blockCount / geometry->head_count; + geometry->sectors_per_track = blockCount; geometry->bytes_per_sector = blockSize; }