linux/drivers
Matt Fleming 4025b05599 efivars: Handle duplicate names from get_next_variable()
commit e971318bbe 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]  [<ffffffff81208954>] ? sysfs_add_one+0xd4/0x100
[    0.591861]  [<ffffffff810587bf>] warn_slowpath_common+0x7f/0xc0
[    0.592650]  [<ffffffff810588bc>] warn_slowpath_fmt+0x4c/0x50
[    0.593429]  [<ffffffff8134dd85>] ? strlcat+0x65/0x80
[    0.594203]  [<ffffffff81208954>] sysfs_add_one+0xd4/0x100
[    0.594979]  [<ffffffff81208b78>] create_dir+0x78/0xd0
[    0.595753]  [<ffffffff81208ec6>] sysfs_create_dir+0x86/0xe0
[    0.596532]  [<ffffffff81347e4c>] kobject_add_internal+0x9c/0x220
[    0.597310]  [<ffffffff81348307>] kobject_init_and_add+0x67/0x90
[    0.598083]  [<ffffffff81584a71>] ? efivar_create_sysfs_entry+0x61/0x1c0
[    0.598859]  [<ffffffff81584b2b>] efivar_create_sysfs_entry+0x11b/0x1c0
[    0.599631]  [<ffffffff8158517e>] register_efivars+0xde/0x420
[    0.600395]  [<ffffffff81d430a7>] ? edd_init+0x2f5/0x2f5
[    0.601150]  [<ffffffff81d4315f>] efivars_init+0xb8/0x104
[    0.601903]  [<ffffffff8100215a>] do_one_initcall+0x12a/0x180
[    0.602659]  [<ffffffff81d05d80>] kernel_init_freeable+0x13e/0x1c6
[    0.603418]  [<ffffffff81d05586>] ? loglevel+0x31/0x31
[    0.604183]  [<ffffffff816a6530>] ? rest_init+0x80/0x80
[    0.604936]  [<ffffffff816a653e>] kernel_init+0xe/0xf0
[    0.605681]  [<ffffffff816ce7ec>] ret_from_fork+0x7c/0xb0
[    0.606414]  [<ffffffff816a6530>] ? 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.

[Backported for 3.4-stable. Removed code related to pstore
workqueue but pulled in helper function variable_is_present
from a93bc0c; Moved the definition of __efivars to the top
for being referenced in variable_is_present.]

Reported-by: Andre Heider <a.heider@gmail.com>
Reported-by: Lingzhu Xiang <lxiang@redhat.com>
Tested-by: Lingzhu Xiang <lxiang@redhat.com>
Cc: Seiji Aguchi <seiji.aguchi@hds.com>
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
Signed-off-by: Lingzhu Xiang <lxiang@redhat.com>
Reviewed-by: CAI Qian <caiqian@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2013-04-05 10:04:36 -07:00
..
accessibility
acpi ACPI: Add DMI entry for Sony VGN-FW41E_H 2013-03-04 06:06:44 +08:00
amba
ata ata_piix: reenable MS Virtual PC guests 2013-03-14 11:29:42 -07:00
atm atm/iphase: rename fregt_t -> ffreg_t 2013-02-14 10:49:05 -08:00
auxdisplay
base drivercore: Fix ordering between deferred_probe and exiting initcalls 2013-02-28 06:59:01 -08:00
bcma
block loop: prevent bdev freeing while device in use 2013-04-05 10:04:35 -07:00
bluetooth Bluetooth: Add support for Dell[QCA 0cf3:817a] 2013-04-05 10:04:15 -07:00
cdrom
char virtio: rng: disallow multiple device registrations, fixes crashes 2013-03-20 13:04:57 -07:00
clk
clocksource
connector
cpufreq Fix memory leak in cpufreq stats. 2013-03-14 11:29:51 -07:00
cpuidle
crypto
dca dca: check against empty dca_domains list before unregister provider 2013-02-28 06:59:06 -08:00
devfreq
dio
dma ioat: Fix DMA memory sync direction correct flag 2013-01-27 20:47:44 -08:00
edac EDAC: Test correct variable in ->store function 2013-02-03 18:24:41 -06:00
eisa
firewire firewire: add minor number range check to fw_device_init() 2013-03-04 06:06:41 +08:00
firmware efivars: Handle duplicate names from get_next_variable() 2013-04-05 10:04:36 -07:00
gpio
gpu drm/i915: Don't clobber crtc->fb when queue_flip fails 2013-04-05 10:04:36 -07:00
hid HID: usbhid: quirk for Realtek Multi-card reader 2013-04-05 10:04:16 -07:00
hsi
hv
hwmon hwmon: (sht15) Fix memory leak if regulator_enable() fails 2013-03-20 13:05:00 -07:00
hwspinlock
i2c
ide
idle
ieee802154
infiniband IPoIB: Fix send lockup due to missed TX completion 2013-03-28 12:12:25 -07:00
input
iommu iommu/amd: Make sure dma_ops are set for hotplug devices 2013-04-05 10:04:18 -07:00
isdn isdn/gigaset: fix zero size border case in debug dump 2013-02-14 10:49:04 -08:00
leds
lguest
macintosh
mca
md md: raid0: fix error return from create_stripe_zones. 2013-03-14 11:29:49 -07:00
media media: rc: unlock on error in show_protocols() 2013-03-04 06:06:41 +08:00
memstick
message
mfd
misc
mmc mmc: sdhci-esdhc-imx: fix host version read 2013-02-28 06:59:05 -08:00
mtd mtd: nand: gpmi: reset BCH earlier, too, to avoid NAND startup problems 2013-01-17 08:50:45 -08:00
net mwifiex: cancel cmd timer and free curr_cmd in shutdown process 2013-04-05 10:04:19 -07:00
nfc
nubus
of
oprofile
parisc
parport
pci PCI/PM: Clean up PME state when removing a device 2013-02-17 10:49:26 -08:00
pcmcia pcmcia/vrc4171: Add missing spinlock init 2013-02-28 06:59:05 -08:00
pinctrl
platform asus-laptop: Do not call HWRS on init 2013-03-28 12:12:28 -07:00
pnp
power ab8500_btemp: Demote initcall sequence 2013-03-04 06:06:44 +08:00
pps
ps3
ptp
rapidio
regulator
remoteproc
rpmsg
rtc drivers/rtc/rtc-isl1208.c: call rtc_update_irq() from the alarm irq handler 2013-02-11 08:47:18 -08:00
s390 KVM: s390: Handle hosts not supporting s390-virtio. 2013-02-28 06:59:01 -08:00
sbus
scsi SCSI: storvsc: Initialize the sglist 2013-03-14 11:29:42 -07:00
sfi
sh
sn
spi
ssb
staging staging: comedi: s626: fix continuous acquisition 2013-04-05 10:04:15 -07:00
target target/iscsi: Fix mutual CHAP auth on big-endian arches 2013-03-28 12:12:13 -07:00
tc
thermal
tty vt: synchronize_rcu() under spinlock is not nice... 2013-04-05 10:04:19 -07:00
uio
usb usb: gadget: udc-core: fix a regression during gadget driver unbinding 2013-04-05 10:04:35 -07:00
uwb
vhost vhost/net: fix heads usage of ubuf_info 2013-03-28 12:11:54 -07:00
video atmel_lcdfb: fix 16-bpp modes on older SOCs 2013-03-20 13:05:00 -07:00
virt
virtio
vlynq
w1 w1: fix oops when w1_search is called from netlink connector 2013-03-20 13:04:59 -07:00
watchdog
xen xen/pciback: Don't disable a PCI device that is already disabled. 2013-03-20 13:04:57 -07:00
zorro
Kconfig
Makefile