NFS: Don't free a state ID the server does not recognize
authorChuck Lever <chuck.lever@oracle.com>
Wed, 11 Jul 2012 20:29:56 +0000 (16:29 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Mon, 16 Jul 2012 18:48:10 +0000 (14:48 -0400)
commit89af2739589365bf0dd2023c6a076b22ccd530f9
tree91608923b32aa16c7bf013bfb25d6006266c89a1
parent377e507d1572eca6372c862483f4ce4680ad310a
NFS: Don't free a state ID the server does not recognize

The result of a TEST_STATEID operation can indicate a few different
things:

  o If NFS_OK is returned, then the client can continue using the
    state ID under test, and skip recovery.

  o RFC 5661 says that if the state ID was revoked, then the client
    must perform an explicit FREE_STATEID before trying to re-open.

  o If the server doesn't recognize the state ID at all, then no
    FREE_STATEID is needed, and the client can immediately continue
    with open recovery.

Let's err on the side of caution: if the server clearly tells us the
state ID is unknown, we skip the FREE_STATEID.  For any other error,
we issue a FREE_STATEID.  Sometimes that FREE_STATEID will be
unnecessary, but leaving unused state IDs on the server needlessly
ties up resources.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/nfs4proc.c