FAILED: patch "[PATCH] SUNRPC: Return an error from xdr_buf_to_bvec() on overflow" failed to apply to 6.18-stable tree
Subsystems (4)
[email protected]
maintainerThe patch below does not apply to the 6.18-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.18.y
git checkout FETCH_HEAD
git cherry-pick -x 18c1cc69886192e33536498289d26dba6894e3d5
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026072057-lapped-rebate-93bd@gregkh' --subject-prefix 'PATCH 6.18.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 18c1cc69886192e33536498289d26dba6894e3d5 Mon Sep 17 00:00:00 2001
From: Chuck Lever <[email protected]>
Date: Tue, 19 May 2026 09:34:22 -0400
Subject: [PATCH] SUNRPC: Return an error from xdr_buf_to_bvec() on overflow
xdr_buf_to_bvec() returns a slot count even when the caller's bvec budget is exhausted partway through the xdr_buf. Callers feed that count into iov_iter_bvec() and continue as if the conversion had succeeded, silently sending or writing fewer bytes than the data length declares. For an NFS WRITE the server reports the truncated transfer to the client as full success.
The overflow represents an internal invariant violation: a higher layer reserved a bvec budget too small for the xdr_buf it then asked the encoder to convert. That is a server-side fault, not a media I/O failure and not a malformed client argument.
Change xdr_buf_to_bvec() to return a signed int and have the overflow label return -ESERVERFAULT. Update the three callers to detect the negative return and fail the request: nfsd_vfs_write() folds the error into host_err, which nfserrno() translates to nfserr_serverfault for the WRITE reply; svc_udp_sendto() and svc_tcp_sendmsg() propagate the error out of the send path.
fs/nfsd/vfs.c +5 -1
@@ -1440,7 +1440,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp,unsigned long exp_op_flags =0 ;unsigned int pflags = current->flags;bool restore_flags = false; -unsigned int nvecs; +int nvecs;trace_nfsd_write_opened (rqstp, fhp, offset, *cnt);
@@ -1480,6 +1480,10 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, } nvecs =xdr_buf_to_bvec (rqstp->rq_bvec, rqstp->rq_maxpages, payload); +if (nvecs <0 ) { + host_err = nvecs; + goto out_nfserr; + } since =READ_ONCE (file->f_wb_err);if (verf)
include/linux/sunrpc/xdr.h +2 -2
@@ -138,8 +138,8 @@ void xdr_terminate_string(const struct xdr_buf *, const u32);size_t xdr_buf_pagecount (const struct xdr_buf *buf);int xdr_alloc_bvec (struct xdr_buf *buf,gfp_t gfp);void xdr_free_bvec (struct xdr_buf *buf); -unsigned int xdr_buf_to_bvec (struct bio_vec *bvec,unsigned int bvec_size, -const struct xdr_buf *xdr); +int xdr_buf_to_bvec (struct bio_vec *bvec,unsigned int bvec_size, +const struct xdr_buf *xdr);int xdr_buf_to_sg (const struct xdr_buf *buf,unsigned int offset,unsigned int len,struct scatterlist *sg,unsigned int nsg); int xdr_buf_to_sg_alloc(const struct xdr_buf *buf, unsigned int offset,
net/sunrpc/svcsock.c +12 -2
@@ -732,7 +732,7 @@ static int svc_udp_sendto(struct svc_rqst *rqstp) .msg_flags = MSG_SPLICE_PAGES, .msg_controllen = sizeof(buffer), }; -unsigned int count; +int count;int err;svc_udp_release_ctxt (xprt, rqstp->rq_xprt_ctxt);
@@ -746,6 +746,10 @@ static int svc_udp_sendto(struct svc_rqst *rqstp) goto out_notconn; count =xdr_buf_to_bvec (svsk->sk_bvec,SUNRPC_MAX_UDP_SENDPAGES , xdr); +if (count <0 ) { + err = count; + goto out_trace; + }iov_iter_bvec (&msg.msg_iter,ITER_SOURCE , svsk->sk_bvec, count, rqstp->rq_res.len);
@@ -757,6 +761,7 @@ static int svc_udp_sendto(struct svc_rqst *rqstp) err =sock_sendmsg (svsk->sk_sock, &msg); } +out_trace:trace_svcsock_udp_send (xprt, err);mutex_unlock (&xprt->xpt_mutex);
@@ -1237,7 +1242,7 @@ static int svc_tcp_sendmsg(struct svc_sock *svsk, struct svc_rqst *rqstp,struct msghdr msg = { .msg_flags =MSG_SPLICE_PAGES , }; -unsigned int count; +int count;void *buf;int ret;
@@ -1253,10 +1258,15 @@ static int svc_tcp_sendmsg(struct svc_sock *svsk, struct svc_rqst *rqstp, count =xdr_buf_to_bvec (svsk->sk_bvec +1 , rqstp->rq_maxpages, &rqstp->rq_res); +if (count <0 ) { + ret = count; + goto out; + }iov_iter_bvec (&msg.msg_iter,ITER_SOURCE , svsk->sk_bvec,1 + count,sizeof (marker) + rqstp->rq_res.len); ret =sock_sendmsg (svsk->sk_sock, &msg); +out:page_frag_free (buf);return ret; }
net/sunrpc/xdr.c +6 -5
@@ -139,13 +139,14 @@ xdr_free_bvec(struct xdr_buf *buf)/** * xdr_buf_to_bvec - Copy components of an xdr_buf into a bio_vec array * @bvec: bio_vec array to populate -* @bvec_size: element count of @bio_vec +* @bvec_size: element count of @bvec * @xdr: xdr_buf to be copied * -* Returns the number of entries consumed in @bvec. +* Returns the number of entries consumed in @bvec on success, or +* -ESERVERFAULT when @xdr does not fit within @bvec_size entries. */ -unsigned int xdr_buf_to_bvec (struct bio_vec *bvec,unsigned int bvec_size, -const struct xdr_buf *xdr) +int xdr_buf_to_bvec (struct bio_vec *bvec,unsigned int bvec_size, +const struct xdr_buf *xdr) {const struct kvec *head = xdr->head;const struct kvec *tail = xdr->tail;
@@ -187,7 +188,7 @@ unsigned int xdr_buf_to_bvec(struct bio_vec *bvec, unsigned int bvec_size, bvec_overflow:pr_warn_once ("%s: bio_vec array overflow\n" , __func__); -return count; +return -ESERVERFAULT ; }EXPORT_SYMBOL_GPL (xdr_buf_to_bvec);
Sasha Levin
maintainerPATCH 1/5 NFSD: pass nfsd_file to nfsd_iter_read()
From: Mike Snitzer <[email protected]>
[ Upstream commit 803bc849f0039291f546ba0e2237faebeb5c073e ]
Prepare for nfsd_iter_read() to use the DIO alignment stored in nfsd_file by passing the nfsd_file to nfsd_iter_read() rather than just the file which is associaed with the nfsd_file.
This means nfsd4_encode_readv() now also needs the nfsd_file rather than the file. Instead of changing the file arg to be the nfsd_file, we discard the file arg as the nfsd_file (and indeed the file) is already available via the "read" argument.
Stable-dep-of: 18c1cc698861 ("SUNRPC: Return an error from xdr_buf_to_bvec() on overflow")
--- fs/nfsd/nfs4xdr.c | 8 ++++---- fs/nfsd/vfs.c | 7 ++++--- fs/nfsd/vfs.h | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-)
fs/nfsd/nfs4xdr.c +4 -4
@@ -4478,7 +4478,7 @@ static __be32 nfsd4_encode_splice_read(static __be32 nfsd4_encode_readv (struct nfsd4_compoundres *resp,struct nfsd4_read *read, -struct file *file,unsigned long maxcount) +unsigned long maxcount) {struct xdr_stream *xdr = resp->xdr;unsigned int base = xdr->buf->page_len & ~PAGE_MASK ;
@@ -4489,7 +4489,7 @@ static __be32 nfsd4_encode_readv(struct nfsd4_compoundres *resp,if (xdr_reserve_space_vec (xdr, maxcount) <0 )return nfserr_resource; - nfserr =nfsd_iter_read (resp->rqstp, read->rd_fhp, file, + nfserr =nfsd_iter_read (resp->rqstp, read->rd_fhp, read->rd_nf, read->rd_offset, &maxcount, base, &read->rd_eof); read->rd_length = maxcount;
@@ -4536,7 +4536,7 @@ nfsd4_encode_read(struct nfsd4_compoundres *resp, __be32 nfserr,if (file->f_op->splice_read && splice_ok) nfserr =nfsd4_encode_splice_read (resp, read, file, maxcount);else - nfserr =nfsd4_encode_readv (resp, read, file, maxcount); + nfserr =nfsd4_encode_readv (resp, read, maxcount);if (nfserr) {xdr_truncate_encode (xdr, eof_offset);return nfserr;
@@ -5432,7 +5432,7 @@ nfsd4_encode_read_plus_data(struct nfsd4_compoundres *resp,if (file->f_op->splice_read && splice_ok) nfserr =nfsd4_encode_splice_read (resp, read, file, maxcount);else - nfserr =nfsd4_encode_readv (resp, read, file, maxcount); + nfserr =nfsd4_encode_readv (resp, read, maxcount);if (nfserr)return nfserr;
fs/nfsd/vfs.c +4 -3
@@ -1078,7 +1078,7 @@ __be32 nfsd_splice_read(struct svc_rqst *rqstp, struct svc_fh *fhp,* nfsd_iter_read - Perform a VFS read using an iterator * @rqstp: RPC transaction context * @fhp: file handle of file to be read -* @file: opened struct file of file to be read +* @nf: opened struct nfsd_file of file to be read * @offset: starting byte offset * @count: IN: requested number of bytes; OUT: number of bytes read * @base: offset in first page of read buffer
@@ -1091,9 +1091,10 @@ __be32 nfsd_splice_read(struct svc_rqst *rqstp, struct svc_fh *fhp,* returned. */ __be32 nfsd_iter_read (struct svc_rqst *rqstp,struct svc_fh *fhp, -struct file *file,loff_t offset,unsigned long *count, +struct nfsd_file *nf,loff_t offset,unsigned long *count,unsigned int base,u32 *eof) { +struct file *file = nf->nf_file;unsigned long v, total;struct iov_iter iter;struct kiocb kiocb;
@@ -1346,7 +1347,7 @@ __be32 nfsd_read(struct svc_rqst *rqstp, struct svc_fh *fhp,if (file->f_op->splice_read &&nfsd_read_splice_ok (rqstp)) err =nfsd_splice_read (rqstp, fhp, file, offset, count, eof);else - err =nfsd_iter_read (rqstp, fhp, file, offset, count,0 , eof); + err =nfsd_iter_read (rqstp, fhp, nf, offset, count,0 , eof);nfsd_file_put (nf);trace_nfsd_read_done (rqstp, fhp, offset, *count);
fs/nfsd/vfs.h +1 -1
@@ -122,7 +122,7 @@ __be32 nfsd_splice_read(struct svc_rqst *rqstp, struct svc_fh *fhp,unsigned long *count, u32 *eof);__be32 nfsd_iter_read (struct svc_rqst *rqstp,struct svc_fh *fhp, -struct file *file,loff_t offset, +struct nfsd_file *nf,loff_t offset,unsigned long *count,unsigned int base,u32 *eof);bool nfsd_read_splice_ok (struct svc_rqst *rqstp);
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/5 sunrpc: allocate a separate bvec array for socket sends
From: Jeff Layton <[email protected]>
[ Upstream commit 6b3b697d65d46a0f640216a3f6c72856c159c567 ]
svc_tcp_sendmsg() calls xdr_buf_to_bvec() with the second slot of rq_bvec as the start, but doesn't reduce the array length by one, which could lead to an array overrun. Also, rq_bvec is always rq_maxpages in length, which can be too short in some cases, since the TCP record marker consumes a slot.
Fix both problems by adding a separate bvec array to the svc_sock that is specifically for sending. For TCP, make this array one slot longer than rq_maxpages, to account for the record marker. For UDP, only allocate as large an array as we need since it's limited to 64k of payload.
Stable-dep-of: 18c1cc698861 ("SUNRPC: Return an error from xdr_buf_to_bvec() on overflow")
--- include/linux/sunrpc/svcsock.h | 3 ++ net/sunrpc/svcsock.c | 55 +++++++++++++++++++++++++++++----- 2 files changed, 51 insertions(+), 7 deletions(-)
include/linux/sunrpc/svcsock.h +3 -0
@@ -26,6 +26,9 @@ struct svc_sock {void (*sk_odata)(struct sock *);void (*sk_owspace)(struct sock *); +/* For sends (protected by xpt_mutex) */ +struct bio_vec *sk_bvec; +/* private TCP part */ /* On-the-wire fragment header: */ __be32 sk_marker;
net/sunrpc/svcsock.c +48 -7
116 lines not on this page · raw message
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 3/5 SUNRPC: Add helpers to convert xdr_buf byte ranges to scatterlists
In reply to Sasha LevinFrom: Chuck Lever <[email protected]>
[ Upstream commit e9be933959b581effd426f93b86654f5fbf0c574 ]
The crypto/krb5 library accepts data in scatterlist form, but the GSS-API layer presents RPC payloads as struct xdr_buf. Bridge that gap with a pair of helper functions:
xdr_buf_to_sg() - populate a caller-supplied scatterlist
array from a byte range
xdr_buf_to_sg_alloc() - populate a caller-supplied inline
scatterlist, chaining to a heap- allocated overflow for large payloads
The inline array (typically stack-allocated at eight entries) covers the common case of small RPCs with no heap allocation on the encrypt/decrypt path. Only buffers spanning many pages incur a kmalloc for the chained extension.
The segment-walking logic follows the same head, page array, tail traversal as xdr_process_buf(), but populates a scatterlist directly rather than invoking a per-segment callback. sg_next() traversal makes the walker safe for chained scatterlists. Once subsequent patches reroute all per-message crypto operations through crypto/krb5, xdr_process_buf() loses its last callers and is removed.
Stable-dep-of: 18c1cc698861 ("SUNRPC: Return an error from xdr_buf_to_bvec() on overflow")
--- include/linux/sunrpc/xdr.h | 15 +++ net/sunrpc/xdr.c | 199 +++++++++++++++++++++++++++++++++++++ 2 files changed, 214 insertions(+)
include/linux/sunrpc/xdr.h +15 -0
@@ -140,6 +140,21 @@ int xdr_alloc_bvec(struct xdr_buf *buf, gfp_t gfp);void xdr_free_bvec (struct xdr_buf *buf);unsigned int xdr_buf_to_bvec (struct bio_vec *bvec,unsigned int bvec_size,const struct xdr_buf *xdr); +int xdr_buf_to_sg (const struct xdr_buf *buf,unsigned int offset, +unsigned int len,struct scatterlist *sg,unsigned int nsg); +int xdr_buf_to_sg_alloc (const struct xdr_buf *buf,unsigned int offset, +unsigned int len,struct scatterlist *sg_head, +unsigned int sg_head_nents, +struct scatterlist **sg_overflow,gfp_t gfp); + +/* +* Inline scatterlist entries for xdr_buf_to_sg_alloc(). Sized to cover the +* head kvec, tail kvec, and a few page fragments without any heap allocation. +*/ +enum { +XDR_BUF_TO_SG_NENTS =8 , +}; +static inline __be32 *xdr_encode_array (__be32 *p,const void *s,unsigned int len) {
net/sunrpc/xdr.c +199 -0
205 lines not on this page · raw message
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 4/5 SUNRPC: Bound-check xdr_buf_to_bvec() stores before writing
In reply to Sasha LevinFrom: Chuck Lever <[email protected]>
[ Upstream commit 42f5b80dda6b86e424054baf1475df686c403d5c ]
xdr_buf_to_bvec() writes a bio_vec into the caller's array before testing whether that slot is in range, and the head branch performs the store with no check at all. When the caller's budget is exactly used up, the next store lands one element past the end of the array. The overflow label returns count - 1, which masks the surplus store but cannot undo it.
rq_bvec, the array passed by nfsd_vfs_write(), is allocated to exactly rq_maxpages entries with no slack. The OOB store can land in adjacent slab memory; the bv_len and bv_offset fields written there are derived from client-supplied RPC payload sizes.
Move the in-range check ahead of the store in the head, page-loop, and tail branches. With the check at the top of each sequence, count is incremented only after a successful store, so the overflow label can return count directly.
Stable-dep-of: 18c1cc698861 ("SUNRPC: Return an error from xdr_buf_to_bvec() on overflow")
--- net/sunrpc/xdr.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
net/sunrpc/xdr.c +9 -5
@@ -152,6 +152,8 @@ unsigned int xdr_buf_to_bvec(struct bio_vec *bvec, unsigned int bvec_size,unsigned int count =0 ;if (head->iov_len) { +if (unlikely (count >= bvec_size)) + goto bvec_overflow;bvec_set_virt (bvec++, head->iov_base, head->iov_len); ++count; }
@@ -165,25 +167,27 @@ unsigned int xdr_buf_to_bvec(struct bio_vec *bvec, unsigned int bvec_size,while (remaining >0 ) { len = min_t(unsigned int, remaining,PAGE_SIZE - offset); +if (unlikely (count >= bvec_size)) + goto bvec_overflow;bvec_set_page (bvec++, *pages++, len, offset); remaining -= len; offset =0 ; -if (unlikely (++count > bvec_size)) - goto bvec_overflow; + ++count; } }if (tail->iov_len) { -bvec_set_virt (bvec, tail->iov_base, tail->iov_len); -if (unlikely (++count > bvec_size)) +if (unlikely (count >= bvec_size)) goto bvec_overflow; +bvec_set_virt (bvec, tail->iov_base, tail->iov_len); + ++count; }return count; bvec_overflow:pr_warn_once ("%s: bio_vec array overflow\n" , __func__); -return count -1 ; +return count; }EXPORT_SYMBOL_GPL (xdr_buf_to_bvec);
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 5/5 SUNRPC: Return an error from xdr_buf_to_bvec() on overflow
In reply to Sasha LevinFrom: Chuck Lever <[email protected]>
[ Upstream commit 18c1cc69886192e33536498289d26dba6894e3d5 ]
xdr_buf_to_bvec() returns a slot count even when the caller's bvec budget is exhausted partway through the xdr_buf. Callers feed that count into iov_iter_bvec() and continue as if the conversion had succeeded, silently sending or writing fewer bytes than the data length declares. For an NFS WRITE the server reports the truncated transfer to the client as full success.
The overflow represents an internal invariant violation: a higher layer reserved a bvec budget too small for the xdr_buf it then asked the encoder to convert. That is a server-side fault, not a media I/O failure and not a malformed client argument.
Change xdr_buf_to_bvec() to return a signed int and have the overflow label return -ESERVERFAULT. Update the three callers to detect the negative return and fail the request: nfsd_vfs_write() folds the error into host_err, which nfserrno() translates to nfserr_serverfault for the WRITE reply; svc_udp_sendto() and svc_tcp_sendmsg() propagate the error out of the send path.
--- fs/nfsd/vfs.c | 8 +++++++- include/linux/sunrpc/xdr.h | 4 ++-- net/sunrpc/svcsock.c | 14 ++++++++++++-- net/sunrpc/xdr.c | 11 ++++++----- 4 files changed, 27 insertions(+), 10 deletions(-)
fs/nfsd/vfs.c +7 -1
@@ -1203,7 +1203,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp,unsigned long exp_op_flags =0 ;unsigned int pflags = current->flags;bool restore_flags = false; -unsigned int nvecs; +int nvecs;trace_nfsd_write_opened (rqstp, fhp, offset, *cnt);
@@ -1243,7 +1243,13 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, } nvecs =xdr_buf_to_bvec (rqstp->rq_bvec, rqstp->rq_maxpages, payload); +if (nvecs <0 ) { + host_err = nvecs; + goto out_nfserr; + } +iov_iter_bvec (&iter,ITER_SOURCE , rqstp->rq_bvec, nvecs, *cnt); + since =READ_ONCE (file->f_wb_err);if (verf)nfsd_copy_write_verifier (verf, nn);
include/linux/sunrpc/xdr.h +2 -2
@@ -138,8 +138,8 @@ void xdr_terminate_string(const struct xdr_buf *, const u32);size_t xdr_buf_pagecount (const struct xdr_buf *buf);int xdr_alloc_bvec (struct xdr_buf *buf,gfp_t gfp);void xdr_free_bvec (struct xdr_buf *buf); -unsigned int xdr_buf_to_bvec (struct bio_vec *bvec,unsigned int bvec_size, -const struct xdr_buf *xdr); +int xdr_buf_to_bvec (struct bio_vec *bvec,unsigned int bvec_size, +const struct xdr_buf *xdr);int xdr_buf_to_sg (const struct xdr_buf *buf,unsigned int offset,unsigned int len,struct scatterlist *sg,unsigned int nsg); int xdr_buf_to_sg_alloc(const struct xdr_buf *buf, unsigned int offset,
net/sunrpc/svcsock.c +12 -2
@@ -738,7 +738,7 @@ static int svc_udp_sendto(struct svc_rqst *rqstp) .msg_flags = MSG_SPLICE_PAGES, .msg_controllen = sizeof(buffer), }; -unsigned int count; +int count;int err;svc_udp_release_ctxt (xprt, rqstp->rq_xprt_ctxt);
@@ -752,6 +752,10 @@ static int svc_udp_sendto(struct svc_rqst *rqstp) goto out_notconn; count =xdr_buf_to_bvec (svsk->sk_bvec,SUNRPC_MAX_UDP_SENDPAGES , xdr); +if (count <0 ) { + err = count; + goto out_trace; + }iov_iter_bvec (&msg.msg_iter,ITER_SOURCE , svsk->sk_bvec, count, rqstp->rq_res.len);
@@ -763,6 +767,7 @@ static int svc_udp_sendto(struct svc_rqst *rqstp) err =sock_sendmsg (svsk->sk_sock, &msg); } +out_trace:trace_svcsock_udp_send (xprt, err);mutex_unlock (&xprt->xpt_mutex);
@@ -1241,7 +1246,7 @@ static int svc_tcp_sendmsg(struct svc_sock *svsk, struct svc_rqst *rqstp,struct msghdr msg = { .msg_flags =MSG_SPLICE_PAGES , }; -unsigned int count; +int count;void *buf;int ret;
@@ -1257,10 +1262,15 @@ static int svc_tcp_sendmsg(struct svc_sock *svsk, struct svc_rqst *rqstp, count =xdr_buf_to_bvec (svsk->sk_bvec +1 , rqstp->rq_maxpages, &rqstp->rq_res); +if (count <0 ) { + ret = count; + goto out; + }iov_iter_bvec (&msg.msg_iter,ITER_SOURCE , svsk->sk_bvec,1 + count,sizeof (marker) + rqstp->rq_res.len); ret =sock_sendmsg (svsk->sk_sock, &msg); +out:page_frag_free (buf);return ret; }
net/sunrpc/xdr.c +6 -5
@@ -139,13 +139,14 @@ xdr_free_bvec(struct xdr_buf *buf)/** * xdr_buf_to_bvec - Copy components of an xdr_buf into a bio_vec array * @bvec: bio_vec array to populate -* @bvec_size: element count of @bio_vec +* @bvec_size: element count of @bvec * @xdr: xdr_buf to be copied * -* Returns the number of entries consumed in @bvec. +* Returns the number of entries consumed in @bvec on success, or +* -ESERVERFAULT when @xdr does not fit within @bvec_size entries. */ -unsigned int xdr_buf_to_bvec (struct bio_vec *bvec,unsigned int bvec_size, -const struct xdr_buf *xdr) +int xdr_buf_to_bvec (struct bio_vec *bvec,unsigned int bvec_size, +const struct xdr_buf *xdr) {const struct kvec *head = xdr->head;const struct kvec *tail = xdr->tail;
@@ -187,7 +188,7 @@ unsigned int xdr_buf_to_bvec(struct bio_vec *bvec, unsigned int bvec_size, bvec_overflow:pr_warn_once ("%s: bio_vec array overflow\n" , __func__); -return count; +return -ESERVERFAULT ; }EXPORT_SYMBOL_GPL (xdr_buf_to_bvec);
Signature · 1 line
2.53.0