From 47c25cca2ac63c614c9e29a97be075362f387d2d Mon Sep 17 00:00:00 2001 From: Ben Hutchings Date: Mon, 8 Dec 2014 01:47:13 +0000 Subject: [PATCH] Fix/ignore various ABI changes svn path=/dists/sid/linux/; revision=22133 --- debian/changelog | 2 + debian/config/defines | 4 + .../iovec-fix-abi-change-in-3.16.7-ckt1.patch | 58 ++++++ .../patches/debian/of-fix-abi-changes.patch | 179 ++++++++++++++++++ .../perf-fix-abi-change-in-3.16.7-ckt2.patch | 20 ++ ...uncate-fix-abi-change-in-3.16.7-ckt1.patch | 19 ++ debian/patches/series | 4 + 7 files changed, 286 insertions(+) create mode 100644 debian/patches/debian/iovec-fix-abi-change-in-3.16.7-ckt1.patch create mode 100644 debian/patches/debian/of-fix-abi-changes.patch create mode 100644 debian/patches/debian/perf-fix-abi-change-in-3.16.7-ckt2.patch create mode 100644 debian/patches/debian/truncate-fix-abi-change-in-3.16.7-ckt1.patch diff --git a/debian/changelog b/debian/changelog index 1385a49dc..0673d2b51 100644 --- a/debian/changelog +++ b/debian/changelog @@ -245,6 +245,8 @@ linux (3.16.7-ckt2-1) UNRELEASED; urgency=medium * [amd64] traps: Stop using IST for #SS (CVE-2014-9090) * [amd64] traps: Fix the espfix64 #DF fixup and rewrite it in C * [amd64] traps: Rework bad_iret + * Fix ABI changes in iovec, of, perf and truncate + * Ignore ABI changes in iwlwifi, KVM and spi-nor [ Ian Campbell ] * [xen] Backport various netback fixes (Closes: #767261). diff --git a/debian/config/defines b/debian/config/defines index 75a226cdd..61890753a 100644 --- a/debian/config/defines +++ b/debian/config/defines @@ -1,5 +1,9 @@ [abi] abiname: 4 +ignore-changes: + module:arch/x86/kvm/kvm + module:drivers/mtd/spi-nor/spi-nor + module:drivers/net/wireless/iwlwifi/iwlwifi [base] arches: diff --git a/debian/patches/debian/iovec-fix-abi-change-in-3.16.7-ckt1.patch b/debian/patches/debian/iovec-fix-abi-change-in-3.16.7-ckt1.patch new file mode 100644 index 000000000..bf9d8059e --- /dev/null +++ b/debian/patches/debian/iovec-fix-abi-change-in-3.16.7-ckt1.patch @@ -0,0 +1,58 @@ +From: Ben Hutchings +Date: Mon, 08 Dec 2014 01:22:04 +0000 +Subject: iovec: Fix ABI change in 3.16.7-ckt1 +Forwarded: not-needed + +The combination of 'switch iov_iter_get_pages() to passing maximal +number of pages' and 'fuse: honour max_read and max_write in direct_io +mode' adds a new parameter to iov_iter_get_pages(). + +I don't think it's very likely to be used OOT, but just in case it is: +- Rename the new version to iov_iter_get_pages_fixed() +- Define and export iov_iter_get_pages() with the old parameters + for ABI compatibility +- Define iov_iter_get_pages as a macro alias for iov_iter_get_pages_fixed + +--- a/include/linux/uio.h ++++ b/include/linux/uio.h +@@ -84,7 +84,10 @@ unsigned long iov_iter_alignment(const s + void iov_iter_init(struct iov_iter *i, int direction, const struct iovec *iov, + unsigned long nr_segs, size_t count); + ssize_t iov_iter_get_pages(struct iov_iter *i, struct page **pages, ++ size_t maxsize, size_t *start); ++ssize_t iov_iter_get_pages_fixed(struct iov_iter *i, struct page **pages, + size_t maxsize, unsigned maxpages, size_t *start); ++#define iov_iter_get_pages iov_iter_get_pages_fixed + ssize_t iov_iter_get_pages_alloc(struct iov_iter *i, struct page ***pages, + size_t maxsize, size_t *start); + int iov_iter_npages(const struct iov_iter *i, int maxpages); +--- a/mm/iov_iter.c ++++ b/mm/iov_iter.c +@@ -714,7 +714,8 @@ unsigned long iov_iter_alignment(const s + } + EXPORT_SYMBOL(iov_iter_alignment); + +-ssize_t iov_iter_get_pages(struct iov_iter *i, ++/* Called as iov_iter_get_pages() */ ++ssize_t iov_iter_get_pages_fixed(struct iov_iter *i, + struct page **pages, size_t maxsize, unsigned maxpages, + size_t *start) + { +@@ -723,6 +724,17 @@ ssize_t iov_iter_get_pages(struct iov_it + else + return get_pages_iovec(i, pages, maxsize, maxpages, start); + } ++EXPORT_SYMBOL(iov_iter_get_pages_fixed); ++ ++/* ABI compatibility wrapper */ ++#undef iov_iter_get_pages ++ssize_t iov_iter_get_pages(struct iov_iter *i, ++ struct page **pages, size_t maxsize, ++ size_t *start) ++{ ++ return iov_iter_get_pages_fixed(i, pages, maxsize, maxsize / PAGE_SIZE, ++ start); ++} + EXPORT_SYMBOL(iov_iter_get_pages); + + ssize_t iov_iter_get_pages_alloc(struct iov_iter *i, diff --git a/debian/patches/debian/of-fix-abi-changes.patch b/debian/patches/debian/of-fix-abi-changes.patch new file mode 100644 index 000000000..57f260eea --- /dev/null +++ b/debian/patches/debian/of-fix-abi-changes.patch @@ -0,0 +1,179 @@ +From: Ben Hutchings +Date: Mon, 08 Dec 2014 01:10:36 +0000 +Subject: of: Fix ABI changes +Forwarded: not-needed + +'of: Fix overflow bug in string property parsing functions' +(included in 3.16.7-ckt2) and 'of: add optional options parameter to +of_find_node_by_path()' (cherry-picked to support console selection) +changed various exported functions into inline wrappers. Change the +wrappers to exported extern functions, to maintain the ABI. + +--- a/drivers/of/base.c ++++ b/drivers/of/base.c +@@ -882,6 +882,12 @@ struct device_node *of_find_node_opts_by + } + EXPORT_SYMBOL(of_find_node_opts_by_path); + ++struct device_node *of_find_node_by_path(const char *path) ++{ ++ return of_find_node_opts_by_path(path, NULL); ++} ++EXPORT_SYMBOL(of_find_node_by_path); ++ + /** + * of_find_node_by_name - Find a node by its "name" property + * @from: The node to start searching from or NULL, the node +@@ -1460,6 +1466,52 @@ int of_property_read_string_helper(struc + } + EXPORT_SYMBOL_GPL(of_property_read_string_helper); + ++/** ++ * of_property_count_strings() - Find and return the number of strings from a ++ * multiple strings property. ++ * @np: device node from which the property value is to be read. ++ * @propname: name of the property to be searched. ++ * ++ * Search for a property in a device tree node and retrieve the number of null ++ * terminated string contain in it. Returns the number of strings on ++ * success, -EINVAL if the property does not exist, -ENODATA if property ++ * does not have a value, and -EILSEQ if the string is not null-terminated ++ * within the length of the property data. ++ */ ++static inline int of_property_count_strings(struct device_node *np, ++ const char *propname) ++{ ++ return of_property_read_string_helper(np, propname, NULL, 0, 0); ++} ++EXPORT_SYMBOL_GPL(of_property_count_strings); ++ ++/** ++ * of_property_read_string_index() - Find and read a string from a multiple ++ * strings property. ++ * @np: device node from which the property value is to be read. ++ * @propname: name of the property to be searched. ++ * @index: index of the string in the list of strings ++ * @out_string: pointer to null terminated return string, modified only if ++ * return value is 0. ++ * ++ * Search for a property in a device tree node and retrieve a null ++ * terminated string value (pointer to data, not a copy) in the list of strings ++ * contained in that property. ++ * Returns 0 on success, -EINVAL if the property does not exist, -ENODATA if ++ * property does not have a value, and -EILSEQ if the string is not ++ * null-terminated within the length of the property data. ++ * ++ * The out_string pointer is modified only if a valid string can be decoded. ++ */ ++int of_property_read_string_index(struct device_node *np, ++ const char *propname, ++ int index, const char **output) ++{ ++ int rc = of_property_read_string_helper(np, propname, output, 1, index); ++ return rc < 0 ? rc : 0; ++} ++EXPORT_SYMBOL_GPL(of_property_read_string_index); ++ + void of_print_phandle_args(const char *msg, const struct of_phandle_args *args) + { + int i; +--- a/include/linux/of.h ++++ b/include/linux/of.h +@@ -230,10 +230,7 @@ extern struct device_node *of_find_match + + extern struct device_node *of_find_node_opts_by_path(const char *path, + const char **opts); +-static inline struct device_node *of_find_node_by_path(const char *path) +-{ +- return of_find_node_opts_by_path(path, NULL); +-} ++extern struct device_node *of_find_node_by_path(const char *path); + + extern struct device_node *of_find_node_by_phandle(phandle handle); + extern struct device_node *of_get_parent(const struct device_node *node); +@@ -273,9 +270,14 @@ extern int of_property_read_u64(const st + extern int of_property_read_string(struct device_node *np, + const char *propname, + const char **out_string); ++extern int of_property_read_string_index(struct device_node *np, ++ const char *propname, ++ int index, const char **output); + extern int of_property_match_string(struct device_node *np, + const char *propname, + const char *string); ++extern int of_property_count_strings(struct device_node *np, ++ const char *propname); + extern int of_property_read_string_helper(struct device_node *np, + const char *propname, + const char **out_strs, size_t sz, int index); +@@ -495,6 +497,19 @@ static inline int of_property_read_strin + return -ENOSYS; + } + ++static inline int of_property_read_string_index(struct device_node *np, ++ const char *propname, int index, ++ const char **out_string) ++{ ++ return -ENOSYS; ++} ++ ++static inline int of_property_count_strings(struct device_node *np, ++ const char *propname) ++{ ++ return -ENOSYS; ++} ++ + static inline int of_property_read_string_helper(struct device_node *np, + const char *propname, + const char **out_strs, size_t sz, int index) +@@ -691,50 +706,6 @@ static inline int of_property_read_strin + } + + /** +- * of_property_count_strings() - Find and return the number of strings from a +- * multiple strings property. +- * @np: device node from which the property value is to be read. +- * @propname: name of the property to be searched. +- * +- * Search for a property in a device tree node and retrieve the number of null +- * terminated string contain in it. Returns the number of strings on +- * success, -EINVAL if the property does not exist, -ENODATA if property +- * does not have a value, and -EILSEQ if the string is not null-terminated +- * within the length of the property data. +- */ +-static inline int of_property_count_strings(struct device_node *np, +- const char *propname) +-{ +- return of_property_read_string_helper(np, propname, NULL, 0, 0); +-} +- +-/** +- * of_property_read_string_index() - Find and read a string from a multiple +- * strings property. +- * @np: device node from which the property value is to be read. +- * @propname: name of the property to be searched. +- * @index: index of the string in the list of strings +- * @out_string: pointer to null terminated return string, modified only if +- * return value is 0. +- * +- * Search for a property in a device tree node and retrieve a null +- * terminated string value (pointer to data, not a copy) in the list of strings +- * contained in that property. +- * Returns 0 on success, -EINVAL if the property does not exist, -ENODATA if +- * property does not have a value, and -EILSEQ if the string is not +- * null-terminated within the length of the property data. +- * +- * The out_string pointer is modified only if a valid string can be decoded. +- */ +-static inline int of_property_read_string_index(struct device_node *np, +- const char *propname, +- int index, const char **output) +-{ +- int rc = of_property_read_string_helper(np, propname, output, 1, index); +- return rc < 0 ? rc : 0; +-} +- +-/** + * of_property_read_bool - Findfrom a property + * @np: device node from which the property value is to be read. + * @propname: name of the property to be searched. diff --git a/debian/patches/debian/perf-fix-abi-change-in-3.16.7-ckt2.patch b/debian/patches/debian/perf-fix-abi-change-in-3.16.7-ckt2.patch new file mode 100644 index 000000000..77f40292f --- /dev/null +++ b/debian/patches/debian/perf-fix-abi-change-in-3.16.7-ckt2.patch @@ -0,0 +1,20 @@ +From: Ben Hutchings +Date: Mon, 08 Dec 2014 01:39:31 +0000 +Subject: perf: Fix ABI change in 3.16.7-ckt2 +Forwarded: not-needed + +Hide the new #include from genksyms. + + +--- a/kernel/events/core.c ++++ b/kernel/events/core.c +@@ -41,7 +41,9 @@ + #include + #include + #include ++#ifndef __GENKSYMS__ + #include ++#endif + + #include "internal.h" + diff --git a/debian/patches/debian/truncate-fix-abi-change-in-3.16.7-ckt1.patch b/debian/patches/debian/truncate-fix-abi-change-in-3.16.7-ckt1.patch new file mode 100644 index 000000000..1d696a23c --- /dev/null +++ b/debian/patches/debian/truncate-fix-abi-change-in-3.16.7-ckt1.patch @@ -0,0 +1,19 @@ +From: Ben Hutchings +Date: Mon, 08 Dec 2014 01:34:44 +0000 +Subject: truncate: Fix ABI change in 3.16.7-ckt1 +Forwarded: not-needed + +Hide the new #include from genksyms. + +--- a/mm/truncate.c ++++ b/mm/truncate.c +@@ -20,7 +20,9 @@ + #include /* grr. try_to_release_page, + do_invalidatepage */ + #include ++#ifndef __GENKSYMS__ + #include ++#endif + #include "internal.h" + + static void clear_exceptional_entry(struct address_space *mapping, diff --git a/debian/patches/series b/debian/patches/series index d19ee8981..490f4e435 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -476,3 +476,7 @@ features/all/iwlwifi-debug/iwlwifi-mvm-update-layout-of-firmware-error-dump.patc bugfix/x86/x86_64-traps-Stop-using-IST-for-SS.patch bugfix/x86/x86_64-traps-Fix-the-espfix64-DF-fixup-and-rewrite-i.patch bugfix/x86/x86_64-traps-Rework-bad_iret.patch +debian/of-fix-abi-changes.patch +debian/iovec-fix-abi-change-in-3.16.7-ckt1.patch +debian/truncate-fix-abi-change-in-3.16.7-ckt1.patch +debian/perf-fix-abi-change-in-3.16.7-ckt2.patch