diff --git a/src/add-ons/kernel/file_systems/packagefs/nodes/Directory.cpp b/src/add-ons/kernel/file_systems/packagefs/nodes/Directory.cpp index b34ebc5052..a809561193 100644 --- a/src/add-ons/kernel/file_systems/packagefs/nodes/Directory.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/nodes/Directory.cpp @@ -31,9 +31,9 @@ Directory::~Directory() status_t -Directory::Init(Directory* parent, const String& name) +Directory::Init(const String& name) { - status_t error = Node::Init(parent, name); + status_t error = Node::Init(name); if (error != B_OK) return error; @@ -80,8 +80,11 @@ void Directory::AddChild(Node* node) { ASSERT_WRITE_LOCKED_RW_LOCK(&fLock); + ASSERT(node->Parent() == NULL); + fChildTable.Insert(node); fChildList.Add(node); + node->_SetParent(this); node->AcquireReference(); } @@ -90,10 +93,13 @@ void Directory::RemoveChild(Node* node) { ASSERT_WRITE_LOCKED_RW_LOCK(&fLock); + ASSERT(node->Parent() == this); + Node* nextNode = fChildList.GetNext(node); fChildTable.Remove(node); fChildList.Remove(node); + node->_SetParent(NULL); node->ReleaseReference(); // adjust directory iterators pointing to the removed child diff --git a/src/add-ons/kernel/file_systems/packagefs/nodes/Directory.h b/src/add-ons/kernel/file_systems/packagefs/nodes/Directory.h index 402bf45587..d269bd4620 100644 --- a/src/add-ons/kernel/file_systems/packagefs/nodes/Directory.h +++ b/src/add-ons/kernel/file_systems/packagefs/nodes/Directory.h @@ -27,7 +27,7 @@ public: Directory(ino_t id); virtual ~Directory(); - virtual status_t Init(Directory* parent, const String& name); + virtual status_t Init(const String& name); virtual mode_t Mode() const; virtual off_t FileSize() const; diff --git a/src/add-ons/kernel/file_systems/packagefs/nodes/Node.cpp b/src/add-ons/kernel/file_systems/packagefs/nodes/Node.cpp index 9bcf73af38..fd05e4e1fd 100644 --- a/src/add-ons/kernel/file_systems/packagefs/nodes/Node.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/nodes/Node.cpp @@ -23,26 +23,37 @@ Node::Node(ino_t id) fName(), fFlags(0) { - rw_lock_init(&fLock, "packagefs node"); } Node::~Node() { - rw_lock_destroy(&fLock); } status_t -Node::Init(Directory* parent, const String& name) +Node::Init(const String& name) { - fParent = parent; fName = name; fFlags = 0; return B_OK; } +void +Node::SetID(ino_t id) +{ + fID = id; +} + + +void +Node::_SetParent(Directory* parent) +{ + fParent = parent; +} + + status_t Node::VFSInit(dev_t deviceID) { @@ -58,20 +69,6 @@ Node::VFSUninit() } -void -Node::SetID(ino_t id) -{ - fID = id; -} - - -void -Node::SetParent(Directory* parent) -{ - fParent = parent; -} - - uid_t Node::UserID() const { diff --git a/src/add-ons/kernel/file_systems/packagefs/nodes/Node.h b/src/add-ons/kernel/file_systems/packagefs/nodes/Node.h index 7715a6700b..04aa9a7c32 100644 --- a/src/add-ons/kernel/file_systems/packagefs/nodes/Node.h +++ b/src/add-ons/kernel/file_systems/packagefs/nodes/Node.h @@ -57,7 +57,8 @@ public: Node*& IDHashTableNext() { return fIDHashTableNext; } - virtual status_t Init(Directory* parent, const String& name); + virtual status_t Init(const String& name); + void SetID(ino_t id); virtual status_t VFSInit(dev_t deviceID); // base class version must be called on @@ -67,9 +68,6 @@ public: inline bool IsKnownToVFS() const; inline bool HasVFSInitError() const; - void SetID(ino_t id); - void SetParent(Directory* parent); - virtual mode_t Mode() const = 0; virtual uid_t UserID() const; virtual gid_t GroupID() const; @@ -92,6 +90,11 @@ public: virtual void* IndexCookieForAttribute(const StringKey& name) const; +private: + friend class Directory; + + void _SetParent(Directory* parent); + protected: rw_lock fLock; ino_t fID; diff --git a/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingLeafNode.cpp b/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingLeafNode.cpp index eed45a0255..45b6a9a7af 100644 --- a/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingLeafNode.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingLeafNode.cpp @@ -220,7 +220,7 @@ UnpackingLeafNode::CloneTransferPackageNodes(ino_t id, UnpackingNode*& _newNode) if (clone == NULL) return B_NO_MEMORY; - status_t error = clone->Init(Parent(), Name()); + status_t error = clone->Init(Name()); if (error != B_OK) { delete clone; return error; diff --git a/src/add-ons/kernel/file_systems/packagefs/package_links/PackageLinkDirectory.cpp b/src/add-ons/kernel/file_systems/packagefs/package_links/PackageLinkDirectory.cpp index d3bc55ef98..8861c9e747 100644 --- a/src/add-ons/kernel/file_systems/packagefs/package_links/PackageLinkDirectory.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/package_links/PackageLinkDirectory.cpp @@ -45,10 +45,10 @@ PackageLinkDirectory::~PackageLinkDirectory() status_t -PackageLinkDirectory::Init(Directory* parent, Package* package) +PackageLinkDirectory::Init(Package* package) { // init the directory/node - status_t error = Init(parent, package->VersionedName()); + status_t error = Init(package->VersionedName()); if (error != B_OK) RETURN_ERROR(error); @@ -60,9 +60,9 @@ PackageLinkDirectory::Init(Directory* parent, Package* package) status_t -PackageLinkDirectory::Init(Directory* parent, const String& name) +PackageLinkDirectory::Init(const String& name) { - return Directory::Init(parent, name); + return Directory::Init(name); } @@ -227,7 +227,7 @@ PackageLinkDirectory::_UpdateDependencies(PackageLinksListener* listener) if (link == NULL) return B_NO_MEMORY; - status_t error = link->Init(this, dependency->FileName()); + status_t error = link->Init(dependency->FileName()); if (error != B_OK) { delete link; RETURN_ERROR(error); @@ -271,7 +271,7 @@ PackageLinkDirectory::_CreateOrUpdateLink(Link*& link, Package* package, if (link == NULL) return B_NO_MEMORY; - status_t error = link->Init(this, name); + status_t error = link->Init(name); if (error != B_OK) RETURN_ERROR(error); diff --git a/src/add-ons/kernel/file_systems/packagefs/package_links/PackageLinkDirectory.h b/src/add-ons/kernel/file_systems/packagefs/package_links/PackageLinkDirectory.h index 60a9681dda..0604f85af5 100644 --- a/src/add-ons/kernel/file_systems/packagefs/package_links/PackageLinkDirectory.h +++ b/src/add-ons/kernel/file_systems/packagefs/package_links/PackageLinkDirectory.h @@ -19,8 +19,8 @@ public: PackageLinkDirectory(); virtual ~PackageLinkDirectory(); - status_t Init(Directory* parent, Package* package); - virtual status_t Init(Directory* parent, const String& name); + status_t Init(Package* package); + virtual status_t Init(const String& name); virtual timespec ModifiedTime() const; diff --git a/src/add-ons/kernel/file_systems/packagefs/package_links/PackageLinksDirectory.cpp b/src/add-ons/kernel/file_systems/packagefs/package_links/PackageLinksDirectory.cpp index b283dc6af8..f614d1a3c3 100644 --- a/src/add-ons/kernel/file_systems/packagefs/package_links/PackageLinksDirectory.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/package_links/PackageLinksDirectory.cpp @@ -48,7 +48,7 @@ PackageLinksDirectory::AddPackage(Package* package) BReference linkDirectoryReference(linkDirectory, true); - status_t error = linkDirectory->Init(this, package); + status_t error = linkDirectory->Init(package); if (error != B_OK) RETURN_ERROR(error); diff --git a/src/add-ons/kernel/file_systems/packagefs/volume/PackageFSRoot.cpp b/src/add-ons/kernel/file_systems/packagefs/volume/PackageFSRoot.cpp index d1033b517a..20a1e2cc7e 100644 --- a/src/add-ons/kernel/file_systems/packagefs/volume/PackageFSRoot.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/volume/PackageFSRoot.cpp @@ -68,7 +68,7 @@ PackageFSRoot::Init() if (fPackageLinksDirectory == NULL) return B_NO_MEMORY; - status_t error = fPackageLinksDirectory->Init(NULL, + status_t error = fPackageLinksDirectory->Init( StringConstants::Get().kPackageLinksDirectoryName); if (error != B_OK) RETURN_ERROR(error); diff --git a/src/add-ons/kernel/file_systems/packagefs/volume/Volume.cpp b/src/add-ons/kernel/file_systems/packagefs/volume/Volume.cpp index da48dfd972..f3a43a18fc 100644 --- a/src/add-ons/kernel/file_systems/packagefs/volume/Volume.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/volume/Volume.cpp @@ -402,7 +402,7 @@ Volume::Mount(const char* parameterString) = new ::RootDirectory(kRootDirectoryID, st.st_mtim); if (fRootDirectory == NULL) RETURN_ERROR(B_NO_MEMORY); - fRootDirectory->Init(NULL, volumeNameString); + fRootDirectory->Init(volumeNameString); fNodes.Insert(fRootDirectory); fRootDirectory->AcquireReference(); // one reference for the table @@ -1410,7 +1410,7 @@ Volume::_CreateUnpackingNode(mode_t mode, Directory* parent, const String& name, Node* node = unpackingNode->GetNode(); BReference nodeReference(node, true); - status_t error = node->Init(parent, name); + status_t error = node->Init(name); if (error != B_OK) RETURN_ERROR(error); @@ -1711,7 +1711,7 @@ Volume::_CreateShineThroughDirectory(Directory* parent, const char* name, if (!nameString.SetTo(name)) RETURN_ERROR(B_NO_MEMORY); - status_t error = directory->Init(parent, nameString); + status_t error = directory->Init(nameString); if (error != B_OK) RETURN_ERROR(error); @@ -1855,7 +1855,6 @@ Volume::_AddPackageLinksDirectory() NodeWriteLocker rootDirectoryWriteLocker(fRootDirectory); NodeWriteLocker packageLinksDirectoryWriteLocker(packageLinksDirectory); - packageLinksDirectory->SetParent(fRootDirectory); fRootDirectory->AddChild(packageLinksDirectory); _AddPackageLinksNode(packageLinksDirectory); @@ -1879,7 +1878,6 @@ Volume::_RemovePackageLinksDirectory() if (packageLinksDirectory->Parent() == fRootDirectory) { packageLinksDirectory->SetListener(NULL); fRootDirectory->RemoveChild(packageLinksDirectory); - packageLinksDirectory->SetParent(NULL); } }