Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
[linux-2.6-microblaze.git] / net / ipv4 / tcp_output.c
index 9901176..f322e79 100644 (file)
@@ -445,11 +445,12 @@ struct tcp_out_options {
        struct mptcp_out_options mptcp;
 };
 
-static void mptcp_options_write(__be32 *ptr, struct tcp_out_options *opts)
+static void mptcp_options_write(__be32 *ptr, const struct tcp_sock *tp,
+                               struct tcp_out_options *opts)
 {
 #if IS_ENABLED(CONFIG_MPTCP)
        if (unlikely(OPTION_MPTCP & opts->options))
-               mptcp_write_options(ptr, &opts->mptcp);
+               mptcp_write_options(ptr, tp, &opts->mptcp);
 #endif
 }
 
@@ -701,7 +702,7 @@ static void tcp_options_write(__be32 *ptr, struct tcp_sock *tp,
 
        smc_options_write(ptr, &options);
 
-       mptcp_options_write(ptr, opts);
+       mptcp_options_write(ptr, tp, opts);
 }
 
 static void smc_set_option(const struct tcp_sock *tp,
@@ -1038,9 +1039,9 @@ static void tcp_tsq_handler(struct sock *sk)
  * transferring tsq->head because tcp_wfree() might
  * interrupt us (non NAPI drivers)
  */
-static void tcp_tasklet_func(unsigned long data)
+static void tcp_tasklet_func(struct tasklet_struct *t)
 {
-       struct tsq_tasklet *tsq = (struct tsq_tasklet *)data;
+       struct tsq_tasklet *tsq = from_tasklet(tsq,  t, tasklet);
        LIST_HEAD(list);
        unsigned long flags;
        struct list_head *q, *n;
@@ -1125,9 +1126,7 @@ void __init tcp_tasklet_init(void)
                struct tsq_tasklet *tsq = &per_cpu(tsq_tasklet, i);
 
                INIT_LIST_HEAD(&tsq->head);
-               tasklet_init(&tsq->tasklet,
-                            tcp_tasklet_func,
-                            (unsigned long)tsq);
+               tasklet_setup(&tsq->tasklet, tcp_tasklet_func);
        }
 }
 
@@ -1348,7 +1347,6 @@ static int __tcp_transmit_skb(struct sock *sk, struct sk_buff *skb,
                }
        }
 
-       tcp_options_write((__be32 *)(th + 1), tp, &opts);
        skb_shinfo(skb)->gso_type = sk->sk_gso_type;
        if (likely(!(tcb->tcp_flags & TCPHDR_SYN))) {
                th->window      = htons(tcp_select_window(sk));
@@ -1359,6 +1357,9 @@ static int __tcp_transmit_skb(struct sock *sk, struct sk_buff *skb,
                 */
                th->window      = htons(min(tp->rcv_wnd, 65535U));
        }
+
+       tcp_options_write((__be32 *)(th + 1), tp, &opts);
+
 #ifdef CONFIG_TCP_MD5SIG
        /* Calculate the MD5 hash, as we have all we need now */
        if (md5) {
@@ -1569,6 +1570,7 @@ int tcp_fragment(struct sock *sk, enum tcp_queue tcp_queue,
        if (!buff)
                return -ENOMEM; /* We'll just try again later. */
        skb_copy_decrypted(buff, skb);
+       mptcp_skb_ext_copy(buff, skb);
 
        sk_wmem_queued_add(sk, buff->truesize);
        sk_mem_charge(sk, buff->truesize);
@@ -2124,6 +2126,7 @@ static int tso_fragment(struct sock *sk, struct sk_buff *skb, unsigned int len,
        if (unlikely(!buff))
                return -ENOMEM;
        skb_copy_decrypted(buff, skb);
+       mptcp_skb_ext_copy(buff, skb);
 
        sk_wmem_queued_add(sk, buff->truesize);
        sk_mem_charge(sk, buff->truesize);
@@ -2394,6 +2397,7 @@ static int tcp_mtu_probe(struct sock *sk)
 
        skb = tcp_send_head(sk);
        skb_copy_decrypted(nskb, skb);
+       mptcp_skb_ext_copy(nskb, skb);
 
        TCP_SKB_CB(nskb)->seq = TCP_SKB_CB(skb)->seq;
        TCP_SKB_CB(nskb)->end_seq = TCP_SKB_CB(skb)->seq + probe_size;