Implemented acquire_vnode() forwarding.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29391 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -192,6 +192,8 @@ enum {
|
|||||||
GET_VNODE_REPLY,
|
GET_VNODE_REPLY,
|
||||||
PUT_VNODE_REQUEST,
|
PUT_VNODE_REQUEST,
|
||||||
PUT_VNODE_REPLY,
|
PUT_VNODE_REPLY,
|
||||||
|
ACQUIRE_VNODE_REQUEST,
|
||||||
|
ACQUIRE_VNODE_REPLY,
|
||||||
NEW_VNODE_REQUEST,
|
NEW_VNODE_REQUEST,
|
||||||
NEW_VNODE_REPLY,
|
NEW_VNODE_REPLY,
|
||||||
PUBLISH_VNODE_REQUEST,
|
PUBLISH_VNODE_REQUEST,
|
||||||
@@ -1465,6 +1467,21 @@ public:
|
|||||||
PutVNodeReply() : ReplyRequest(PUT_VNODE_REPLY) {}
|
PutVNodeReply() : ReplyRequest(PUT_VNODE_REPLY) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// AcquireVNodeRequest
|
||||||
|
class AcquireVNodeRequest : public Request {
|
||||||
|
public:
|
||||||
|
AcquireVNodeRequest() : Request(ACQUIRE_VNODE_REQUEST) {}
|
||||||
|
|
||||||
|
dev_t nsid;
|
||||||
|
ino_t vnid;
|
||||||
|
};
|
||||||
|
|
||||||
|
// AcquireVNodeReply
|
||||||
|
class AcquireVNodeReply : public ReplyRequest {
|
||||||
|
public:
|
||||||
|
AcquireVNodeReply() : ReplyRequest(ACQUIRE_VNODE_REPLY) {}
|
||||||
|
};
|
||||||
|
|
||||||
// NewVNodeRequest
|
// NewVNodeRequest
|
||||||
class NewVNodeRequest : public Request {
|
class NewVNodeRequest : public Request {
|
||||||
public:
|
public:
|
||||||
@@ -2073,6 +2090,8 @@ using UserlandFSUtil::GetVNodeRequest;
|
|||||||
using UserlandFSUtil::GetVNodeReply;
|
using UserlandFSUtil::GetVNodeReply;
|
||||||
using UserlandFSUtil::PutVNodeRequest;
|
using UserlandFSUtil::PutVNodeRequest;
|
||||||
using UserlandFSUtil::PutVNodeReply;
|
using UserlandFSUtil::PutVNodeReply;
|
||||||
|
using UserlandFSUtil::AcquireVNodeRequest;
|
||||||
|
using UserlandFSUtil::AcquireVNodeReply;
|
||||||
using UserlandFSUtil::NewVNodeRequest;
|
using UserlandFSUtil::NewVNodeRequest;
|
||||||
using UserlandFSUtil::NewVNodeReply;
|
using UserlandFSUtil::NewVNodeReply;
|
||||||
using UserlandFSUtil::PublishVNodeRequest;
|
using UserlandFSUtil::PublishVNodeRequest;
|
||||||
|
|||||||
@@ -72,6 +72,8 @@ KernelRequestHandler::HandleRequest(Request* request)
|
|||||||
return _HandleRequest((GetVNodeRequest*)request);
|
return _HandleRequest((GetVNodeRequest*)request);
|
||||||
case PUT_VNODE_REQUEST:
|
case PUT_VNODE_REQUEST:
|
||||||
return _HandleRequest((PutVNodeRequest*)request);
|
return _HandleRequest((PutVNodeRequest*)request);
|
||||||
|
case ACQUIRE_VNODE_REQUEST:
|
||||||
|
return _HandleRequest((AcquireVNodeRequest*)request);
|
||||||
case NEW_VNODE_REQUEST:
|
case NEW_VNODE_REQUEST:
|
||||||
return _HandleRequest((NewVNodeRequest*)request);
|
return _HandleRequest((NewVNodeRequest*)request);
|
||||||
case PUBLISH_VNODE_REQUEST:
|
case PUBLISH_VNODE_REQUEST:
|
||||||
@@ -346,6 +348,31 @@ KernelRequestHandler::_HandleRequest(PutVNodeRequest* request)
|
|||||||
return fPort->SendRequest(&allocator);
|
return fPort->SendRequest(&allocator);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// _HandleRequest
|
||||||
|
status_t
|
||||||
|
KernelRequestHandler::_HandleRequest(AcquireVNodeRequest* request)
|
||||||
|
{
|
||||||
|
// check and executed the request
|
||||||
|
Volume* volume = NULL;
|
||||||
|
status_t result = _GetVolume(request->nsid, &volume);
|
||||||
|
VolumePutter _(volume);
|
||||||
|
if (result == B_OK)
|
||||||
|
result = volume->AcquireVNode(request->vnid);
|
||||||
|
|
||||||
|
// prepare the reply
|
||||||
|
RequestAllocator allocator(fPort->GetPort());
|
||||||
|
AcquireVNodeReply* reply;
|
||||||
|
status_t error = AllocateRequest(allocator, &reply);
|
||||||
|
if (error != B_OK)
|
||||||
|
return error;
|
||||||
|
reply->error = result;
|
||||||
|
|
||||||
|
// send the reply
|
||||||
|
return fPort->SendRequest(&allocator);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// _HandleRequest
|
// _HandleRequest
|
||||||
status_t
|
status_t
|
||||||
KernelRequestHandler::_HandleRequest(NewVNodeRequest* request)
|
KernelRequestHandler::_HandleRequest(NewVNodeRequest* request)
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
|
|
||||||
namespace UserlandFSUtil {
|
namespace UserlandFSUtil {
|
||||||
|
|
||||||
|
class AcquireVNodeRequest;
|
||||||
class GetVNodeRemovedRequest;
|
class GetVNodeRemovedRequest;
|
||||||
class GetVNodeRequest;
|
class GetVNodeRequest;
|
||||||
class NewVNodeRequest;
|
class NewVNodeRequest;
|
||||||
@@ -25,6 +26,7 @@ class UnremoveVNodeRequest;
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
using UserlandFSUtil::AcquireVNodeRequest;
|
||||||
using UserlandFSUtil::GetVNodeRemovedRequest;
|
using UserlandFSUtil::GetVNodeRemovedRequest;
|
||||||
using UserlandFSUtil::GetVNodeRequest;
|
using UserlandFSUtil::GetVNodeRequest;
|
||||||
using UserlandFSUtil::NewVNodeRequest;
|
using UserlandFSUtil::NewVNodeRequest;
|
||||||
@@ -57,6 +59,7 @@ private:
|
|||||||
// vnodes
|
// vnodes
|
||||||
status_t _HandleRequest(GetVNodeRequest* request);
|
status_t _HandleRequest(GetVNodeRequest* request);
|
||||||
status_t _HandleRequest(PutVNodeRequest* request);
|
status_t _HandleRequest(PutVNodeRequest* request);
|
||||||
|
status_t _HandleRequest(AcquireVNodeRequest* request);
|
||||||
status_t _HandleRequest(NewVNodeRequest* request);
|
status_t _HandleRequest(NewVNodeRequest* request);
|
||||||
status_t _HandleRequest(PublishVNodeRequest* request);
|
status_t _HandleRequest(PublishVNodeRequest* request);
|
||||||
status_t _HandleRequest(RemoveVNodeRequest* request);
|
status_t _HandleRequest(RemoveVNodeRequest* request);
|
||||||
|
|||||||
@@ -151,6 +151,24 @@ PRINT(("put_vnode(%ld, %lld)\n", GetID(), vnid));
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// AcquireVNode
|
||||||
|
status_t
|
||||||
|
Volume::AcquireVNode(ino_t vnid)
|
||||||
|
{
|
||||||
|
PRINT(("acquire_vnode(%ld, %lld)\n", GetID(), vnid));
|
||||||
|
if (IsMounting() && !fMountVNodes->ContainsKey(vnid)) {
|
||||||
|
ERROR(("Volume::AcquireVNode(): acquire_vnode() invoked for unknown "
|
||||||
|
"vnode while mounting!\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
status_t error = acquire_vnode(fFSVolume, vnid);
|
||||||
|
if (error == B_OK)
|
||||||
|
_IncrementVNodeCount(vnid);
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// NewVNode
|
// NewVNode
|
||||||
status_t
|
status_t
|
||||||
Volume::NewVNode(ino_t vnid, void* node)
|
Volume::NewVNode(ino_t vnid, void* node)
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ public:
|
|||||||
// client methods
|
// client methods
|
||||||
status_t GetVNode(ino_t vnid, void** node);
|
status_t GetVNode(ino_t vnid, void** node);
|
||||||
status_t PutVNode(ino_t vnid);
|
status_t PutVNode(ino_t vnid);
|
||||||
|
status_t AcquireVNode(ino_t vnid);
|
||||||
status_t NewVNode(ino_t vnid, void* node);
|
status_t NewVNode(ino_t vnid, void* node);
|
||||||
status_t PublishVNode(ino_t vnid, void* node,
|
status_t PublishVNode(ino_t vnid, void* node,
|
||||||
int type, uint32 flags);
|
int type, uint32 flags);
|
||||||
|
|||||||
@@ -328,10 +328,37 @@ UserlandFS::KernelEmu::put_vnode(dev_t nsid, ino_t vnid)
|
|||||||
|
|
||||||
// acquire_vnode
|
// acquire_vnode
|
||||||
status_t
|
status_t
|
||||||
UserlandFS::KernelEmu::acquire_vnode(dev_t nsid, ino_t vnodeID)
|
UserlandFS::KernelEmu::acquire_vnode(dev_t nsid, ino_t vnid)
|
||||||
{
|
{
|
||||||
// TODO: Implement!
|
// get the request port and the file system
|
||||||
return B_BAD_VALUE;
|
RequestPort* port;
|
||||||
|
FileSystem* fileSystem;
|
||||||
|
status_t error = get_port_and_fs(&port, &fileSystem);
|
||||||
|
if (error != B_OK)
|
||||||
|
return error;
|
||||||
|
|
||||||
|
// prepare the request
|
||||||
|
RequestAllocator allocator(port->GetPort());
|
||||||
|
AcquireVNodeRequest* request;
|
||||||
|
error = AllocateRequest(allocator, &request);
|
||||||
|
if (error != B_OK)
|
||||||
|
return error;
|
||||||
|
|
||||||
|
request->nsid = nsid;
|
||||||
|
request->vnid = vnid;
|
||||||
|
|
||||||
|
// send the request
|
||||||
|
UserlandRequestHandler handler(fileSystem, ACQUIRE_VNODE_REPLY);
|
||||||
|
AcquireVNodeReply* reply;
|
||||||
|
error = port->SendRequest(&allocator, &handler, (Request**)&reply);
|
||||||
|
if (error != B_OK)
|
||||||
|
return error;
|
||||||
|
RequestReleaser requestReleaser(port, reply);
|
||||||
|
|
||||||
|
// process the reply
|
||||||
|
if (reply->error != B_OK)
|
||||||
|
return reply->error;
|
||||||
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
// new_vnode
|
// new_vnode
|
||||||
@@ -420,7 +447,6 @@ UserlandFS::KernelEmu::publish_vnode(dev_t nsid, ino_t vnid, void* data)
|
|||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
// stat() the node to get its type
|
// stat() the node to get its type
|
||||||
// TODO: This must not be called while mounting!
|
|
||||||
int type;
|
int type;
|
||||||
status_t error = volume->GetVNodeType(data, &type);
|
status_t error = volume->GetVNodeType(data, &type);
|
||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
|
|||||||
Reference in New Issue
Block a user