packagefs: Set and unset node parents in Directory rather than Node::Init.
This way we can ASSERT() that the node doesn't belong to some other directory.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ PackageLinksDirectory::AddPackage(Package* package)
|
||||
BReference<PackageLinkDirectory> linkDirectoryReference(linkDirectory,
|
||||
true);
|
||||
|
||||
status_t error = linkDirectory->Init(this, package);
|
||||
status_t error = linkDirectory->Init(package);
|
||||
if (error != B_OK)
|
||||
RETURN_ERROR(error);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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<Node> 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user