diff options
author | rmacklem <rmacklem@FreeBSD.org> | 2011-07-16 20:53:27 +0000 |
---|---|---|
committer | rmacklem <rmacklem@FreeBSD.org> | 2011-07-16 20:53:27 +0000 |
commit | e720a1657c320cd06d5982011a451462436ea5f7 (patch) | |
tree | d90984cb5dfc752c7ba4207574f21855e8ae9046 /sys/fs/nfs | |
parent | 3abb8f9591c05a06c334fa139ffe1d2087c14729 (diff) | |
download | FreeBSD-src-e720a1657c320cd06d5982011a451462436ea5f7.zip FreeBSD-src-e720a1657c320cd06d5982011a451462436ea5f7.tar.gz |
The new NFSv4 client handled NFSERR_GRACE as a fatal error
for the remove and rename operations. Some NFSv4 servers will
report NFSERR_GRACE for these operations. This patch changes
the behaviour of the client so that it handles NFSERR_GRACE
like NFSERR_DELAY for non-state related operations like
remove and rename. It also exempts the delegreturn operation
from handling within newnfs_request() for NFSERR_DELAY/NFSERR_GRACE
so that it can handle NFSERR_GRACE in the same manner as before.
This problem was resolved thanks to discussion with bfields at fieldses.org.
The problem was identified at the recent NFSv4 ineroperability
bakeathon.
MFC after: 2 weeks
Diffstat (limited to 'sys/fs/nfs')
-rw-r--r-- | sys/fs/nfs/nfs_commonkrpc.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/sys/fs/nfs/nfs_commonkrpc.c b/sys/fs/nfs/nfs_commonkrpc.c index ca629d2..1f65380 100644 --- a/sys/fs/nfs/nfs_commonkrpc.c +++ b/sys/fs/nfs/nfs_commonkrpc.c @@ -715,8 +715,10 @@ tryagain: NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED); nd->nd_repstat = fxdr_unsigned(u_int32_t, *tl); if (nd->nd_repstat != 0) { - if ((nd->nd_repstat == NFSERR_DELAY && + if (((nd->nd_repstat == NFSERR_DELAY || + nd->nd_repstat == NFSERR_GRACE) && (nd->nd_flag & ND_NFSV4) && + nd->nd_procnum != NFSPROC_DELEGRETURN && nd->nd_procnum != NFSPROC_SETATTR && nd->nd_procnum != NFSPROC_READ && nd->nd_procnum != NFSPROC_WRITE && |