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:
parent
5d4c68c2f7
commit
14429e896e
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user