packagefs: Fix adding package links twice to volume
PackageLinkDirectory::NotifyDirectoryAdded() first notified the listener (Volume) about the directory itself, then about the links it contained. Since Volume adds the nodes recursively, the latter were added twice, resulting in a corrupted ID hash table.
This commit is contained in:
@@ -149,26 +149,6 @@ PackageLinkDirectory::UpdatePackageDependencies(Package* package,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
PackageLinkDirectory::NotifyDirectoryAdded(PackageLinksListener* listener)
|
|
||||||
{
|
|
||||||
NodeWriteLocker writeLocker(this);
|
|
||||||
|
|
||||||
listener->PackageLinkNodeAdded(this);
|
|
||||||
|
|
||||||
if (fSelfLink != NULL) {
|
|
||||||
NodeWriteLocker selfLinkLocker(fSelfLink);
|
|
||||||
listener->PackageLinkNodeAdded(fSelfLink);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (FamilyDependencyList::Iterator it = fDependencyLinks.GetIterator();
|
|
||||||
DependencyLink* link = it.Next();) {
|
|
||||||
NodeWriteLocker linkLocker(link);
|
|
||||||
listener->PackageLinkNodeAdded(link);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
PackageLinkDirectory::_Update(PackageLinksListener* listener)
|
PackageLinkDirectory::_Update(PackageLinksListener* listener)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -32,9 +32,6 @@ public:
|
|||||||
void UpdatePackageDependencies(Package* package,
|
void UpdatePackageDependencies(Package* package,
|
||||||
PackageLinksListener* listener);
|
PackageLinksListener* listener);
|
||||||
|
|
||||||
void NotifyDirectoryAdded(
|
|
||||||
PackageLinksListener* listener);
|
|
||||||
|
|
||||||
bool IsEmpty() const
|
bool IsEmpty() const
|
||||||
{ return fPackages.IsEmpty(); }
|
{ return fPackages.IsEmpty(); }
|
||||||
|
|
||||||
|
|||||||
@@ -70,8 +70,10 @@ PackageLinksDirectory::AddPackage(Package* package)
|
|||||||
// No entry is in the way, so just add the link directory.
|
// No entry is in the way, so just add the link directory.
|
||||||
AddChild(linkDirectory);
|
AddChild(linkDirectory);
|
||||||
|
|
||||||
if (fListener != NULL)
|
if (fListener != NULL) {
|
||||||
linkDirectory->NotifyDirectoryAdded(fListener);
|
NodeWriteLocker writeLocker(linkDirectory);
|
||||||
|
fListener->PackageLinkNodeAdded(linkDirectory);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
|||||||
Reference in New Issue
Block a user