[haiku-commits] haiku: hrev56217 - in src: add-ons/kernel/file_systems/ext2 system/kernel/device_manager

  • From: Jérôme Duval <jerome.duval@xxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 25 Jun 2022 20:16:12 +0000 (UTC)

hrev56217 adds 3 changesets to branch 'master'
old head: faefd309d97ec1de78f1a6e55835f68effb4aef8
new head: caf0369a8937ceab6d173793524d2dd392c5f8a6
overview: 
https://git.haiku-os.org/haiku/log/?qt=range&q=caf0369a8937+%5Efaefd309d97e

----------------------------------------------------------------------------

442298d4941d: 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 <pulkomandy@xxxxxxxxxxxxx>
  Tested-by: Commit checker robot <no-reply+buildbot@xxxxxxxxxxxx>

732f5f0f8720: ext2: accept block count until the disk size plus one
  
  my understanding is that it's possible that the last block (for instance of 
size 4KB)
  is too large for the last few partition sectors, if the partition size isn't 
a multiple
  of the block size.
  
  Change-Id: I88c709d6e449aa52358fd9343c9f68f7ac1c01fe
  Reviewed-on: https://review.haiku-os.org/c/haiku/+/5399
  Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxxxxxx>
  Tested-by: Commit checker robot <no-reply+buildbot@xxxxxxxxxxxx>

caf0369a8937: ext2: check volume state when mounting
  
  we deny mounting read/write when not clean or with errors.
  
  Change-Id: Ie0188319618d9d8e7199b308c007fbaeacaed87c
  Reviewed-on: https://review.haiku-os.org/c/haiku/+/5400
  Tested-by: Commit checker robot <no-reply+buildbot@xxxxxxxxxxxx>
  Reviewed-by: Jérôme Duval <jerome.duval@xxxxxxxxx>

                                   [ Jérôme Duval <jerome.duval@xxxxxxxxx> ]

----------------------------------------------------------------------------

3 files changed, 22 insertions(+), 9 deletions(-)
src/add-ons/kernel/file_systems/ext2/Volume.cpp | 14 +++++++++++++-
src/add-ons/kernel/file_systems/ext2/ext2.h     |  6 +++---
src/system/kernel/device_manager/devfs.cpp      | 11 ++++++-----

############################################################################

Commit:      442298d4941d2f17abeaa6ed1cee928fc5710a63
URL:         https://git.haiku-os.org/haiku/commit/?id=442298d4941d
Author:      Jérôme Duval <jerome.duval@xxxxxxxxx>
Date:        Sat Jun 25 07:07:27 2022 UTC

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 <pulkomandy@xxxxxxxxxxxxx>
Tested-by: Commit checker robot <no-reply+buildbot@xxxxxxxxxxxx>

----------------------------------------------------------------------------

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;
 }
 

############################################################################

Commit:      732f5f0f87207ad81a5d3c4a6d6fbb32b4d618e9
URL:         https://git.haiku-os.org/haiku/commit/?id=732f5f0f8720
Author:      Jérôme Duval <jerome.duval@xxxxxxxxx>
Date:        Sat Jun 25 07:25:42 2022 UTC

ext2: accept block count until the disk size plus one

my understanding is that it's possible that the last block (for instance of 
size 4KB)
is too large for the last few partition sectors, if the partition size isn't a 
multiple
of the block size.

Change-Id: I88c709d6e449aa52358fd9343c9f68f7ac1c01fe
Reviewed-on: https://review.haiku-os.org/c/haiku/+/5399
Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxxxxxx>
Tested-by: Commit checker robot <no-reply+buildbot@xxxxxxxxxxxx>

----------------------------------------------------------------------------

diff --git a/src/add-ons/kernel/file_systems/ext2/Volume.cpp 
b/src/add-ons/kernel/file_systems/ext2/Volume.cpp
index 7727c1f901..dff0520458 100644
--- a/src/add-ons/kernel/file_systems/ext2/Volume.cpp
+++ b/src/add-ons/kernel/file_systems/ext2/Volume.cpp
@@ -233,8 +233,10 @@ Volume::Mount(const char* deviceName, uint32 flags)
        status = opener.GetSize(&diskSize);
        if (status != B_OK)
                return status;
-       if (diskSize < ((off_t)NumBlocks() << BlockShift()))
+       if ((diskSize + fBlockSize) <= ((off_t)NumBlocks() << BlockShift())) {
+               FATAL("diskSize is too small for the number of blocks!\n");
                return B_BAD_VALUE;
+       }
 
        fBlockCache = opener.InitCache(NumBlocks(), fBlockSize);
        if (fBlockCache == NULL)

############################################################################

Revision:    hrev56217
Commit:      caf0369a8937ceab6d173793524d2dd392c5f8a6
URL:         https://git.haiku-os.org/haiku/commit/?id=caf0369a8937
Author:      Jérôme Duval <jerome.duval@xxxxxxxxx>
Date:        Sat Jun 25 07:49:00 2022 UTC

ext2: check volume state when mounting

we deny mounting read/write when not clean or with errors.

Change-Id: Ie0188319618d9d8e7199b308c007fbaeacaed87c
Reviewed-on: https://review.haiku-os.org/c/haiku/+/5400
Tested-by: Commit checker robot <no-reply+buildbot@xxxxxxxxxxxx>
Reviewed-by: Jérôme Duval <jerome.duval@xxxxxxxxx>

----------------------------------------------------------------------------

diff --git a/src/add-ons/kernel/file_systems/ext2/Volume.cpp 
b/src/add-ons/kernel/file_systems/ext2/Volume.cpp
index dff0520458..cce2cba784 100644
--- a/src/add-ons/kernel/file_systems/ext2/Volume.cpp
+++ b/src/add-ons/kernel/file_systems/ext2/Volume.cpp
@@ -168,6 +168,16 @@ Volume::Mount(const char* deviceName, uint32 flags)
        if (!_VerifySuperBlock())
                return B_ERROR;
 
+       if ((fSuperBlock.State() & EXT2_FS_STATE_VALID) == 0
+               || (fSuperBlock.State() & EXT2_FS_STATE_ERROR) != 0) {
+               if (!IsReadOnly()) {
+                       FATAL("Volume::Mount(): can't mount R/W, volume not 
clean\n");
+                       return B_NOT_ALLOWED;
+               } else {
+                       FATAL("Volume::Mount(): warning: volume not clean\n");
+               }
+       }
+
        // initialize short hands to the superblock (to save byte swapping)
        fBlockShift = fSuperBlock.BlockShift();
        if (fBlockShift < 10 || fBlockShift > 16)
diff --git a/src/add-ons/kernel/file_systems/ext2/ext2.h 
b/src/add-ons/kernel/file_systems/ext2/ext2.h
index 3b4e4f0a06..a307bb8ed6 100644
--- a/src/add-ons/kernel/file_systems/ext2/ext2.h
+++ b/src/add-ons/kernel/file_systems/ext2/ext2.h
@@ -171,9 +171,9 @@ struct ext2_super_block {
 
 #define EXT2_MAX_REVISION              EXT2_DYNAMIC_REVISION
 
-#define EXT2_FS_STATE_VALID            1       // File system was cleanly 
unmounted
-#define EXT2_FS_STATE_ERROR            2       // File system has errors
-#define EXT2_FS_STATE_ORPHAN   3       // Orphans are being recovered
+#define EXT2_FS_STATE_VALID            0x1     // File system was cleanly 
unmounted
+#define EXT2_FS_STATE_ERROR            0x2     // File system has errors
+#define EXT2_FS_STATE_ORPHAN   0x4     // Orphans are being recovered
 
 // compatible features
 #define EXT2_FEATURE_DIRECTORY_PREALLOCATION   0x0001


Other related posts:

  • » [haiku-commits] haiku: hrev56217 - in src: add-ons/kernel/file_systems/ext2 system/kernel/device_manager - Jérôme Duval