svn commit: r340184 - stable/10/sys/fs/nfsserver
Andriy Gapon
avg at FreeBSD.org
Tue Nov 6 14:22:45 UTC 2018
Author: avg
Date: Tue Nov 6 14:22:44 2018
New Revision: 340184
URL: https://svnweb.freebsd.org/changeset/base/340184
Log:
MFC r339595: nfsrvd_readdirplus: for some errors, do not fail the entire request
Sponsored by: Panzura
Modified:
stable/10/sys/fs/nfsserver/nfs_nfsdport.c
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/sys/fs/nfsserver/nfs_nfsdport.c
==============================================================================
--- stable/10/sys/fs/nfsserver/nfs_nfsdport.c Tue Nov 6 14:21:26 2018 (r340183)
+++ stable/10/sys/fs/nfsserver/nfs_nfsdport.c Tue Nov 6 14:22:44 2018 (r340184)
@@ -2145,10 +2145,22 @@ again:
}
}
}
- if (!r) {
- if (refp == NULL &&
- ((nd->nd_flag & ND_NFSV3) ||
- NFSNONZERO_ATTRBIT(&attrbits))) {
+
+ /*
+ * If we failed to look up the entry, then it
+ * has become invalid, most likely removed.
+ */
+ if (r != 0) {
+ if (needs_unbusy)
+ vfs_unbusy(new_mp);
+ goto invalid;
+ }
+ KASSERT(refp != NULL || nvp != NULL,
+ ("%s: undetected lookup error", __func__));
+
+ if (refp == NULL &&
+ ((nd->nd_flag & ND_NFSV3) ||
+ NFSNONZERO_ATTRBIT(&attrbits))) {
r = nfsvno_getfh(nvp, &nfh, p);
if (!r)
r = nfsvno_getattr(nvp, nvap,
@@ -2169,17 +2181,25 @@ again:
if (new_mp == mp)
new_mp = nvp->v_mount;
}
- }
- } else {
- nvp = NULL;
}
- if (r) {
+
+ /*
+ * If we failed to get attributes of the entry,
+ * then just skip it for NFSv3 (the traditional
+ * behavior in the old NFS server).
+ * For NFSv4 the behavior is controlled by
+ * RDATTRERROR: we either ignore the error or
+ * fail the request.
+ * Note that RDATTRERROR is never set for NFSv3.
+ */
+ if (r != 0) {
if (!NFSISSET_ATTRBIT(&attrbits,
NFSATTRBIT_RDATTRERROR)) {
- if (nvp != NULL)
- vput(nvp);
+ vput(nvp);
if (needs_unbusy != 0)
vfs_unbusy(new_mp);
+ if ((nd->nd_flag & ND_NFSV3))
+ goto invalid;
nd->nd_repstat = r;
break;
}
@@ -2248,6 +2268,7 @@ again:
if (dirlen <= cnt)
entrycnt++;
}
+invalid:
cpos += dp->d_reclen;
dp = (struct dirent *)cpos;
cookiep++;
More information about the svn-src-stable-10
mailing list