From 60a8140ded7da888e1ebf0d03ac6c20130b08aeb Mon Sep 17 00:00:00 2001 From: Pawel Dziepak Date: Tue, 5 Jun 2012 23:12:04 +0200 Subject: [PATCH] nfs4: Add close() and free_cookie() hooks --- .../kernel/file_systems/nfs4/Inode.cpp | 24 ++++++++++++++++++ src/add-ons/kernel/file_systems/nfs4/Inode.h | 1 + .../kernel/file_systems/nfs4/NFS4Defs.h | 1 + .../file_systems/nfs4/ReplyInterpreter.cpp | 16 ++++++++++++ .../file_systems/nfs4/ReplyInterpreter.h | 1 + .../file_systems/nfs4/RequestBuilder.cpp | 21 ++++++++++++++++ .../kernel/file_systems/nfs4/RequestBuilder.h | 2 ++ .../file_systems/nfs4/kernel_interface.cpp | 25 ++++++++++++++++--- 8 files changed, 88 insertions(+), 3 deletions(-) diff --git a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp index e4f855ddda..c3ee82e332 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp @@ -249,6 +249,30 @@ Inode::Open(int mode, OpenFileCookie* cookie) } +status_t +Inode::Close(OpenFileCookie* cookie) +{ + RequestBuilder req(ProcCompound); + req.PutFH(fHandle); + req.Close(cookie->fSeq, cookie->fStateId, cookie->fStateSeq); + + RPC::Reply *rpl; + fFilesystem->Server()->SendCall(req.Request(), &rpl); + ReplyInterpreter reply(rpl); + + status_t result; + result = reply.PutFH(); + if (result != B_OK) + return result; + + result = reply.Close(); + if (result != B_OK) + return result; + + return B_OK; +} + + status_t Inode::Read(OpenFileCookie* cookie, off_t pos, void* buffer, size_t* _length) { diff --git a/src/add-ons/kernel/file_systems/nfs4/Inode.h b/src/add-ons/kernel/file_systems/nfs4/Inode.h index c75e197620..46959870ba 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Inode.h +++ b/src/add-ons/kernel/file_systems/nfs4/Inode.h @@ -37,6 +37,7 @@ public: status_t Stat(struct stat* st); status_t Open(int mode, OpenFileCookie* cookie); + status_t Close(OpenFileCookie* cookie); status_t Read(OpenFileCookie* cookie, off_t pos, void* buffer, size_t* length); diff --git a/src/add-ons/kernel/file_systems/nfs4/NFS4Defs.h b/src/add-ons/kernel/file_systems/nfs4/NFS4Defs.h index d9648a1cc5..8ded674387 100644 --- a/src/add-ons/kernel/file_systems/nfs4/NFS4Defs.h +++ b/src/add-ons/kernel/file_systems/nfs4/NFS4Defs.h @@ -22,6 +22,7 @@ enum Procedure { enum Opcode { OpAccess = 3, + OpClose = 4, OpGetAttr = 9, OpGetFH = 10, OpLookUp = 15, diff --git a/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.cpp b/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.cpp index 1c158ee38c..4a8611b054 100644 --- a/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.cpp @@ -65,6 +65,22 @@ ReplyInterpreter::Access(uint32* supported, uint32* allowed) } +status_t +ReplyInterpreter::Close() +{ + status_t res = _OperationError(OpClose); + if (res != B_OK) + return res; + + fReply->Stream().GetUInt(); + fReply->Stream().GetUInt(); + fReply->Stream().GetUInt(); + fReply->Stream().GetUInt(); + + return fReply->Stream().IsEOF() ? B_BAD_VALUE : B_OK; +} + + // Bit Twiddling Hacks // http://graphics.stanford.edu/~seander/bithacks.html static inline uint32 sCountBits(uint32 v) diff --git a/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.h b/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.h index c3d5395349..594e45b3fd 100644 --- a/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.h +++ b/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.h @@ -39,6 +39,7 @@ public: ~ReplyInterpreter(); status_t Access(uint32* supported, uint32* allowed); + status_t Close(); status_t GetAttr(AttrValue** attrs, uint32* count); status_t GetFH(Filehandle* fh); inline status_t LookUp(); diff --git a/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.cpp b/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.cpp index 641a4fc80e..578605140e 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.cpp @@ -53,6 +53,27 @@ RequestBuilder::Access() } +status_t +RequestBuilder::Close(uint32 seq, const uint32* id, uint32 stateSeq) +{ + if (fProcedure != ProcCompound) + return B_BAD_VALUE; + if (fRequest == NULL) + return B_NO_MEMORY; + + fRequest->Stream().AddUInt(OpClose); + fRequest->Stream().AddUInt(seq); + fRequest->Stream().AddUInt(stateSeq); + fRequest->Stream().AddUInt(id[0]); + fRequest->Stream().AddUInt(id[1]); + fRequest->Stream().AddUInt(id[2]); + + fOpCount++; + + return B_OK; +} + + status_t RequestBuilder::GetAttr(Attribute* attrs, uint32 count) { diff --git a/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.h b/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.h index e2c89b4ec5..2e8be8c0cf 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.h +++ b/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.h @@ -23,6 +23,8 @@ public: ~RequestBuilder(); status_t Access(); + status_t Close(uint32 seq, const uint32* id, + uint32 stateSeq); status_t GetAttr(Attribute* attrs, uint32 count); status_t GetFH(); status_t LookUp(const char* name); diff --git a/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp b/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp index ffdc7885da..ac7421d1b6 100644 --- a/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp @@ -156,7 +156,26 @@ nfs4_open(fs_volume* volume, fs_vnode* vnode, int openMode, void** _cookie) } -status_t +static status_t +nfs4_close(fs_volume* volume, fs_vnode* vnode, void* cookie) +{ + return B_OK; +} + + +static status_t +nfs4_free_cookie(fs_volume* volume, fs_vnode* vnode, void* _cookie) +{ + Inode* inode = reinterpret_cast(vnode->private_node); + OpenFileCookie* cookie = reinterpret_cast(_cookie); + inode->Close(cookie); + delete cookie; + + return B_OK; +} + + +static status_t nfs4_read(fs_volume* volume, fs_vnode* vnode, void* _cookie, off_t pos, void* buffer, size_t* length) { @@ -308,8 +327,8 @@ fs_vnode_ops gNFSv4VnodeOps = { /* file operations */ NULL, // create() nfs4_open, - NULL, // close() - NULL, // free_cookie() + nfs4_close, + nfs4_free_cookie, nfs4_read, NULL, // write,