Removing the nodes from the unused list in fs_unmount() had the side effect that

the root vnode was tried to be removed as well (which resulted in a crash).
Since playing with the root node reference count is a bad idea anyway and opens
a big race condition (with regards to the unused list), we no longer do that
now, until it's safe.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16665 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2006-03-08 22:57:53 +00:00
parent 168049c8be
commit abb84c7d51
+8 -6
View File
@@ -5252,10 +5252,6 @@ fs_unmount(char *path, uint32 flags, bool kernel)
// a vnode while we're figuring out if we can continue
mutex_lock(&sVnodeMutex);
// simplify the loop below: we decrement the root vnode ref_count
// by the known number of references: one for the file system, one
// from the path_to_vnode() call above
mount->root_vnode->ref_count -= 2;
bool disconnectedDescriptors = false;
@@ -5266,7 +5262,11 @@ fs_unmount(char *path, uint32 flags, bool kernel)
// make sure all of them are not busy or have refs on them
vnode = NULL;
while ((vnode = (struct vnode *)list_get_next_item(&mount->vnodes, vnode)) != NULL) {
if (vnode->busy || vnode->ref_count != 0) {
// The root vnode ref_count needs to be 2 here: one for the file
// system, one from the path_to_vnode() call above
if (vnode->busy
|| ((vnode->ref_count != 0 && mount->root_vnode != vnode)
|| (vnode->ref_count != 2 && mount->root_vnode == vnode))) {
// there are still vnodes in use on this mount, so we cannot
// unmount yet
busy = true;
@@ -5278,7 +5278,6 @@ fs_unmount(char *path, uint32 flags, bool kernel)
break;
if ((flags & B_FORCE_UNMOUNT) == 0) {
mount->root_vnode->ref_count += 2;
mutex_unlock(&sVnodeMutex);
put_vnode(mount->root_vnode);
@@ -5396,6 +5395,9 @@ fs_unmount(char *path, uint32 flags, bool kernel)
}
}
// The ref_count of the root node is 2 at this point, see above why this is
mount->root_vnode->ref_count -= 2;
mutex_unlock(&sVnodeMutex);
mount->covers_vnode->covered_by = NULL;