nfs4: Fix handling of retried CLOSE requests
This commit is contained in:
@@ -24,7 +24,6 @@ NFS4Object::HandleErrors(uint32 nfs4Error, RPC::Server* serv,
|
|||||||
ASSERT(nfs4Error != NFS4ERR_CLID_INUSE);
|
ASSERT(nfs4Error != NFS4ERR_CLID_INUSE);
|
||||||
ASSERT(nfs4Error != NFS4ERR_NOFILEHANDLE);
|
ASSERT(nfs4Error != NFS4ERR_NOFILEHANDLE);
|
||||||
ASSERT(nfs4Error != NFS4ERR_BAD_STATEID);
|
ASSERT(nfs4Error != NFS4ERR_BAD_STATEID);
|
||||||
ASSERT(nfs4Error != NFS4ERR_BAD_SEQID);
|
|
||||||
ASSERT(nfs4Error != NFS4ERR_RESTOREFH);
|
ASSERT(nfs4Error != NFS4ERR_RESTOREFH);
|
||||||
ASSERT(nfs4Error != NFS4ERR_LOCKS_HELD);
|
ASSERT(nfs4Error != NFS4ERR_LOCKS_HELD);
|
||||||
ASSERT(nfs4Error != NFS4ERR_OP_ILLEGAL);
|
ASSERT(nfs4Error != NFS4ERR_OP_ILLEGAL);
|
||||||
@@ -36,6 +35,12 @@ NFS4Object::HandleErrors(uint32 nfs4Error, RPC::Server* serv,
|
|||||||
case NFS4_OK:
|
case NFS4_OK:
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// retransmission of CLOSE caused seqid to fall back
|
||||||
|
case NFS4ERR_BAD_SEQID:
|
||||||
|
ASSERT(sequence != NULL);
|
||||||
|
(*sequence)++;
|
||||||
|
return true;
|
||||||
|
|
||||||
// server needs more time, we need to wait
|
// server needs more time, we need to wait
|
||||||
case NFS4ERR_LOCKED:
|
case NFS4ERR_LOCKED:
|
||||||
case NFS4ERR_DELAY:
|
case NFS4ERR_DELAY:
|
||||||
|
|||||||
@@ -290,6 +290,14 @@ OpenState::Close()
|
|||||||
|
|
||||||
sequence += IncrementSequence(reply.NFS4Error());
|
sequence += IncrementSequence(reply.NFS4Error());
|
||||||
|
|
||||||
|
// RFC 3530 8.10.1. Some servers does not do anything to help client
|
||||||
|
// recognize retried CLOSE requests so we just assume that BAD_STATEID
|
||||||
|
// on CLOSE request is just a result of retransmission.
|
||||||
|
if (reply.NFS4Error() == NFS4ERR_BAD_STATEID) {
|
||||||
|
fFileSystem->OpenOwnerSequenceUnlock(sequence);
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
if (HandleErrors(reply.NFS4Error(), serv, NULL, this, &sequence))
|
if (HandleErrors(reply.NFS4Error(), serv, NULL, this, &sequence))
|
||||||
continue;
|
continue;
|
||||||
fFileSystem->OpenOwnerSequenceUnlock(sequence);
|
fFileSystem->OpenOwnerSequenceUnlock(sequence);
|
||||||
|
|||||||
Reference in New Issue
Block a user