From 4318f15fa156865c22c3fc24250c582d82096975 Mon Sep 17 00:00:00 2001 From: Pawel Dziepak Date: Thu, 28 Jun 2012 01:46:55 +0200 Subject: [PATCH] nfs4: Check for reace conditions in filehandle recovery --- .../kernel/file_systems/nfs4/Inode.cpp | 23 ++++++++++++++++--- .../file_systems/nfs4/ReplyInterpreter.cpp | 1 + 2 files changed, 21 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 59c499a037..292a71b064 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp @@ -1575,8 +1575,10 @@ Inode::_HandleErrors(uint32 nfs4Error, RPC::Server* serv, // filehandle has expired case NFS4ERR_FHEXPIRED: - _LookUpFilehandle(); - return true; + if (_LookUpFilehandle() == B_OK) + return true; + else + return false; // filesystem has been moved case NFS4ERR_MOVED: @@ -1635,6 +1637,14 @@ Inode::_LookUpFilehandle() req.GetFH(); + if (fFilesystem->IsAttrSupported(FATTR4_FILEID)) { + AttrValue attr; + attr.fAttribute = FATTR4_FILEID; + attr.fFreePointer = false; + attr.fData.fValue64 = fFileId; + req.Verify(&attr, 1); + } + status_t result = request.Send(); if (result != B_OK) return result; @@ -1645,6 +1655,13 @@ Inode::_LookUpFilehandle() for (uint32 i = 0; i < lookupCount; i++) reply.LookUp(); - return reply.GetFH(&fHandle); + result = reply.GetFH(&fHandle); + if (result != B_OK) + return result; + + if (fFilesystem->IsAttrSupported(FATTR4_FILEID)) + return reply.Verify(); + else + return B_OK; } diff --git a/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.cpp b/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.cpp index 42ed5712bb..471b709016 100644 --- a/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.cpp @@ -734,6 +734,7 @@ ReplyInterpreter::_NFS4ErrorToHaiku(uint32 x) case NFS4ERR_LOCKED: case NFS4ERR_GRACE: return B_WOULD_BLOCK; + case NFS4ERR_FHEXPIRED: return B_ENTRY_NOT_FOUND; // ... default: return B_ERROR; }