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)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Wed, 23 Aug 2023 19:58:47 +0000 (15:58 -0400)
commit303a78052091c81e9003915c521fdca1c7e117af
tree2616e0e3ddc48fee94929cf7e1220013b0e2377f
parent8d18f6c5bb864d97a730f471c56cdecf313efe64
NFSv4.2: Rework scratch handling for READ_PLUS (again)

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>
fs/nfs/internal.h
fs/nfs/nfs42.h
fs/nfs/nfs42xdr.c
fs/nfs/nfs4proc.c
fs/nfs/read.c