summaryrefslogtreecommitdiffstats
path: root/sys/fs
diff options
context:
space:
mode:
authorrmacklem <rmacklem@FreeBSD.org>2011-07-16 20:53:27 +0000
committerrmacklem <rmacklem@FreeBSD.org>2011-07-16 20:53:27 +0000
commite720a1657c320cd06d5982011a451462436ea5f7 (patch)
treed90984cb5dfc752c7ba4207574f21855e8ae9046 /sys/fs
parent3abb8f9591c05a06c334fa139ffe1d2087c14729 (diff)
downloadFreeBSD-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')
-rw-r--r--sys/fs/nfs/nfs_commonkrpc.c4
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 &&
OpenPOWER on IntegriCloud