mirror of
https://github.com/torvalds/linux.git
synced 2026-05-26 16:12:59 +02:00
net: devmem: preserve sockc_err
Preserve the error code returned by sock_cmsg_send and return that on err. Signed-off-by: Mina Almasry <almasrymina@google.com> Acked-by: Stanislav Fomichev <sdf@fomichev.me> Link: https://patch.msgid.link/20250523230524.1107879-4-almasrymina@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
170ebc60b7
commit
85cea17d15
|
|
@ -1067,7 +1067,7 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size)
|
|||
int flags, err, copied = 0;
|
||||
int mss_now = 0, size_goal, copied_syn = 0;
|
||||
int process_backlog = 0;
|
||||
bool sockc_valid = true;
|
||||
int sockc_err = 0;
|
||||
int zc = 0;
|
||||
long timeo;
|
||||
|
||||
|
|
@ -1075,13 +1075,10 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size)
|
|||
|
||||
sockc = (struct sockcm_cookie){ .tsflags = READ_ONCE(sk->sk_tsflags) };
|
||||
if (msg->msg_controllen) {
|
||||
err = sock_cmsg_send(sk, msg, &sockc);
|
||||
if (unlikely(err))
|
||||
/* Don't return error until MSG_FASTOPEN has been
|
||||
* processed; that may succeed even if the cmsg is
|
||||
* invalid.
|
||||
*/
|
||||
sockc_valid = false;
|
||||
sockc_err = sock_cmsg_send(sk, msg, &sockc);
|
||||
/* Don't return error until MSG_FASTOPEN has been processed;
|
||||
* that may succeed even if the cmsg is invalid.
|
||||
*/
|
||||
}
|
||||
|
||||
if ((flags & MSG_ZEROCOPY) && size) {
|
||||
|
|
@ -1092,7 +1089,7 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size)
|
|||
} else if (sock_flag(sk, SOCK_ZEROCOPY)) {
|
||||
skb = tcp_write_queue_tail(sk);
|
||||
uarg = msg_zerocopy_realloc(sk, size, skb_zcopy(skb),
|
||||
sockc_valid && !!sockc.dmabuf_id);
|
||||
!sockc_err && sockc.dmabuf_id);
|
||||
if (!uarg) {
|
||||
err = -ENOBUFS;
|
||||
goto out_err;
|
||||
|
|
@ -1102,7 +1099,7 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size)
|
|||
else
|
||||
uarg_to_msgzc(uarg)->zerocopy = 0;
|
||||
|
||||
if (sockc_valid && sockc.dmabuf_id) {
|
||||
if (!sockc_err && sockc.dmabuf_id) {
|
||||
binding = net_devmem_get_binding(sk, sockc.dmabuf_id);
|
||||
if (IS_ERR(binding)) {
|
||||
err = PTR_ERR(binding);
|
||||
|
|
@ -1116,7 +1113,7 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size)
|
|||
zc = MSG_SPLICE_PAGES;
|
||||
}
|
||||
|
||||
if (sockc_valid && sockc.dmabuf_id &&
|
||||
if (!sockc_err && sockc.dmabuf_id &&
|
||||
(!(flags & MSG_ZEROCOPY) || !sock_flag(sk, SOCK_ZEROCOPY))) {
|
||||
err = -EINVAL;
|
||||
goto out_err;
|
||||
|
|
@ -1160,9 +1157,8 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size)
|
|||
/* 'common' sending to sendq */
|
||||
}
|
||||
|
||||
if (!sockc_valid) {
|
||||
if (!err)
|
||||
err = -EINVAL;
|
||||
if (sockc_err) {
|
||||
err = sockc_err;
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user