Reverted the part of r31520 that made devfs_unpublish_partition() take a raw

device path + child partition name. When a "raw" device is unpublished the node
removal notification triggers the partition and child partitions to be
unpublished/removed. Since in that case the "raw" node is already unpublished
trying to resolve it in devfs_unpublish_partition() again to unpublish the child
partitions would fail, leaving the child partition nodes behind. When a new raw
device would then become available publishing its partitions would fail because
of these left behind nodes, causing bug #4587. Seeing that this code is more
compact and straight forward anyway I don't quite see why it was changed in the
first place.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34967 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Michael Lotz 2010-01-09 03:55:38 +00:00
parent 5d4c68c2f7
commit 14429e896e
4 changed files with 17 additions and 27 deletions

View File

@ -19,7 +19,7 @@ extern "C" {
status_t devfs_unpublish_file_device(const char *path);
status_t devfs_publish_file_device(const char *path, const char *filePath);
status_t devfs_unpublish_partition(const char *devicePath, const char *name);
status_t devfs_unpublish_partition(const char *path);
status_t devfs_publish_partition(const char *name, const partition_info *info);
status_t devfs_rename_partition(const char *devicePath, const char *oldName,
const char *newName);

View File

@ -2043,32 +2043,15 @@ devfs_publish_file_device(const char *path, const char *filePath)
extern "C" status_t
devfs_unpublish_partition(const char *devicePath, const char *name)
devfs_unpublish_partition(const char* path)
{
// get the device node
devfs_vnode* deviceNode;
status_t status = get_node_for_path(sDeviceFileSystem, devicePath,
&deviceNode);
devfs_vnode *node;
status_t status = get_node_for_path(sDeviceFileSystem, path, &node);
if (status != B_OK)
return status;
// get the partition node and temporarily increment its ref count
RecursiveLocker locker(sDeviceFileSystem->lock);
devfs_vnode* node = devfs_find_in_dir(deviceNode->parent, name);
if (node != NULL)
status = get_vnode(sDeviceFileSystem->volume, node->id, (void**)&node);
else
status = B_ENTRY_NOT_FOUND;
locker.Unlock();
// unpublish the partition node
if (status == B_OK) {
status = unpublish_node(sDeviceFileSystem, node, S_IFCHR);
put_vnode(sDeviceFileSystem->volume, node->id);
}
put_vnode(sDeviceFileSystem->volume, deviceNode->id);
status = unpublish_node(sDeviceFileSystem, node, S_IFCHR);
put_vnode(sDeviceFileSystem->volume, node->id);
return status;
}

View File

@ -232,8 +232,15 @@ KPartition::UnpublishDevice()
if (!fPublishedName)
return B_OK;
status_t error = devfs_unpublish_partition(Device()->Path(),
fPublishedName);
// get the path
KPath path;
status_t error = GetPath(&path);
if (error != B_OK) {
dprintf("KPartition::UnpublishDevice(): Failed to get path for "
"partition %ld: %s\n", ID(), strerror(error));
}
error = devfs_unpublish_partition(path.Path());
if (error != B_OK) {
dprintf("KPartition::UnpublishDevice(): Failed to unpublish partition "
"%ld: %s\n", ID(), strerror(error));

View File

@ -13,9 +13,9 @@
extern "C" status_t
devfs_unpublish_partition(const char *devicePath, const char *name)
devfs_unpublish_partition(const char *path)
{
printf("unpublish partition: %s/%s\n", devicePath, name);
printf("unpublish partition: %s\n", path);
return B_OK;
}