From 69adfb6de2fbb3d8a90071beb5576593228dc7b5 Mon Sep 17 00:00:00 2001 From: Pawel Dziepak Date: Tue, 26 Jun 2012 21:09:30 +0200 Subject: [PATCH] nfs4: Add create_dir() hook --- .../kernel/file_systems/nfs4/Inode.cpp | 34 ++++++++++++++++++- src/add-ons/kernel/file_systems/nfs4/Inode.h | 1 + .../file_systems/nfs4/RequestBuilder.cpp | 11 +++--- .../kernel/file_systems/nfs4/RequestBuilder.h | 4 +-- .../file_systems/nfs4/kernel_interface.cpp | 11 +++++- 5 files changed, 52 insertions(+), 9 deletions(-) diff --git a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp index 961cfb1f77..e825118a4b 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp @@ -336,7 +336,7 @@ Inode::CreateLink(const char* name, const char* path, int mode) attr.fAttribute = FATTR4_MODE; attr.fFreePointer = false; attr.fData.fValue32 = mode; - req.Create(NF4LNK, name, path, &attr, 1); + req.Create(NF4LNK, name, &attr, 1, path); status_t result = request.Send(); if (result != B_OK) @@ -919,6 +919,38 @@ Inode::Write(OpenFileCookie* cookie, off_t pos, const void* _buffer, } +status_t +Inode::CreateDir(const char* name, int mode) +{ + do { + RPC::Server* serv = fFilesystem->Server(); + Request request(serv); + RequestBuilder& req = request.Builder(); + + req.PutFH(fHandle); + + AttrValue attr; + attr.fAttribute = FATTR4_MODE; + attr.fFreePointer = false; + attr.fData.fValue32 = mode; + req.Create(NF4DIR, name, &attr, 1); + + status_t result = request.Send(); + if (result != B_OK) + return result; + + ReplyInterpreter& reply = request.Reply(); + + if (_HandleErrors(reply.NFS4Error(), serv)) + continue; + + reply.PutFH(); + + return reply.Create(); + } while (true); +} + + status_t Inode::OpenDir(OpenDirCookie* cookie) { diff --git a/src/add-ons/kernel/file_systems/nfs4/Inode.h b/src/add-ons/kernel/file_systems/nfs4/Inode.h index c1b84ec168..781f982faa 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Inode.h +++ b/src/add-ons/kernel/file_systems/nfs4/Inode.h @@ -52,6 +52,7 @@ public: status_t Write(OpenFileCookie* cookie, off_t pos, const void* buffer, size_t *_length); + status_t CreateDir(const char* name, int mode); status_t OpenDir(OpenDirCookie* cookie); status_t ReadDir(void* buffer, uint32 size, uint32* count, OpenDirCookie* cookie); diff --git a/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.cpp b/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.cpp index 9426e3c2ae..1ae16ce4c9 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.cpp @@ -87,23 +87,24 @@ RequestBuilder::Close(uint32 seq, const uint32* id, uint32 stateSeq) status_t -RequestBuilder::Create(FileType type, const char* name, const char* path, - AttrValue* attr, uint32 count) +RequestBuilder::Create(FileType type, const char* name, AttrValue* attr, + uint32 count, const char* path) { if (fProcedure != ProcCompound) return B_BAD_VALUE; if (fRequest == NULL) return B_NO_MEMORY; - if (path == NULL) + if (type == NF4LNK && path == NULL) return B_BAD_VALUE; if (name == NULL) return B_BAD_VALUE; - if (type != NF4LNK) + if (type == NF4BLK || type == NF4CHR) return B_BAD_VALUE; fRequest->Stream().AddUInt(OpCreate); fRequest->Stream().AddUInt(type); - fRequest->Stream().AddString(path); + if (type == NF4LNK) + fRequest->Stream().AddString(path); fRequest->Stream().AddString(name); _EncodeAttrs(fRequest->Stream(), attr, count); diff --git a/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.h b/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.h index b6cc110d53..aa1187de3c 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.h +++ b/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.h @@ -29,8 +29,8 @@ public: status_t Close(uint32 seq, const uint32* id, uint32 stateSeq); status_t Create(FileType type, const char* name, - const char* path, AttrValue* attr, - uint32 count); + AttrValue* attr, uint32 count, + const char* path = NULL); status_t GetAttr(Attribute* attrs, uint32 count); status_t GetFH(); status_t Link(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 c769d803c7..227791eaf7 100644 --- a/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp @@ -376,6 +376,15 @@ nfs4_write(fs_volume* volume, fs_vnode* vnode, void* _cookie, off_t pos, } +static status_t +nfs4_create_dir(fs_volume* volume, fs_vnode* parent, const char* name, + int mode) +{ + Inode* inode = reinterpret_cast(parent->private_node); + return inode->CreateDir(name, mode); +} + + static status_t nfs4_remove_dir(fs_volume* volume, fs_vnode* parent, const char* name) { @@ -526,7 +535,7 @@ fs_vnode_ops gNFSv4VnodeOps = { nfs4_write, /* directory operations */ - NULL, // create_dir() + nfs4_create_dir, nfs4_remove_dir, nfs4_open_dir, nfs4_close_dir,