Bladeren bron

NFS: check xdr_decode for errors

Check if the decoded entry has the eof bit set when returning from xdr_decode
with an error.  If it does, we should set the eof bits in the array before
returning.  This should keep us from looping when we expect more data but the
server doesn't give us anything new.

Signed-off-by: Bryan Schumaker <bjschuma@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Bryan Schumaker 15 jaren geleden
bovenliggende
commit
9942438089
1 gewijzigde bestanden met toevoegingen van 15 en 1 verwijderingen
  1. 15 1
      fs/nfs/dir.c

+ 15 - 1
fs/nfs/dir.c

@@ -442,6 +442,8 @@ void nfs_readdir_page_filler(nfs_readdir_descriptor_t *desc, struct nfs_entry *e
 	struct xdr_stream stream;
 	struct xdr_stream stream;
 	struct xdr_buf buf;
 	struct xdr_buf buf;
 	__be32 *ptr = xdr_page;
 	__be32 *ptr = xdr_page;
+	int status;
+	struct nfs_cache_array *array;
 
 
 	buf.head->iov_base = xdr_page;
 	buf.head->iov_base = xdr_page;
 	buf.head->iov_len = buflen;
 	buf.head->iov_len = buflen;
@@ -453,11 +455,23 @@ void nfs_readdir_page_filler(nfs_readdir_descriptor_t *desc, struct nfs_entry *e
 
 
 	xdr_init_decode(&stream, &buf, ptr);
 	xdr_init_decode(&stream, &buf, ptr);
 
 
-	while (xdr_decode(desc, entry, &stream) == 0) {
+
+	do {
+		status = xdr_decode(desc, entry, &stream);
+		if (status != 0)
+			break;
+
 		if (nfs_readdir_add_to_array(entry, page) == -1)
 		if (nfs_readdir_add_to_array(entry, page) == -1)
 			break;
 			break;
 		if (desc->plus == 1)
 		if (desc->plus == 1)
 			nfs_prime_dcache(desc->file->f_path.dentry, entry);
 			nfs_prime_dcache(desc->file->f_path.dentry, entry);
+	} while (!entry->eof);
+
+	if (status == -EBADCOOKIE && entry->eof) {
+		array = nfs_readdir_get_array(page);
+		array->eof_index = array->size - 1;
+		status = 0;
+		nfs_readdir_release_array(page);
 	}
 	}
 }
 }