From c26d71977971af394f0c6d47e0ce0a91df5e3102 Mon Sep 17 00:00:00 2001 From: Bryan Schumaker Date: Thu, 21 Oct 2010 16:33:16 -0400 Subject: [PATCH] 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 Signed-off-by: Trond Myklebust --- fs/nfs/dir.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 7b8b7c59db9f5..0cbb714a09d8d 100644 --- a/fs/nfs/dir.c +++ b/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_buf buf; __be32 *ptr = xdr_page; + int status; + struct nfs_cache_array *array; buf.head->iov_base = xdr_page; 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); - 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) break; if (desc->plus == 1) 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); } } -- 2.39.5