sock: fix zerocopy_success regression with msg_zerocopy
authorWillem de Bruijn <willemb@google.com>
Wed, 9 Aug 2017 23:09:44 +0000 (19:09 -0400)
committerDavid S. Miller <davem@davemloft.net>
Wed, 9 Aug 2017 23:49:17 +0000 (16:49 -0700)
Do not use uarg->zerocopy outside msg_zerocopy. In other paths the
field is not explicitly initialized and aliases another field.

Those paths have only one reference so do not need this intermediate
variable. Call uarg->callback directly.

Fixes: 1f8b977ab32d ("sock: enable MSG_ZEROCOPY")
Signed-off-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/skbuff.h

index 8c0708d2e5e6655c648a5718000fac4103c7f321..7594e19bce622a38dc39c054093c3da15b99b67b 100644 (file)
@@ -1273,8 +1273,13 @@ static inline void skb_zcopy_clear(struct sk_buff *skb, bool zerocopy)
        struct ubuf_info *uarg = skb_zcopy(skb);
 
        if (uarg) {
-               uarg->zerocopy = uarg->zerocopy && zerocopy;
-               sock_zerocopy_put(uarg);
+               if (uarg->callback == sock_zerocopy_callback) {
+                       uarg->zerocopy = uarg->zerocopy && zerocopy;
+                       sock_zerocopy_put(uarg);
+               } else {
+                       uarg->callback(uarg, zerocopy);
+               }
+
                skb_shinfo(skb)->tx_flags &= ~SKBTX_ZEROCOPY_FRAG;
        }
 }