From d564275ba7c6dd4b5e2ca5de251927dcde6b134d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Mon, 4 Sep 2006 12:37:56 +0000 Subject: [PATCH] added disk systems rescan to DiskDeviceManager, and called it in the post init phase the next step would be to rescan the partition tree with a job to recognize unrecognized partitions (asynchronously ?) git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@18737 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/kernel/ddm.h | 19 ++++++++++++++ .../disk_device_manager/KDiskDeviceManager.h | 1 + .../KDiskDeviceManager.cpp | 25 +++++++++++++++++++ .../disk_device_manager.cpp | 8 ++++++ src/system/kernel/main.c | 2 ++ 5 files changed, 55 insertions(+) create mode 100644 headers/private/kernel/ddm.h diff --git a/headers/private/kernel/ddm.h b/headers/private/kernel/ddm.h new file mode 100644 index 0000000000..5a6137e9f1 --- /dev/null +++ b/headers/private/kernel/ddm.h @@ -0,0 +1,19 @@ +/* + * Copyright 2006, Jerome Duval. All rights reserved. + * Distributed under the terms of the MIT License. + * + */ +#ifndef _KERNEL_DDM_H +#define _KERNEL_DDM_H + +#ifdef __cplusplus +extern "C" { +#endif + +status_t ddm_init_post_modules(struct kernel_args *args); + +#ifdef __cplusplus +} +#endif + +#endif /* _KERNEL_DDM_H */ diff --git a/headers/private/kernel/disk_device_manager/KDiskDeviceManager.h b/headers/private/kernel/disk_device_manager/KDiskDeviceManager.h index 99afe4b8ed..7dfc1c5b27 100644 --- a/headers/private/kernel/disk_device_manager/KDiskDeviceManager.h +++ b/headers/private/kernel/disk_device_manager/KDiskDeviceManager.h @@ -120,6 +120,7 @@ public: // by the registrar. status_t InitialDeviceScan(); + status_t RescanDiskSystems(); private: status_t _AddPartitioningSystem(const char *name); diff --git a/src/system/kernel/disk_device_manager/KDiskDeviceManager.cpp b/src/system/kernel/disk_device_manager/KDiskDeviceManager.cpp index c34fb0fb59..001bb8eae8 100644 --- a/src/system/kernel/disk_device_manager/KDiskDeviceManager.cpp +++ b/src/system/kernel/disk_device_manager/KDiskDeviceManager.cpp @@ -929,6 +929,31 @@ KDiskDeviceManager::InitialDeviceScan() return error; } +//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 + + return B_OK; +} + // _AddPartitioningSystem status_t KDiskDeviceManager::_AddPartitioningSystem(const char *name) diff --git a/src/system/kernel/disk_device_manager/disk_device_manager.cpp b/src/system/kernel/disk_device_manager/disk_device_manager.cpp index 1f8dc57d51..d13d97dbdf 100644 --- a/src/system/kernel/disk_device_manager/disk_device_manager.cpp +++ b/src/system/kernel/disk_device_manager/disk_device_manager.cpp @@ -3,6 +3,7 @@ #include #include +#include "ddm.h" #include "disk_device_manager.h" #include "KDiskDevice.h" #include "KDiskDeviceJob.h" @@ -273,3 +274,10 @@ update_disk_device_job_interrupt_properties(disk_job_id jobID, return B_DISK_DEVICE_JOB_CONTINUE; } +status_t +ddm_init_post_modules(kernel_args *args) +{ + KDiskDeviceManager *manager = KDiskDeviceManager::Default(); + return manager->RescanDiskSystems(); +} + diff --git a/src/system/kernel/main.c b/src/system/kernel/main.c index 4231eaadcf..ec2d4dc508 100644 --- a/src/system/kernel/main.c +++ b/src/system/kernel/main.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -227,6 +228,7 @@ main2(void *unused) cpu_init_post_modules(&sKernelArgs); vm_init_post_modules(&sKernelArgs); debug_init_post_modules(&sKernelArgs); + ddm_init_post_modules(&sKernelArgs); // start the init process {