xref: /haiku/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingNode.cpp (revision 9f81ca838ce7b92b5689e57d3f86765db4705a7b)
1 /*
2  * Copyright 2011-2013, Ingo Weinhold, ingo_weinhold@gmx.de.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include "UnpackingNode.h"
8 
9 #include "DebugSupport.h"
10 #include "Node.h"
11 #include "PackageNode.h"
12 
13 
~UnpackingNode()14 UnpackingNode::~UnpackingNode()
15 {
16 }
17 
18 
19 status_t
CloneTransferPackageNodes(ino_t id,UnpackingNode * & _newNode)20 UnpackingNode::CloneTransferPackageNodes(ino_t id, UnpackingNode*& _newNode)
21 {
22 	return B_BAD_VALUE;
23 }
24 
25 
26 status_t
NodeInitVFS(dev_t deviceID,ino_t nodeID,PackageNode * packageNode)27 UnpackingNode::NodeInitVFS(dev_t deviceID, ino_t nodeID,
28 	PackageNode* packageNode)
29 {
30 	status_t error = B_OK;
31 	if (packageNode != NULL)
32 		error = packageNode->VFSInit(deviceID, nodeID);
33 
34 	return error;
35 }
36 
37 
38 void
NodeUninitVFS(PackageNode * packageNode,uint32 & nodeFlags)39 UnpackingNode::NodeUninitVFS(PackageNode* packageNode, uint32& nodeFlags)
40 {
41 	if (packageNode != NULL) {
42 		if ((nodeFlags & NODE_FLAG_VFS_INIT_ERROR) == 0)
43 			packageNode->VFSUninit();
44 		else
45 			nodeFlags &= ~(uint32)NODE_FLAG_VFS_INIT_ERROR;
46 	}
47 }
48 
49 
50 void
NodeReinitVFS(dev_t deviceID,ino_t nodeID,PackageNode * packageNode,PackageNode * previousPackageNode,uint32 & nodeFlags)51 UnpackingNode::NodeReinitVFS(dev_t deviceID, ino_t nodeID,
52 	PackageNode* packageNode, PackageNode* previousPackageNode,
53 	uint32& nodeFlags)
54 {
55 	if ((nodeFlags & NODE_FLAG_KNOWN_TO_VFS) == 0)
56 		return;
57 
58 	if (packageNode != previousPackageNode) {
59 		bool hadInitError = (nodeFlags & NODE_FLAG_VFS_INIT_ERROR) != 0;
60 		nodeFlags &= ~(uint32)NODE_FLAG_VFS_INIT_ERROR;
61 
62 		if (packageNode != NULL) {
63 			status_t error = packageNode->VFSInit(deviceID, nodeID);
64 			if (error != B_OK) {
65 				ERROR("UnpackingNode::NodeReinitVFS(): VFSInit() failed for "
66 					"(%" B_PRIdDEV ", %" B_PRIdINO ")\n", deviceID, nodeID);
67 				nodeFlags |= NODE_FLAG_VFS_INIT_ERROR;
68 			}
69 		}
70 
71 		if (previousPackageNode != NULL && !hadInitError)
72 			previousPackageNode->VFSUninit();
73 	}
74 }
75