Linux 2.6.37.5
Subsystems (44)
I'm announcing the release of the 2.6.37.5 kernel.
All users of the 2.6.37 kernel series must upgrade.
The updated 2.6.37.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-2.6.37.y.git
and can be browsed at the normal kernel.org git web browser:
http://git.kernel.org/?p=linux/kernel/git/stable/linux-2.6.37.y.git;a=summarythanks,
greg k-h
------------
Documentation/i2c/instantiating-devices | 2 Makefile | 2 arch/microblaze/include/asm/uaccess.h | 8 - arch/mips/alchemy/mtx-1/platform.c | 9 + arch/parisc/kernel/irq.c | 2 arch/powerpc/include/asm/reg.h | 1 arch/powerpc/kernel/perf_event.c | 24 +++ arch/x86/include/asm/pgtable-3level.h | 11 - arch/x86/kernel/alternative.c | 7 - arch/x86/kernel/check.c | 8 - arch/x86/kernel/e820.c | 10 + arch/x86/kernel/early-quirks.c | 7 - arch/x86/kernel/entry_64.S | 2 arch/x86/mm/fault.c | 14 +- arch/x86/mm/init_64.c | 6 arch/x86/mm/pageattr.c | 18 +- arch/x86/mm/pgtable.c | 14 -- arch/x86/xen/mmu.c | 10 - block/blk-lib.c | 19 +-- drivers/ata/ahci.c | 4 drivers/ata/libata-eh.c | 2 drivers/gpu/drm/drm_sysfs.c | 7 + drivers/gpu/drm/i915/intel_panel.c | 1 drivers/hid/Kconfig | 4 drivers/hid/hid-core.c | 1 drivers/hid/hid-ids.h | 1 drivers/hid/hid-magicmouse.c | 4 drivers/hid/hid-ortek.c | 3 drivers/hwmon/f71882fg.c | 2 drivers/hwmon/sht15.c | 4 drivers/infiniband/core/cm.c | 1 drivers/infiniband/core/cma.c | 15 ++ drivers/mmc/core/sdio.c | 8 + drivers/mmc/host/sdhci-pci.c | 8 + drivers/mtd/chips/cfi_cmdset_0001.c | 43 +++--- drivers/mtd/chips/jedec_probe.c | 35 ++--- drivers/mtd/mtd_blkdevs.c | 1 drivers/mtd/nand/omap2.c | 2 drivers/mtd/onenand/generic.c | 2 drivers/mtd/onenand/omap2.c | 2 drivers/net/ixgbe/ixgbe_common.c | 3 drivers/net/ixgbe/ixgbe_fcoe.c | 51 +++++++- drivers/net/ixgbe/ixgbe_fcoe.h | 2 drivers/net/ixgbe/ixgbe_sriov.c | 2 drivers/net/wireless/ath/ath9k/hw.c | 21 +-- drivers/net/wireless/ath/ath9k/recv.c | 4 drivers/net/wireless/rt2x00/rt2x00dev.c | 12 + drivers/net/wireless/rt2x00/rt2x00usb.c | 22 ++- drivers/pci/pci-sysfs.c | 2 drivers/pci/quirks.c | 113 ++++++++---------- drivers/scsi/device_handler/scsi_dh_alua.c | 3 drivers/staging/tidspbridge/rmgr/proc.c | 19 ++- drivers/staging/winbond/core.h | 1 drivers/usb/core/hcd-pci.c | 13 -- drivers/usb/core/hcd.c | 55 ++++++-- drivers/usb/core/urb.c | 11 + drivers/usb/host/ehci-hub.c | 23 +++ drivers/usb/host/isp1760-hcd.c | 22 ++- drivers/usb/host/isp1760-hcd.h | 1 drivers/usb/host/xhci-ring.c | 43 ++++++ drivers/usb/host/xhci.h | 9 + drivers/usb/serial/ch341.c | 1 drivers/usb/serial/kobil_sct.c | 2 drivers/usb/serial/option.c | 3 drivers/usb/serial/usb-serial.c | 5 fs/btrfs/file.c | 13 ++ fs/ext3/namei.c | 2 fs/nfs/nfs2xdr.c | 6 fs/nfs/nfs3xdr.c | 6 fs/nfs/nfs4proc.c | 2 fs/nfs/nfsroot.c | 29 ++-- fs/partitions/osf.c | 12 + include/linux/ftrace.h | 2 include/linux/usb/ch9.h | 2 include/linux/usb/hcd.h | 4 include/linux/usb/serial.h | 3 kernel/perf_event.c | 4 kernel/sched.c | 2 kernel/smp.c | 55 +++++++- kernel/trace/ftrace.c | 52 +++++++- net/ipv4/netfilter/nf_conntrack_l3proto_ipv4_compat.c | 2 net/netfilter/nf_conntrack_netlink.c | 25 ++- net/netfilter/nf_conntrack_standalone.c | 2 net/sunrpc/clnt.c | 4 net/sunrpc/sched.c | 14 -- net/sunrpc/xprtsock.c | 3 security/tomoyo/file.c | 5 sound/drivers/aloop.c | 19 +-- sound/pci/asihpi/hpioctl.c | 5 sound/pci/ctxfi/ctatc.c | 2 sound/pci/ctxfi/ctdaio.c | 2 sound/pci/ctxfi/ctmixer.c | 19 --- sound/pci/hda/patch_realtek.c | 56 +++++--- sound/pci/hda/patch_sigmatel.c | 11 + sound/soc/codecs/wm8978.c | 14 +- tools/perf/util/PERF-VERSION-GEN | 8 - 96 files changed, 773 insertions(+), 379 deletions(-)
Alan Stern (2):
USB: serial drivers need to use larger bulk-in buffers
USB: move usbcore away from hcd->state
Alexander Duyck (1):
ixgbe: limit VF access to network traffic
Alexander van Heukelum (1):
x86, binutils, xen: Fix another wrong size directive
Amir Hanania (1):
ixgbe: work around for DDP last buffer size
Andrea Arcangeli (1):
x86/mm: Fix pgd_lock deadlock
Andreas Herrmann (1):
x86, quirk: Fix SB600 revision check
Andrey Vagin (1):
x86/mm: Handle mm_fault_error() in kernel space
Anton Blanchard (1):
perf, powerpc: Handle events that raise an exception without overflowing
Antony Pavlov (2):
mtd: jedec_probe: Change variable name from cfi_p to cfi
mtd: jedec_probe: initialise make sector erase command variable
Axel Lin (1):
mtd: add "platform:" prefix for platform modalias
Ben Hutchings (2):
sunrpc: Propagate errors from xs_bind() through xs_create_sock()
PCI: sysfs: Fix failure path for addition of "vpd" attribute
Brandeburg, Jesse (1):
PCI: remove quirk for pre-production systems
Chris Mason (1):
Btrfs: deal with short returns from copy_from_user
Chris Wilson (1):
drm: Hold the mode mutex whilst probing for sysfs status
Chuck Lever (1):
NFS: NFSROOT should default to "proto=udp"
Dan Rosenberg (1):
ALSA: sound/pci/asihpi: check adapter index in hpi_ioctl
David Henningsson (1):
ALSA: HDA: Realtek ALC88x: Do not over-initialize speakers and hp that are primary outputs
Eric Sandeen (1):
ext3: Always set dx_node's fake_dirent explicitly.
Felipe Contreras (1):
staging: tidspbridge: protect dmm_map properly
Felix Fietkau (1):
ath9k: remove support for the FIF_PROMISC_IN_BSS filter flag
Florian Fainelli (1):
MIPS: MTX-1: Make au1000_eth probe all PHY addresses
Frederic Weisbecker (2):
perf: Fix the software events state check
perf: Handle stopped state with tracepoints
Greg Kroah-Hartman (1):
Linux 2.6.37.5
Hans de Goede (1):
hwmon/f71882fg: Set platform drvdata to NULL later
Henrik Rydberg (1):
HID: hid-magicmouse: Correct touch orientation direction
Herton Ronaldo Krzesinski (2):
USB: serial: option: Apply OPTION_BLACKLIST_SENDSETUP also for ZTE MF626
HID: add support for Ortek PKB-1700
Ivo van Doorn (1):
rt2x00: Fix crash on USB unplug
Jeff Mahoney (1):
staging: winbond: needs <linux/delay.h> for msleep and friends
Jiri Slaby (3):
USB: serial/kobil_sct, fix potential tty NULL dereference
PCI: add more checking to ICH region quirks
PCI: do not create quirk I/O regions below PCIBIOS_MIN_IO for ICH
Joakim Tjernlund (1):
mtd: fix race in cfi_cmdset_0001 driver
Johannes Stezenbach (1):
rt2x00: fix hang when unplugging USB device in use
Joseph Gruher (1):
scsi_dh_alua: fix deadlock in stpg_endio
Josh Hunt (1):
perf tools: Version incorrect with some versions of grep
Jovi Zhang (1):
nfs: fix compilation warning
Kamal Mostafa (2):
x86: Fix panic when handling "mem={invalid}" param
x86: Emit "mem=nopentium ignored" warning when not supported
Linus Torvalds (1):
Increase OSF partition limit from 8 to 18
Lukas Czerner (1):
block: fix mis-synchronisation in blkdev_issue_zeroout()
Manoj Iyer (1):
mmc: sdhci: Add Ricoh e823 PCI ID
Mark Brown (1):
ASoC: Fix broken bitfield definitions in WM8978
Mathieu Desnoyers (1):
x86: stop_machine_text_poke() should issue sync_core()
Matthew Garrett (1):
ehci: Check individual port status registers on resume
Maxim Levitsky (1):
mtd: mtd_blkdevs: fix double free on error path
Milton Miller (3):
call_function_many: fix list delete vs add race
call_function_many: add missing ordering
smp_call_function_many: handle concurrent clearing of mask
Naga Chumbalkar (1):
x86: Don't check for BIOS corruption in first 64K when there's no need to
Pablo Neira Ayuso (1):
netfilter: fix export secctx error handling
Paul Zimmerman (1):
USB: Add support for SuperSpeed isoc endpoints
Per Jessen (1):
ahci: recognize Marvell 88se9125 PCIe SATA 6.0 Gb/s controller
Przemyslaw Bruski (3):
ALSA: ctxfi - Fix incorrect SPDIF status bit mask
ALSA: ctxfi - Fix SPDIF status retrieval
ALSA: ctxfi - Clear input settings before initialization
Roman Fietze (1):
i2c: Fix typo in instantiating-devices document
Sarah Sharp (2):
xhci: Update internal dequeue pointers after stalls.
xhci: Fix cycle bit calculation during stall handling.
Sean Hefty (2):
RDMA/cma: Fix crash in request handlers
IB/cm: Bump reference count on cm_id before invoking callback
Sebastian Andrzej Siewior (1):
USB: isp1760: Implement solution for erratum 2
Senthil Balasubramanian (2):
ath9k_hw: read and backup AR_WA register value even before chip reset on.
ath9k_hw: Fix incorrect macversion and macrev checks
Seth Heasley (2):
ahci: AHCI mode SATA patch for Intel DH89xxCC DeviceIDs
ahci: AHCI mode SATA patch for Intel Patsburg SATA RAID controller
Shaohua Li (1):
x86: Flush TLB if PGD entry is changed in i386 PAE mode
Stanislav Kinsbursky (1):
RPC: killing RPC tasks races fixed
Stefan Nilsson XK (1):
mmc: sdio: remember new card RCA when redetecting card
Steven J. Magnani (1):
microblaze: Fix /dev/zero corruption from __clear_user()
Steven Rostedt (1):
ftrace: Fix memory leak with function graph and cpu hotplug
Takashi Iwai (3):
drm/i915: Fix calculation of backlight value in combined mode
ALSA: hda - Initialize special cases for input src in init phase
ALSA: aloop - Fix possible IRQ lock inversion
Tejun Heo (1):
libata: fix hotplug for drivers which don't implement LPM
Tetsuo Handa (1):
TOMOYO: Fix memory leak upon file open.
Thomas Gleixner (1):
fix per-cpu flag problem in the cpu affinity checkers
Timo Warns (1):
Fix corrupted OSF partition table parsing
Trond Myklebust (2):
NFS: Fix a decoding problem in nfs3_decode_dirent
SUNRPC: Ensure we always run the tk_callback before tk_action
Vitaliy Kulikov (1):
ALSA: hda - fix digital mic selection in mixer on 92HD8X codecs
Vivien Didelot (1):
hwmon: (sht15) Fix integer overflow in humidity calculation
wangyanqing (1):
USB: serial: ch341: add new id
Documentation/i2c/instantiating-devices +1 -1
@@ -100,7 +100,7 @@ static int __devinit usb_hcd_pnx4008_probe(struct platform_device *pdev) (...) i2c_adap = i2c_get_adapter(2); memset(&i2c_info, 0, sizeof(struct i2c_board_info)); - strlcpy(i2c_info.name, "isp1301_pnx", I2C_NAME_SIZE); + strlcpy(i2c_info.type, "isp1301_pnx", I2C_NAME_SIZE); isp1301_i2c_client = i2c_new_probed_device(i2c_adap, &i2c_info, normal_i2c, NULL); i2c_put_adapter(i2c_adap);
Makefile +1 -1
@@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 37 -EXTRAVERSION = .4 +EXTRAVERSION = .5 NAME = Flesh-Eating Bats with Fangs # *DOCUMENTATION*
arch/microblaze/include/asm/uaccess.h +4 -4
@@ -120,16 +120,16 @@ static inline unsigned long __must_check __clear_user(void __user *to, {/* normal memset with two words to __ex_table */ __asm__ __volatile__ ( \ -"1: sb r0, %2, r0;" \ +"1: sb r0, %1, r0;" \" addik %0, %0, -1;" \" bneid %0, 1b;" \ -" addik %2, %2, 1;" \ +" addik %1, %1, 1;" \"2: " \ __EX_TABLE_SECTION \".word 1b,2b;" \".previous;" \ - :"=r" (n) \ - :"0" (n),"r" (to) + :"=r" (n),"=r" (to) \ + :"0" (n),"1" (to) );return n; }
arch/mips/alchemy/mtx-1/platform.c +9 -0
@@ -28,6 +28,8 @@#include <linux/mtd/physmap.h> #include <mtd/mtd-abi.h> +#include <asm/mach-au1x00/au1xxx_eth.h> +static struct gpio_keys_button mtx1_gpio_button[] = { { .gpio =207 ,
@@ -140,10 +142,17 @@ static struct __initdata platform_device * mtx1_devs[] = { &mtx1_mtd, }; +static struct au1000_eth_platform_data mtx1_au1000_eth0_pdata = { + .phy_search_highest_addr =1 , + .phy1_search_mac0 =1 , +}; +static int __init mtx1_register_devices (void ) {int rc; +au1xxx_override_eth_cfg (0 , &mtx1_au1000_eth0_pdata); + rc =gpio_request (mtx1_gpio_button[0 ].gpio, mtx1_gpio_button[0 ].desc);if (rc <0 ) {
arch/parisc/kernel/irq.c +1 -1
@@ -108,7 +108,7 @@ int cpu_check_affinity(unsigned int irq, const struct cpumask *dest)int cpu_dest;/* timer and ipi have to always be received on all CPUs */ -if (CHECK_IRQ_PER_CPU (irq)) { +if (CHECK_IRQ_PER_CPU (irq_to_desc (irq)->status)) {/* Bad linux design decision. The mask has already * been set; we must reset it */ cpumask_setall (irq_desc[irq].affinity);
arch/powerpc/include/asm/reg.h +1 -0
@@ -878,6 +878,7 @@#define PV_970 0x0039#define PV_POWER5 0x003A#define PV_POWER5p 0x003B +#define PV_POWER7 0x003F#define PV_970FX 0x003C#define PV_630 0x0040#define PV_630p 0x0041
arch/powerpc/kernel/perf_event.c +23 -1
@@ -1268,6 +1268,28 @@ unsigned long perf_instruction_pointer(struct pt_regs *regs)return ip; } +static bool pmc_overflow (unsigned long val) +{ +if ((int )val <0 ) +return true; + +/* +* Events on POWER7 can roll back if a speculative event doesn't +* eventually complete. Unfortunately in some rare cases they will +* raise a performance monitor exception. We need to catch this to +* ensure we reset the PMC. In all cases the PMC will be 256 or less +* cycles from overflow. +* +* We only do this if the first pass fails to find any overflowing +* PMCs because a user might set a period of less than 256 and we +* don't want to mistakenly reset them. +*/ +if (__is_processor (PV_POWER7 ) && ((0x80000000 - val) <=256 )) +return true; + +return false; +} +/* * Performance monitor interrupt stuff */
@@ -1315,7 +1337,7 @@ static void perf_event_interrupt(struct pt_regs *regs)if (is_limited_pmc (i +1 ))continue ; val =read_pmc (i +1 ); -if ((int )val <0 ) +if (pmc_overflow (val))write_pmc (i +1 ,0 ); } }
arch/x86/include/asm/pgtable-3level.h +3 -8
@@ -69,8 +69,6 @@ static inline void native_pmd_clear(pmd_t *pmd)static inline void pud_clear (pud_t *pudp) { -unsigned long pgd; -set_pud (pudp,__pud (0 ));/*
@@ -79,13 +77,10 @@ static inline void pud_clear(pud_t *pudp)* section 8.1: in PAE mode we explicitly have to flush the * TLB via cr3 if the top-level pgd is changed... * -* Make sure the pud entry we're updating is within the -* current pgd to avoid unnecessary TLB flushes. +* Currently all places where pud_clear() is called either have +* flush_tlb_mm() followed or don't need TLB flush (x86_64 code or +* pud_clear_bad()), so we don't need TLB flush here. */ - pgd =read_cr3 (); -if (__pa (pudp) >= pgd &&__pa (pudp) < - (pgd +sizeof (pgd_t)*PTRS_PER_PGD )) -write_cr3 (pgd); }#ifdef CONFIG_SMP
arch/x86/kernel/alternative.c +6 -1
@@ -417,7 +417,12 @@ int alternatives_text_reserved(void *start, void *end) return 1; } } - +/* +* Intel Archiecture Software Developer's Manual section 7.1.3 specifies +* that a core serializing instruction such as "cpuid" should be +* executed on _each_ core before the new instruction is made visible. +*/ +sync_core ();return 0 ; }#endif
arch/x86/kernel/check.c +4 -4
@@ -106,8 +106,8 @@ void __init setup_bios_corruption_check(void) addr += size; } -printk (KERN_INFO "Scanning %d areas for low memory corruption\n" , - num_scan_areas); +if (num_scan_areas) +printk (KERN_INFO "Scanning %d areas for low memory corruption\n" , num_scan_areas); }
@@ -143,12 +143,12 @@ static void check_corruption(struct work_struct *dummy) {check_for_bios_corruption ();schedule_delayed_work (&bios_check_work, -round_jiffies_relative (corruption_check_period*HZ )); +round_jiffies_relative (corruption_check_period*HZ )); }static int start_periodic_check_for_corruption (void ) { -if (!memory_corruption_check || corruption_check_period ==0 ) +if (!num_scan_areas || !memory_corruption_check || corruption_check_period ==0 )return 0 ; printk(KERN_INFO "Scanning for low memory corruption every %d seconds\n",
arch/x86/kernel/e820.c +8 -2
@@ -846,15 +846,21 @@ static int __init parse_memopt(char *p)if (!p)return -EINVAL ; -#ifdef CONFIG_X86_32 if (!strcmp (p,"nopentium" )) { +#ifdef CONFIG_X86_32 setup_clear_cpu_cap (X86_FEATURE_PSE );return 0 ; - } +#else +printk (KERN_WARNING "mem=nopentium ignored! (only supported on x86_32)\n" ); +return -EINVAL ;#endif + } userdef =1 ; mem_size =memparse (p, &p); +/* don't remove all of memory when handling "mem={invalid}" param */ +if (mem_size ==0 ) +return -EINVAL ;e820_remove_range (mem_size,ULLONG_MAX - mem_size,E820_RAM ,1 );return 0 ;
arch/x86/kernel/early-quirks.c +6 -1
@@ -159,7 +159,12 @@ static void __init ati_bugs_contd(int num, int slot, int func)if (rev >=0x40 ) acpi_fix_pin2_polarity =1 ; -if (rev >0x13 ) +/* +* SB600: revisions 0x11, 0x12, 0x13, 0x14, ... +* SB700: revisions 0x39, 0x3a, ... +* SB800: revisions 0x40, 0x41, ... +*/ +if (rev >=0x39 )return ;if (acpi_use_timer_override)
arch/x86/kernel/entry_64.S +1 -1
@@ -1238,7 +1238,7 @@ ENTRY(xen_do_hypervisor_callback) # do_hypervisor_callback(struct *pt_regs) decl PER_CPU_VAR(irq_count) jmp error_exit CFI_ENDPROC -END(do_hypervisor_callback) +END(xen_do_hypervisor_callback) /* * Hypervisor uses this for application faults while it executes.
arch/x86/mm/fault.c +10 -4
@@ -229,15 +229,14 @@ void vmalloc_sync_all(void)for (address =VMALLOC_START &PMD_MASK ; address >=TASK_SIZE && address <FIXADDR_TOP ; address +=PMD_SIZE ) { - -unsigned long flags;struct page *page; -spin_lock_irqsave (&pgd_lock, flags); +spin_lock (&pgd_lock);list_for_each_entry (page, &pgd_list, lru) {spinlock_t *pgt_lock;pmd_t *ret; +/* the pgt_lock only for Xen */ pgt_lock = &pgd_page_get_mm (page)->page_table_lock;spin_lock (pgt_lock);
@@ -247,7 +246,7 @@ void vmalloc_sync_all(void)if (!ret)break ; } -spin_unlock_irqrestore (&pgd_lock, flags); +spin_unlock (&pgd_lock); } }
@@ -828,6 +827,13 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code, unsigned long address, unsigned int fault) {if (fault &VM_FAULT_OOM ) { +/* Kernel mode? Handle exceptions or die: */ +if (!(error_code &PF_USER )) { +up_read (¤t->mm->mmap_sem); +no_context (regs, error_code, address); +return ; + } +out_of_memory (regs, error_code, address); }else { if (fault & (VM_FAULT_SIGBUS|VM_FAULT_HWPOISON|
arch/x86/mm/init_64.c +3 -3
@@ -105,18 +105,18 @@ void sync_global_pgds(unsigned long start, unsigned long end)for (address = start; address <= end; address +=PGDIR_SIZE ) {const pgd_t *pgd_ref =pgd_offset_k (address); -unsigned long flags;struct page *page;if (pgd_none (*pgd_ref))continue ; -spin_lock_irqsave (&pgd_lock, flags); +spin_lock (&pgd_lock);list_for_each_entry (page, &pgd_list, lru) {pgd_t *pgd;spinlock_t *pgt_lock; pgd = (pgd_t *)page_address (page) +pgd_index (address); +/* the pgt_lock only for Xen */ pgt_lock = &pgd_page_get_mm (page)->page_table_lock;spin_lock (pgt_lock);
@@ -128,7 +128,7 @@ void sync_global_pgds(unsigned long start, unsigned long end)spin_unlock (pgt_lock); } -spin_unlock_irqrestore (&pgd_lock, flags); +spin_unlock (&pgd_lock); } }
arch/x86/mm/pageattr.c +8 -10
@@ -56,12 +56,10 @@ static unsigned long direct_pages_count[PG_LEVEL_NUM];void update_page_count (int level,unsigned long pages) { -unsigned long flags; -/* Protect against CPA */ -spin_lock_irqsave (&pgd_lock, flags); +spin_lock (&pgd_lock); direct_pages_count[level] += pages; -spin_unlock_irqrestore (&pgd_lock, flags); +spin_unlock (&pgd_lock); }static void split_page_count (int level)
@@ -391,7 +389,7 @@ static int try_preserve_large_page(pte_t *kpte, unsigned long address, struct cpa_data *cpa) { -unsigned long nextpage_addr, numpages, pmask, psize, flags, addr, pfn; +unsigned long nextpage_addr, numpages, pmask, psize, addr, pfn;pte_t new_pte, old_pte, *tmp;pgprot_t old_prot, new_prot;int i, do_split =1 ;
@@ -400,7 +398,7 @@ try_preserve_large_page(pte_t *kpte, unsigned long address,if (cpa->force_split)return 1 ; -spin_lock_irqsave (&pgd_lock, flags); +spin_lock (&pgd_lock);/* * Check for races, another CPU might have split this page * up already:
@@ -495,14 +493,14 @@ try_preserve_large_page(pte_t *kpte, unsigned long address, } out_unlock: -spin_unlock_irqrestore (&pgd_lock, flags); +spin_unlock (&pgd_lock);return do_split; }static int split_large_page (pte_t *kpte,unsigned long address) { -unsigned long flags, pfn, pfninc =1 ; +unsigned long pfn, pfninc =1 ;unsigned int i, level;pte_t *pbase, *tmp;pgprot_t ref_prot;
@@ -516,7 +514,7 @@ static int split_large_page(pte_t *kpte, unsigned long address)if (!base)return -ENOMEM ; -spin_lock_irqsave (&pgd_lock, flags); +spin_lock (&pgd_lock);/* * Check for races, another CPU might have split this page * up for us already:
@@ -588,7 +586,7 @@ out_unlock:*/ if (base)__free_page (base); -spin_unlock_irqrestore (&pgd_lock, flags); +spin_unlock (&pgd_lock);return 0 ; }
arch/x86/mm/pgtable.c +5 -9
@@ -121,14 +121,12 @@ static void pgd_ctor(struct mm_struct *mm, pgd_t *pgd)static void pgd_dtor (pgd_t *pgd) { -unsigned long flags;/* can be called from interrupt context */ -if (SHARED_KERNEL_PMD )return ; -spin_lock_irqsave (&pgd_lock, flags); +spin_lock (&pgd_lock);pgd_list_del (pgd); -spin_unlock_irqrestore (&pgd_lock, flags); +spin_unlock (&pgd_lock); }/*
@@ -170,8 +168,7 @@ void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmd)* section 8.1: in PAE mode we explicitly have to flush the * TLB via cr3 if the top-level pgd is changed... */ -if (mm == current->active_mm) - write_cr3(read_cr3()); + flush_tlb_mm(mm); }#else /* !CONFIG_X86_PAE */
@@ -260,7 +257,6 @@ pgd_t *pgd_alloc(struct mm_struct *mm) {pgd_t *pgd;pmd_t *pmds[PREALLOCATED_PMDS ]; -unsigned long flags; pgd = (pgd_t *)__get_free_page (PGALLOC_GFP );
@@ -280,12 +276,12 @@ pgd_t *pgd_alloc(struct mm_struct *mm)* respect to anything walking the pgd_list, so that they * never see a partially populated pgd. */ -spin_lock_irqsave (&pgd_lock, flags); +spin_lock (&pgd_lock);pgd_ctor (mm, pgd);pgd_prepopulate_pmd (mm, pgd, pmds); -spin_unlock_irqrestore (&pgd_lock, flags); +spin_unlock (&pgd_lock);return pgd;
arch/x86/xen/mmu.c +4 -6
@@ -1362,10 +1362,9 @@ static void xen_pgd_pin(struct mm_struct *mm)*/ void xen_mm_pin_all (void ) { -unsigned long flags;struct page *page; -spin_lock_irqsave (&pgd_lock, flags); +spin_lock (&pgd_lock);list_for_each_entry (page, &pgd_list, lru) {if (!PagePinned (page)) {
@@ -1374,7 +1373,7 @@ void xen_mm_pin_all(void) } } -spin_unlock_irqrestore (&pgd_lock, flags); +spin_unlock (&pgd_lock); }/*
@@ -1475,10 +1474,9 @@ static void xen_pgd_unpin(struct mm_struct *mm)*/ void xen_mm_unpin_all (void ) { -unsigned long flags;struct page *page; -spin_lock_irqsave (&pgd_lock, flags); +spin_lock (&pgd_lock);list_for_each_entry (page, &pgd_list, lru) {if (PageSavePinned (page)) {
@@ -1488,7 +1486,7 @@ void xen_mm_unpin_all(void) } } -spin_unlock_irqrestore (&pgd_lock, flags); +spin_unlock (&pgd_lock); }void xen_activate_mm (struct mm_struct *prev,struct mm_struct *next)
block/blk-lib.c +7 -12
@@ -109,7 +109,6 @@ struct bio_batchatomic_t done;unsigned long flags;struct completion *wait; -bio_end_io_t *end_io; };static void bio_batch_end_io (struct bio *bio,int err)
@@ -122,12 +121,9 @@ static void bio_batch_end_io(struct bio *bio, int err)else clear_bit (BIO_UPTODATE , &bb->flags); } -if (bb) { -if (bb->end_io) - bb->end_io (bio, err); -atomic_inc (&bb->done); -complete (bb->wait); - } +if (bb) +if (atomic_dec_and_test (&bb->done)) +complete (bb->wait);bio_put (bio); }
@@ -150,13 +146,12 @@ int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,int ret;struct bio *bio;struct bio_batch bb; -unsigned int sz, issued =0 ; +unsigned int sz;DECLARE_COMPLETION_ONSTACK (wait); -atomic_set (&bb.done,0 ); +atomic_set (&bb.done,1 ); bb.flags =1 <<BIO_UPTODATE ; bb.wait = &wait; - bb.end_io =NULL ; submit: ret =0 ;
@@ -185,12 +180,12 @@ submit:break ; } ret =0 ; - issued++; +atomic_inc (&bb.done);submit_bio (WRITE , bio); }/* Wait for bios in-flight */ -while (issued !=atomic_read (&bb.done)) +if (!atomic_dec_and_test (&bb.done))wait_for_completion (&wait);if (!test_bit (BIO_UPTODATE , &bb.flags))
drivers/ata/ahci.c +4 -0
@@ -260,6 +260,8 @@ static const struct pci_device_id ahci_pci_tbl[] = { { PCI_VDEVICE(INTEL, 0x1d02), board_ahci }, /* PBG AHCI */ { PCI_VDEVICE(INTEL, 0x1d04), board_ahci }, /* PBG RAID */ { PCI_VDEVICE(INTEL, 0x1d06), board_ahci }, /* PBG RAID */ + { PCI_VDEVICE(INTEL, 0x2826), board_ahci }, /* PBG RAID */ + { PCI_VDEVICE(INTEL, 0x2323), board_ahci }, /* DH89xxCC AHCI *//* JMicron 360/1/3/5/6, match class to avoid IDE function */ { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
@@ -380,6 +382,8 @@ static const struct pci_device_id ahci_pci_tbl[] = { { PCI_VDEVICE(MARVELL, 0x6121), board_ahci_mv }, /* 6121 */ { PCI_DEVICE(0x1b4b, 0x9123), .driver_data = board_ahci_yes_fbs }, /* 88se9128 */ + { PCI_DEVICE(0x1b4b, 0x9125), + .driver_data = board_ahci_yes_fbs }, /* 88se9125 *//* Promise */ { PCI_VDEVICE(PROMISE, 0x3f20), board_ahci }, /* PDC42819 */
drivers/ata/libata-eh.c +1 -1
@@ -1618,7 +1618,7 @@ static void ata_eh_analyze_serror(struct ata_link *link)* host links. For disabled PMP links, only N bit is * considered as X bit is left at 1 for link plugging. */ -if (link->lpm_policy !=ATA_LPM_MAX_POWER ) +if (link->lpm_policy >ATA_LPM_MAX_POWER ) hotplug_mask =0 ;/* hotplug doesn't work w/ LPM */ else if (!(link->flags &ATA_LFLAG_DISABLED ) ||ata_is_host_link (link)) hotplug_mask =SERR_PHYRDY_CHG |SERR_DEV_XCHG ;
drivers/gpu/drm/drm_sysfs.c +7 -0
@@ -158,8 +158,15 @@ static ssize_t status_show(struct device *device, {struct drm_connector *connector =to_drm_connector (device);enum drm_connector_status status; +int ret; + + ret =mutex_lock_interruptible (&connector->dev->mode_config.mutex); +if (ret) +return ret; status = connector->funcs->detect (connector, true); +mutex_unlock (&connector->dev->mode_config.mutex); +return snprintf (buf,PAGE_SIZE ,"%s\n" ,drm_get_connector_status_name (status)); }
drivers/gpu/drm/i915/intel_panel.c +0 -1
@@ -176,7 +176,6 @@ u32 intel_panel_get_backlight(struct drm_device *dev) val &= ~1 ;pci_read_config_byte (dev->pdev,PCI_LBPC , &lbpc); val *= lbpc; - val >>=1 ; } }
drivers/hid/Kconfig +2 -2
@@ -291,10 +291,10 @@ config HID_NTRIG Support for N-Trig touch screen. config HID_ORTEK - tristate "Ortek WKB-2000 wireless keyboard and mouse trackpad" + tristate "Ortek PKB-1700/WKB-2000 wireless keyboard and mouse trackpad" depends on USB_HID ---help--- - Support for Ortek WKB-2000 wireless keyboard + mouse trackpad. + Support for Ortek PKB-1700/WKB-2000 wireless keyboard + mouse trackpad. config HID_PANTHERLORD tristate "Pantherlord/GreenAsia game controller"
drivers/hid/hid-core.c +1 -0
@@ -1365,6 +1365,7 @@ static const struct hid_device_id hid_blacklist[] = { { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_16) }, { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_17) }, { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_18) }, + { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_PKB1700) }, { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_WKB2000) }, { HID_USB_DEVICE(USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE) }, { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH) },
drivers/hid/hid-ids.h +1 -0
@@ -445,6 +445,7 @@#define USB_DEVICE_ID_ONTRAK_ADU100 0x0064#define USB_VENDOR_ID_ORTEK 0x05a4 +#define USB_DEVICE_ID_ORTEK_PKB1700 0x1700#define USB_DEVICE_ID_ORTEK_WKB2000 0x2000#define USB_VENDOR_ID_PANJIT 0x134c
drivers/hid/hid-magicmouse.c +2 -2
@@ -256,7 +256,7 @@ static void magicmouse_emit_touch(struct magicmouse_sc *msc, int raw_id, u8 *tdainput_report_abs (input,ABS_MT_TRACKING_ID , id);input_report_abs (input,ABS_MT_TOUCH_MAJOR , touch_major <<2 );input_report_abs (input,ABS_MT_TOUCH_MINOR , touch_minor <<2 ); -input_report_abs (input,ABS_MT_ORIENTATION , orientation); +input_report_abs (input,ABS_MT_ORIENTATION , -orientation);input_report_abs (input,ABS_MT_POSITION_X , x);input_report_abs (input,ABS_MT_POSITION_Y , y);
@@ -395,7 +395,7 @@ static void magicmouse_setup_input(struct input_dev *input, struct hid_device *hinput_set_abs_params (input,ABS_MT_TRACKING_ID ,0 ,15 ,0 ,0 );input_set_abs_params (input,ABS_MT_TOUCH_MAJOR ,0 ,255 ,4 ,0 );input_set_abs_params (input,ABS_MT_TOUCH_MINOR ,0 ,255 ,4 ,0 ); -input_set_abs_params (input,ABS_MT_ORIENTATION ,-32 ,31 ,1 ,0 ); +input_set_abs_params (input,ABS_MT_ORIENTATION ,-31 ,32 ,1 ,0 );/* Note: Touch Y position from the device is inverted relative * to how pointer motion is reported (and relative to how USB
drivers/hid/hid-ortek.c +2 -1
@@ -1,5 +1,5 @@/* -* HID driver for Ortek WKB-2000 (wireless keyboard + mouse trackpad). +* HID driver for Ortek PKB-1700/WKB-2000 (wireless keyboard + mouse trackpad). * Fixes LogicalMaximum error in USB report description, see * http://bugzilla.kernel.org/show_bug.cgi?id=14787 *
@@ -31,6 +31,7 @@ static __u8 *ortek_report_fixup(struct hid_device *hdev, __u8 *rdesc, }static const struct hid_device_id ortek_devices[] = { + {HID_USB_DEVICE (USB_VENDOR_ID_ORTEK ,USB_DEVICE_ID_ORTEK_PKB1700 ) }, {HID_USB_DEVICE (USB_VENDOR_ID_ORTEK ,USB_DEVICE_ID_ORTEK_WKB2000 ) }, { } };
drivers/hwmon/f71882fg.c +1 -1
@@ -2110,7 +2110,6 @@ static int f71882fg_remove(struct platform_device *pdev)int nr_fans = (data->type == f71882fg) ?4 :3 ;u8 start_reg =f71882fg_read8 (data,F71882FG_REG_START ); -platform_set_drvdata (pdev,NULL );if (data->hwmon_dev)hwmon_device_unregister (data->hwmon_dev);
@@ -2177,6 +2176,7 @@ static int f71882fg_remove(struct platform_device *pdev) } } +platform_set_drvdata (pdev,NULL );kfree (data);return 0 ;
drivers/hwmon/sht15.c +2 -2
@@ -333,11 +333,11 @@ static inline int sht15_calc_humid(struct sht15_data *data)const int c1 =-4 ;const int c2 =40500 ;/* x 10 ^ -6 */ -const int c3 =-2800 ;/* x10 ^ -9 */ +const int c3 =-28 ;/* x 10 ^ -7 */ RHlinear = c1*1000 + c2 * data->val_humid/1000 - + (data->val_humid * data->val_humid * c3)/1000000 ; + + (data->val_humid * data->val_humid * c3) /10000 ;return (temp -25000 ) * (10000 +80 * data->val_humid) /1000000 + RHlinear; }
drivers/infiniband/core/cm.c +1 -0
@@ -2989,6 +2989,7 @@ static int cm_sidr_req_handler(struct cm_work *work) goto out;/* No match. */ }atomic_inc (&cur_cm_id_priv->refcount); +atomic_inc (&cm_id_priv->refcount);spin_unlock_irq (&cm.lock); cm_id_priv->id.cm_handler = cur_cm_id_priv->id.cm_handler;
drivers/infiniband/core/cma.c +15 -0
@@ -1210,6 +1210,11 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event) cm_id->context = conn_id; cm_id->cm_handler = cma_ib_handler; +/* +* Protect against the user destroying conn_id from another thread +* until we're done accessing it. +*/ +atomic_inc (&conn_id->refcount); ret = conn_id->id.event_handler (&conn_id->id, &event);if (!ret) {/*
@@ -1222,8 +1227,10 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)ib_send_cm_mra (cm_id,CMA_CM_MRA_SETTING ,NULL ,0 );mutex_unlock (&lock);mutex_unlock (&conn_id->handler_mutex); +cma_deref_id (conn_id); goto out; } +cma_deref_id (conn_id);/* Destroy the CM ID by returning a non-zero value. */ conn_id->cm_id.ib =NULL ;
@@ -1425,17 +1432,25 @@ static int iw_conn_req_handler(struct iw_cm_id *cm_id, event.param.conn.private_data_len = iw_event->private_data_len; event.param.conn.initiator_depth = attr.max_qp_init_rd_atom; event.param.conn.responder_resources = attr.max_qp_rd_atom; + +/* +* Protect against the user destroying conn_id from another thread +* until we're done accessing it. +*/ +atomic_inc (&conn_id->refcount); ret = conn_id->id.event_handler (&conn_id->id, &event);if (ret) {/* User wants to destroy the CM ID */ conn_id->cm_id.iw =NULL ;cma_exch (conn_id,CMA_DESTROYING );mutex_unlock (&conn_id->handler_mutex); +cma_deref_id (conn_id);rdma_destroy_id (&conn_id->id); goto out; }mutex_unlock (&conn_id->handler_mutex); +cma_deref_id (conn_id); out:if (dev)
drivers/mmc/core/sdio.c +8 -0
@@ -395,6 +395,14 @@ static int mmc_sdio_init_card(struct mmc_host *host, u32 ocr,if (err) goto remove; +/* +* Update oldcard with the new RCA received from the SDIO +* device -- we're doing this so that it's updated in the +* "card" struct when oldcard overwrites that later. +*/ +if (oldcard) + oldcard->rca = card->rca; +mmc_set_bus_mode (host,MMC_BUSMODE_PUSHPULL ); }
drivers/mmc/host/sdhci-pci.c +8 -0
@@ -454,6 +454,14 @@ static const struct pci_device_id pci_ids[] __devinitdata = { }, { + .vendor = PCI_VENDOR_ID_RICOH, + .device = 0xe823, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .driver_data = (kernel_ulong_t)&sdhci_ricoh_mmc, + }, + + { .vendor = PCI_VENDOR_ID_ENE, .device = PCI_DEVICE_ID_ENE_CB712_SD, .subvendor = PCI_ANY_ID,
drivers/mtd/chips/cfi_cmdset_0001.c +22 -21
59 lines not on this page · raw message
drivers/mtd/chips/jedec_probe.c +18 -17
@@ -1935,14 +1935,14 @@ static void jedec_reset(u32 base, struct map_info *map, struct cfi_private *cfi) } -static int cfi_jedec_setup (struct cfi_private *p_cfi,int index) +static int cfi_jedec_setup (struct map_info *map,struct cfi_private *cfi,int index) {int i,num_erase_regions;uint8_t uaddr; -if (! (jedec_table[index].devtypes & p_cfi->device_type)) { +if (!(jedec_table[index].devtypes & cfi->device_type)) {DEBUG (MTD_DEBUG_LEVEL1 ,"Rejecting potential %s with incompatible %d-bit device type\n" , - jedec_table[index].name,4 * (1 <<p_cfi->device_type)); + jedec_table[index].name,4 * (1 <<cfi->device_type));return 0 ; }
@@ -1950,27 +1950,28 @@ static int cfi_jedec_setup(struct cfi_private *p_cfi, int index) num_erase_regions = jedec_table[index].nr_regions; - p_cfi->cfiq =kmalloc (sizeof (struct cfi_ident ) + num_erase_regions *4 ,GFP_KERNEL ); -if (!p_cfi->cfiq) { + cfi->cfiq =kmalloc (sizeof (struct cfi_ident ) + num_erase_regions *4 ,GFP_KERNEL ); +if (!cfi->cfiq) {//xx printk(KERN_WARNING "%s: kmalloc failed for CFI ident structure\n", map->name); return 0 ; } -memset (p_cfi->cfiq,0 ,sizeof (struct cfi_ident )); +memset (cfi->cfiq,0 ,sizeof (struct cfi_ident )); - p_cfi->cfiq->P_ID = jedec_table[index].cmd_set; - p_cfi->cfiq->NumEraseRegions = jedec_table[index].nr_regions; - p_cfi->cfiq->DevSize = jedec_table[index].dev_size; - p_cfi->cfi_mode =CFI_MODE_JEDEC ; + cfi->cfiq->P_ID = jedec_table[index].cmd_set; + cfi->cfiq->NumEraseRegions = jedec_table[index].nr_regions; + cfi->cfiq->DevSize = jedec_table[index].dev_size; + cfi->cfi_mode =CFI_MODE_JEDEC ; + cfi->sector_erase_cmd =CMD (0x30 );for (i=0 ; i<num_erase_regions; i++){ - p_cfi->cfiq->EraseRegionInfo[i] = jedec_table[index].regions[i]; + cfi->cfiq->EraseRegionInfo[i] = jedec_table[index].regions[i]; } - p_cfi->cmdset_priv =NULL ; + cfi->cmdset_priv =NULL ;/* This may be redundant for some cases, but it doesn't hurt */ - p_cfi->mfr = jedec_table[index].mfr_id; - p_cfi->id = jedec_table[index].dev_id; + cfi->mfr = jedec_table[index].mfr_id; + cfi->id = jedec_table[index].dev_id; uaddr = jedec_table[index].uaddr;
@@ -1978,8 +1979,8 @@ static int cfi_jedec_setup(struct cfi_private *p_cfi, int index)our brains explode when we see the datasheets talking about address lines numbered from A-1 to A18. The CFI table has unlock addresses in device-words according to the mode the device is connected in */ - p_cfi->addr_unlock1 = unlock_addrs[uaddr].addr1 / p_cfi->device_type; - p_cfi->addr_unlock2 = unlock_addrs[uaddr].addr2 / p_cfi->device_type; + cfi->addr_unlock1 = unlock_addrs[uaddr].addr1 / cfi->device_type; + cfi->addr_unlock2 = unlock_addrs[uaddr].addr2 / cfi->device_type;return 1 ;/* ok */ }
@@ -2175,7 +2176,7 @@ static int jedec_probe_chip(struct map_info *map, __u32 base,"MTD %s(): matched device 0x%x,0x%x unlock_addrs: 0x%.4x 0x%.4x\n" , __func__, cfi->mfr, cfi->id, cfi->addr_unlock1, cfi->addr_unlock2 ); -if (!cfi_jedec_setup (cfi, i)) +if (!cfi_jedec_setup (map, cfi, i))return 0 ; goto ok_out; }
drivers/mtd/mtd_blkdevs.c +0 -1
@@ -413,7 +413,6 @@ error3: error2:list_del (&new->list); error1: -kfree (new);return ret; }
drivers/mtd/nand/omap2.c +1 -1
@@ -968,6 +968,6 @@ static void __exit omap_nand_exit(void)module_init (omap_nand_init);module_exit (omap_nand_exit); -MODULE_ALIAS (DRIVER_NAME ); +MODULE_ALIAS ("platform:" DRIVER_NAME );MODULE_LICENSE ("GPL" );MODULE_DESCRIPTION ("Glue layer for NAND flash on TI OMAP boards" );
drivers/mtd/onenand/generic.c +1 -1
@@ -131,7 +131,7 @@ static struct platform_driver generic_onenand_driver = { .remove = __devexit_p(generic_onenand_remove), }; -MODULE_ALIAS (DRIVER_NAME ); +MODULE_ALIAS ("platform:" DRIVER_NAME );static int __init generic_onenand_init (void ) {
drivers/mtd/onenand/omap2.c +1 -1
@@ -815,7 +815,7 @@ static void __exit omap2_onenand_exit(void)module_init (omap2_onenand_init);module_exit (omap2_onenand_exit); -MODULE_ALIAS (DRIVER_NAME ); +MODULE_ALIAS ("platform:" DRIVER_NAME );MODULE_LICENSE ("GPL" );MODULE_AUTHOR ("Jarkko Lavinen <[email protected]>" );MODULE_DESCRIPTION ("Glue layer for OneNAND flash on OMAP2 / OMAP3" );
drivers/net/ixgbe/ixgbe_common.c +3 -0
@@ -1292,6 +1292,9 @@ s32 ixgbe_init_rx_addrs_generic(struct ixgbe_hw *hw)hw_dbg (hw," New MAC Addr =%pM\n" , hw->mac.addr); hw->mac.ops.set_rar (hw,0 , hw->mac.addr,0 ,IXGBE_RAH_AV ); + +/* clear VMDq pool/queue selection for RAR 0 */ + hw->mac.ops.clear_vmdq (hw,0 ,IXGBE_CLEAR_VMDQ_ALL ); } hw->addr_ctrl.overflow_promisc =0 ;
drivers/net/ixgbe/ixgbe_fcoe.c +50 -1
81 lines not on this page · raw message
drivers/net/ixgbe/ixgbe_fcoe.h +2 -0
@@ -70,6 +70,8 @@ struct ixgbe_fcoe {spinlock_t lock;struct pci_pool *pool;struct ixgbe_fcoe_ddp ddp[IXGBE_FCOE_DDP_MAX ]; +unsigned char *extra_ddp_buffer; + dma_addr_t extra_ddp_buffer_dma; };#endif /* _IXGBE_FCOE_H */
drivers/net/ixgbe/ixgbe_sriov.c +0 -2
@@ -110,12 +110,10 @@ static int ixgbe_set_vf_vlan(struct ixgbe_adapter *adapter, int add, int vid,return adapter->hw.mac.ops.set_vfta (&adapter->hw, vid, vf, (bool )add); } -static void ixgbe_set_vmolr (struct ixgbe_hw *hw,u32 vf,bool aupe) {u32 vmolr =IXGBE_READ_REG (hw,IXGBE_VMOLR (vf)); vmolr |= (IXGBE_VMOLR_ROMPE | -IXGBE_VMOLR_ROPE |IXGBE_VMOLR_BAM );if (aupe) vmolr |=IXGBE_VMOLR_AUPE ;
drivers/net/wireless/ath/ath9k/hw.c +11 -10
@@ -516,6 +516,17 @@ static int __ath9k_hw_init(struct ath_hw *ah)if (ah->hw_version.devid ==AR5416_AR9100_DEVID ) ah->hw_version.macVersion =AR_SREV_VERSION_9100 ; +/* +* Read back AR_WA into a permanent copy and set bits 14 and 17. +* We need to do this to avoid RMW of this register. We cannot +* read the reg when chip is asleep. +*/ + ah->WARegVal =REG_READ (ah,AR_WA ); + ah->WARegVal |= (AR_WA_D3_L1_DISABLE | +AR_WA_ASPM_TIMER_BASED_DISABLE ); + +ath9k_hw_read_revisions (ah); +if (!ath9k_hw_set_reset_reg (ah,ATH9K_RESET_POWER_ON )) {ath_print (common,ATH_DBG_FATAL ,"Couldn't reset chip\n" );
@@ -574,14 +585,6 @@ static int __ath9k_hw_init(struct ath_hw *ah)ath9k_hw_init_mode_regs (ah); -/* -* Read back AR_WA into a permanent copy and set bits 14 and 17. -* We need to do this to avoid RMW of this register. We cannot -* read the reg when chip is asleep. -*/ - ah->WARegVal =REG_READ (ah,AR_WA ); - ah->WARegVal |= (AR_WA_D3_L1_DISABLE | -AR_WA_ASPM_TIMER_BASED_DISABLE );if (ah->is_pciexpress)ath9k_hw_configpcipowersave (ah,0 ,0 );
@@ -1089,8 +1092,6 @@ static bool ath9k_hw_set_reset_power_on(struct ath_hw *ah)return false; } -ath9k_hw_read_revisions (ah); -return ath9k_hw_set_reset (ah,ATH9K_RESET_WARM ); }
drivers/net/wireless/ath/ath9k/recv.c +1 -3
@@ -439,9 +439,7 @@ u32 ath_calcrxfilter(struct ath_softc *sc)* mode interface or when in monitor mode. AP mode does not need this * since it receives all in-BSS frames anyway. */ -if (((sc->sc_ah->opmode !=NL80211_IFTYPE_AP ) && - (sc->rx.rxfilter &FIF_PROMISC_IN_BSS )) || - (sc->sc_ah->is_monitoring)) +if (sc->sc_ah->is_monitoring) rfilt |=ATH9K_RX_FILTER_PROM ;if (sc->rx.rxfilter &FIF_CONTROL )
drivers/net/wireless/rt2x00/rt2x00dev.c +10 -2
@@ -486,6 +486,10 @@ void rt2x00lib_rxdone(struct queue_entry *entry)unsigned int header_length;int rate_idx; +if (!test_bit (DEVICE_STATE_PRESENT , &rt2x00dev->flags) || + !test_bit (DEVICE_STATE_ENABLED_RADIO , &rt2x00dev->flags)) + goto submit_entry; +if (test_bit (ENTRY_DATA_IO_FAILED , &entry->flags)) goto submit_entry;
@@ -570,9 +574,13 @@ void rt2x00lib_rxdone(struct queue_entry *entry) entry->skb = skb; submit_entry: - rt2x00dev->ops->lib->clear_entry (entry); -rt2x00queue_index_inc (entry->queue,Q_INDEX ); + entry->flags =0 ;rt2x00queue_index_inc (entry->queue,Q_INDEX_DONE ); +if (test_bit (DEVICE_STATE_PRESENT , &rt2x00dev->flags) && +test_bit (DEVICE_STATE_ENABLED_RADIO , &rt2x00dev->flags)) { + rt2x00dev->ops->lib->clear_entry (entry); +rt2x00queue_index_inc (entry->queue,Q_INDEX ); + } }EXPORT_SYMBOL_GPL (rt2x00lib_rxdone);
drivers/net/wireless/rt2x00/rt2x00usb.c +14 -8
@@ -226,9 +226,7 @@ static void rt2x00usb_interrupt_txdone(struct urb *urb)* Schedule the delayed work for reading the TX status * from the device. */ -if (test_bit (DEVICE_STATE_PRESENT , &rt2x00dev->flags) && -test_bit (DEVICE_STATE_ENABLED_RADIO , &rt2x00dev->flags)) -ieee80211_queue_work (rt2x00dev->hw, &rt2x00dev->txdone_work); +ieee80211_queue_work (rt2x00dev->hw, &rt2x00dev->txdone_work); }static void rt2x00usb_kick_tx_entry (struct queue_entry *entry)
@@ -237,6 +235,7 @@ static void rt2x00usb_kick_tx_entry(struct queue_entry *entry)struct usb_device *usb_dev =to_usb_device_intf (rt2x00dev->dev);struct queue_entry_priv_usb *entry_priv = entry->priv_data;u32 length; +int status;if (!test_and_clear_bit (ENTRY_DATA_PENDING , &entry->flags))return ;
@@ -253,7 +252,10 @@ static void rt2x00usb_kick_tx_entry(struct queue_entry *entry) entry->skb->data, length, rt2x00usb_interrupt_txdone, entry); -if (usb_submit_urb (entry_priv->urb,GFP_ATOMIC )) { + status =usb_submit_urb (entry_priv->urb,GFP_ATOMIC ); +if (status) { +if (status == -ENODEV ) +clear_bit (DEVICE_STATE_PRESENT , &rt2x00dev->flags);set_bit (ENTRY_DATA_IO_FAILED , &entry->flags);rt2x00lib_dmadone (entry); }
@@ -424,9 +426,7 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb)* Schedule the delayed work for reading the RX status * from the device. */ -if (test_bit (DEVICE_STATE_PRESENT , &rt2x00dev->flags) && -test_bit (DEVICE_STATE_ENABLED_RADIO , &rt2x00dev->flags)) -ieee80211_queue_work (rt2x00dev->hw, &rt2x00dev->rxdone_work); +ieee80211_queue_work (rt2x00dev->hw, &rt2x00dev->rxdone_work); }/*
@@ -454,6 +454,7 @@ void rt2x00usb_clear_entry(struct queue_entry *entry)to_usb_device_intf (entry->queue->rt2x00dev->dev);struct queue_entry_priv_usb *entry_priv = entry->priv_data;int pipe; +int status; entry->flags =0 ;
@@ -464,7 +465,12 @@ void rt2x00usb_clear_entry(struct queue_entry *entry) rt2x00usb_interrupt_rxdone, entry);set_bit (ENTRY_OWNER_DEVICE_DATA , &entry->flags); -if (usb_submit_urb (entry_priv->urb,GFP_ATOMIC )) { + + status =usb_submit_urb (entry_priv->urb,GFP_ATOMIC ); +if (status) { +if (status == -ENODEV ) +clear_bit (DEVICE_STATE_PRESENT , + &entry->queue->rt2x00dev->flags);set_bit (ENTRY_DATA_IO_FAILED , &entry->flags);rt2x00lib_dmadone (entry); }
drivers/pci/pci-sysfs.c +1 -1
@@ -1088,7 +1088,7 @@ static int pci_create_capabilities_sysfs(struct pci_dev *dev) attr->write = write_vpd_attr; retval =sysfs_create_bin_file (&dev->dev.kobj, attr);if (retval) { -kfree (dev->vpd->attr); +kfree (attr);return retval; } dev->vpd->attr = attr;
drivers/pci/quirks.c +53 -60
141 lines not on this page · raw message
drivers/scsi/device_handler/scsi_dh_alua.c +2 -1
@@ -285,7 +285,8 @@ static void stpg_endio(struct request *req, int error) print_alua_state(h->state)); } done: -blk_put_request (req); + req->end_io_data =NULL ; +__blk_put_request (req->q, req);if (h->callback_fn) { h->callback_fn (h->callback_data, err); h->callback_fn = h->callback_data =NULL ;
drivers/staging/tidspbridge/rmgr/proc.c +14 -5
@@ -781,12 +781,14 @@ int proc_begin_dma(void *hprocessor, void *pmpu_addr, u32 ul_size, (u32 )pmpu_addr, ul_size, dir); +mutex_lock (&proc_lock); +/* find requested memory are in cached mapping information */ map_obj =find_containing_mapping (pr_ctxt, (u32 ) pmpu_addr, ul_size);if (!map_obj) {pr_err ("%s: find_containing_mapping failed\n" , __func__); status = -EFAULT ; - goto err_out; + goto no_map; }if (memory_give_ownership (map_obj, (u32 ) pmpu_addr, ul_size, dir)) {
@@ -795,6 +797,8 @@ int proc_begin_dma(void *hprocessor, void *pmpu_addr, u32 ul_size, status = -EFAULT ; } +no_map: +mutex_unlock (&proc_lock); err_out:return status;
@@ -819,21 +823,24 @@ int proc_end_dma(void *hprocessor, void *pmpu_addr, u32 ul_size, (u32 )pmpu_addr, ul_size, dir); +mutex_lock (&proc_lock); +/* find requested memory are in cached mapping information */ map_obj =find_containing_mapping (pr_ctxt, (u32 ) pmpu_addr, ul_size);if (!map_obj) {pr_err ("%s: find_containing_mapping failed\n" , __func__); status = -EFAULT ; - goto err_out; + goto no_map; }if (memory_regain_ownership (map_obj, (u32 ) pmpu_addr, ul_size, dir)) {pr_err ("%s: InValid address parameters %p %x\n" , __func__, pmpu_addr, ul_size); status = -EFAULT ; - goto err_out; } +no_map: +mutex_unlock (&proc_lock); err_out:return status; }
@@ -1726,9 +1733,8 @@ int proc_un_map(void *hprocessor, void *map_addr, (p_proc_object->hbridge_context, va_align, size_align); } -mutex_unlock (&proc_lock);if (status) - goto func_end; + goto unmap_failed;/* * A successful unmap should be followed by removal of map_obj
@@ -1737,6 +1743,9 @@ int proc_un_map(void *hprocessor, void *map_addr,*/ remove_mapping_information (pr_ctxt, (u32 ) map_addr, size_align); +unmap_failed: +mutex_unlock (&proc_lock); + func_end:dev_dbg (bridge,"%s: hprocessor: 0x%p map_addr: 0x%p status: 0x%x\n" , __func__, hprocessor, map_addr, status);
drivers/staging/winbond/core.h +1 -0
@@ -3,6 +3,7 @@#include <linux/wireless.h> #include <linux/types.h> +#include <linux/delay.h> #include "wbhal_s.h" #include "mto.h"
drivers/usb/core/hcd-pci.c +6 -7
@@ -364,8 +364,7 @@ static int check_root_hub_suspended(struct device *dev)struct pci_dev *pci_dev =to_pci_dev (dev);struct usb_hcd *hcd =pci_get_drvdata (pci_dev); -if (!(hcd->state ==HC_STATE_SUSPENDED || - hcd->state ==HC_STATE_HALT )) { +if (HCD_RH_RUNNING (hcd)) {dev_warn (dev,"Root hub is not suspended\n" );return -EBUSY ; }
@@ -387,7 +386,7 @@ static int suspend_common(struct device *dev, bool do_wakeup)if (retval)return retval; -if (hcd->driver->pci_suspend) { +if (hcd->driver->pci_suspend && !HCD_DEAD (hcd)) {/* Optimization: Don't suspend if a root-hub wakeup is * pending and it would cause the HCD to wake up anyway. */
@@ -428,7 +427,7 @@ static int resume_common(struct device *dev, int event)struct usb_hcd *hcd =pci_get_drvdata (pci_dev);int retval; -if (hcd->state !=HC_STATE_SUSPENDED ) { +if (HCD_RH_RUNNING (hcd)) {dev_dbg (dev,"can't resume, not suspended!\n" );return 0 ; }
@@ -443,7 +442,7 @@ static int resume_common(struct device *dev, int event)clear_bit (HCD_FLAG_SAW_IRQ , &hcd->flags); -if (hcd->driver->pci_resume) { +if (hcd->driver->pci_resume && !HCD_DEAD (hcd)) {if (event !=PM_EVENT_AUTO_RESUME )wait_for_companions (pci_dev, hcd);
@@ -476,10 +475,10 @@ static int hcd_pci_suspend_noirq(struct device *dev)pci_save_state (pci_dev); -/* If the root hub is HALTed rather than SUSPENDed, +/* If the root hub is dead rather than suspended, * disallow remote wakeup. */ -if (hcd->state ==HC_STATE_HALT ) +if (HCD_DEAD (hcd))device_set_wakeup_enable (dev,0 );dev_dbg (dev,"wakeup: %d\n" ,device_may_wakeup (dev));
drivers/usb/core/hcd.c +41 -14
134 lines not on this page · raw message
drivers/usb/core/urb.c +10 -1
@@ -366,7 +366,16 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags)if (xfertype ==USB_ENDPOINT_XFER_ISOC ) {int n, len; -/* FIXME SuperSpeed isoc endpoints have up to 16 bursts */ +/* SuperSpeed isoc endpoints have up to 16 bursts of up to +* 3 packets each +*/ +if (dev->speed ==USB_SPEED_SUPER ) { +int burst =1 + ep->ss_ep_comp.bMaxBurst; +int mult =USB_SS_MULT (ep->ss_ep_comp.bmAttributes); + max *= burst; + max *= mult; + } +/* "high bandwidth" mode, 1-3 packets/uframe? */ if (dev->speed ==USB_SPEED_HIGH ) {int mult =1 + ((max >>11 ) &0x03 );
drivers/usb/host/ehci-hub.c +22 -1
@@ -106,6 +106,27 @@ static void ehci_handover_companion_ports(struct ehci_hcd *ehci) ehci->owned_ports =0 ; } +static int ehci_port_change (struct ehci_hcd *ehci) +{ +int i =HCS_N_PORTS (ehci->hcs_params); + +/* First check if the controller indicates a change event */ + +if (ehci_readl (ehci, &ehci->regs->status) &STS_PCD ) +return 1 ; + +/* +* Not all controllers appear to update this while going from D3 to D0, +* so check the individual port status registers as well +*/ + +while (i--) +if (ehci_readl (ehci, &ehci->regs->port_status[i]) &PORT_CSC ) +return 1 ; + +return 0 ; +} +static void ehci_adjust_port_wakeup_flags (struct ehci_hcd *ehci,bool suspending,bool do_wakeup) {
@@ -173,7 +194,7 @@ static void ehci_adjust_port_wakeup_flags(struct ehci_hcd *ehci, }/* Does the root hub have a port wakeup pending? */ -if (!suspending && (ehci_readl (ehci, &ehci->regs->status) &STS_PCD )) +if (!suspending &&ehci_port_change (ehci))usb_hcd_resume_root_hub (ehci_to_hcd (ehci));spin_unlock_irqrestore (&ehci->lock, flags);
drivers/usb/host/isp1760-hcd.c +16 -6
@@ -33,6 +33,7 @@ struct isp1760_hcd {struct inter_packet_info atl_ints[32 ];struct inter_packet_info int_ints[32 ];struct memory_chunk memory_pool[BLOCKS ]; +u32 atl_queued;/* periodic schedule support */ #define DEFAULT_I_TDPS 1024
@@ -850,6 +851,11 @@ static void enqueue_an_ATL_packet(struct usb_hcd *hcd, struct isp1760_qh *qh, skip_map &= ~queue_entry;isp1760_writel (skip_map, hcd->regs +HC_ATL_PTD_SKIPMAP_REG ); + priv->atl_queued++; +if (priv->atl_queued ==2 ) +isp1760_writel (INTERRUPT_ENABLE_SOT_MASK , + hcd->regs +HC_INTERRUPT_ENABLE ); + buffstatus =isp1760_readl (hcd->regs +HC_BUFFER_STATUS_REG ); buffstatus |=ATL_BUFFER ;isp1760_writel (buffstatus, hcd->regs +HC_BUFFER_STATUS_REG );
@@ -992,6 +998,7 @@ static void do_atl_int(struct usb_hcd *usb_hcd)u32 dw3; status =0 ; + priv->atl_queued--; queue_entry =__ffs (done_map); done_map &= ~(1 << queue_entry);
@@ -1054,11 +1061,6 @@ static void do_atl_int(struct usb_hcd *usb_hcd)* device is not able to send data fast enough. * This happens mostly on slower hardware. */ -printk (KERN_NOTICE "Reloading ptd %p/%p... qh %p read: " -"%d of %zu done: %08x cur: %08x\n" , qtd, - urb, qh,PTD_XFERRED_LENGTH (dw3), - qtd->length, done_map, - (1 << queue_entry));/* RL counter = ERR counter */ dw3 &= ~(0xf <<19 );
@@ -1086,6 +1088,11 @@ static void do_atl_int(struct usb_hcd *usb_hcd)priv_write_copy (priv, (u32 *)&ptd, usb_hcd->regs + atl_regs,sizeof (ptd)); + priv->atl_queued++; +if (priv->atl_queued ==2 ) +isp1760_writel (INTERRUPT_ENABLE_SOT_MASK , + usb_hcd->regs +HC_INTERRUPT_ENABLE ); + buffstatus =isp1760_readl (usb_hcd->regs +HC_BUFFER_STATUS_REG ); buffstatus |=ATL_BUFFER ;
@@ -1191,6 +1198,9 @@ static void do_atl_int(struct usb_hcd *usb_hcd) skip_map =isp1760_readl (usb_hcd->regs +HC_ATL_PTD_SKIPMAP_REG ); } +if (priv->atl_queued <=1 ) +isp1760_writel (INTERRUPT_ENABLE_MASK , + usb_hcd->regs +HC_INTERRUPT_ENABLE ); }static void do_intl_int (struct usb_hcd *usb_hcd)
@@ -1770,7 +1780,7 @@ static irqreturn_t isp1760_irq(struct usb_hcd *usb_hcd) goto leave;isp1760_writel (imask, usb_hcd->regs +HC_INTERRUPT_REG ); -if (imask &HC_ATL_INT ) +if (imask & (HC_ATL_INT |HC_SOT_INT ))do_atl_int (usb_hcd);if (imask &HC_INTL_INT )
drivers/usb/host/isp1760-hcd.h +1 -0
@@ -69,6 +69,7 @@ void deinit_kmem_cache(void);#define HC_INTERRUPT_ENABLE 0x314#define INTERRUPT_ENABLE_MASK (HC_INTL_INT | HC_ATL_INT | HC_EOT_INT) +#define INTERRUPT_ENABLE_SOT_MASK (HC_INTL_INT | HC_SOT_INT | HC_EOT_INT)#define HC_ISO_INT (1 << 9)#define HC_ATL_INT (1 << 8)
drivers/usb/host/xhci-ring.c +40 -3
76 lines not on this page · raw message
drivers/usb/host/xhci.h +9 -0
@@ -648,6 +648,9 @@ struct xhci_ep_ctx {#define AVG_TRB_LENGTH_FOR_EP (p) ((p) & 0xffff)#define MAX_ESIT_PAYLOAD_FOR_EP (p) (((p) & 0xffff) << 16) +/* deq bitmasks */ +#define EP_CTX_CYCLE_MASK (1 << 0) +/** * struct xhci_input_control_context
@@ -750,6 +753,12 @@ struct xhci_virt_ep {struct timer_list stop_cmd_timer;int stop_cmds_pending;struct xhci_hcd *xhci; +/* Dequeue pointer and dequeue segment for a submitted Set TR Dequeue +* command. We'll need to update the ring's dequeue segment and dequeue +* pointer after the command completes. +*/ +struct xhci_segment *queued_deq_seg; +union xhci_trb *queued_deq_ptr;/* * Sometimes the xHC can not process isochronous endpoint ring quickly * enough, and it will miss some isoc tds on the ring and generate
drivers/usb/serial/ch341.c +1 -0
@@ -75,6 +75,7 @@ static int debug;static const struct usb_device_id id_table[] = { {USB_DEVICE (0x4348 ,0x5523 ) }, {USB_DEVICE (0x1a86 ,0x7523 ) }, + {USB_DEVICE (0x1a86 ,0x5523 ) }, { }, };MODULE_DEVICE_TABLE (usb, id_table);
drivers/usb/serial/kobil_sct.c +1 -1
@@ -372,7 +372,7 @@ static void kobil_read_int_callback(struct urb *urb) } tty =tty_port_tty_get (&port->port); -if (urb->actual_length) { +if (tty && urb->actual_length) {/* BEGIN DEBUG */ /*
drivers/usb/serial/option.c +2 -1
@@ -653,7 +653,8 @@ static const struct usb_device_id option_ids[] = { { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0028, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0029, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0030, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF626, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF626, 0xff, + 0xff, 0xff), .driver_info = (kernel_ulong_t)&four_g_w14_blacklist }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0032, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0033, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0034, 0xff, 0xff, 0xff) },
drivers/usb/serial/usb-serial.c +2 -3
@@ -911,9 +911,8 @@ int usb_serial_probe(struct usb_interface *interface,dev_err (&interface->dev,"No free urbs available\n" ); goto probe_error; } - buffer_size = serial->type->bulk_in_size; -if (!buffer_size) - buffer_size =le16_to_cpu (endpoint->wMaxPacketSize); + buffer_size =max_t (int, serial->type->bulk_in_size, +le16_to_cpu (endpoint->wMaxPacketSize)); port->bulk_in_size = buffer_size; port->bulk_in_endpointAddress = endpoint->bEndpointAddress; port->bulk_in_buffer =kmalloc (buffer_size,GFP_KERNEL );
fs/btrfs/file.c +13 -0
@@ -69,6 +69,19 @@ static noinline int btrfs_copy_from_user(loff_t pos, int num_pages,/* Flush processor's dcache for this page */ flush_dcache_page (page); + +/* +* if we get a partial write, we can end up with +* partially up to date pages. These add +* a lot of complexity, so make sure they don't +* happen by forcing this copy to be retried. +* +* The rest of the btrfs_file_write code will fall +* back to page at a time copies after we return 0. +*/ +if (!PageUptodate (page) && copied < count) + copied =0 ; +iov_iter_advance (i, copied); write_bytes -= copied; total_copied += copied;
fs/ext3/namei.c +1 -1
@@ -1549,8 +1549,8 @@ static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry, goto cleanup; node2 = (struct dx_node *)(bh2->b_data); entries2 = node2->entries; +memset (&node2->fake,0 ,sizeof (struct fake_dirent )); node2->fake.rec_len =ext3_rec_len_to_disk (sb->s_blocksize); - node2->fake.inode =0 ;BUFFER_TRACE (frame->bh,"get_write_access" ); err =ext3_journal_get_write_access (handle, frame->bh);if (err)
fs/nfs/nfs2xdr.c +4 -2
@@ -477,11 +477,13 @@ nfs_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry, struct nfs_se entry->ino =ntohl (*p++); entry->len =ntohl (*p++); - p =xdr_inline_decode (xdr, entry->len +4 ); + p =xdr_inline_decode (xdr, entry->len);if (unlikely (!p)) goto out_overflow; entry->name = (const char *) p; - p +=XDR_QUADLEN (entry->len); + p =xdr_inline_decode (xdr,4 ); +if (unlikely (!p)) + goto out_overflow; entry->prev_cookie = entry->cookie; entry->cookie =ntohl (*p++);
fs/nfs/nfs3xdr.c +4 -2
@@ -614,11 +614,13 @@ nfs3_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry, struct nfs_s p =xdr_decode_hyper (p, &entry->ino); entry->len =ntohl (*p++); - p =xdr_inline_decode (xdr, entry->len +8 ); + p =xdr_inline_decode (xdr, entry->len);if (unlikely (!p)) goto out_overflow; entry->name = (const char *) p; - p +=XDR_QUADLEN (entry->len); + p =xdr_inline_decode (xdr,8 ); +if (unlikely (!p)) + goto out_overflow; entry->prev_cookie = entry->cookie; p =xdr_decode_hyper (p, &entry->cookie);
fs/nfs/nfs4proc.c +1 -1
@@ -3226,7 +3226,7 @@ static int buf_to_pages_noslab(const void *buf, size_t buflen, spages = pages; do { - len = min(PAGE_CACHE_SIZE, buflen); + len = min_t(size_t, PAGE_CACHE_SIZE, buflen); newpage = alloc_page(GFP_KERNEL); if (newpage == NULL)
fs/nfs/nfsroot.c +14 -15
@@ -86,11 +86,14 @@/* Default path we try to mount. "%s" gets replaced by our IP address */ #define NFS_ROOT "/tftpboot/%s" +/* Default NFSROOT mount options. */ +#define NFS_DEF_OPTIONS "udp" +/* Parameters passed from the kernel command line */ static char nfs_root_parms[256 ]__initdata ="" ;/* Text-based mount options passed to super.c */ -static char nfs_root_options[256 ]__initdata ="" ; +static char nfs_root_options[256 ]__initdata =NFS_DEF_OPTIONS ;/* Address of NFS server */ static __be32 servaddr__initdata =htonl (INADDR_NONE );
@@ -160,8 +163,14 @@ static int __init root_nfs_copy(char *dest, const char *src, }static int __init root_nfs_cat (char *dest,const char *src, -const size_t destlen) +const size_t destlen) { +size_t len =strlen (dest); + +if (len && dest[len -1 ] !=',' ) +if (strlcat (dest,"," , destlen) > destlen) +return -1 ; +if (strlcat (dest, src, destlen) > destlen)return -1 ;return 0 ;
@@ -194,16 +203,6 @@ static int __init root_nfs_parse_options(char *incoming, char *exppath,if (root_nfs_cat (nfs_root_options, incoming,sizeof (nfs_root_options)))return -1 ; - -/* -* Possibly prepare for more options to be appended -*/ -if (nfs_root_options[0 ] !='\0' && - nfs_root_options[strlen (nfs_root_options)] !=',' ) -if (root_nfs_cat (nfs_root_options,"," , -sizeof (nfs_root_options))) -return -1 ; -return 0 ; }
@@ -217,7 +216,7 @@ static int __init root_nfs_parse_options(char *incoming, char *exppath,*/ static int __init root_nfs_data (char *cmdline) { -char addr_option[sizeof ("nolock,addr=" ) +INET_ADDRSTRLEN +1 ]; +char mand_options[sizeof ("nolock,addr=" ) +INET_ADDRSTRLEN +1 ];int len, retval =-1 ;char *tmp =NULL ;const size_t tmplen =sizeof (nfs_export_path);
@@ -244,9 +243,9 @@ static int __init root_nfs_data(char *cmdline)* Append mandatory options for nfsroot so they override * what has come before */ -snprintf (addr_option,sizeof (addr_option),"nolock,addr=%pI4" , +snprintf (mand_options,sizeof (mand_options),"nolock,addr=%pI4" , &servaddr); -if (root_nfs_cat (nfs_root_options, addr_option, +if (root_nfs_cat (nfs_root_options, mand_options,sizeof (nfs_root_options))) goto out_optionstoolong;
fs/partitions/osf.c +10 -2
@@ -10,10 +10,13 @@#include "check.h" #include "osf.h" +#define MAX_OSF_PARTITIONS 18 +int osf_partition (struct parsed_partitions *state) {int i;int slot =1 ; +unsigned int npartitions;Sector sect;unsigned char *data; struct disklabel {
@@ -45,7 +48,7 @@ int osf_partition(struct parsed_partitions *state)u8 p_fstype;u8 p_frag;__le16 p_cpg; - } d_partitions[8 ]; + } d_partitions[MAX_OSF_PARTITIONS ]; } * label;struct d_partition * partition;
@@ -63,7 +66,12 @@ int osf_partition(struct parsed_partitions *state)put_dev_sector (sect);return 0 ; } -for (i =0 ; i <le16_to_cpu (label->d_npartitions); i++, partition++) { + npartitions =le16_to_cpu (label->d_npartitions); +if (npartitions >MAX_OSF_PARTITIONS ) { +put_dev_sector (sect); +return 0 ; + } +for (i =0 ; i < npartitions; i++, partition++) {if (slot == state->limit)break ;if (le32_to_cpu (partition->p_size))
include/linux/ftrace.h +2 -0
@@ -428,6 +428,7 @@ extern void unregister_ftrace_graph(void);extern void ftrace_graph_init_task (struct task_struct *t);extern void ftrace_graph_exit_task (struct task_struct *t); +extern void ftrace_graph_init_idle_task (struct task_struct *t,int cpu);static inline int task_curr_ret_stack (struct task_struct *t) {
@@ -451,6 +452,7 @@ static inline void unpause_graph_tracing(void)static inline void ftrace_graph_init_task (struct task_struct *t) { }static inline void ftrace_graph_exit_task (struct task_struct *t) { } +static inline void ftrace_graph_init_idle_task (struct task_struct *t,int cpu) { }static inline int register_ftrace_graph (trace_func_graph_ret_t retfunc,trace_func_graph_ent_t entryfunc)
include/linux/usb/ch9.h +2 -0
@@ -575,6 +575,8 @@ struct usb_ss_ep_comp_descriptor {#define USB_DT_SS_EP_COMP_SIZE 6/* Bits 4:0 of bmAttributes if this is a bulk endpoint */ #define USB_SS_MAX_STREAMS (p) (1 << (p & 0x1f)) +/* Bits 1:0 of bmAttributes if this is an isoc endpoint */ +#define USB_SS_MULT (p) (1 + ((p) & 0x3))/*-------------------------------------------------------------------------*/
include/linux/usb/hcd.h +4 -0
@@ -99,6 +99,8 @@ struct usb_hcd {#define HCD_FLAG_POLL_RH 2/* poll for rh status? */ #define HCD_FLAG_POLL_PENDING 3/* status has changed? */ #define HCD_FLAG_WAKEUP_PENDING 4/* root hub is resuming? */ +#define HCD_FLAG_RH_RUNNING 5/* root hub is running? */ +#define HCD_FLAG_DEAD 6/* controller has died? */ /* The flags can be tested using these macros; they are likely to * be slightly faster than test_bit().
@@ -108,6 +110,8 @@ struct usb_hcd {#define HCD_POLL_RH (hcd) ((hcd)->flags & (1U << HCD_FLAG_POLL_RH))#define HCD_POLL_PENDING (hcd) ((hcd)->flags & (1U << HCD_FLAG_POLL_PENDING))#define HCD_WAKEUP_PENDING (hcd) ((hcd)->flags & (1U << HCD_FLAG_WAKEUP_PENDING)) +#define HCD_RH_RUNNING (hcd) ((hcd)->flags & (1U << HCD_FLAG_RH_RUNNING)) +#define HCD_DEAD (hcd) ((hcd)->flags & (1U << HCD_FLAG_DEAD))/* Flags that get set only during HCD registration or removal. */ unsigned rh_registered:1;/* is root hub registered? */
include/linux/usb/serial.h +2 -1
@@ -191,7 +191,8 @@ static inline void usb_set_serial_data(struct usb_serial *serial, void *data)* @id_table: pointer to a list of usb_device_id structures that define all * of the devices this structure can support. * @num_ports: the number of different ports this device will have. -* @bulk_in_size: bytes to allocate for bulk-in buffer (0 = end-point size) +* @bulk_in_size: minimum number of bytes to allocate for bulk-in buffer +* (0 = end-point size) * @bulk_out_size: bytes to allocate for bulk-out buffer (0 = end-point size) * @calc_num_ports: pointer to a function to determine how many ports this * device has dynamically. It will be called after the probe()
kernel/perf_event.c +3 -1
@@ -4414,7 +4414,7 @@ static int perf_exclude_event(struct perf_event *event, struct pt_regs *regs) {if (event->hw.state &PERF_HES_STOPPED ) -return 0 ; +return 1 ;if (regs) {if (event->attr.exclude_user &&user_mode (regs))
@@ -4770,6 +4770,8 @@ static int perf_tp_event_match(struct perf_event *event, struct perf_sample_data *data, struct pt_regs *regs) { +if (event->hw.state &PERF_HES_STOPPED ) +return 0 ;/* * All tracepoints are from kernel-space. */
kernel/sched.c +1 -1
@@ -5706,7 +5706,7 @@ void __cpuinit init_idle(struct task_struct *idle, int cpu)* The idle tasks have their own, simple scheduling class: */ idle->sched_class = &idle_sched_class; -ftrace_graph_init_task (idle); +ftrace_graph_init_idle_task (idle, cpu); }/*
kernel/smp.c +44 -11
86 lines not on this page · raw message
kernel/trace/ftrace.c +45 -7
70 lines not on this page · raw message
net/ipv4/netfilter/nf_conntrack_l3proto_ipv4_compat.c +1 -1
@@ -97,7 +97,7 @@ static int ct_show_secctx(struct seq_file *s, const struct nf_conn *ct) ret =security_secid_to_secctx (ct->secmark, &secctx, &len);if (ret) -return ret; +return 0 ; ret =seq_printf (s,"secctx=%s " , secctx);
net/netfilter/nf_conntrack_netlink.c +14 -11
@@ -254,7 +254,7 @@ ctnetlink_dump_secctx(struct sk_buff *skb, const struct nf_conn *ct) ret =security_secid_to_secctx (ct->secmark, &secctx, &len);if (ret) -return ret; +return 0 ; ret =-1 ; nest_secctx =nla_nest_start (skb,CTA_SECCTX |NLA_F_NESTED );
@@ -453,16 +453,22 @@ ctnetlink_counters_size(const struct nf_conn *ct) ; } -#ifdef CONFIG_NF_CONNTRACK_SECMARK -static int ctnetlink_nlmsg_secctx_size (const struct nf_conn *ct) +static inline int +ctnetlink_secctx_size (const struct nf_conn *ct) { -int len; +#ifdef CONFIG_NF_CONNTRACK_SECMARK +int len, ret; -security_secid_to_secctx (ct->secmark,NULL , &len); + ret =security_secid_to_secctx (ct->secmark,NULL , &len); +if (ret) +return 0 ; -return sizeof (char ) * len; -} +return nla_total_size (0 )/* CTA_SECCTX */ + +nla_total_size (sizeof (char ) * len);/* CTA_SECCTX_NAME */ +#else +return 0 ;#endif +}static inline size_t ctnetlink_nlmsg_size (const struct nf_conn *ct)
@@ -479,10 +485,7 @@ ctnetlink_nlmsg_size(const struct nf_conn *ct) +nla_total_size (0 )/* CTA_PROTOINFO */ +nla_total_size (0 )/* CTA_HELP */ +nla_total_size (NF_CT_HELPER_NAME_LEN )/* CTA_HELP_NAME */ -#ifdef CONFIG_NF_CONNTRACK_SECMARK - +nla_total_size (0 )/* CTA_SECCTX */ - + nla_total_size(ctnetlink_nlmsg_secctx_size(ct)) /* CTA_SECCTX_NAME */ -#endif + + ctnetlink_secctx_size(ct)#ifdef CONFIG_NF_NAT_NEEDED +2 *nla_total_size (0 )/* CTA_NAT_SEQ_ADJ_ORIG|REPL */ +6 *nla_total_size (sizeof (u_int32_t))/* CTA_NAT_SEQ_OFFSET */
net/netfilter/nf_conntrack_standalone.c +1 -1
@@ -118,7 +118,7 @@ static int ct_show_secctx(struct seq_file *s, const struct nf_conn *ct) ret =security_secid_to_secctx (ct->secmark, &secctx, &len);if (ret) -return ret; +return 0 ; ret =seq_printf (s,"secctx=%s " , secctx);
net/sunrpc/clnt.c +3 -1
@@ -436,7 +436,9 @@ void rpc_killall_tasks(struct rpc_clnt *clnt)if (!(rovr->tk_flags &RPC_TASK_KILLED )) { rovr->tk_flags |=RPC_TASK_KILLED ;rpc_exit (rovr, -EIO ); -rpc_wake_up_queued_task (rovr->tk_waitqueue, rovr); +if (RPC_IS_QUEUED (rovr)) +rpc_wake_up_queued_task (rovr->tk_waitqueue, + rovr); } }spin_unlock (&clnt->cl_lock);
net/sunrpc/sched.c +6 -8
@@ -623,14 +623,12 @@ static void __rpc_execute(struct rpc_task *task) save_callback = task->tk_callback; task->tk_callback =NULL ;save_callback (task); - } - -/* -* Perform the next FSM step. -* tk_action may be NULL when the task has been killed -* by someone else. -*/ -if (!RPC_IS_QUEUED (task)) { + }else { +/* +* Perform the next FSM step. +* tk_action may be NULL when the task has been killed +* by someone else. +*/ if (task->tk_action ==NULL )break ; task->tk_action (task);
net/sunrpc/xprtsock.c +2 -1
@@ -1631,7 +1631,8 @@ static struct socket *xs_create_sock(struct rpc_xprt *xprt, }xs_reclassify_socket (family, sock); -if (xs_bind (transport, sock)) { + err =xs_bind (transport, sock); +if (err) {sock_release (sock); goto out; }
security/tomoyo/file.c +1 -4
@@ -927,7 +927,7 @@ int tomoyo_check_open_permission(struct tomoyo_domain_info *domain, struct path *path, const int flag) {const u8 acc_mode =ACC_MODE (flag); -int error = -ENOMEM ; +int error =0 ;struct tomoyo_path_info buf;struct tomoyo_request_info r;int idx;
@@ -938,9 +938,6 @@ int tomoyo_check_open_permission(struct tomoyo_domain_info *domain, buf.name =NULL ; r.mode =TOMOYO_CONFIG_DISABLED ; idx =tomoyo_read_lock (); -if (!tomoyo_get_realpath (&buf, path)) - goto out; - error =0 ;/* * If the filename is specified by "deny_rewrite" keyword, * we need to check "allow_rewrite" permission when the filename is not
sound/drivers/aloop.c +9 -10
@@ -482,8 +482,9 @@ static unsigned int loopback_pos_update(struct loopback_cable *cable) cable->streams[SNDRV_PCM_STREAM_CAPTURE ];unsigned long delta_play =0 , delta_capt =0 ;unsigned int running; +unsigned long flags; -spin_lock (&cable->lock); +spin_lock_irqsave (&cable->lock, flags); running = cable->running ^ cable->pause;if (running & (1 <<SNDRV_PCM_STREAM_PLAYBACK )) { delta_play = jiffies - dpcm_play->last_jiffies;
@@ -495,10 +496,8 @@ static unsigned int loopback_pos_update(struct loopback_cable *cable) dpcm_capt->last_jiffies += delta_capt; } -if (delta_play ==0 && delta_capt ==0 ) { -spin_unlock (&cable->lock); -return running; - } +if (delta_play ==0 && delta_capt ==0 ) + goto unlock;if (delta_play > delta_capt) { loopback_bytepos_update(dpcm_play, delta_play - delta_capt,
@@ -510,14 +509,14 @@ static unsigned int loopback_pos_update(struct loopback_cable *cable) delta_capt = delta_play; } -if (delta_play ==0 && delta_capt ==0 ) { -spin_unlock (&cable->lock); -return running; - } +if (delta_play ==0 && delta_capt ==0 ) + goto unlock; +/* note delta_capt == delta_play at this moment */ loopback_bytepos_update (dpcm_capt, delta_capt,BYTEPOS_UPDATE_COPY );loopback_bytepos_update (dpcm_play, delta_play,BYTEPOS_UPDATE_POSONLY ); -spin_unlock (&cable->lock); + unlock: +spin_unlock_irqrestore (&cable->lock, flags);return running; }
sound/pci/asihpi/hpioctl.c +5 -0
@@ -155,6 +155,11 @@ long asihpi_hpi_ioctl(struct file *file, unsigned int cmd, unsigned long arg) goto out; } +if (hm->h.adapter_index >=HPI_MAX_ADAPTERS ) { + err = -EINVAL ; + goto out; + } + pa = &adapters[hm->h.adapter_index]; hr->h.size =0 ;if (hm->h.object ==HPI_OBJ_SUBSYSTEM ) {
sound/pci/ctxfi/ctatc.c +1 -1
@@ -869,7 +869,7 @@ spdif_passthru_playback_setup(struct ct_atc *atc, struct ct_atc_pcm *apcm)mutex_lock (&atc->atc_mutex); dao->ops->get_spos (dao, &status);if (((status >>24 ) &IEC958_AES3_CON_FS ) != iec958_con_fs) { - status &= ((~IEC958_AES3_CON_FS ) <<24 ); + status &= ~(IEC958_AES3_CON_FS <<24 ); status |= (iec958_con_fs <<24 ); dao->ops->set_spos (dao, status); dao->ops->commit_write (dao);
sound/pci/ctxfi/ctdaio.c +2 -0
@@ -176,6 +176,7 @@ static int dao_set_left_input(struct dao *dao, struct rsc *input)if (!entry)return -ENOMEM ; + dao->ops->clear_left_input (dao);/* Program master and conjugate resources */ input->ops->master (input); daio->rscl.ops->master (&daio->rscl);
@@ -204,6 +205,7 @@ static int dao_set_right_input(struct dao *dao, struct rsc *input)if (!entry)return -ENOMEM ; + dao->ops->clear_right_input (dao);/* Program master and conjugate resources */ input->ops->master (input); daio->rscr.ops->master (&daio->rscr);
sound/pci/ctxfi/ctmixer.c +5 -14
@@ -566,19 +566,6 @@ static int ct_spdif_get_mask(struct snd_kcontrol *kcontrol,return 0 ; } -static int ct_spdif_default_get (struct snd_kcontrol *kcontrol, -struct snd_ctl_elem_value *ucontrol) -{ -unsigned int status =SNDRV_PCM_DEFAULT_CON_SPDIF ; - - ucontrol->value.iec958.status[0 ] = (status >>0 ) &0xff ; - ucontrol->value.iec958.status[1 ] = (status >>8 ) &0xff ; - ucontrol->value.iec958.status[2 ] = (status >>16 ) &0xff ; - ucontrol->value.iec958.status[3 ] = (status >>24 ) &0xff ; - -return 0 ; -} -static int ct_spdif_get (struct snd_kcontrol *kcontrol,struct snd_ctl_elem_value *ucontrol) {
@@ -586,6 +573,10 @@ static int ct_spdif_get(struct snd_kcontrol *kcontrol,unsigned int status; atc->spdif_out_get_status (atc, &status); + +if (status ==0 ) + status =SNDRV_PCM_DEFAULT_CON_SPDIF ; + ucontrol->value.iec958.status[0 ] = (status >>0 ) &0xff ; ucontrol->value.iec958.status[1 ] = (status >>8 ) &0xff ; ucontrol->value.iec958.status[2 ] = (status >>16 ) &0xff ;
@@ -629,7 +620,7 @@ static struct snd_kcontrol_new iec958_default_ctl = { .name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, DEFAULT), .count = 1, .info = ct_spdif_info, - .get = ct_spdif_default_get, + .get = ct_spdif_get, .put = ct_spdif_put, .private_value = MIXER_IEC958_DEFAULT };
sound/pci/hda/patch_realtek.c +37 -19
105 lines not on this page · raw message
sound/pci/hda/patch_sigmatel.c +8 -3
@@ -749,7 +749,7 @@ static int stac92xx_mux_enum_put(struct snd_kcontrol *kcontrol, struct snd_ctl_estruct sigmatel_spec *spec = codec->spec;unsigned int adc_idx =snd_ctl_get_ioffidx (kcontrol, &ucontrol->id);const struct hda_input_mux *imux = spec->input_mux; -unsigned int idx, prev_idx; +unsigned int idx, prev_idx, didx; idx = ucontrol->value.enumerated.item[0 ];if (idx >= imux->num_items)
@@ -761,7 +761,8 @@ static int stac92xx_mux_enum_put(struct snd_kcontrol *kcontrol, struct snd_ctl_esnd_hda_codec_write_cache (codec, spec->mux_nids[adc_idx],0 ,AC_VERB_SET_CONNECT_SEL , imux->items[idx].index); -if (prev_idx >= spec->num_analog_muxes) { +if (prev_idx >= spec->num_analog_muxes && + spec->mux_nids[adc_idx] != spec->dmux_nids[adc_idx]) { imux = spec->dinput_mux;/* 0 = analog */ snd_hda_codec_write_cache(codec,
@@ -771,9 +772,13 @@ static int stac92xx_mux_enum_put(struct snd_kcontrol *kcontrol, struct snd_ctl_e } }else { imux = spec->dinput_mux; +/* first dimux item is hardcoded to select analog imux, +* so lets skip it +*/ + didx = idx - spec->num_analog_muxes +1 ;snd_hda_codec_write_cache (codec, spec->dmux_nids[adc_idx],0 ,AC_VERB_SET_CONNECT_SEL , - imux->items[idx -1 ].index); + imux->items[didx].index); } spec->cur_mux[adc_idx] = idx;return 1 ;
sound/soc/codecs/wm8978.c +8 -6
@@ -147,18 +147,18 @@ static const struct snd_kcontrol_new wm8978_snd_controls[] = {SOC_SINGLE ("DAC Playback Limiter Threshold" ,WM8978_DAC_LIMITER_2 ,4 ,7 ,0 ),SOC_SINGLE ("DAC Playback Limiter Boost" , -WM8978_DAC_LIMITER_2 ,0 ,15 ,0 ), +WM8978_DAC_LIMITER_2 ,0 ,12 ,0 ),SOC_ENUM ("ALC Enable Switch" , alc1),SOC_SINGLE ("ALC Capture Min Gain" ,WM8978_ALC_CONTROL_1 ,0 ,7 ,0 ),SOC_SINGLE ("ALC Capture Max Gain" ,WM8978_ALC_CONTROL_1 ,3 ,7 ,0 ), -SOC_SINGLE ("ALC Capture Hold" ,WM8978_ALC_CONTROL_2 ,4 ,7 ,0 ), +SOC_SINGLE ("ALC Capture Hold" ,WM8978_ALC_CONTROL_2 ,4 ,10 ,0 ),SOC_SINGLE ("ALC Capture Target" ,WM8978_ALC_CONTROL_2 ,0 ,15 ,0 ),SOC_ENUM ("ALC Capture Mode" , alc3), -SOC_SINGLE ("ALC Capture Decay" ,WM8978_ALC_CONTROL_3 ,4 ,15 ,0 ), -SOC_SINGLE ("ALC Capture Attack" ,WM8978_ALC_CONTROL_3 ,0 ,15 ,0 ), +SOC_SINGLE ("ALC Capture Decay" ,WM8978_ALC_CONTROL_3 ,4 ,10 ,0 ), +SOC_SINGLE ("ALC Capture Attack" ,WM8978_ALC_CONTROL_3 ,0 ,10 ,0 ),SOC_SINGLE ("ALC Capture Noise Gate Switch" ,WM8978_NOISE_GATE ,3 ,1 ,0 ), SOC_SINGLE("ALC Capture Noise Gate Threshold",
@@ -213,8 +213,10 @@ static const struct snd_kcontrol_new wm8978_snd_controls[] = { WM8978_LOUT2_SPK_CONTROL, WM8978_ROUT2_SPK_CONTROL, 6, 1, 1),/* DAC / ADC oversampling */ -SOC_SINGLE ("DAC 128x Oversampling Switch" ,WM8978_DAC_CONTROL ,8 ,1 ,0 ), - SOC_SINGLE("ADC 128x Oversampling Switch", WM8978_ADC_CONTROL, 8, 1, 0), +SOC_SINGLE ("DAC 128x Oversampling Switch" ,WM8978_DAC_CONTROL , +5 ,1 ,0 ), +SOC_SINGLE ("ADC 128x Oversampling Switch" ,WM8978_ADC_CONTROL , + 5, 1, 0), };/* Mixer #1: Output (OUT1, OUT2) Mixer: mix AUX, Input mixer output and DAC */
tools/perf/util/PERF-VERSION-GEN +4 -4
@@ -23,10 +23,10 @@ if test -d ../../.git -o -f ../../.git && then VN=$(echo "$VN" | sed -e 's/-/./g'); else - eval `grep '^VERSION\s*=' ../../Makefile|tr -d ' '` - eval `grep '^PATCHLEVEL\s*=' ../../Makefile|tr -d ' '` - eval `grep '^SUBLEVEL\s*=' ../../Makefile|tr -d ' '` - eval `grep '^EXTRAVERSION\s*=' ../../Makefile|tr -d ' '` + eval $(grep '^VERSION[[:space:]]*=' ../../Makefile|tr -d ' ') + eval $(grep '^PATCHLEVEL[[:space:]]*=' ../../Makefile|tr -d ' ') + eval $(grep '^SUBLEVEL[[:space:]]*=' ../../Makefile|tr -d ' ') + eval $(grep '^EXTRAVERSION[[:space:]]*=' ../../Makefile|tr -d ' ') VN="${VERSION}.${PATCHLEVEL}.${SUBLEVEL}${EXTRAVERSION}" fi