Author: mmlr Date: 2010-01-09 04:55:38 +0100 (Sat, 09 Jan 2010) New Revision: 34967 Changeset: http://dev.haiku-os.org/changeset/34967/haiku Ticket: http://dev.haiku-os.org/ticket/4587 Modified: haiku/trunk/headers/private/kernel/fs/devfs.h haiku/trunk/src/system/kernel/device_manager/devfs.cpp haiku/trunk/src/system/kernel/disk_device_manager/KPartition.cpp haiku/trunk/src/tests/add-ons/kernel/kernelland_emu/device_manager.cpp Log: 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. Modified: haiku/trunk/headers/private/kernel/fs/devfs.h =================================================================== --- haiku/trunk/headers/private/kernel/fs/devfs.h 2010-01-09 02:21:22 UTC (rev 34966) +++ haiku/trunk/headers/private/kernel/fs/devfs.h 2010-01-09 03:55:38 UTC (rev 34967) @@ -19,7 +19,7 @@ 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); Modified: haiku/trunk/src/system/kernel/device_manager/devfs.cpp =================================================================== --- haiku/trunk/src/system/kernel/device_manager/devfs.cpp 2010-01-09 02:21:22 UTC (rev 34966) +++ haiku/trunk/src/system/kernel/device_manager/devfs.cpp 2010-01-09 03:55:38 UTC (rev 34967) @@ -2043,32 +2043,15 @@ 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; } Modified: haiku/trunk/src/system/kernel/disk_device_manager/KPartition.cpp =================================================================== --- haiku/trunk/src/system/kernel/disk_device_manager/KPartition.cpp 2010-01-09 02:21:22 UTC (rev 34966) +++ haiku/trunk/src/system/kernel/disk_device_manager/KPartition.cpp 2010-01-09 03:55:38 UTC (rev 34967) @@ -232,9 +232,16 @@ 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)); } Modified: haiku/trunk/src/tests/add-ons/kernel/kernelland_emu/device_manager.cpp =================================================================== --- haiku/trunk/src/tests/add-ons/kernel/kernelland_emu/device_manager.cpp 2010-01-09 02:21:22 UTC (rev 34966) +++ haiku/trunk/src/tests/add-ons/kernel/kernelland_emu/device_manager.cpp 2010-01-09 03:55:38 UTC (rev 34967) @@ -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; }