
From: Trond Myklebust <trond.myklebust@fys.uio.no>

OK. I've managed to squash the NFS read corruption problems that I had
on my 2.5.x client setup with the following patch.
Since the two of you reported what appears to be the same problem,
would you mind trying it out?

The fix basically tightens up consistency checks in the process of
reading the skb (which is done in the sk->data_ready() callback).



 25-akpm/net/sunrpc/xprt.c |   10 ++++++++--
 1 files changed, 8 insertions(+), 2 deletions(-)

diff -puN net/sunrpc/xprt.c~nfs-read-corruption-fix net/sunrpc/xprt.c
--- 25/net/sunrpc/xprt.c~nfs-read-corruption-fix	Mon Apr  7 12:53:12 2003
+++ 25-akpm/net/sunrpc/xprt.c	Mon Apr  7 12:53:12 2003
@@ -625,7 +625,8 @@ skb_read_bits(skb_reader_t *desc, void *
 {
 	if (len > desc->count)
 		len = desc->count;
-	skb_copy_bits(desc->skb, desc->offset, to, len);
+	if (skb_copy_bits(desc->skb, desc->offset, to, len))
+		return 0;
 	desc->count -= len;
 	desc->offset += len;
 	return len;
@@ -669,11 +670,15 @@ csum_partial_copy_to_xdr(struct xdr_buf 
 		csum2 = skb_checksum(skb, desc.offset, skb->len - desc.offset, 0);
 		desc.csum = csum_block_add(desc.csum, csum2, desc.offset);
 	}
+	if (desc.count)
+		return -1;
 	if ((unsigned short)csum_fold(desc.csum))
 		return -1;
 	return 0;
 no_checksum:
 	xdr_partial_copy_from_skb(xdr, 0, &desc, skb_read_bits);
+	if (desc.count)
+		return -1;
 	return 0;
 }
 
@@ -750,7 +755,8 @@ tcp_copy_data(skb_reader_t *desc, void *
 {
 	if (len > desc->count)
 		len = desc->count;
-	skb_copy_bits(desc->skb, desc->offset, p, len);
+	if (skb_copy_bits(desc->skb, desc->offset, p, len))
+		return 0;
 	desc->offset += len;
 	desc->count -= len;
 	return len;

_
