[haiku-commits] r34967 - in haiku/trunk: headers/private/kernel/fs src/system/kernel/device_manager src/system/kernel/disk_device_manager src/tests/add-ons/kernel/kernelland_emu

  • From: mmlr@xxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 9 Jan 2010 04:55:39 +0100 (CET)

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;
 }
 


Other related posts: