summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrmacklem <rmacklem@FreeBSD.org>2014-08-03 00:35:10 +0000
committerrmacklem <rmacklem@FreeBSD.org>2014-08-03 00:35:10 +0000
commit672efbb4a9b586b3eef3f75a536d3e8dfcd223c4 (patch)
tree08db98274c60fe24dce332fa6222db8702bb25ce
parentb0acb5134fd6ed3a0a1e0bb809682bfa572c551a (diff)
downloadFreeBSD-src-672efbb4a9b586b3eef3f75a536d3e8dfcd223c4.zip
FreeBSD-src-672efbb4a9b586b3eef3f75a536d3e8dfcd223c4.tar.gz
MFC: r268273
The new NFSv3 server did not generate directory postop attributes for the reply to ReaddirPlus when the server failed within the loop that calls VFS_VGET(). This failure is most likely an error return from VFS_VGET() caused by a bogus d_fileno that was truncated to 32bits. This patch fixes the server so that it will return directory postop attributes for the failure. It does not fix the underlying issue caused by d_fileno being uint32_t when a file system like ZFS generates a fileno that is greater than 32bits.
-rw-r--r--sys/fs/nfsserver/nfs_nfsdport.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/sys/fs/nfsserver/nfs_nfsdport.c b/sys/fs/nfsserver/nfs_nfsdport.c
index 5799958..cb05dd0 100644
--- a/sys/fs/nfsserver/nfs_nfsdport.c
+++ b/sys/fs/nfsserver/nfs_nfsdport.c
@@ -2264,9 +2264,11 @@ again:
if (dirlen > cnt || nd->nd_repstat) {
if (!nd->nd_repstat && entrycnt == 0)
nd->nd_repstat = NFSERR_TOOSMALL;
- if (nd->nd_repstat)
+ if (nd->nd_repstat) {
newnfs_trimtrailing(nd, mb0, bpos0);
- else
+ if (nd->nd_flag & ND_NFSV3)
+ nfsrv_postopattr(nd, getret, &at);
+ } else
newnfs_trimtrailing(nd, mb1, bpos1);
eofflag = 0;
} else if (cpos < cend)
OpenPOWER on IntegriCloud