* Added optional partition_module_info::uninitialize() hook. It is supposed to

destroy the partitioning system's on-disk structure.
* Adjusted the existing partitioning system implementations accordingly.
  Actually implemented the hook for the intel partitioning system.
* Added Uninitialize() method to KDiskSystem and KPartitioningSystem. The latter
  implements the method calling the new module hook.
* _user_uninitialize_partition(): Also let the disk system uninitialize the
  on-disk structure.

This fixes the failure to initialize a disk device with BFS, when it contains a
valid partition map with at least one partition.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42140 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold 2011-06-13 01:27:13 +00:00
parent f84387d6c4
commit 285f4cf441
11 changed files with 111 additions and 54 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright 2003-2008, Haiku, Inc. All Rights Reserved.
* Copyright 2003-2011, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
@ -88,6 +88,8 @@ public:
virtual status_t Initialize(KPartition* partition,
const char* name, const char* parameters,
disk_job_id job);
virtual status_t Uninitialize(KPartition* partition,
disk_job_id job);
virtual status_t CreateChild(KPartition* partition, off_t offset,
off_t size, const char* type,
const char* name, const char* parameters,

View File

@ -1,5 +1,5 @@
/*
* Copyright 2003-2007, Haiku, Inc. All Rights Reserved.
* Copyright 2003-2011, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
@ -64,6 +64,8 @@ public:
virtual status_t Initialize(KPartition* partition,
const char* name, const char* parameters,
disk_job_id job);
virtual status_t Uninitialize(KPartition* partition,
disk_job_id job);
virtual status_t CreateChild(KPartition* partition, off_t offset,
off_t size, const char* type,
const char* name, const char* parameters,

View File

@ -1,5 +1,5 @@
/*
* Copyright 2003-2008, Haiku Inc.
* Copyright 2003-2011, Haiku, Inc.
* Distributed under the terms of the MIT License.
*/
#ifndef _K_DISK_DEVICE_MODULES_H
@ -99,9 +99,11 @@ typedef struct partition_module_info {
const char* parameters, disk_job_id job);
status_t (*initialize)(int fd, partition_id partition, const char* name,
const char *parameters, off_t partitionSize, disk_job_id job);
status_t (*uninitialize)(int fd, partition_id partition,
off_t partitionSize, disk_job_id job);
status_t (*create_child)(int fd, partition_id partition, off_t offset,
off_t size, const char* type, const char* name,
const char* parameters, disk_job_id job,
off_t size, const char* type, const char* name,
const char* parameters, disk_job_id job,
partition_id* childID);
// childID is used for the return value, but is also an optional input
// parameter -- -1 to be ignored

View File

@ -1283,6 +1283,7 @@ partition_module_info gEFIPartitionModule = {
NULL, // set_parameters
NULL, // set_content_parameters
efi_gpt_initialize,
NULL, // uninitialize
efi_gpt_create_child,
efi_gpt_delete_child
#else

View File

@ -509,6 +509,7 @@ static partition_module_info intel_partition_map_module =
NULL, // set_parameters
NULL, // set_content_parameters
pm_initialize, // initialize
pm_uninitialize, // uninitialize
pm_create_child, // create_child
pm_delete_child, // delete_child
#else
@ -596,6 +597,7 @@ static partition_module_info intel_extended_partition_module =
NULL, // set_parameters
NULL, // set_content_parameters
ep_initialize, // initialize
NULL, // uninitialize
ep_create_child, // create_child
ep_delete_child, // delete_child
#else // _BOOT_MODE

View File

@ -1,9 +1,9 @@
/*
* Copyright 2003-2009, Haiku, Inc. All Rights Reserved.
* Copyright 2003-2011, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Ingo Weinhold, bonefish@cs.tu-berlin.de
* Ingo Weinhold, ingo_weinhold@gmx.de
* Tomas Kucera, kucerat@centrum.cz
*/
@ -1285,6 +1285,45 @@ pm_initialize(int fd, partition_id partitionID, const char* name,
}
status_t
pm_uninitialize(int fd, partition_id partitionID, off_t partitionSize,
disk_job_id job)
{
// get partition's block size
size_t blockSize;
{
PartitionReadLocker locker(partitionID);
if (!locker.IsLocked())
return B_ERROR;
partition_data* partition = get_partition(partitionID);
if (partition == NULL)
return B_BAD_VALUE;
update_disk_device_job_progress(job, 0.0);
blockSize = partition->block_size;
if (blockSize == 0)
return B_BAD_VALUE;
}
// We overwrite the first block, which contains the partition table.
// Allocate a buffer, we can clear and write.
void* block = malloc(blockSize);
if (block == NULL)
return B_NO_MEMORY;
MemoryDeleter blockDeleter(block);
memset(block, 0, blockSize);
if (write_pos(fd, 0, block, blockSize) < 0)
return errno;
update_disk_device_job_progress(job, 1.0);
return B_OK;
}
// pm_create_child
/*! childID is used for the return value, but is also an optional input
parameter -- -1 to be ignored

View File

@ -48,6 +48,8 @@ status_t pm_set_type(int fd, partition_id partitionID, const char* type,
disk_job_id job);
status_t pm_initialize(int fd, partition_id partitionID, const char* name,
const char* parameters, off_t partitionSize, disk_job_id job);
status_t pm_uninitialize(int fd, partition_id partitionID,
off_t partitionSize, disk_job_id job);
status_t pm_create_child(int fd, partition_id partitionID, off_t offset,
off_t size, const char* type, const char* name,
const char* parameters, disk_job_id job,

View File

@ -1,5 +1,5 @@
/*
* Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
* Copyright 2009-2011, Ingo Weinhold, ingo_weinhold@gmx.de.
* Distributed under the terms of the MIT License.
*/
@ -461,47 +461,7 @@ static partition_module_info vmdk_partition_module =
vmdk_free_partition_cookie, // free_partition_cookie
vmdk_free_partition_content_cookie, // free_partition_content_cookie
#ifndef _BOOT_MODE
// querying (obsolete)
NULL, // get_supported_operations
NULL, // get_supported_child_operations
NULL, // supports_initializing_child
NULL, // is_sub_system_for
// validation hooks (obsolete)
NULL, // validate_resize
NULL, // validate_resize_child
NULL, // validate_move
NULL, // validate_move_child
NULL, // validate_set_name
NULL, // validate_set_content_name
NULL, // validate_set_type
NULL, // validate_set_parameters
NULL, // validate_set_content_parameters
NULL, // validate_initialize
NULL, // validate_create_child
NULL, // get_partitionable_spaces
NULL, // get_next_supported_type
NULL, // get_type_for_content_type
// shadow partition modification (obsolete)
NULL, // shadow_changed
// writing
NULL, // repair
NULL, // resize
NULL, // resize_child
NULL, // move
NULL, // move_child
NULL, // set_name
NULL, // set_content_name
NULL, // set_type
NULL, // set_parameters
NULL, // set_content_parameters
NULL, // initialize
NULL, // create_child
NULL, // delete_child
#else
#ifdef _BOOT_MODE
NULL
#endif // _BOOT_MODE
};

View File

@ -1,4 +1,8 @@
// KDiskSystem.cpp
/*
* Copyright 2003-2011, Ingo Weinhold, ingo_weinhold@gmx.de.
* Distributed under the terms of the MIT License.
*/
#include <stdio.h>
#include <stdlib.h>
@ -318,6 +322,14 @@ KDiskSystem::Initialize(KPartition* partition, const char* name,
}
status_t
KDiskSystem::Uninitialize(KPartition* partition, disk_job_id job)
{
// to be implemented by derived classes
return B_NOT_SUPPORTED;
}
// CreateChild
status_t
KDiskSystem::CreateChild(KPartition* partition, off_t offset, off_t size,

View File

@ -1,5 +1,5 @@
/*
* Copyright 2003-2007, Haiku, Inc. All Rights Reserved.
* Copyright 2003-2011, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
@ -413,6 +413,30 @@ KPartitioningSystem::Initialize(KPartition* partition, const char* name,
}
status_t
KPartitioningSystem::Uninitialize(KPartition* partition, disk_job_id job)
{
// check parameters
if (partition == NULL || fModule == NULL)
return B_BAD_VALUE;
if (fModule->uninitialize == NULL)
return B_NOT_SUPPORTED;
// open partition device
int fd = -1;
status_t result = partition->Open(O_RDWR, &fd);
if (result != B_OK)
return result;
// let the module do its job
result = fModule->uninitialize(fd, partition->ID(), partition->Size(), job);
// cleanup and return
close(fd);
return result;
}
// CreateChild
//! Creates a child partition
status_t

View File

@ -1,9 +1,9 @@
/*
* Copyright 2003-2009, Haiku, Inc. All Rights Reserved.
* Copyright 2003-2011, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Ingo Weinhold, bonefish@cs.tu-berlin.de
* Ingo Weinhold, ingo_weinhold@gmx.de
* Axel Dörfler, axeld@pinc-software.de
*/
@ -1251,7 +1251,18 @@ _user_uninitialize_partition(partition_id partitionID, int32* _changeCounter)
// TODO: We should also check, if any partition is mounted!
// uninitialize
KDiskSystem* diskSystem = partition->DiskSystem();
locker.Unlock();
// Let the disk system uninitialize the partition. This operation is not
// mandatory. If implemented, it will destroy the on-disk structures, so
// that the disk system cannot accidentally identify the partition later on.
if (diskSystem != NULL)
diskSystem->Uninitialize(partition, DUMMY_JOB_ID);
// re-lock and uninitialize the partition object
locker.Lock();
error = partition->UninitializeContents(true);
partition->UnmarkBusy(true);