summaryrefslogtreecommitdiffstats
path: root/fs/nfs/nfs42xdr.c
diff options
context:
space:
mode:
authorTrond Myklebust <trond.myklebust@hammerspace.com>2020-12-08 08:41:01 -0500
committerTrond Myklebust <trond.myklebust@hammerspace.com>2020-12-14 06:51:08 -0500
commitdac3b1059b499c570f02cd94f3172d8c8df3a9dd (patch)
tree89c495c87b422246bbce7fb703d2901d6be24f98 /fs/nfs/nfs42xdr.c
parent82f98c8b116bd769a47688ca5227f94826ae8a2a (diff)
downloadlinux-dac3b1059b499c570f02cd94f3172d8c8df3a9dd.tar.bz2
NFSv4.2: Handle hole lengths that exceed the READ_PLUS read buffer
If a hole extends beyond the READ_PLUS read buffer, then we want to fill just the remaining buffer with zeros. Also ignore eof... Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Diffstat (limited to 'fs/nfs/nfs42xdr.c')
-rw-r--r--fs/nfs/nfs42xdr.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/fs/nfs/nfs42xdr.c b/fs/nfs/nfs42xdr.c
index f9faa131a4f5..6ba2a28e7e03 100644
--- a/fs/nfs/nfs42xdr.c
+++ b/fs/nfs/nfs42xdr.c
@@ -1080,6 +1080,12 @@ static int decode_read_plus_hole(struct xdr_stream *xdr,
}
length -= args->offset + res->count - offset;
}
+ if (length + res->count > args->count) {
+ *eof = 0;
+ if (unlikely(res->count >= args->count))
+ return 1;
+ length = args->count - res->count;
+ }
recvd = xdr_expand_hole(xdr, res->count, length);
res->count += recvd;