From 97378968277307db7d9426a6fa253e9b133823c8 Mon Sep 17 00:00:00 2001 From: Pawel Dziepak Date: Tue, 26 Jun 2012 21:20:57 +0200 Subject: [PATCH] nfs4: Fix removing nodes other than NF4DIR or NF4REG --- src/add-ons/kernel/file_systems/nfs4/Inode.cpp | 15 +++++++++++---- src/add-ons/kernel/file_systems/nfs4/NFS4Defs.h | 1 + .../kernel/file_systems/nfs4/ReplyInterpreter.h | 8 ++++++++ .../kernel/file_systems/nfs4/RequestBuilder.cpp | 17 +++++++++++++++++ .../kernel/file_systems/nfs4/RequestBuilder.h | 1 + 5 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp index e825118a4b..f7c8b4a8d0 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp @@ -241,8 +241,11 @@ Inode::Remove(const char* name, FileType type) AttrValue attr; attr.fAttribute = FATTR4_TYPE; attr.fFreePointer = false; - attr.fData.fValue32 = type; - req.Verify(&attr, 1); + attr.fData.fValue32 = NF4DIR; + if (type == NF4DIR) + req.Verify(&attr, 1); + else + req.Nverify(&attr, 1); req.PutFH(fHandle); req.Remove(name); @@ -259,8 +262,12 @@ Inode::Remove(const char* name, FileType type) reply.PutFH(); reply.LookUp(); - result = reply.Verify(); - if (result == NFS4ERR_NOT_SAME && type == NF4REG) + if (type == NF4DIR) + result = reply.Verify(); + else + result = reply.Nverify(); + + if (result == NFS4ERR_SAME && type != NF4DIR) return B_IS_A_DIRECTORY; if (result == NFS4ERR_NOT_SAME && type == NF4DIR) return B_NOT_A_DIRECTORY; diff --git a/src/add-ons/kernel/file_systems/nfs4/NFS4Defs.h b/src/add-ons/kernel/file_systems/nfs4/NFS4Defs.h index ffa17d5975..c4ebafa5d7 100644 --- a/src/add-ons/kernel/file_systems/nfs4/NFS4Defs.h +++ b/src/add-ons/kernel/file_systems/nfs4/NFS4Defs.h @@ -29,6 +29,7 @@ enum Opcode { OpLink = 11, OpLookUp = 15, OpLookUpUp = 16, + OpNverify = 17, OpOpen = 18, OpOpenConfirm = 20, OpPutFH = 22, diff --git a/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.h b/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.h index 3c54a28769..89e334015e 100644 --- a/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.h +++ b/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.h @@ -72,6 +72,7 @@ public: status_t Link(); inline status_t LookUp(); inline status_t LookUpUp(); + inline status_t Nverify(); status_t Open(uint32* id, uint32* seq, bool* confirm); status_t OpenConfirm(uint32* stateSeq); inline status_t PutFH(); @@ -150,6 +151,13 @@ ReplyInterpreter::LookUpUp() } +inline status_t +ReplyInterpreter::Nverify() +{ + return _OperationError(OpNverify); +} + + inline status_t ReplyInterpreter::PutFH() { diff --git a/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.cpp b/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.cpp index 1ae16ce4c9..aa7460e5cd 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.cpp @@ -197,6 +197,23 @@ RequestBuilder::LookUpUp() } +status_t +RequestBuilder::Nverify(AttrValue* attr, uint32 count) +{ + if (fProcedure != ProcCompound) + return B_BAD_VALUE; + if (fRequest == NULL) + return B_NO_MEMORY; + + fRequest->Stream().AddUInt(OpNverify); + _EncodeAttrs(fRequest->Stream(), attr, count); + + fOpCount++; + + return B_OK; +} + + status_t RequestBuilder::Open(OpenClaim claim, uint32 seq, uint32 access, uint64 id, OpenCreate oc, uint64 ownerId, const char* name, AttrValue* attr, diff --git a/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.h b/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.h index aa1187de3c..89a7379a67 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.h +++ b/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.h @@ -36,6 +36,7 @@ public: status_t Link(const char* name); status_t LookUp(const char* name); status_t LookUpUp(); + status_t Nverify(AttrValue* attr, uint32 count); status_t Open(OpenClaim claim, uint32 seq, uint32 access, uint64 id, OpenCreate oc, uint64 ownerId, const char* name,