diff --git a/Makefile b/Makefile
index 8a1e51e5b0cf..107b5778b864 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 VERSION = 3
 PATCHLEVEL = 18
-SUBLEVEL = 83
+SUBLEVEL = 84
 EXTRAVERSION =
 NAME = Diseased Newt
 
diff --git a/drivers/char/ipmi/ipmi_msghandler.c 
b/drivers/char/ipmi/ipmi_msghandler.c
index f816211f062f..63164ff66bb4 100644
--- a/drivers/char/ipmi/ipmi_msghandler.c
+++ b/drivers/char/ipmi/ipmi_msghandler.c
@@ -4010,7 +4010,8 @@ smi_from_recv_msg(ipmi_smi_t intf, struct ipmi_recv_msg 
*recv_msg,
 }
 
 static void check_msg_timeout(ipmi_smi_t intf, struct seq_table *ent,
-                             struct list_head *timeouts, long timeout_period,
+                             struct list_head *timeouts,
+                             unsigned long timeout_period,
                              int slot, unsigned long *flags,
                              unsigned int *waiting_msgs)
 {
@@ -4023,8 +4024,8 @@ static void check_msg_timeout(ipmi_smi_t intf, struct 
seq_table *ent,
        if (!ent->inuse)
                return;
 
-       ent->timeout -= timeout_period;
-       if (ent->timeout > 0) {
+       if (timeout_period < ent->timeout) {
+               ent->timeout -= timeout_period;
                (*waiting_msgs)++;
                return;
        }
@@ -4091,7 +4092,8 @@ static void check_msg_timeout(ipmi_smi_t intf, struct 
seq_table *ent,
        }
 }
 
-static unsigned int ipmi_timeout_handler(ipmi_smi_t intf, long timeout_period)
+static unsigned int ipmi_timeout_handler(ipmi_smi_t intf,
+                                        unsigned long timeout_period)
 {
        struct list_head     timeouts;
        struct ipmi_recv_msg *msg, *msg2;
diff --git a/drivers/net/ethernet/fealnx.c b/drivers/net/ethernet/fealnx.c
index b1b9ebafb354..a3b2e23921bf 100644
--- a/drivers/net/ethernet/fealnx.c
+++ b/drivers/net/ethernet/fealnx.c
@@ -257,8 +257,8 @@ enum rx_desc_status_bits {
        RXFSD = 0x00000800,     /* first descriptor */
        RXLSD = 0x00000400,     /* last descriptor */
        ErrorSummary = 0x80,    /* error summary */
-       RUNT = 0x40,            /* runt packet received */
-       LONG = 0x20,            /* long packet received */
+       RUNTPKT = 0x40,         /* runt packet received */
+       LONGPKT = 0x20,         /* long packet received */
        FAE = 0x10,             /* frame align error */
        CRC = 0x08,             /* crc error */
        RXER = 0x04,            /* receive error */
@@ -1633,7 +1633,7 @@ static int netdev_rx(struct net_device *dev)
                                               dev->name, rx_status);
 
                                dev->stats.rx_errors++; /* end of a packet. */
-                               if (rx_status & (LONG | RUNT))
+                               if (rx_status & (LONGPKT | RUNTPKT))
                                        dev->stats.rx_length_errors++;
                                if (rx_status & RXER)
                                        dev->stats.rx_frame_errors++;
diff --git a/fs/coda/upcall.c b/fs/coda/upcall.c
index 5bb6e27298a4..21dbff85829a 100644
--- a/fs/coda/upcall.c
+++ b/fs/coda/upcall.c
@@ -446,8 +446,7 @@ int venus_fsync(struct super_block *sb, struct CodaFid *fid)
        UPARG(CODA_FSYNC);
 
        inp->coda_fsync.VFid = *fid;
-       error = coda_upcall(coda_vcp(sb), sizeof(union inputArgs),
-                           &outsize, inp);
+       error = coda_upcall(coda_vcp(sb), insize, &outsize, inp);
 
        CODA_FREE(inp, insize);
        return error;
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
index 2adcb9876e91..6c6fa10a82ca 100644
--- a/fs/ocfs2/file.c
+++ b/fs/ocfs2/file.c
@@ -1151,6 +1151,13 @@ int ocfs2_setattr(struct dentry *dentry, struct iattr 
*attr)
                dquot_initialize(inode);
        size_change = S_ISREG(inode->i_mode) && attr->ia_valid & ATTR_SIZE;
        if (size_change) {
+               /*
+                * Here we should wait dio to finish before inode lock
+                * to avoid a deadlock between ocfs2_setattr() and
+                * ocfs2_dio_end_io_write()
+                */
+               inode_dio_wait(inode);
+
                status = ocfs2_rw_lock(inode, 1);
                if (status < 0) {
                        mlog_errno(status);
@@ -1170,8 +1177,6 @@ int ocfs2_setattr(struct dentry *dentry, struct iattr 
*attr)
                if (status)
                        goto bail_unlock;
 
-               inode_dio_wait(inode);
-
                if (i_size_read(inode) >= attr->ia_size) {
                        if (ocfs2_should_order_data(inode)) {
                                status = ocfs2_begin_ordered_truncate(inode,
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 2ff757f2d3a3..e5ba0236047e 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -3117,6 +3117,13 @@ static inline void nf_reset_trace(struct sk_buff *skb)
 #endif
 }
 
+static inline void ipvs_reset(struct sk_buff *skb)
+{
+#if IS_ENABLED(CONFIG_IP_VS)
+       skb->ipvs_property = 0;
+#endif
+}
+
 /* Note: This doesn't put any conntrack and bridge info in dst. */
 static inline void __nf_copy(struct sk_buff *dst, const struct sk_buff *src,
                             bool copy)
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c
index 4ccf021b85d5..6b9c7eaca478 100644
--- a/net/8021q/vlan.c
+++ b/net/8021q/vlan.c
@@ -376,6 +376,9 @@ static int vlan_device_event(struct notifier_block *unused, 
unsigned long event,
                        dev->name);
                vlan_vid_add(dev, htons(ETH_P_8021Q), 0);
        }
+       if (event == NETDEV_DOWN &&
+           (dev->features & NETIF_F_HW_VLAN_CTAG_FILTER))
+               vlan_vid_del(dev, htons(ETH_P_8021Q), 0);
 
        vlan_info = rtnl_dereference(dev->vlan_info);
        if (!vlan_info)
@@ -420,9 +423,6 @@ static int vlan_device_event(struct notifier_block *unused, 
unsigned long event,
                break;
 
        case NETDEV_DOWN:
-               if (dev->features & NETIF_F_HW_VLAN_CTAG_FILTER)
-                       vlan_vid_del(dev, htons(ETH_P_8021Q), 0);
-
                /* Put all VLANs for this dev in the down state too.  */
                vlan_group_for_each_dev(grp, i, vlandev) {
                        flgs = vlandev->flags;
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index b2e2a53c2284..9c830242a1f9 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -4069,6 +4069,7 @@ void skb_scrub_packet(struct sk_buff *skb, bool xnet)
        if (!xnet)
                return;
 
+       ipvs_reset(skb);
        skb_orphan(skb);
        skb->mark = 0;
 }
diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c
index ff186dac3e07..4d925dbe4bb7 100644
--- a/net/dccp/ipv6.c
+++ b/net/dccp/ipv6.c
@@ -487,6 +487,9 @@ static struct sock *dccp_v6_request_recv_sock(struct sock 
*sk,
                newsk->sk_backlog_rcv = dccp_v4_do_rcv;
                newnp->pktoptions  = NULL;
                newnp->opt         = NULL;
+               newnp->ipv6_mc_list = NULL;
+               newnp->ipv6_ac_list = NULL;
+               newnp->ipv6_fl_list = NULL;
                newnp->mcast_oif   = inet6_iif(skb);
                newnp->mcast_hops  = ipv6_hdr(skb)->hop_limit;
 
@@ -562,6 +565,10 @@ static struct sock *dccp_v6_request_recv_sock(struct sock 
*sk,
        /* Clone RX bits */
        newnp->rxopt.all = np->rxopt.all;
 
+       newnp->ipv6_mc_list = NULL;
+       newnp->ipv6_ac_list = NULL;
+       newnp->ipv6_fl_list = NULL;
+
        /* Clone pktoptions received with SYN */
        newnp->pktoptions = NULL;
        if (ireq->pktopts != NULL) {
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index ff47e881e205..55da3338bfb2 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -2911,13 +2911,8 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct 
dst_entry *dst,
        tcp_ecn_make_synack(req, th, sk);
        th->source = htons(ireq->ir_num);
        th->dest = ireq->ir_rmt_port;
-       /* Setting of flags are superfluous here for callers (and ECE is
-        * not even correctly set)
-        */
-       tcp_init_nondata_skb(skb, tcp_rsk(req)->snt_isn,
-                            TCPHDR_SYN | TCPHDR_ACK);
-
-       th->seq = htonl(TCP_SKB_CB(skb)->seq);
+       skb->ip_summed = CHECKSUM_PARTIAL;
+       th->seq = htonl(tcp_rsk(req)->snt_isn);
        /* XXX data is queued and acked as is. No buffer/window check */
        th->ack_seq = htonl(tcp_rsk(req)->rcv_nxt);
 
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
index 19fe7b789a72..b8e05f16659c 100644
--- a/net/ipv6/tcp_ipv6.c
+++ b/net/ipv6/tcp_ipv6.c
@@ -1113,6 +1113,7 @@ static struct sock *tcp_v6_syn_recv_sock(struct sock *sk, 
struct sk_buff *skb,
                newtp->af_specific = &tcp_sock_ipv6_mapped_specific;
 #endif
 
+               newnp->ipv6_mc_list = NULL;
                newnp->ipv6_ac_list = NULL;
                newnp->ipv6_fl_list = NULL;
                newnp->pktoptions  = NULL;
@@ -1184,6 +1185,7 @@ static struct sock *tcp_v6_syn_recv_sock(struct sock *sk, 
struct sk_buff *skb,
           First: no IPv4 options.
         */
        newinet->inet_opt = NULL;
+       newnp->ipv6_mc_list = NULL;
        newnp->ipv6_ac_list = NULL;
        newnp->ipv6_fl_list = NULL;
 
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index 4792e76b7d4a..d22e8d210fce 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -1927,7 +1927,7 @@ static int netlink_dump(struct sock *sk)
        struct sk_buff *skb = NULL;
        struct nlmsghdr *nlh;
        struct module *module;
-       int len, err = -ENOBUFS;
+       int err = -ENOBUFS;
        int alloc_size;
 
        mutex_lock(nlk->cb_mutex);
@@ -1965,9 +1965,11 @@ static int netlink_dump(struct sock *sk)
                goto errout_skb;
        netlink_skb_set_owner_r(skb, sk);
 
-       len = cb->dump(skb, cb);
+       if (nlk->dump_done_errno > 0)
+               nlk->dump_done_errno = cb->dump(skb, cb);
 
-       if (len > 0) {
+       if (nlk->dump_done_errno > 0 ||
+           skb_tailroom(skb) < nlmsg_total_size(sizeof(nlk->dump_done_errno))) 
{
                mutex_unlock(nlk->cb_mutex);
 
                if (sk_filter(sk, skb))
@@ -1977,13 +1979,15 @@ static int netlink_dump(struct sock *sk)
                return 0;
        }
 
-       nlh = nlmsg_put_answer(skb, cb, NLMSG_DONE, sizeof(len), NLM_F_MULTI);
-       if (!nlh)
+       nlh = nlmsg_put_answer(skb, cb, NLMSG_DONE,
+                              sizeof(nlk->dump_done_errno), NLM_F_MULTI);
+       if (WARN_ON(!nlh))
                goto errout_skb;
 
        nl_dump_check_consistent(cb, nlh);
 
-       memcpy(nlmsg_data(nlh), &len, sizeof(len));
+       memcpy(nlmsg_data(nlh), &nlk->dump_done_errno,
+              sizeof(nlk->dump_done_errno));
 
        if (sk_filter(sk, skb))
                kfree_skb(skb);
@@ -2048,6 +2052,7 @@ int __netlink_dump_start(struct sock *ssk, struct sk_buff 
*skb,
        cb->skb = skb;
 
        nlk->cb_running = true;
+       nlk->dump_done_errno = INT_MAX;
 
        mutex_unlock(nlk->cb_mutex);
 
diff --git a/net/netlink/af_netlink.h b/net/netlink/af_netlink.h
index c6bd3dd35cb3..81a2d371bcf6 100644
--- a/net/netlink/af_netlink.h
+++ b/net/netlink/af_netlink.h
@@ -35,6 +35,7 @@ struct netlink_sock {
        size_t                  max_recvmsg_len;
        wait_queue_head_t       wait;
        bool                    cb_running;
+       int                     dump_done_errno;
        struct netlink_callback cb;
        struct mutex            *cb_mutex;
        struct mutex            cb_def_mutex;
diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c
index 70966fee8835..5b5ddc0f2dbc 100644
--- a/net/sctp/ipv6.c
+++ b/net/sctp/ipv6.c
@@ -805,6 +805,8 @@ static void sctp_inet6_skb_msgname(struct sk_buff *skb, 
char *msgname,
                if (ipv6_addr_type(&addr->v6.sin6_addr) & IPV6_ADDR_LINKLOCAL) {
                        struct sctp_ulpevent *ev = sctp_skb2event(skb);
                        addr->v6.sin6_scope_id = ev->iif;
+               } else {
+                       addr->v6.sin6_scope_id = 0;
                }
        }
 
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index 07324ca1df1d..3f89cd063246 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -4466,6 +4466,10 @@ int sctp_do_peeloff(struct sock *sk, sctp_assoc_t id, 
struct socket **sockp)
        struct socket *sock;
        int err = 0;
 
+       /* Do not peel off from one netns to another one. */
+       if (!net_eq(current->nsproxy->net_ns, sock_net(sk)))
+               return -EINVAL;
+
        if (!asoc)
                return -EINVAL;
 
diff --git a/security/integrity/ima/ima_appraise.c 
b/security/integrity/ima/ima_appraise.c
index dd88b6e1e8a1..ee7618115756 100644
--- a/security/integrity/ima/ima_appraise.c
+++ b/security/integrity/ima/ima_appraise.c
@@ -297,6 +297,9 @@ void ima_update_xattr(struct integrity_iint_cache *iint, 
struct file *file)
        if (iint->flags & IMA_DIGSIG)
                return;
 
+       if (iint->ima_file_status != INTEGRITY_PASS)
+               return;
+
        rc = ima_collect_measurement(iint, file, NULL, NULL);
        if (rc < 0)
                return;

Reply via email to