diff --git a/debian/changelog b/debian/changelog index 81bad1c91..d03da4616 100644 --- a/debian/changelog +++ b/debian/changelog @@ -86,6 +86,7 @@ linux (3.14.5-1) UNRELEASED; urgency=medium [ Ben Hutchings ] * [x86] ACPICA: Tables: Fix invalid pointer accesses in acpi_tb_parse_root_table(). (Closes: #748574) + * net: Revert lockdep changes in 3.14.5 to avoid an ABI change [ Ian Campbell ] * [arm64] Initial kernel configuration and packaging (Closes: #745349). diff --git a/debian/config/defines b/debian/config/defines index 2625534c1..f1f919e88 100644 --- a/debian/config/defines +++ b/debian/config/defines @@ -8,6 +8,10 @@ ignore-changes: g450_mnp2f matrox_* matroxfb_* +# Not used OOT (at least not in open-vm-tools) + vsock_core_init +# Cannot be used OOT + nf_ct_extend_register [base] arches: diff --git a/debian/patches/debian/net-revert-lockdep-changes-in-3.14.5.patch b/debian/patches/debian/net-revert-lockdep-changes-in-3.14.5.patch new file mode 100644 index 000000000..e50f25b20 --- /dev/null +++ b/debian/patches/debian/net-revert-lockdep-changes-in-3.14.5.patch @@ -0,0 +1,260 @@ +From: Ben Hutchings +Date: Sun, 01 Jun 2014 20:33:54 +0100 +Subject: net: Revert lockdep changes in 3.14.5 + +These changes fixed false lockep warnings, but result in an ABI +change. As lockdep is not enabled in our binary packages, they +don't fix any problem either. + +diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c +index 9dde3ea..1831fb7 100644 +--- a/drivers/net/macvlan.c ++++ b/drivers/net/macvlan.c +@@ -518,11 +518,6 @@ static struct lock_class_key macvlan_netdev_addr_lock_key; + #define MACVLAN_STATE_MASK \ + ((1<<__LINK_STATE_NOCARRIER) | (1<<__LINK_STATE_DORMANT)) + +-static int macvlan_get_nest_level(struct net_device *dev) +-{ +- return ((struct macvlan_dev *)netdev_priv(dev))->nest_level; +-} +- + static void macvlan_set_lockdep_class_one(struct net_device *dev, + struct netdev_queue *txq, + void *_unused) +@@ -533,9 +528,8 @@ static void macvlan_set_lockdep_class_one(struct net_device *dev, + + static void macvlan_set_lockdep_class(struct net_device *dev) + { +- lockdep_set_class_and_subclass(&dev->addr_list_lock, +- &macvlan_netdev_addr_lock_key, +- macvlan_get_nest_level(dev)); ++ lockdep_set_class(&dev->addr_list_lock, ++ &macvlan_netdev_addr_lock_key); + netdev_for_each_tx_queue(dev, macvlan_set_lockdep_class_one, NULL); + } + +@@ -737,7 +731,6 @@ static const struct net_device_ops macvlan_netdev_ops = { + .ndo_fdb_add = macvlan_fdb_add, + .ndo_fdb_del = macvlan_fdb_del, + .ndo_fdb_dump = ndo_dflt_fdb_dump, +- .ndo_get_lock_subclass = macvlan_get_nest_level, + }; + + void macvlan_common_setup(struct net_device *dev) +@@ -866,7 +859,6 @@ int macvlan_common_newlink(struct net *src_net, struct net_device *dev, + vlan->dev = dev; + vlan->port = port; + vlan->set_features = MACVLAN_FEATURES; +- vlan->nest_level = dev_get_nest_level(lowerdev, netif_is_macvlan) + 1; + + vlan->mode = MACVLAN_MODE_VEPA; + if (data && data[IFLA_MACVLAN_MODE]) +diff --git a/include/linux/if_macvlan.h b/include/linux/if_macvlan.h +index a9a53b1..7c8b20b 100644 +--- a/include/linux/if_macvlan.h ++++ b/include/linux/if_macvlan.h +@@ -56,7 +56,6 @@ struct macvlan_dev { + int numqueues; + netdev_features_t tap_features; + int minor; +- int nest_level; + }; + + static inline void macvlan_count_rx(const struct macvlan_dev *vlan, +diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h +index 72ba6f5..bbedfb5 100644 +--- a/include/linux/if_vlan.h ++++ b/include/linux/if_vlan.h +@@ -73,7 +73,7 @@ static inline struct vlan_ethhdr *vlan_eth_hdr(const struct sk_buff *skb) + /* found in socket.c */ + extern void vlan_ioctl_set(int (*hook)(struct net *, void __user *)); + +-static inline bool is_vlan_dev(struct net_device *dev) ++static inline int is_vlan_dev(struct net_device *dev) + { + return dev->priv_flags & IFF_802_1Q_VLAN; + } +@@ -158,7 +158,6 @@ struct vlan_dev_priv { + #ifdef CONFIG_NET_POLL_CONTROLLER + struct netpoll *netpoll; + #endif +- unsigned int nest_level; + }; + + static inline struct vlan_dev_priv *vlan_dev_priv(const struct net_device *dev) +diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h +index 911718f..daafd95 100644 +--- a/include/linux/netdevice.h ++++ b/include/linux/netdevice.h +@@ -1145,7 +1145,6 @@ struct net_device_ops { + netdev_tx_t (*ndo_dfwd_start_xmit) (struct sk_buff *skb, + struct net_device *dev, + void *priv); +- int (*ndo_get_lock_subclass)(struct net_device *dev); + }; + + /* +@@ -2862,12 +2861,7 @@ static inline void netif_addr_lock(struct net_device *dev) + + static inline void netif_addr_lock_nested(struct net_device *dev) + { +- int subclass = SINGLE_DEPTH_NESTING; +- +- if (dev->netdev_ops->ndo_get_lock_subclass) +- subclass = dev->netdev_ops->ndo_get_lock_subclass(dev); +- +- spin_lock_nested(&dev->addr_list_lock, subclass); ++ spin_lock_nested(&dev->addr_list_lock, SINGLE_DEPTH_NESTING); + } + + static inline void netif_addr_lock_bh(struct net_device *dev) +@@ -2994,14 +2988,6 @@ void *netdev_lower_get_next_private_rcu(struct net_device *dev, + priv; \ + priv = netdev_lower_get_next_private_rcu(dev, &(iter))) + +-void *netdev_lower_get_next(struct net_device *dev, +- struct list_head **iter); +-#define netdev_for_each_lower_dev(dev, ldev, iter) \ +- for (iter = &(dev)->adj_list.lower, \ +- ldev = netdev_lower_get_next(dev, &(iter)); \ +- ldev; \ +- ldev = netdev_lower_get_next(dev, &(iter))) +- + void *netdev_adjacent_get_private(struct list_head *adj_list); + void *netdev_lower_get_first_private_rcu(struct net_device *dev); + struct net_device *netdev_master_upper_dev_get(struct net_device *dev); +@@ -3017,8 +3003,6 @@ void netdev_upper_dev_unlink(struct net_device *dev, + void netdev_adjacent_rename_links(struct net_device *dev, char *oldname); + void *netdev_lower_dev_get_private(struct net_device *dev, + struct net_device *lower_dev); +-int dev_get_nest_level(struct net_device *dev, +- bool (*type_check)(struct net_device *dev)); + int skb_checksum_help(struct sk_buff *skb); + struct sk_buff *__skb_gso_segment(struct sk_buff *skb, + netdev_features_t features, bool tx_path); +diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c +index 44ebd5c..175273f 100644 +--- a/net/8021q/vlan.c ++++ b/net/8021q/vlan.c +@@ -169,7 +169,6 @@ int register_vlan_dev(struct net_device *dev) + if (err < 0) + goto out_uninit_mvrp; + +- vlan->nest_level = dev_get_nest_level(real_dev, is_vlan_dev) + 1; + err = register_netdevice(dev); + if (err < 0) + goto out_uninit_mvrp; +diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c +index cc0d218..27bfe2f 100644 +--- a/net/8021q/vlan_dev.c ++++ b/net/8021q/vlan_dev.c +@@ -524,11 +524,6 @@ static void vlan_dev_set_lockdep_class(struct net_device *dev, int subclass) + netdev_for_each_tx_queue(dev, vlan_dev_set_lockdep_one, &subclass); + } + +-static int vlan_dev_get_lock_subclass(struct net_device *dev) +-{ +- return vlan_dev_priv(dev)->nest_level; +-} +- + static const struct header_ops vlan_header_ops = { + .create = vlan_dev_hard_header, + .rebuild = vlan_dev_rebuild_header, +@@ -564,7 +559,7 @@ static const struct net_device_ops vlan_netdev_ops; + static int vlan_dev_init(struct net_device *dev) + { + struct net_device *real_dev = vlan_dev_priv(dev)->real_dev; +- int i; ++ int subclass = 0, i; + + netif_carrier_off(dev); + +@@ -613,7 +608,10 @@ static int vlan_dev_init(struct net_device *dev) + + SET_NETDEV_DEVTYPE(dev, &vlan_type); + +- vlan_dev_set_lockdep_class(dev, vlan_dev_get_lock_subclass(dev)); ++ if (is_vlan_dev(real_dev)) ++ subclass = 1; ++ ++ vlan_dev_set_lockdep_class(dev, subclass); + + vlan_dev_priv(dev)->vlan_pcpu_stats = alloc_percpu(struct vlan_pcpu_stats); + if (!vlan_dev_priv(dev)->vlan_pcpu_stats) +@@ -793,7 +791,6 @@ static const struct net_device_ops vlan_netdev_ops = { + .ndo_netpoll_cleanup = vlan_dev_netpoll_cleanup, + #endif + .ndo_fix_features = vlan_dev_fix_features, +- .ndo_get_lock_subclass = vlan_dev_get_lock_subclass, + }; + + void vlan_setup(struct net_device *dev) +diff --git a/net/core/dev.c b/net/core/dev.c +index 7c22974..6088927 100644 +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -4605,32 +4605,6 @@ void *netdev_lower_get_next_private_rcu(struct net_device *dev, + EXPORT_SYMBOL(netdev_lower_get_next_private_rcu); + + /** +- * netdev_lower_get_next - Get the next device from the lower neighbour +- * list +- * @dev: device +- * @iter: list_head ** of the current position +- * +- * Gets the next netdev_adjacent from the dev's lower neighbour +- * list, starting from iter position. The caller must hold RTNL lock or +- * its own locking that guarantees that the neighbour lower +- * list will remain unchainged. +- */ +-void *netdev_lower_get_next(struct net_device *dev, struct list_head **iter) +-{ +- struct netdev_adjacent *lower; +- +- lower = list_entry((*iter)->next, struct netdev_adjacent, list); +- +- if (&lower->list == &dev->adj_list.lower) +- return NULL; +- +- *iter = &lower->list; +- +- return lower->dev; +-} +-EXPORT_SYMBOL(netdev_lower_get_next); +- +-/** + * netdev_lower_get_first_private_rcu - Get the first ->private from the + * lower neighbour list, RCU + * variant +@@ -5080,30 +5054,6 @@ void *netdev_lower_dev_get_private(struct net_device *dev, + } + EXPORT_SYMBOL(netdev_lower_dev_get_private); + +- +-int dev_get_nest_level(struct net_device *dev, +- bool (*type_check)(struct net_device *dev)) +-{ +- struct net_device *lower = NULL; +- struct list_head *iter; +- int max_nest = -1; +- int nest; +- +- ASSERT_RTNL(); +- +- netdev_for_each_lower_dev(dev, lower, iter) { +- nest = dev_get_nest_level(lower, type_check); +- if (max_nest < nest) +- max_nest = nest; +- } +- +- if (type_check(dev)) +- max_nest++; +- +- return max_nest; +-} +-EXPORT_SYMBOL(dev_get_nest_level); +- + static void dev_change_rx_flags(struct net_device *dev, int flags) + { + const struct net_device_ops *ops = dev->netdev_ops; diff --git a/debian/patches/debian/netfilter-avoid-abi-change-in-3.14.5.patch b/debian/patches/debian/netfilter-avoid-abi-change-in-3.14.5.patch new file mode 100644 index 000000000..2c05d472a --- /dev/null +++ b/debian/patches/debian/netfilter-avoid-abi-change-in-3.14.5.patch @@ -0,0 +1,46 @@ +From: Ben Hutchings +Date: Sun, 01 Jun 2014 23:29:17 +0100 +Subject: netfilter: Avoid ABI change in 3.14.5 + +The types of fields in struct nf_ct_ext were changed by commit +223b02d923ec ("netfilter: nf_conntrack: reserve two bytes for +nf_ct_ext->len") as u8 is not large enough to store the offsets +that may be needed now. + +This ABI change should only affect the conntrack extension modules, +which must be in-tree as they have centrally assigned numbers. +However the structure definition is visible to all modules using +conntrack at all. Hide the ABI change from genksyms and use a macro +to rename the extension registration function so that it is still not +possible to mismatch conntrack core and extension modules. + +--- a/include/net/netfilter/nf_conntrack_extend.h ++++ b/include/net/netfilter/nf_conntrack_extend.h +@@ -47,8 +47,19 @@ enum nf_ct_ext_id { + /* Extensions: optional stuff which isn't permanently in struct. */ + struct nf_ct_ext { + struct rcu_head rcu; ++#ifdef __GENKSYMS__ ++ /* Layout expected by modules calling nf_ct_extend_register() ++ * (which has been removed) ++ */ ++ u8 offset[NF_CT_EXT_NUM]; ++ u8 len; ++#else ++ /* Layout expected by modules calling nf_ct_extend_register_16() ++ * (all newly built modules, thanks to macro definition below) ++ */ + u16 offset[NF_CT_EXT_NUM]; + u16 len; ++#endif + char data[0]; + }; + +@@ -118,6 +129,7 @@ struct nf_ct_ext_type { + u8 alloc_size; + }; + ++#define nf_ct_extend_register nf_ct_extend_register_16 + int nf_ct_extend_register(struct nf_ct_ext_type *type); + void nf_ct_extend_unregister(struct nf_ct_ext_type *type); + #endif /* _NF_CONNTRACK_EXTEND_H */ diff --git a/debian/patches/debian/sockdiag-avoid-abi-change-in-3.14.5.patch b/debian/patches/debian/sockdiag-avoid-abi-change-in-3.14.5.patch new file mode 100644 index 000000000..6163d69a0 --- /dev/null +++ b/debian/patches/debian/sockdiag-avoid-abi-change-in-3.14.5.patch @@ -0,0 +1,40 @@ +From: Ben Hutchings +Date: Sun, 01 Jun 2014 20:38:59 +0100 +Subject: sockdiag: Avoid ABI change in 3.14.5 + +Add the user_namespace parameter back to sock_diag_put_filterinfo(), +but don't use it there. + +--- a/include/linux/sock_diag.h ++++ b/include/linux/sock_diag.h +@@ -23,7 +23,7 @@ int sock_diag_check_cookie(void *sk, __u + void sock_diag_save_cookie(void *sk, __u32 *cookie); + + int sock_diag_put_meminfo(struct sock *sk, struct sk_buff *skb, int attr); +-int sock_diag_put_filterinfo(struct sock *sk, ++int sock_diag_put_filterinfo(struct user_namespace *user_ns, struct sock *sk, + struct sk_buff *skb, int attrtype); + + #endif +--- a/net/core/sock_diag.c ++++ b/net/core/sock_diag.c +@@ -49,7 +49,7 @@ int sock_diag_put_meminfo(struct sock *s + } + EXPORT_SYMBOL_GPL(sock_diag_put_meminfo); + +-int sock_diag_put_filterinfo(struct sock *sk, ++int sock_diag_put_filterinfo(struct user_namespace *user_ns __always_unused, struct sock *sk, + struct sk_buff *skb, int attrtype) + { + struct nlattr *attr; +--- a/net/packet/diag.c ++++ b/net/packet/diag.c +@@ -172,7 +172,7 @@ static int sk_diag_fill(struct sock *sk, + goto out_nlmsg_trim; + + if ((req->pdiag_show & PACKET_SHOW_FILTER) && +- sock_diag_put_filterinfo(sk, skb, PACKET_DIAG_FILTER)) ++ sock_diag_put_filterinfo(user_ns, sk, skb, PACKET_DIAG_FILTER)) + goto out_nlmsg_trim; + + return nlmsg_end(skb, nlh); diff --git a/debian/patches/debian/target-avoid-abi-change-in-3.14.5.patch b/debian/patches/debian/target-avoid-abi-change-in-3.14.5.patch new file mode 100644 index 000000000..f49c2a548 --- /dev/null +++ b/debian/patches/debian/target-avoid-abi-change-in-3.14.5.patch @@ -0,0 +1,43 @@ +From: Ben Hutchings +Date: Sun, 01 Jun 2014 20:47:46 +0100 +Subject: target: Avoid ABI change in 3.14.5 + +Commit e63ed0d7a980 ("scsi: fix our current target reap infrastructure") +removed one field (ew) and changed the type of another (reap_ref). + +Put back 'ew' and hide the type change to 'reap_ref', which remains +the same size and is only used within the SCSI core. + +--- a/drivers/scsi/scsi_scan.c ++++ b/drivers/scsi/scsi_scan.c +@@ -433,6 +433,8 @@ static struct scsi_target *scsi_alloc_ta + } + dev = &starget->dev; + device_initialize(dev); ++ /* bwh: assert binary compatibility */ ++ BUILD_BUG_ON(sizeof(starget->reap_ref) != sizeof(unsigned int)); + kref_init(&starget->reap_ref); + dev->parent = get_device(parent); + dev_set_name(dev, "target%d:%d:%d", shost->host_no, channel, id); +--- a/include/scsi/scsi_device.h ++++ b/include/scsi/scsi_device.h +@@ -257,7 +257,11 @@ struct scsi_target { + struct list_head siblings; + struct list_head devices; + struct device dev; ++#ifdef __GENKSYMS__ ++ unsigned int reap_ref; ++#else + struct kref reap_ref; /* last put renders target invisible */ ++#endif + unsigned int channel; + unsigned int id; /* target id ... replace + * scsi_device.id eventually */ +@@ -284,6 +288,7 @@ struct scsi_target { + #define SCSI_DEFAULT_TARGET_BLOCKED 3 + + char scsi_level; ++ struct execute_work ew; /* bwh: unused, for binary compatibility */ + enum scsi_target_state state; + void *hostdata; /* available to low-level driver */ + unsigned long starget_data[0]; /* for the transport */ diff --git a/debian/patches/series b/debian/patches/series index 88f5c4bda..36a82377c 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -84,3 +84,7 @@ features/arm/ARM-sun4i-dt-Add-USB-host-bindings.patch debian/libata-avoid-abi-change-in-3.14.4.patch debian/dm-avoid-abi-change-in-3.14.4.patch bugfix/x86/ACPICA-Tables-Fix-invalid-pointer-accesses-in-acpi_t.patch +debian/net-revert-lockdep-changes-in-3.14.5.patch +debian/sockdiag-avoid-abi-change-in-3.14.5.patch +debian/target-avoid-abi-change-in-3.14.5.patch +debian/netfilter-avoid-abi-change-in-3.14.5.patch