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:
@@ -19,7 +19,7 @@ extern "C" {
|
|||||||
status_t devfs_unpublish_file_device(const char *path);
|
status_t devfs_unpublish_file_device(const char *path);
|
||||||
status_t devfs_publish_file_device(const char *path, const char *filePath);
|
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_publish_partition(const char *name, const partition_info *info);
|
||||||
status_t devfs_rename_partition(const char *devicePath, const char *oldName,
|
status_t devfs_rename_partition(const char *devicePath, const char *oldName,
|
||||||
const char *newName);
|
const char *newName);
|
||||||
|
|||||||
@@ -2043,32 +2043,15 @@ devfs_publish_file_device(const char *path, const char *filePath)
|
|||||||
|
|
||||||
|
|
||||||
extern "C" status_t
|
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 *node;
|
||||||
devfs_vnode* deviceNode;
|
status_t status = get_node_for_path(sDeviceFileSystem, path, &node);
|
||||||
status_t status = get_node_for_path(sDeviceFileSystem, devicePath,
|
|
||||||
&deviceNode);
|
|
||||||
if (status != B_OK)
|
if (status != B_OK)
|
||||||
return status;
|
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);
|
status = unpublish_node(sDeviceFileSystem, node, S_IFCHR);
|
||||||
put_vnode(sDeviceFileSystem->volume, node->id);
|
put_vnode(sDeviceFileSystem->volume, node->id);
|
||||||
}
|
|
||||||
|
|
||||||
put_vnode(sDeviceFileSystem->volume, deviceNode->id);
|
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -232,8 +232,15 @@ KPartition::UnpublishDevice()
|
|||||||
if (!fPublishedName)
|
if (!fPublishedName)
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
|
||||||
status_t error = devfs_unpublish_partition(Device()->Path(),
|
// get the path
|
||||||
fPublishedName);
|
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) {
|
if (error != B_OK) {
|
||||||
dprintf("KPartition::UnpublishDevice(): Failed to unpublish partition "
|
dprintf("KPartition::UnpublishDevice(): Failed to unpublish partition "
|
||||||
"%ld: %s\n", ID(), strerror(error));
|
"%ld: %s\n", ID(), strerror(error));
|
||||||
|
|||||||
@@ -13,9 +13,9 @@
|
|||||||
|
|
||||||
|
|
||||||
extern "C" status_t
|
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;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user