Added a new variant of add_partitions_for() which takes a device instead
of a file descriptor as first argument. add_partitions_for() is now able to only mount file systems if requested; partitions with unknown contents will not be removed from the list if it doesn't try to mount them. Moved the file system mounting code to the new Partition::Mount() method. Partition::Scan() now only mounts file systems if requested. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@4882 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -172,8 +172,31 @@ Partition::AddChild()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
Partition::Mount(Directory **_fileSystem)
|
||||||
|
{
|
||||||
|
for (int32 i = 0; i < sNumFileSystemModules; i++) {
|
||||||
|
file_system_module_info *module = sFileSystemModules[i];
|
||||||
|
|
||||||
|
TRACE(("check for file_system: %s\n", module->pretty_name));
|
||||||
|
|
||||||
|
Directory *fileSystem;
|
||||||
|
if (module->get_file_system(this, &fileSystem) == B_OK) {
|
||||||
|
gRoot->AddNode(fileSystem);
|
||||||
|
if (_fileSystem)
|
||||||
|
*_fileSystem = fileSystem;
|
||||||
|
|
||||||
|
fIsFileSystem = true;
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return B_ENTRY_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
Partition::Scan()
|
Partition::Scan(bool mountFileSystems)
|
||||||
{
|
{
|
||||||
// scan for partitions first (recursively all eventual children as well)
|
// scan for partitions first (recursively all eventual children as well)
|
||||||
|
|
||||||
@@ -200,10 +223,10 @@ Partition::Scan()
|
|||||||
TRACE(("*** scan child %p (start = %Ld, size = %Ld, parent = %p)!\n",
|
TRACE(("*** scan child %p (start = %Ld, size = %Ld, parent = %p)!\n",
|
||||||
child, child->offset, child->size, child->Parent()));
|
child, child->offset, child->size, child->Parent()));
|
||||||
|
|
||||||
child->Scan();
|
child->Scan(mountFileSystems);
|
||||||
|
|
||||||
if (child->IsFileSystem()) {
|
if (!mountFileSystems || child->IsFileSystem()) {
|
||||||
// move the file systems to the partition list
|
// move the partitions containing file systems to the partition list
|
||||||
list_remove_item(&fChildren, child);
|
list_remove_item(&fChildren, child);
|
||||||
list_add_item(&gPartitions, child);
|
list_add_item(&gPartitions, child);
|
||||||
|
|
||||||
@@ -225,19 +248,8 @@ Partition::Scan()
|
|||||||
|
|
||||||
// scan for file systems
|
// scan for file systems
|
||||||
|
|
||||||
for (int32 i = 0; i < sNumFileSystemModules; i++) {
|
if (mountFileSystems)
|
||||||
file_system_module_info *module = sFileSystemModules[i];
|
return Mount();
|
||||||
|
|
||||||
TRACE(("check for file_system: %s\n", module->pretty_name));
|
|
||||||
|
|
||||||
Directory *fileSystem;
|
|
||||||
if (module->get_file_system(this, &fileSystem) == B_OK) {
|
|
||||||
gRoot->AddNode(fileSystem);
|
|
||||||
|
|
||||||
fIsFileSystem = true;
|
|
||||||
return B_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return B_ENTRY_NOT_FOUND;
|
return B_ENTRY_NOT_FOUND;
|
||||||
}
|
}
|
||||||
@@ -249,7 +261,7 @@ Partition::Scan()
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
add_partitions_for(int fd)
|
add_partitions_for(int fd, bool mountFileSystems)
|
||||||
{
|
{
|
||||||
Partition *partition = new Partition(fd);
|
Partition *partition = new Partition(fd);
|
||||||
|
|
||||||
@@ -257,7 +269,10 @@ add_partitions_for(int fd)
|
|||||||
partition->block_size = 512;
|
partition->block_size = 512;
|
||||||
partition->size = partition->Size();
|
partition->size = partition->Size();
|
||||||
|
|
||||||
if (partition->Scan() == B_OK && partition->IsFileSystem()) {
|
// add this partition to the list of partitions, if it contains
|
||||||
|
// or might contain a file system
|
||||||
|
if ((partition->Scan(mountFileSystems) == B_OK && partition->IsFileSystem())
|
||||||
|
|| (!partition->IsFileSystem() && !mountFileSystems)) {
|
||||||
list_add_item(&gPartitions, partition);
|
list_add_item(&gPartitions, partition);
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
@@ -267,6 +282,22 @@ add_partitions_for(int fd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
add_partitions_for(Node *device, bool mountFileSystems)
|
||||||
|
{
|
||||||
|
int fd = open_node(device, O_RDONLY);
|
||||||
|
if (fd < B_OK)
|
||||||
|
return fd;
|
||||||
|
|
||||||
|
status_t status = add_partitions_for(fd, mountFileSystems);
|
||||||
|
if (status < B_OK)
|
||||||
|
printf("add_partitions_for(%d) failed: %ld\n", fd, status);
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
partition_data *
|
partition_data *
|
||||||
create_child_partition(partition_id id, int32 index, partition_id childID)
|
create_child_partition(partition_id id, int32 index, partition_id childID)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user