NFSv4.2: Rework scratch handling for READ_PLUS (again)
authorAnna Schumaker <Anna.Schumaker@Netapp.com>
Fri, 9 Jun 2023 19:26:25 +0000 (15:26 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 13 Sep 2023 07:43:05 +0000 (09:43 +0200)
commitadac9f0ddd2b291c7ce41f549fdb27a13616cff5
treed40f599f23e5e11a875635e0f704c0caed8aafcb
parent7795634751622709cab9ce4cad2bcd93f871fae3
NFSv4.2: Rework scratch handling for READ_PLUS (again)

commit 303a78052091c81e9003915c521fdca1c7e117af upstream.

I found that the read code might send multiple requests using the same
nfs_pgio_header, but nfs4_proc_read_setup() is only called once. This is
how we ended up occasionally double-freeing the scratch buffer, but also
means we set a NULL pointer but non-zero length to the xdr scratch
buffer. This results in an oops the first time decoding needs to copy
something to scratch, which frequently happens when decoding READ_PLUS
hole segments.

I fix this by moving scratch handling into the pageio read code. I
provide a function to allocate scratch space for decoding read replies,
and free the scratch buffer when the nfs_pgio_header is freed.

Fixes: fbd2a05f29a9 (NFSv4.2: Rework scratch handling for READ_PLUS)
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/nfs/internal.h
fs/nfs/nfs42.h
fs/nfs/nfs42xdr.c
fs/nfs/nfs4proc.c
fs/nfs/read.c