diff --git a/debian/bin/test-patches b/debian/bin/test-patches index fc17ede29..94d6b0569 100755 --- a/debian/bin/test-patches +++ b/debian/bin/test-patches @@ -19,12 +19,15 @@ else featureset=none fi -eval "set -- $(getopt -n "$0" -- "f:j:s:" "$@")" +fuzz=0 + +eval "set -- $(getopt -n "$0" -o "f:j:s:" -l "fuzz:" -- "$@")" while true; do case "$1" in -f) flavour="$2"; shift 2 ;; -j) export MAKEFLAGS="$MAKEFLAGS -j$2"; shift 2 ;; -s) featureset="$2"; shift 2 ;; + --fuzz) fuzz="$2"; shift 2;; --) shift 1; break ;; esac done @@ -36,6 +39,7 @@ Options: -f specify the 'flavour' of kernel to build, e.g. 686-pae -j specify number of compiler jobs to run in parallel -s specify an optional featureset to apply, e.g. rt + --fuzz set the maximum patch fuzz factor (default: 0) EOF exit 2 fi @@ -63,8 +67,9 @@ alias quilt='quilt --quiltrc -' # Try to clean up any previous test patches if [ "$featureset" = none ]; then - while quilt top 2>/dev/null | grep -q ^test/; do - quilt delete + while patch="$(quilt next 2>/dev/null || quilt top 2>/dev/null)" && \ + [ "${patch#test/}" != "$patch" ]; do + quilt delete -r "$patch" done else sed -i '/^test\//d' debian/patches/series-${featureset} @@ -89,7 +94,7 @@ for patch in "$@"; do patch_abs="$(readlink -f "$patch")" (cd "debian/build/source_${featureset}" && \ quilt import -P "test/$(basename "$patch")" "$patch_abs" && \ - quilt push --fuzz=0) + quilt push --fuzz="$fuzz") done # Build selected binaries diff --git a/debian/changelog b/debian/changelog index 44ffd76b6..f7c6b7e75 100644 --- a/debian/changelog +++ b/debian/changelog @@ -427,6 +427,156 @@ linux-2.6 (3.3~rc6-1~experimental.1) experimental; urgency=low -- Ben Hutchings Sun, 04 Mar 2012 20:27:42 +0000 +linux (3.2.41-1) unstable; urgency=low + + * New upstream stable update: + http://www.kernel.org/pub/linux/kernel/v3.x/ChangeLog-3.2.40 + - ext4: return ENOMEM if sb_getblk() fails + - ext4: fix possible use-after-free with AIO + - s390/kvm: Fix store status for ACRS/FPRS + - staging: comedi: disallow COMEDI_DEVCONFIG on non-board minors + - ext4: fix race in ext4_mb_add_n_trim() + - UBIFS: fix double free of ubifs_orphan objects + - hrtimer: Prevent hrtimer_enqueue_reprogram race + - nfsd: Fix memleak + - x86: Do not leak kernel page mapping locations + - USB: usb-storage: unusual_devs update for Super TOP SATA bridge + - posix-cpu-timers: Fix nanosleep task_struct leak + - NFSv4.1: Don't decode skipped layoutgets + - cgroup: fix exit() vs rmdir() race + - cpuset: fix cpuset_print_task_mems_allowed() vs rename() race + - ext4: fix xattr block allocation/release with bigalloc + - mm: fix pageblock bitmap allocation + - target: Add missing mapped_lun bounds checking during make_mappedlun + setup + - b43: Increase number of RX DMA slots + - posix-timer: Don't call idr_find() with out-of-range ID + - fs: Fix possible use-after-free with AIO + - powerpc/kexec: Disable hard IRQ before kexec + - mmu_notifier_unregister NULL Pointer deref and multiple ->release() + callouts + - tmpfs: fix use-after-free of mempolicy object (CVE-2013-1767) + - ocfs2: fix possible use-after-free with AIO + - ocfs2: fix ocfs2_init_security_and_acl() to initialize acl correctly + - ocfs2: ac->ac_allow_chain_relink=0 won't disable group relink + - idr: fix a subtle bug in idr_get_next() + - idr: make idr_get_next() good for rcu_read_lock() + - idr: fix top layer handling + - sysctl: fix null checking in bin_dn_node_address() + - nbd: fsync and kill block device on shutdown + - s390/timer: avoid overflow when programming clock comparator + (regression in 3.2.38) + - xen-pciback: rate limit error messages from xen_pcibk_enable_msi{,x}() + (CVE-2013-0231) + - xen-netback: correctly return errors from netbk_count_requests() + - xen-netback: cancel the credit timer when taking the vif down + - ipv6: use a stronger hash for tcp + - staging: comedi: ni_labpc: correct differential channel sequence for + AI commands + - staging: comedi: ni_labpc: set up command4 register *after* command3 + - vhost: fix length for cross region descriptor (CVE-2013-0311) + http://www.kernel.org/pub/linux/kernel/v3.x/ChangeLog-3.2.41 + - NFS: Don't allow NFS silly-renamed files to be deleted, no signal + - ARM: VFP: fix emulation of second VFP instruction + - md: fix two bugs when attempting to resize RAID0 array. + - proc connector: reject unprivileged listener bumps + - cifs: ensure that cifs_get_root() only traverses directories + - dm: fix truncated status strings + - hw_random: make buffer usable in scatterlist. (real fix for #701784) + - efi_pstore: Check remaining space with QueryVariableInfo() before + writing data + - efi: be more paranoid about available space when creating variables + (Closes: #703574) + - vfs: fix pipe counter breakage + - xen/pciback: Don't disable a PCI device that is already disabled. + - ALSA: seq: Fix missing error handling in snd_seq_timer_open() + - ext3: Fix format string issues (CVE-2013-1848) + - keys: fix race with concurrent install_user_keyrings() (CVE-2013-1792) + - USB: cdc-wdm: fix buffer overflow (CVE-2013-1860) + - signal: always clear sa_restorer on execve (CVE-2013-0914) + - crypto: user - fix info leaks in report API (CVE-2013-2546, + CVE-2013-2547, CVE-2013-2548) + - Fix: compat_rw_copy_check_uvector() misuse in aio, readv, writev, and + security keys + - batman-adv: bat_socket_read missing checks + - batman-adv: Only write requested number of byte to user buffer + - mm/hotplug: correctly add new zone to all other nodes' zone lists + (CVE-2012-5517) + - btrfs: use rcu_barrier() to wait for bdev puts at unmount + + [ Aurelien Jarno] + * [mips,mipsel] Disable VGA_CONSOLE and ignore the corresponding ABI + change. It is completely broken on MIPS. + * headers: Include Kbuild.platforms and Platform files in -common to + fix out-of-tree building on mips and mipsel. + * [{mips,mipsel}/{4,5}kc-malta] Enable HW_RANDOM as module so that both + flavours have a consistent configuration. + + [ Ben Hutchings ] + * [x86] ata_piix: reenable MS Virtual PC guests (fixes regression in + 3.2.19-1) + * test-patches: Clean up all previous test patches, whether or not they + were applied + * test-patches: Add --fuzz option to allow testing patches that have fuzz + * [x86] efi: Fix processor-specific memcpy() build error (Closes: #698581) + * udeb: Add hid-topseed to input-modules (Closes: #702611) + * [x86] drm/i915: Unconditionally initialise the interrupt workers, + thanks to Bjørn Mork (Closes: #692607) + * efi: Ensure efivars is loaded on EFI systems (Closes: #703363) + - [x86] Use a platform device to trigger loading of efivars + - [ia64] Change EFI_VARS from module to built-in + * efivars: Work around serious firmware bugs + - Allow disabling use as a pstore backend + - Add module parameter to disable use as a pstore backend + * [x86] Set EFI_VARS_PSTORE_DEFAULT_DISABLE=y + - explicitly calculate length of VariableName + - Handle duplicate names from get_next_variable() + * efi_pstore: Introducing workqueue updating sysfs + * efivars: pstore: Do not check size when erasing variable + * efivars: Remove check for 50% full on write + * kmsg_dump: Only dump kernel log in error cases (Closes: #703386) + - kexec: remove KMSG_DUMP_KEXEC + - kmsg_dump: don't run on non-error paths by default + * [x86] i915: initialize CADL in opregion (Closes: #703271) + * drm, agp: Update to 3.4.37: + - drm/radeon/dce6: fix display powergating + - drm: don't add inferred modes for monitors that don't support them + - drm/i915: Increase the RC6p threshold. + * signal: Fix use of missing sa_restorer field (build regression + introduced by fix for CVE-2013-0914) + * rds: limit the size allocated by rds_message_alloc() + * rtnl: fix info leak on RTM_GETLINK request for VF devices + * dcbnl: fix various netlink info leaks + * [s390] mm: fix flush_tlb_kernel_range() + * [powerpc] Fix cputable entry for 970MP rev 1.0 + * vhost/net: fix heads usage of ubuf_info + * udf: avoid info leak on export (CVE-2012-6548) + * isofs: avoid info leak on export (CVE-2012-6549) + * [x86,powerpc/powerpc64] random: Change HW_RANDOM back from built-in to + module, as we now have a real fix for #701784 + * [rt] Update to 3.2.40-rt60 + + -- Ben Hutchings Sat, 23 Mar 2013 03:54:34 +0000 + +linux (3.2.39-2) unstable; urgency=high + + * [s390,s390x] virtio: Ignore ABI changes in 3.2.39 (fixes FTBFS) + * [sparc] drm: Ignore ABI changes in 3.2.39 (fixes FTBFS) + * [sparc] drm: Change from built-in to module + * [rt] Update to 3.2.39-rt59: + - acpi/rt: Convert acpi_gbl_hardware lock back to a raw_spinlock_t + - printk: Fix rq->lock vs logbuf_lock unlock lock inversion + - wait-simple: Simple waitqueue implementation + - rcutiny: Use simple waitqueue + * [x86] efi: Fix ABI change for introduction of efi_enabled() function + in 3.2.38 (Closes: #701690) + * [armel/versatile] i2c: Re-enable I2C_PCA_PLATFORM as module, erroneously + disabled in 3.2.39-1 (fixes FTBFS) + * [x86,powerpc/powerpc64] random: Change HW_RANDOM from module to built-in, + to work around virtio-rng bug (Closes: #701784) + + -- Ben Hutchings Wed, 27 Feb 2013 03:48:30 +0000 + linux (3.2.39-1) unstable; urgency=high * New upstream stable update: diff --git a/debian/config/armel/config.versatile b/debian/config/armel/config.versatile index b1f819737..819a7a9ba 100644 --- a/debian/config/armel/config.versatile +++ b/debian/config/armel/config.versatile @@ -154,7 +154,7 @@ CONFIG_I2C=m ## # CONFIG_I2C_ISCH is not set # CONFIG_I2C_OCORES is not set -# CONFIG_I2C_PCA_PLATFORM is not set +CONFIG_I2C_PCA_PLATFORM=m # CONFIG_I2C_SIMTEC is not set CONFIG_I2C_VERSATILE=m diff --git a/debian/config/ia64/config b/debian/config/ia64/config index 7113a3306..2411315ba 100644 --- a/debian/config/ia64/config +++ b/debian/config/ia64/config @@ -155,7 +155,8 @@ CONFIG_IPMI_POWEROFF=m ## ## file: drivers/firmware/Kconfig ## -CONFIG_EFI_VARS=m +CONFIG_EFI_VARS=y +CONFIG_EFI_VARS_PSTORE=y CONFIG_DMIID=y ## diff --git a/debian/config/kernelarch-mips/config b/debian/config/kernelarch-mips/config index 630ab06cd..a85a33649 100644 --- a/debian/config/kernelarch-mips/config +++ b/debian/config/kernelarch-mips/config @@ -14,6 +14,11 @@ CONFIG_SECCOMP=y CONFIG_SCSI=y CONFIG_BLK_DEV_SD=y +## +## file: drivers/video/console/Kconfig +## +# CONFIG_VGA_CONSOLE is not set + ## ## file: fs/ext2/Kconfig ## diff --git a/debian/config/kernelarch-x86/config b/debian/config/kernelarch-x86/config index 61aa727ef..28149d8dd 100644 --- a/debian/config/kernelarch-x86/config +++ b/debian/config/kernelarch-x86/config @@ -406,6 +406,9 @@ CONFIG_EDAC_AMD8111=m CONFIG_EDD=m # CONFIG_EDD_OFF is not set CONFIG_EFI_VARS=m +CONFIG_EFI_VARS_PSTORE=y +#. Runtime-disabled by default +CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE=y CONFIG_DELL_RBU=m CONFIG_DCDBAS=m CONFIG_DMIID=y diff --git a/debian/config/mips/config b/debian/config/mips/config index ff41199a4..63f3c1bf1 100644 --- a/debian/config/mips/config +++ b/debian/config/mips/config @@ -6,4 +6,3 @@ CONFIG_CPU_BIG_ENDIAN=y # CONFIG_CPU_LITTLE_ENDIAN is not set ## end choice # CONFIG_RAPIDIO is not set - diff --git a/debian/config/mips/config.4kc-malta b/debian/config/mips/config.4kc-malta index 22e5b48f8..db273dc9d 100644 --- a/debian/config/mips/config.4kc-malta +++ b/debian/config/mips/config.4kc-malta @@ -198,6 +198,11 @@ CONFIG_PPDEV=m CONFIG_R3964=m CONFIG_APPLICOM=m +## +## file: drivers/char/hw_random/Kconfig +## +CONFIG_HW_RANDOM=m + ## ## file: drivers/char/ipmi/Kconfig ## @@ -1018,8 +1023,6 @@ CONFIG_FB_VIRTUAL=m ## ## file: drivers/video/console/Kconfig ## -CONFIG_VGA_CONSOLE=y -# CONFIG_VGACON_SOFT_SCROLLBACK is not set CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y # CONFIG_FONTS is not set diff --git a/debian/config/mips/config.5kc-malta b/debian/config/mips/config.5kc-malta index 15c5542f2..a9fcc21d1 100644 --- a/debian/config/mips/config.5kc-malta +++ b/debian/config/mips/config.5kc-malta @@ -201,6 +201,11 @@ CONFIG_PPDEV=m CONFIG_R3964=m CONFIG_APPLICOM=m +## +## file: drivers/char/hw_random/Kconfig +## +CONFIG_HW_RANDOM=m + ## ## file: drivers/char/ipmi/Kconfig ## @@ -1022,8 +1027,6 @@ CONFIG_FB_VIRTUAL=m ## ## file: drivers/video/console/Kconfig ## -CONFIG_VGA_CONSOLE=y -# CONFIG_VGACON_SOFT_SCROLLBACK is not set CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y # CONFIG_FONTS is not set diff --git a/debian/config/mips/config.r4k-ip22 b/debian/config/mips/config.r4k-ip22 index a71db0952..4746f2044 100644 --- a/debian/config/mips/config.r4k-ip22 +++ b/debian/config/mips/config.r4k-ip22 @@ -441,7 +441,6 @@ CONFIG_FB=y ## ## file: drivers/video/console/Kconfig ## -# CONFIG_VGA_CONSOLE is not set # CONFIG_MDA_CONSOLE is not set CONFIG_SGI_NEWPORT_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y diff --git a/debian/config/mips/config.r5k-ip32 b/debian/config/mips/config.r5k-ip32 index 43753f90a..e19f420f8 100644 --- a/debian/config/mips/config.r5k-ip32 +++ b/debian/config/mips/config.r5k-ip32 @@ -557,7 +557,6 @@ CONFIG_FB_GBE_MEM=4 ## ## file: drivers/video/console/Kconfig ## -# CONFIG_VGA_CONSOLE is not set CONFIG_FRAMEBUFFER_CONSOLE=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FONTS is not set diff --git a/debian/config/mips/config.sb1-bcm91250a b/debian/config/mips/config.sb1-bcm91250a index fbc48561e..841cae24f 100644 --- a/debian/config/mips/config.sb1-bcm91250a +++ b/debian/config/mips/config.sb1-bcm91250a @@ -702,7 +702,6 @@ CONFIG_FB_TRIDENT=m ## ## file: drivers/video/console/Kconfig ## -# CONFIG_VGA_CONSOLE is not set CONFIG_FRAMEBUFFER_CONSOLE=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FONTS is not set diff --git a/debian/config/mips/config.sb1a-bcm91480b b/debian/config/mips/config.sb1a-bcm91480b index 841f8343c..418fe24b4 100644 --- a/debian/config/mips/config.sb1a-bcm91480b +++ b/debian/config/mips/config.sb1a-bcm91480b @@ -708,7 +708,6 @@ CONFIG_FB_TRIDENT=m ## ## file: drivers/video/console/Kconfig ## -# CONFIG_VGA_CONSOLE is not set CONFIG_FRAMEBUFFER_CONSOLE=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FONTS is not set diff --git a/debian/config/mipsel/config b/debian/config/mipsel/config index 7f124deb6..bf12a2398 100644 --- a/debian/config/mipsel/config +++ b/debian/config/mipsel/config @@ -5,4 +5,3 @@ # CONFIG_CPU_BIG_ENDIAN is not set CONFIG_CPU_LITTLE_ENDIAN=y ## end choice - diff --git a/debian/config/mipsel/config.loongson-2f b/debian/config/mipsel/config.loongson-2f index 10c73d735..1190fe37b 100644 --- a/debian/config/mipsel/config.loongson-2f +++ b/debian/config/mipsel/config.loongson-2f @@ -126,6 +126,5 @@ CONFIG_BACKLIGHT_GENERIC=m ## ## file: drivers/video/console/Kconfig ## -# CONFIG_VGA_CONSOLE is not set CONFIG_FRAMEBUFFER_CONSOLE=y diff --git a/debian/config/mipsel/config.r5k-cobalt b/debian/config/mipsel/config.r5k-cobalt index 33f1eb95e..68446688e 100644 --- a/debian/config/mipsel/config.r5k-cobalt +++ b/debian/config/mipsel/config.r5k-cobalt @@ -671,11 +671,6 @@ CONFIG_USB_MON=y CONFIG_FB=m CONFIG_FB_COBALT=m -## -## file: drivers/video/console/Kconfig -## -# CONFIG_VGA_CONSOLE is not set - ## ## file: drivers/w1/Kconfig ## diff --git a/debian/config/sparc/config b/debian/config/sparc/config index 0805b9e40..ba5397f01 100644 --- a/debian/config/sparc/config +++ b/debian/config/sparc/config @@ -68,7 +68,7 @@ CONFIG_PRINTER=m ## ## file: drivers/gpu/drm/Kconfig ## -CONFIG_DRM=y +CONFIG_DRM=m CONFIG_DRM_TDFX=m CONFIG_DRM_R128=m CONFIG_DRM_RADEON=m diff --git a/debian/installer/modules/input-modules b/debian/installer/modules/input-modules index 31a4bd6cf..349695bdc 100644 --- a/debian/installer/modules/input-modules +++ b/debian/installer/modules/input-modules @@ -20,5 +20,6 @@ hid-quanta ? hid-samsung ? hid-speedlink ? hid-sunplus ? +hid-topseed ? synaptics_usb ? wistron_btns ? diff --git a/debian/patches/bugfix/all/efi_pstore-Introducing-workqueue-updating-sysfs.patch b/debian/patches/bugfix/all/efi_pstore-Introducing-workqueue-updating-sysfs.patch new file mode 100644 index 000000000..11183c399 --- /dev/null +++ b/debian/patches/bugfix/all/efi_pstore-Introducing-workqueue-updating-sysfs.patch @@ -0,0 +1,160 @@ +From: Seiji Aguchi +Date: Tue, 12 Feb 2013 13:04:41 -0800 +Subject: efi_pstore: Introducing workqueue updating sysfs + +commit a93bc0c6e07ed9bac44700280e65e2945d864fd4 upstream. + +[Problem] +efi_pstore creates sysfs entries, which enable users to access to NVRAM, +in a write callback. If a kernel panic happens in an interrupt context, +it may fail because it could sleep due to dynamic memory allocations during +creating sysfs entries. + +[Patch Description] +This patch removes sysfs operations from a write callback by introducing +a workqueue updating sysfs entries which is scheduled after the write +callback is called. + +Also, the workqueue is kicked in a just oops case. +A system will go down in other cases such as panic, clean shutdown and emergency +restart. And we don't need to create sysfs entries because there is no chance for +users to access to them. + +efi_pstore will be robust against a kernel panic in an interrupt context with this patch. + +Signed-off-by: Seiji Aguchi +Acked-by: Matt Fleming +Signed-off-by: Tony Luck +[bwh: Backported to 3.8: adjust context] +--- + drivers/firmware/efivars.c | 85 +++++++++++++++++++++++++++++++++++++++++--- + include/linux/efi.h | 3 +- + 2 files changed, 82 insertions(+), 6 deletions(-) + +--- a/drivers/firmware/efivars.c ++++ b/drivers/firmware/efivars.c +@@ -165,6 +165,13 @@ efivar_create_sysfs_entry(struct efivars + efi_char16_t *variable_name, + efi_guid_t *vendor_guid); + ++/* ++ * Prototype for workqueue functions updating sysfs entry ++ */ ++ ++static void efivar_update_sysfs_entries(struct work_struct *); ++static DECLARE_WORK(efivar_work, efivar_update_sysfs_entries); ++ + /* Return the number of unicode characters in data */ + static unsigned long + utf16_strnlen(efi_char16_t *s, size_t maxlength) +@@ -1428,11 +1435,8 @@ static int efi_pstore_write(enum pstore_ + + spin_unlock_irqrestore(&efivars->lock, flags); + +- if (size) +- ret = efivar_create_sysfs_entry(efivars, +- utf16_strsize(efi_name, +- DUMP_NAME_LEN * 2), +- efi_name, &vendor); ++ if (reason == KMSG_DUMP_OOPS) ++ schedule_work(&efivar_work); + + *id = part; + return ret; +@@ -1670,6 +1674,75 @@ static ssize_t efivar_delete(struct file + return count; + } + ++static bool variable_is_present(efi_char16_t *variable_name, efi_guid_t *vendor) ++{ ++ struct efivar_entry *entry, *n; ++ struct efivars *efivars = &__efivars; ++ unsigned long strsize1, strsize2; ++ bool found = false; ++ ++ strsize1 = utf16_strsize(variable_name, 1024); ++ list_for_each_entry_safe(entry, n, &efivars->list, list) { ++ strsize2 = utf16_strsize(entry->var.VariableName, 1024); ++ if (strsize1 == strsize2 && ++ !memcmp(variable_name, &(entry->var.VariableName), ++ strsize2) && ++ !efi_guidcmp(entry->var.VendorGuid, ++ *vendor)) { ++ found = true; ++ break; ++ } ++ } ++ return found; ++} ++ ++static void efivar_update_sysfs_entries(struct work_struct *work) ++{ ++ struct efivars *efivars = &__efivars; ++ efi_guid_t vendor; ++ efi_char16_t *variable_name; ++ unsigned long variable_name_size = 1024; ++ efi_status_t status = EFI_NOT_FOUND; ++ bool found; ++ ++ /* Add new sysfs entries */ ++ while (1) { ++ variable_name = kzalloc(variable_name_size, GFP_KERNEL); ++ if (!variable_name) { ++ pr_err("efivars: Memory allocation failed.\n"); ++ return; ++ } ++ ++ spin_lock_irq(&efivars->lock); ++ found = false; ++ while (1) { ++ variable_name_size = 1024; ++ status = efivars->ops->get_next_variable( ++ &variable_name_size, ++ variable_name, ++ &vendor); ++ if (status != EFI_SUCCESS) { ++ break; ++ } else { ++ if (!variable_is_present(variable_name, ++ &vendor)) { ++ found = true; ++ break; ++ } ++ } ++ } ++ spin_unlock_irq(&efivars->lock); ++ ++ if (!found) { ++ kfree(variable_name); ++ break; ++ } else ++ efivar_create_sysfs_entry(efivars, ++ variable_name_size, ++ variable_name, &vendor); ++ } ++} ++ + /* + * Let's not leave out systab information that snuck into + * the efivars driver +@@ -2000,6 +2073,8 @@ err_put: + static void __exit + efivars_exit(void) + { ++ cancel_work_sync(&efivar_work); ++ + if (efi_enabled(EFI_RUNTIME_SERVICES)) { + unregister_efivars(&__efivars); + kobject_put(efi_kobj); +--- a/include/linux/efi.h ++++ b/include/linux/efi.h +@@ -740,7 +740,8 @@ struct efivars { + * 1) ->list - adds, removals, reads, writes + * 2) ops.[gs]et_variable() calls. + * It must not be held when creating sysfs entries or calling kmalloc. +- * ops.get_next_variable() is only called from register_efivars(), ++ * ops.get_next_variable() is only called from register_efivars() ++ * or efivar_update_sysfs_entries(), + * which is protected by the BKL, so that path is safe. + */ + spinlock_t lock; diff --git a/debian/patches/bugfix/all/efivars-Add-module-parameter-to-disable-use-as-a-pst.patch b/debian/patches/bugfix/all/efivars-Add-module-parameter-to-disable-use-as-a-pst.patch new file mode 100644 index 000000000..2d042a3f1 --- /dev/null +++ b/debian/patches/bugfix/all/efivars-Add-module-parameter-to-disable-use-as-a-pst.patch @@ -0,0 +1,75 @@ +From: Seth Forshee +Date: Mon, 11 Mar 2013 16:17:50 -0500 +Subject: efivars: Add module parameter to disable use as a pstore backend + +commit ec0971ba5372a4dfa753f232449d23a8fd98490e upstream. + +We know that with some firmware implementations writing too much data to +UEFI variables can lead to bricking machines. Recent changes attempt to +address this issue, but for some it may still be prudent to avoid +writing large amounts of data until the solution has been proven on a +wide variety of hardware. + +Crash dumps or other data from pstore can potentially be a large data +source. Add a pstore_module parameter to efivars to allow disabling its +use as a backend for pstore. Also add a config option, +CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE, to allow setting the default +value of this paramter to true (i.e. disabled by default). + +Signed-off-by: Seth Forshee +Cc: Josh Boyer +Cc: Matthew Garrett +Cc: Seiji Aguchi +Cc: Tony Luck +Signed-off-by: Matt Fleming +--- + drivers/firmware/Kconfig | 9 +++++++++ + drivers/firmware/efivars.c | 8 +++++++- + 2 files changed, 16 insertions(+), 1 deletion(-) + +diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig +index 898023d..42c759a 100644 +--- a/drivers/firmware/Kconfig ++++ b/drivers/firmware/Kconfig +@@ -62,6 +62,15 @@ config EFI_VARS_PSTORE + will allow writing console messages, crash dumps, or anything + else supported by pstore to EFI variables. + ++config EFI_VARS_PSTORE_DEFAULT_DISABLE ++ bool "Disable using efivars as a pstore backend by default" ++ depends on EFI_VARS_PSTORE ++ default n ++ help ++ Saying Y here will disable the use of efivars as a storage ++ backend for pstore by default. This setting can be overridden ++ using the efivars module's pstore_disable parameter. ++ + config EFI_PCDP + bool "Console device selection via EFI PCDP or HCDP table" + depends on ACPI && EFI && IA64 +diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c +index 37b6f24..6607daf 100644 +--- a/drivers/firmware/efivars.c ++++ b/drivers/firmware/efivars.c +@@ -103,6 +103,11 @@ MODULE_VERSION(EFIVARS_VERSION); + */ + #define GUID_LEN 36 + ++static bool efivars_pstore_disable = ++ IS_ENABLED(EFI_VARS_PSTORE_DEFAULT_DISABLE); ++ ++module_param_named(pstore_disable, efivars_pstore_disable, bool, 0644); ++ + /* + * The maximum size of VariableName + Data = 1024 + * Therefore, it's reasonable to save that much +@@ -2009,7 +2014,8 @@ int register_efivars(struct efivars *efivars, + if (error) + unregister_efivars(efivars); + +- efivar_pstore_register(efivars); ++ if (!efivars_pstore_disable) ++ efivar_pstore_register(efivars); + + register_filesystem(&efivarfs_type); + diff --git a/debian/patches/bugfix/all/efivars-Allow-disabling-use-as-a-pstore-backend.patch b/debian/patches/bugfix/all/efivars-Allow-disabling-use-as-a-pstore-backend.patch new file mode 100644 index 000000000..b2a32eff7 --- /dev/null +++ b/debian/patches/bugfix/all/efivars-Allow-disabling-use-as-a-pstore-backend.patch @@ -0,0 +1,140 @@ +From: Seth Forshee +Date: Thu, 7 Mar 2013 11:40:17 -0600 +Subject: efivars: Allow disabling use as a pstore backend + +commit ed9dc8ce7a1c8115dba9483a9b51df8b63a2e0ef upstream. + +Add a new option, CONFIG_EFI_VARS_PSTORE, which can be set to N to +avoid using efivars as a backend to pstore, as some users may want to +compile out the code completely. + +Set the default to Y to maintain backwards compatability, since this +feature has always been enabled until now. + +Signed-off-by: Seth Forshee +Cc: Josh Boyer +Cc: Matthew Garrett +Cc: Seiji Aguchi +Cc: Tony Luck +Signed-off-by: Matt Fleming +--- + drivers/firmware/Kconfig | 9 +++++++ + drivers/firmware/efivars.c | 64 ++++++++++++++------------------------------ + 2 files changed, 29 insertions(+), 44 deletions(-) + +diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig +index 9b00072..898023d 100644 +--- a/drivers/firmware/Kconfig ++++ b/drivers/firmware/Kconfig +@@ -53,6 +53,15 @@ config EFI_VARS + Subsequent efibootmgr releases may be found at: + + ++config EFI_VARS_PSTORE ++ bool "Register efivars backend for pstore" ++ depends on EFI_VARS && PSTORE ++ default y ++ help ++ Say Y here to enable use efivars as a backend to pstore. This ++ will allow writing console messages, crash dumps, or anything ++ else supported by pstore to EFI variables. ++ + config EFI_PCDP + bool "Console device selection via EFI PCDP or HCDP table" + depends on ACPI && EFI && IA64 +diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c +index fe62aa3..37b6f24 100644 +--- a/drivers/firmware/efivars.c ++++ b/drivers/firmware/efivars.c +@@ -1309,9 +1309,7 @@ static const struct inode_operations efivarfs_dir_inode_operations = { + .create = efivarfs_create, + }; + +-static struct pstore_info efi_pstore_info; +- +-#ifdef CONFIG_PSTORE ++#ifdef CONFIG_EFI_VARS_PSTORE + + static int efi_pstore_open(struct pstore_info *psi) + { +@@ -1514,38 +1512,6 @@ static int efi_pstore_erase(enum pstore_type_id type, u64 id, int count, + + return 0; + } +-#else +-static int efi_pstore_open(struct pstore_info *psi) +-{ +- return 0; +-} +- +-static int efi_pstore_close(struct pstore_info *psi) +-{ +- return 0; +-} +- +-static ssize_t efi_pstore_read(u64 *id, enum pstore_type_id *type, int *count, +- struct timespec *timespec, +- char **buf, struct pstore_info *psi) +-{ +- return -1; +-} +- +-static int efi_pstore_write(enum pstore_type_id type, +- enum kmsg_dump_reason reason, u64 *id, +- unsigned int part, int count, size_t size, +- struct pstore_info *psi) +-{ +- return 0; +-} +- +-static int efi_pstore_erase(enum pstore_type_id type, u64 id, int count, +- struct timespec time, struct pstore_info *psi) +-{ +- return 0; +-} +-#endif + + static struct pstore_info efi_pstore_info = { + .owner = THIS_MODULE, +@@ -1557,6 +1523,24 @@ static struct pstore_info efi_pstore_info = { + .erase = efi_pstore_erase, + }; + ++static void efivar_pstore_register(struct efivars *efivars) ++{ ++ efivars->efi_pstore_info = efi_pstore_info; ++ efivars->efi_pstore_info.buf = kmalloc(4096, GFP_KERNEL); ++ if (efivars->efi_pstore_info.buf) { ++ efivars->efi_pstore_info.bufsize = 1024; ++ efivars->efi_pstore_info.data = efivars; ++ spin_lock_init(&efivars->efi_pstore_info.buf_lock); ++ pstore_register(&efivars->efi_pstore_info); ++ } ++} ++#else ++static void efivar_pstore_register(struct efivars *efivars) ++{ ++ return; ++} ++#endif ++ + static ssize_t efivar_create(struct file *filp, struct kobject *kobj, + struct bin_attribute *bin_attr, + char *buf, loff_t pos, size_t count) +@@ -2025,15 +2009,7 @@ int register_efivars(struct efivars *efivars, + if (error) + unregister_efivars(efivars); + +- efivars->efi_pstore_info = efi_pstore_info; +- +- efivars->efi_pstore_info.buf = kmalloc(4096, GFP_KERNEL); +- if (efivars->efi_pstore_info.buf) { +- efivars->efi_pstore_info.bufsize = 1024; +- efivars->efi_pstore_info.data = efivars; +- spin_lock_init(&efivars->efi_pstore_info.buf_lock); +- pstore_register(&efivars->efi_pstore_info); +- } ++ efivar_pstore_register(efivars); + + register_filesystem(&efivarfs_type); + diff --git a/debian/patches/bugfix/all/efivars-Fix-check-for-CONFIG_EFI_VARS_PSTORE_DEFAULT.patch b/debian/patches/bugfix/all/efivars-Fix-check-for-CONFIG_EFI_VARS_PSTORE_DEFAULT.patch new file mode 100644 index 000000000..5e155aa44 --- /dev/null +++ b/debian/patches/bugfix/all/efivars-Fix-check-for-CONFIG_EFI_VARS_PSTORE_DEFAULT.patch @@ -0,0 +1,24 @@ +From: Ben Hutchings +Date: Fri, 22 Mar 2013 19:43:53 +0000 +Subject: efivars: Fix check for CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE + +The 'CONFIG_' prefix is not implicit in IS_ENABLED(). + +Signed-off-by: Ben Hutchings +Cc: Seth Forshee +Cc: +--- + drivers/firmware/efivars.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/firmware/efivars.c ++++ b/drivers/firmware/efivars.c +@@ -105,7 +105,7 @@ MODULE_ALIAS("platform:efivars"); + #define GUID_LEN 36 + + static bool efivars_pstore_disable = +- IS_ENABLED(EFI_VARS_PSTORE_DEFAULT_DISABLE); ++ IS_ENABLED(CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE); + + module_param_named(pstore_disable, efivars_pstore_disable, bool, 0644); + diff --git a/debian/patches/bugfix/all/efivars-Handle-duplicate-names-from-get_next_variabl.patch b/debian/patches/bugfix/all/efivars-Handle-duplicate-names-from-get_next_variabl.patch new file mode 100644 index 000000000..bbff6c362 --- /dev/null +++ b/debian/patches/bugfix/all/efivars-Handle-duplicate-names-from-get_next_variabl.patch @@ -0,0 +1,156 @@ +From: Matt Fleming +Date: Thu, 7 Mar 2013 11:59:14 +0000 +Subject: efivars: Handle duplicate names from get_next_variable() + +commit e971318bbed610e28bb3fde9d548e6aaf0a6b02e upstream. + +Some firmware exhibits a bug where the same VariableName and +VendorGuid values are returned on multiple invocations of +GetNextVariableName(). See, + + https://bugzilla.kernel.org/show_bug.cgi?id=47631 + +As a consequence of such a bug, Andre reports hitting the following +WARN_ON() in the sysfs code after updating the BIOS on his, "Gigabyte +Technology Co., Ltd. To be filled by O.E.M./Z77X-UD3H, BIOS F19e +11/21/2012)" machine, + +[ 0.581554] EFI Variables Facility v0.08 2004-May-17 +[ 0.584914] ------------[ cut here ]------------ +[ 0.585639] WARNING: at /home/andre/linux/fs/sysfs/dir.c:536 sysfs_add_one+0xd4/0x100() +[ 0.586381] Hardware name: To be filled by O.E.M. +[ 0.587123] sysfs: cannot create duplicate filename '/firmware/efi/vars/SbAslBufferPtrVar-01f33c25-764d-43ea-aeea-6b5a41f3f3e8' +[ 0.588694] Modules linked in: +[ 0.589484] Pid: 1, comm: swapper/0 Not tainted 3.8.0+ #7 +[ 0.590280] Call Trace: +[ 0.591066] [] ? sysfs_add_one+0xd4/0x100 +[ 0.591861] [] warn_slowpath_common+0x7f/0xc0 +[ 0.592650] [] warn_slowpath_fmt+0x4c/0x50 +[ 0.593429] [] ? strlcat+0x65/0x80 +[ 0.594203] [] sysfs_add_one+0xd4/0x100 +[ 0.594979] [] create_dir+0x78/0xd0 +[ 0.595753] [] sysfs_create_dir+0x86/0xe0 +[ 0.596532] [] kobject_add_internal+0x9c/0x220 +[ 0.597310] [] kobject_init_and_add+0x67/0x90 +[ 0.598083] [] ? efivar_create_sysfs_entry+0x61/0x1c0 +[ 0.598859] [] efivar_create_sysfs_entry+0x11b/0x1c0 +[ 0.599631] [] register_efivars+0xde/0x420 +[ 0.600395] [] ? edd_init+0x2f5/0x2f5 +[ 0.601150] [] efivars_init+0xb8/0x104 +[ 0.601903] [] do_one_initcall+0x12a/0x180 +[ 0.602659] [] kernel_init_freeable+0x13e/0x1c6 +[ 0.603418] [] ? loglevel+0x31/0x31 +[ 0.604183] [] ? rest_init+0x80/0x80 +[ 0.604936] [] kernel_init+0xe/0xf0 +[ 0.605681] [] ret_from_fork+0x7c/0xb0 +[ 0.606414] [] ? rest_init+0x80/0x80 +[ 0.607143] ---[ end trace 1609741ab737eb29 ]--- + +There's not much we can do to work around and keep traversing the +variable list once we hit this firmware bug. Our only solution is to +terminate the loop because, as Lingzhu reports, some machines get +stuck when they encounter duplicate names, + + > I had an IBM System x3100 M4 and x3850 X5 on which kernel would + > get stuck in infinite loop creating duplicate sysfs files because, + > for some reason, there are several duplicate boot entries in nvram + > getting GetNextVariableName into a circle of iteration (with + > period > 2). + +Also disable the workqueue, as efivar_update_sysfs_entries() uses +GetNextVariableName() to figure out which variables have been created +since the last iteration. That algorithm isn't going to work if +GetNextVariableName() returns duplicates. Note that we don't disable +EFI variable creation completely on the affected machines, it's just +that any pstore dump-* files won't appear in sysfs until the next +boot. + +Reported-by: Andre Heider +Reported-by: Lingzhu Xiang +Tested-by: Lingzhu Xiang +Cc: Seiji Aguchi +Signed-off-by: Matt Fleming +--- + drivers/firmware/efivars.c | 48 +++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 47 insertions(+), 1 deletion(-) + +diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c +index 1e9d9b9..d64661f 100644 +--- a/drivers/firmware/efivars.c ++++ b/drivers/firmware/efivars.c +@@ -170,6 +170,7 @@ efivar_create_sysfs_entry(struct efivars *efivars, + + static void efivar_update_sysfs_entries(struct work_struct *); + static DECLARE_WORK(efivar_work, efivar_update_sysfs_entries); ++static bool efivar_wq_enabled = true; + + /* Return the number of unicode characters in data */ + static unsigned long +@@ -1444,7 +1445,7 @@ static int efi_pstore_write(enum pstore_type_id type, + + spin_unlock_irqrestore(&efivars->lock, flags); + +- if (reason == KMSG_DUMP_OOPS) ++ if (reason == KMSG_DUMP_OOPS && efivar_wq_enabled) + schedule_work(&efivar_work); + + *id = part; +@@ -1975,6 +1976,35 @@ void unregister_efivars(struct efivars *efivars) + } + EXPORT_SYMBOL_GPL(unregister_efivars); + ++/* ++ * Print a warning when duplicate EFI variables are encountered and ++ * disable the sysfs workqueue since the firmware is buggy. ++ */ ++static void dup_variable_bug(efi_char16_t *s16, efi_guid_t *vendor_guid, ++ unsigned long len16) ++{ ++ size_t i, len8 = len16 / sizeof(efi_char16_t); ++ char *s8; ++ ++ /* ++ * Disable the workqueue since the algorithm it uses for ++ * detecting new variables won't work with this buggy ++ * implementation of GetNextVariableName(). ++ */ ++ efivar_wq_enabled = false; ++ ++ s8 = kzalloc(len8, GFP_KERNEL); ++ if (!s8) ++ return; ++ ++ for (i = 0; i < len8; i++) ++ s8[i] = s16[i]; ++ ++ printk(KERN_WARNING "efivars: duplicate variable: %s-%pUl\n", ++ s8, vendor_guid); ++ kfree(s8); ++} ++ + int register_efivars(struct efivars *efivars, + const struct efivar_operations *ops, + struct kobject *parent_kobj) +@@ -2025,6 +2055,22 @@ int register_efivars(struct efivars *efivars, + case EFI_SUCCESS: + variable_name_size = var_name_strnsize(variable_name, + variable_name_size); ++ ++ /* ++ * Some firmware implementations return the ++ * same variable name on multiple calls to ++ * get_next_variable(). Terminate the loop ++ * immediately as there is no guarantee that ++ * we'll ever see a different variable name, ++ * and may end up looping here forever. ++ */ ++ if (variable_is_present(variable_name, &vendor_guid)) { ++ dup_variable_bug(variable_name, &vendor_guid, ++ variable_name_size); ++ status = EFI_NOT_FOUND; ++ break; ++ } ++ + efivar_create_sysfs_entry(efivars, + variable_name_size, + variable_name, diff --git a/debian/patches/bugfix/all/efivars-explicitly-calculate-length-of-VariableName.patch b/debian/patches/bugfix/all/efivars-explicitly-calculate-length-of-VariableName.patch new file mode 100644 index 000000000..ddfa2ec95 --- /dev/null +++ b/debian/patches/bugfix/all/efivars-explicitly-calculate-length-of-VariableName.patch @@ -0,0 +1,101 @@ +From: Matt Fleming +Date: Fri, 1 Mar 2013 14:49:12 +0000 +Subject: efivars: explicitly calculate length of VariableName + +commit ec50bd32f1672d38ddce10fb1841cbfda89cfe9a upstream. + +It's not wise to assume VariableNameSize represents the length of +VariableName, as not all firmware updates VariableNameSize in the same +way (some don't update it at all if EFI_SUCCESS is returned). There +are even implementations out there that update VariableNameSize with +values that are both larger than the string returned in VariableName +and smaller than the buffer passed to GetNextVariableName(), which +resulted in the following bug report from Michael Schroeder, + + > On HP z220 system (firmware version 1.54), some EFI variables are + > incorrectly named : + > + > ls -d /sys/firmware/efi/vars/*8be4d* | grep -v -- -8be returns + > /sys/firmware/efi/vars/dbxDefault-pport8be4df61-93ca-11d2-aa0d-00e098032b8c + > /sys/firmware/efi/vars/KEKDefault-pport8be4df61-93ca-11d2-aa0d-00e098032b8c + > /sys/firmware/efi/vars/SecureBoot-pport8be4df61-93ca-11d2-aa0d-00e098032b8c + > /sys/firmware/efi/vars/SetupMode-Information8be4df61-93ca-11d2-aa0d-00e098032b8c + +The issue here is that because we blindly use VariableNameSize without +verifying its value, we can potentially read garbage values from the +buffer containing VariableName if VariableNameSize is larger than the +length of VariableName. + +Since VariableName is a string, we can calculate its size by searching +for the terminating NULL character. + +Reported-by: Frederic Crozat +Cc: Matthew Garrett +Cc: Josh Boyer +Cc: Michael Schroeder +Cc: Lee, Chun-Yi +Cc: Lingzhu Xiang +Cc: Seiji Aguchi +Signed-off-by: Matt Fleming +--- + drivers/firmware/efivars.c | 32 +++++++++++++++++++++++++++++++- + 1 file changed, 31 insertions(+), 1 deletion(-) + +--- a/drivers/firmware/efivars.c ++++ b/drivers/firmware/efivars.c +@@ -1044,6 +1044,31 @@ static bool variable_is_present(efi_char + return found; + } + ++/* ++ * Returns the size of variable_name, in bytes, including the ++ * terminating NULL character, or variable_name_size if no NULL ++ * character is found among the first variable_name_size bytes. ++ */ ++static unsigned long var_name_strnsize(efi_char16_t *variable_name, ++ unsigned long variable_name_size) ++{ ++ unsigned long len; ++ efi_char16_t c; ++ ++ /* ++ * The variable name is, by definition, a NULL-terminated ++ * string, so make absolutely sure that variable_name_size is ++ * the value we expect it to be. If not, return the real size. ++ */ ++ for (len = 2; len <= variable_name_size; len += sizeof(c)) { ++ c = variable_name[(len / sizeof(c)) - 1]; ++ if (!c) ++ break; ++ } ++ ++ return min(len, variable_name_size); ++} ++ + static void efivar_update_sysfs_entries(struct work_struct *work) + { + struct efivars *efivars = &__efivars; +@@ -1084,10 +1109,13 @@ static void efivar_update_sysfs_entries( + if (!found) { + kfree(variable_name); + break; +- } else ++ } else { ++ variable_name_size = var_name_strnsize(variable_name, ++ variable_name_size); + efivar_create_sysfs_entry(efivars, + variable_name_size, + variable_name, &vendor); ++ } + } + } + +@@ -1318,6 +1346,8 @@ int register_efivars(struct efivars *efi + &vendor_guid); + switch (status) { + case EFI_SUCCESS: ++ variable_name_size = var_name_strnsize(variable_name, ++ variable_name_size); + efivar_create_sysfs_entry(efivars, + variable_name_size, + variable_name, diff --git a/debian/patches/bugfix/all/vhost-net-fix-heads-usage-of-ubuf_info.patch b/debian/patches/bugfix/all/vhost-net-fix-heads-usage-of-ubuf_info.patch new file mode 100644 index 000000000..ea9114a36 --- /dev/null +++ b/debian/patches/bugfix/all/vhost-net-fix-heads-usage-of-ubuf_info.patch @@ -0,0 +1,31 @@ +From: "Michael S. Tsirkin" +Date: Sun, 17 Mar 2013 02:46:09 +0000 +Subject: vhost/net: fix heads usage of ubuf_info + +commit 46aa92d1ba162b4b3d6b7102440e459d4e4ee255 upstream. + +ubuf info allocator uses guest controlled head as an index, +so a malicious guest could put the same head entry in the ring twice, +and we will get two callbacks on the same value. +To fix use upend_idx which is guaranteed to be unique. + +Reported-by: Rusty Russell +Signed-off-by: Michael S. Tsirkin +Signed-off-by: David S. Miller +Signed-off-by: Ben Hutchings +--- + drivers/vhost/net.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/drivers/vhost/net.c ++++ b/drivers/vhost/net.c +@@ -339,7 +339,8 @@ static void handle_tx(struct vhost_net * + msg.msg_controllen = 0; + ubufs = NULL; + } else { +- struct ubuf_info *ubuf = &vq->ubuf_info[head]; ++ struct ubuf_info *ubuf; ++ ubuf = vq->ubuf_info + vq->upend_idx; + + vq->heads[vq->upend_idx].len = + VHOST_DMA_IN_PROGRESS; diff --git a/debian/patches/debian/efi-autoload-efivars.patch b/debian/patches/debian/efi-autoload-efivars.patch new file mode 100644 index 000000000..9c46182a3 --- /dev/null +++ b/debian/patches/debian/efi-autoload-efivars.patch @@ -0,0 +1,56 @@ +From: Ben Hutchings +Subject: x86/efi: Autoload efivars +Date: Mon, 18 Mar 2013 22:59:14 +0000 +Bug-Debian: http://bugs.debian.org/703363 + +efivars is generally useful to have on EFI systems, and in some cases +it may be impossible to load it after a kernel upgrade in order to +complete a boot loader update. At the same time we don't want to +waste memory on non-EFI systems by making it built-in. + +Instead, give it a module alias as if it's a platform driver, and +register a corresponding platform device whenever EFI runtime services +are available. This should trigger udev to load it. + +--- +--- a/arch/x86/platform/efi/efi.c ++++ b/arch/x86/platform/efi/efi.c +@@ -41,6 +41,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -762,6 +763,20 @@ void __init efi_late_init(void) + efi_bgrt_init(); + } + ++#ifdef CONFIG_EFI_VARS_MODULE ++static int __init efi_load_efivars(void) ++{ ++ struct platform_device *pdev; ++ ++ if (!efi_enabled(EFI_RUNTIME_SERVICES)) ++ return 0; ++ ++ pdev = platform_device_register_simple("efivars", 0, NULL, 0); ++ return IS_ERR(pdev) ? PTR_ERR(pdev) : 0; ++} ++device_initcall(efi_load_efivars); ++#endif ++ + void __init efi_set_executable(efi_memory_desc_t *md, bool executable) + { + u64 addr, npages; +--- a/drivers/firmware/efivars.c ++++ b/drivers/firmware/efivars.c +@@ -94,6 +94,7 @@ MODULE_AUTHOR("Matt Domsch +Subject: efivars: Remove check for 50% full on write +Date: Sat, 23 Mar 2013 02:18:42 +0000 + +On my EFI-booting system (AMI firmware/Asus board), the firmware does +not garbage-collect the variable store until it is rather more than +50% full, and it also updates a variable at every boot. This check +means that variable writes are guaranteed to fail after the system has +booted more than a few hundred times. + +Since pstore integration is now disabled by default in Debian, we will +not normally write that much data before rebooting and giving the +firmware a chance to garbage-collect the variable store. Therefore, +until the check can be restricted to known-bad systems, it seems less +risky to disable it for now. + +--- +--- a/drivers/firmware/efivars.c ++++ b/drivers/firmware/efivars.c +@@ -439,8 +439,7 @@ check_var_size_locked(struct efivars *ef + if (status != EFI_SUCCESS) + return status; + +- if (!storage_size || size > remaining_size || size > max_size || +- (remaining_size - size) < (storage_size / 2)) ++ if (!storage_size || size > remaining_size || size > max_size) + return EFI_OUT_OF_RESOURCES; + + return status; diff --git a/debian/patches/series b/debian/patches/series index 02cba59b9..a7b4db65d 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -79,3 +79,12 @@ features/all/alx/alx-update-for-3.8.patch bugfix/mips/mips-add-dependencies-for-have_arch_transparent_hugepage.patch bugfix/all/signal-fix-use-of-missing-sa_restorer-field.patch bugfix/all/kernel-signal.c-use-__ARCH_HAS_SA_RESTORER-instead-o.patch +debian/efi-autoload-efivars.patch +bugfix/all/vhost-net-fix-heads-usage-of-ubuf_info.patch +bugfix/all/efivars-Allow-disabling-use-as-a-pstore-backend.patch +bugfix/all/efivars-Add-module-parameter-to-disable-use-as-a-pst.patch +bugfix/all/efivars-Fix-check-for-CONFIG_EFI_VARS_PSTORE_DEFAULT.patch +bugfix/all/efi_pstore-Introducing-workqueue-updating-sysfs.patch +bugfix/all/efivars-explicitly-calculate-length-of-VariableName.patch +bugfix/all/efivars-Handle-duplicate-names-from-get_next_variabl.patch +debian/efivars-remove-check-for-50-full-on-write.patch diff --git a/debian/rules.real b/debian/rules.real index 2b7789158..54cdba6d2 100644 --- a/debian/rules.real +++ b/debian/rules.real @@ -234,6 +234,8 @@ install-headers_$(ARCH)_$(FEATURESET): $(STAMPS_DIR)/source_$(FEATURESET) echo Makefile; \ find arch/$(KERNEL_ARCH) -maxdepth 1 -name 'Makefile*' -print; \ find arch/$(KERNEL_ARCH) -name 'module.lds' -print; \ + find arch/$(KERNEL_ARCH)/Kbuild.platforms -print; \ + find arch/$(KERNEL_ARCH) -name 'Platform' -print; \ find $$(find arch/$(KERNEL_ARCH) \( -name include -o -name scripts \) -type d -print) -print; \ find include -print; \ ) \