2024-01-17 21:06:52

by Lucas Stach

[permalink] [raw]
Subject: [PATCH] SUNRPC: use request size to initialize bio_vec in svc_udp_sendto()

Use the proper size when setting up the bio_vec, as otherwise only
zero-length UDP packets will be sent.

Fixes: baabf59c2414 ("SUNRPC: Convert svc_udp_sendto() to use the per-socket bio_vec array")
Signed-off-by: Lucas Stach <[email protected]>
---
net/sunrpc/svcsock.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
index 998687421fa6..e0ce4276274b 100644
--- a/net/sunrpc/svcsock.c
+++ b/net/sunrpc/svcsock.c
@@ -717,12 +717,12 @@ static int svc_udp_sendto(struct svc_rqst *rqstp)
ARRAY_SIZE(rqstp->rq_bvec), xdr);

iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, rqstp->rq_bvec,
- count, 0);
+ count, rqstp->rq_res.len);
err = sock_sendmsg(svsk->sk_sock, &msg);
if (err == -ECONNREFUSED) {
/* ICMP error on earlier request. */
iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, rqstp->rq_bvec,
- count, 0);
+ count, rqstp->rq_res.len);
err = sock_sendmsg(svsk->sk_sock, &msg);
}

--
2.43.0



2024-01-17 22:03:54

by Chuck Lever

[permalink] [raw]
Subject: Re: [PATCH] SUNRPC: use request size to initialize bio_vec in svc_udp_sendto()

On Wed, Jan 17, 2024 at 10:06:28PM +0100, Lucas Stach wrote:
> Use the proper size when setting up the bio_vec, as otherwise only
> zero-length UDP packets will be sent.
>
> Fixes: baabf59c2414 ("SUNRPC: Convert svc_udp_sendto() to use the per-socket bio_vec array")
> Signed-off-by: Lucas Stach <[email protected]>
> ---
> net/sunrpc/svcsock.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
> index 998687421fa6..e0ce4276274b 100644
> --- a/net/sunrpc/svcsock.c
> +++ b/net/sunrpc/svcsock.c
> @@ -717,12 +717,12 @@ static int svc_udp_sendto(struct svc_rqst *rqstp)
> ARRAY_SIZE(rqstp->rq_bvec), xdr);
>
> iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, rqstp->rq_bvec,
> - count, 0);
> + count, rqstp->rq_res.len);
> err = sock_sendmsg(svsk->sk_sock, &msg);
> if (err == -ECONNREFUSED) {
> /* ICMP error on earlier request. */
> iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, rqstp->rq_bvec,
> - count, 0);
> + count, rqstp->rq_res.len);
> err = sock_sendmsg(svsk->sk_sock, &msg);
> }
>
> --
> 2.43.0
>

I can't fathom why I would have chosen zero for the @count argument.

We currently have zero test coverage for UDP. I'll look into that.

I've applied this to the nfsd-fixes branch. It should appear in
v6.8-rc if I can get it tested.


--
Chuck Lever

2024-01-18 08:43:02

by Lucas Stach

[permalink] [raw]
Subject: Re: [PATCH] SUNRPC: use request size to initialize bio_vec in svc_udp_sendto()

Am Mittwoch, dem 17.01.2024 um 17:03 -0500 schrieb Chuck Lever:
> On Wed, Jan 17, 2024 at 10:06:28PM +0100, Lucas Stach wrote:
> > Use the proper size when setting up the bio_vec, as otherwise only
> > zero-length UDP packets will be sent.
> >
> > Fixes: baabf59c2414 ("SUNRPC: Convert svc_udp_sendto() to use the per-socket bio_vec array")
> > Signed-off-by: Lucas Stach <[email protected]>
> > ---
> > net/sunrpc/svcsock.c | 4 ++--
> > 1 file changed, 2 insertions(+), 2 deletions(-)
> >
> > diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
> > index 998687421fa6..e0ce4276274b 100644
> > --- a/net/sunrpc/svcsock.c
> > +++ b/net/sunrpc/svcsock.c
> > @@ -717,12 +717,12 @@ static int svc_udp_sendto(struct svc_rqst *rqstp)
> > ARRAY_SIZE(rqstp->rq_bvec), xdr);
> >
> > iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, rqstp->rq_bvec,
> > - count, 0);
> > + count, rqstp->rq_res.len);
> > err = sock_sendmsg(svsk->sk_sock, &msg);
> > if (err == -ECONNREFUSED) {
> > /* ICMP error on earlier request. */
> > iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, rqstp->rq_bvec,
> > - count, 0);
> > + count, rqstp->rq_res.len);
> > err = sock_sendmsg(svsk->sk_sock, &msg);
> > }
> >
> > --
> > 2.43.0
> >
>
> I can't fathom why I would have chosen zero for the @count argument.
>
> We currently have zero test coverage for UDP. I'll look into that.
>
> I've applied this to the nfsd-fixes branch. It should appear in
> v6.8-rc if I can get it tested.

Thanks. For what it is worth, this fix didn't come out of pure code
inspection, but fixes a real world setup for me. While I can't claim
that I have any kind of comprehensive testing, this fix has at least
shown to fix the issue introduced in the referenced commit in my setup.

Regards,
Lucas