diff --git a/src/add-ons/kernel/file_systems/packagefs/Node.cpp b/src/add-ons/kernel/file_systems/packagefs/Node.cpp index ef137c3dea..d5e3bb1627 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Node.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/Node.cpp @@ -56,6 +56,7 @@ Node::Init(Directory* parent, const char* name, uint32 flags) status_t Node::VFSInit(dev_t deviceID) { + fFlags |= NODE_FLAG_KNOWN_TO_VFS; return B_OK; } @@ -63,6 +64,7 @@ Node::VFSInit(dev_t deviceID) void Node::VFSUninit() { + fFlags &= ~(uint32)NODE_FLAG_KNOWN_TO_VFS; } diff --git a/src/add-ons/kernel/file_systems/packagefs/Node.h b/src/add-ons/kernel/file_systems/packagefs/Node.h index e107f7319e..50c05381f1 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Node.h +++ b/src/add-ons/kernel/file_systems/packagefs/Node.h @@ -32,7 +32,9 @@ enum { NODE_FLAG_CONST_NAME = 0x02, // Init(): The given name is a constant that won't go away during the // lifetime of the object. No need to copy. - NODE_FLAG_OWNS_NAME = NODE_FLAG_KEEP_NAME + NODE_FLAG_OWNS_NAME = NODE_FLAG_KEEP_NAME, + NODE_FLAG_KNOWN_TO_VFS = 0x04, + // internal flag }; @@ -61,7 +63,11 @@ public: // so also on error. virtual status_t VFSInit(dev_t deviceID); + // base class version must be called on + // success virtual void VFSUninit(); + // base class version must be called + inline bool IsKnownToVFS() const; void SetID(ino_t id); void SetParent(Directory* parent); @@ -126,6 +132,16 @@ Node::WriteUnlock() } +bool +Node::IsKnownToVFS() const +{ + return (fFlags & NODE_FLAG_KNOWN_TO_VFS) != 0; +} + + +// #pragma mark - + + struct NodeNameHashDefinition { typedef const char* KeyType; typedef Node ValueType; diff --git a/src/add-ons/kernel/file_systems/packagefs/UnpackingLeafNode.cpp b/src/add-ons/kernel/file_systems/packagefs/UnpackingLeafNode.cpp index 3ed264b84c..bb68b71db9 100644 --- a/src/add-ons/kernel/file_systems/packagefs/UnpackingLeafNode.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/UnpackingLeafNode.cpp @@ -34,9 +34,14 @@ UnpackingLeafNode::~UnpackingLeafNode() status_t UnpackingLeafNode::VFSInit(dev_t deviceID) { + status_t error = B_OK; if (PackageLeafNode* packageNode = _ActivePackageNode()) - return packageNode->VFSInit(deviceID, fID); - return B_OK; + error = packageNode->VFSInit(deviceID, fID); + + if (error == B_OK) + Node::VFSInit(deviceID); + + return error; } @@ -45,6 +50,8 @@ UnpackingLeafNode::VFSUninit() { if (PackageLeafNode* packageNode = _ActivePackageNode()) packageNode->VFSUninit(); + + Node::VFSUninit(); }