From fe679b9fa7210f8c0622ff33f723d87d8f8732ad Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Thu, 19 Jul 2007 13:32:33 +0000 Subject: [PATCH] axeld+bonefish: * Refactored RescanDiskSystems(). Pulled out a function _RescanDiskSystems() that scans for either file or partitioning systems. RescanDiskSystems(), which scanned for file systems only before, is used from the constructor as well (open_module_list() works in the early boot process since a while). * Made InitialDeviceScan() and partition scanning safe to be called a second time. We call it directly after the kernel has mounted the boot volume, now, so that additional disk systems from the boot volume have a chance to recognize previously unrecognized partitions. This is a temporary change only; later the disk device manager shall automatically find out when new disk systems/devices/whatever are available. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21655 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../KDiskDeviceManager.cpp | 92 +++++++++---------- .../jobs/KScanPartitionJob.cpp | 4 + src/system/kernel/fs/vfs_boot.cpp | 3 + 3 files changed, 53 insertions(+), 46 deletions(-) diff --git a/src/system/kernel/disk_device_manager/KDiskDeviceManager.cpp b/src/system/kernel/disk_device_manager/KDiskDeviceManager.cpp index eecb23869f..2924aa0a15 100644 --- a/src/system/kernel/disk_device_manager/KDiskDeviceManager.cpp +++ b/src/system/kernel/disk_device_manager/KDiskDeviceManager.cpp @@ -131,34 +131,7 @@ KDiskDeviceManager::KDiskDeviceManager() if (InitCheck() != B_OK) return; - // We are in early boot mode, so open_module_list() won't find what - // we're looking for; we need to use get_next_loaded_module_name() - // instead. - - uint32 cookie = 0; - size_t partitioningPrefixLength = strlen(kPartitioningSystemPrefix); - size_t filePrefixLength = strlen(kFileSystemPrefix); - - while (true) { - KPath name; - if (name.InitCheck() != B_OK) - break; - size_t nameLength = name.BufferSize(); - if (get_next_loaded_module_name(&cookie, name.LockBuffer(), - &nameLength) != B_OK) { - break; - } - name.UnlockBuffer(); - - if (!strncmp(name.Path(), kPartitioningSystemPrefix, - partitioningPrefixLength)) { - DBG(OUT("partitioning system: %s\n", name.Path())); - _AddPartitioningSystem(name.Path()); - } else if (!strncmp(name.Path(), kFileSystemPrefix, filePrefixLength)) { - DBG(OUT("file system: %s\n", name.Path())); - _AddFileSystem(name.Path()); - } - } + RescanDiskSystems(); DBG(OUT("number of disk systems: %ld\n", CountDiskSystems())); // TODO: Watch the disk systems and the relevant directories. @@ -929,27 +902,49 @@ KDiskDeviceManager::InitialDeviceScan() return error; } -//RescanDiskSystems +// _RescanDiskSystems +status_t +KDiskDeviceManager::_RescanDiskSystems(bool fileSystems) +{ + void *cookie = open_module_list(fileSystems + ? kFileSystemPrefix : kPartitioningSystemPrefix); + if (cookie == NULL) + return B_NO_MEMORY; + + while (true) { + KPath name; + if (name.InitCheck() != B_OK) + break; + size_t nameLength = name.BufferSize(); + if (read_next_module_name(cookie, name.LockBuffer(), + &nameLength) != B_OK) { + break; + } + name.UnlockBuffer(); + + if (FindDiskSystem(name.Path())) + continue; + + if (fileSystems) { + DBG(OUT("file system: %s\n", name.Path())); + _AddFileSystem(name.Path()); + } else { + DBG(OUT("partitioning system: %s\n", name.Path())); + _AddPartitioningSystem(name.Path()); + } + } + + close_module_list(cookie); + return B_OK; +} + +// RescanDiskSystems status_t KDiskDeviceManager::RescanDiskSystems() { - // load file systems list - void *cookie = open_module_list(kFileSystemPrefix); - - while (true) { - char name[B_FILE_NAME_LENGTH]; - size_t nameLength = sizeof(name); - module_info *module; - - if (read_next_module_name(cookie, name, &nameLength) != B_OK) - break; - if (FindDiskSystem(name)) - continue; - _AddFileSystem(name); - } - close_module_list(cookie); - - // TODO rescan partition tree for unrecognized partitions + // rescan for partitioning and file systems + _RescanDiskSystems(false); + _RescanDiskSystems(true); return B_OK; } @@ -1161,6 +1156,11 @@ DBG(OUT("KDiskDeviceManager::_Scan(%s)\n", path)); int32 leafLen = strlen("/raw"); if (len <= leafLen || strcmp(path + len - leafLen, "/raw")) return B_ERROR; + if (FindDevice(path) != NULL) { + // we already know this device + return B_OK; + } + DBG(OUT(" found device: %s\n", path)); // create a KDiskDevice for it KDiskDevice *device = new(nothrow) KDiskDevice; diff --git a/src/system/kernel/disk_device_manager/jobs/KScanPartitionJob.cpp b/src/system/kernel/disk_device_manager/jobs/KScanPartitionJob.cpp index 8bab3ab746..443e737814 100644 --- a/src/system/kernel/disk_device_manager/jobs/KScanPartitionJob.cpp +++ b/src/system/kernel/disk_device_manager/jobs/KScanPartitionJob.cpp @@ -63,6 +63,10 @@ KScanPartitionJob::_ScanPartition(KPartition *partition) // the partition's device must be write-locked if (!partition) return B_BAD_VALUE; + if (partition->DiskSystem() != NULL) { + // TODO: this is more or less a hack to prevent rescanning a partition + return B_OK; + } DBG( KPath partitionPath; diff --git a/src/system/kernel/fs/vfs_boot.cpp b/src/system/kernel/fs/vfs_boot.cpp index cb6420f696..f8ce00e7f5 100644 --- a/src/system/kernel/fs/vfs_boot.cpp +++ b/src/system/kernel/fs/vfs_boot.cpp @@ -508,5 +508,8 @@ vfs_mount_boot_file_system(kernel_args *args) // search for other disk systems KDiskDeviceManager *manager = KDiskDeviceManager::Default(); manager->RescanDiskSystems(); + manager->InitialDeviceScan(); + // TODO: later, the DDM should notice when there are new + // partitions/devices available }