Linux 4.9.45
Greg KH
maintainerI'm announcing the release of the 4.9.45 kernel.
All users of the 4.9 kernel series must upgrade.
The updated 4.9.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.9.y
and can be browsed at the normal kernel.org git web browser:
http://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 arch/arm64/include/asm/elf.h | 4 - arch/powerpc/kernel/process.c | 5 +- arch/x86/crypto/sha1_avx2_x86_64_asm.S | 67 +++++++++++++++++---------------- arch/x86/crypto/sha1_ssse3_glue.c | 2 arch/x86/entry/entry_64.S | 2 arch/x86/include/asm/elf.h | 4 - block/blk-mq-pci.c | 8 +++ drivers/block/xen-blkfront.c | 6 +- drivers/crypto/ixp4xx_crypto.c | 6 +- drivers/input/mouse/elan_i2c_core.c | 4 + drivers/irqchip/irq-atmel-aic-common.c | 5 -- drivers/net/usb/qmi_wwan.c | 1 drivers/parisc/dino.c | 2 drivers/usb/core/usb-acpi.c | 26 +++++++++++- drivers/xen/biomerge.c | 3 - include/linux/memblock.h | 6 +- include/linux/pid.h | 4 + include/linux/sched.h | 50 +++++++++++++----------- kernel/audit_watch.c | 12 +++-- kernel/irq/chip.c | 10 +++- kernel/irq/ipi.c | 4 - kernel/pid.c | 11 +---- mm/memblock.c | 38 ++++++++---------- mm/memory.c | 12 +++++ mm/mempolicy.c | 5 -- mm/migrate.c | 11 +---- mm/nobootmem.c | 16 ------- mm/page_alloc.c | 4 + net/netfilter/nf_conntrack_extend.c | 13 ++++-- sound/core/seq/seq_clientmgr.c | 13 +----- sound/core/seq/seq_queue.c | 14 ++++-- sound/core/seq/seq_queue.h | 2 sound/usb/mixer.c | 2 sound/usb/mixer.h | 1 sound/usb/mixer_quirks.c | 6 ++ sound/usb/quirks.c | 1 37 files changed, 216 insertions(+), 166 deletions(-)
Alexey Dobriyan (1):
genirq/ipi: Fixup checks against nr_cpu_ids
Andy Lutomirski (1):
x86/asm/64: Clear AC on NMI entries
Benjamin Herrenschmidt (1):
powerpc: Fix VSX enabling/flushing to also test MSR_FP and MSR_VEC
Boris Brezillon (2):
irqchip/atmel-aic: Fix unbalanced of_node_put() in aic_common_irq_fixup() irqchip/atmel-aic: Fix unbalanced refcount in aic_common_rtc_irq_fixup()
Christoph Hellwig (1):
blk-mq-pci: add a fallback when pci_irq_get_affinity returns NULL
Daniel Mentz (1):
ALSA: seq: 2nd attempt at fixing race creating a queue
Greg Kroah-Hartman (1):
Linux 4.9.45
Hector Martin (1):
usb: qmi_wwan: add D-Link DWM-222 device ID
Herbert Xu (1):
crypto: ixp4xx - Fix error handling path in 'aead_perform()'
Jan Kara (1):
audit: Fix use after free in audit_remove_watch_rule()
KT Liao (1):
Input: elan_i2c - Add antoher Lenovo ACPI ID for upcoming Lenovo NB
Kai-Heng Feng (1):
Input: elan_i2c - add ELAN0608 to the ACPI table
Kees Cook (1):
mm: revert x86_64 and arm64 ELF_ET_DYN_BASE base changes
Linus Torvalds (1):
Sanitize 'move_pages()' permission checks
Liping Zhang (1):
netfilter: nf_ct_ext: fix possible panic after nf_ct_extend_unregister
Marc Zyngier (1):
genirq: Restore trigger settings in irq_modify_status()
Mathias Nyman (1):
usb: optimize acpi companion search for usb port devices
Michal Hocko (1):
mm: fix double mmap_sem unlock on MMF_UNSTABLE enforced SIGBUS
Munehisa Kamata (1):
xen-blkfront: use a right index when checking requests
Oleg Nesterov (1):
pids: make task_tgid_nr_ns() safe
Pavel Tatashin (1):
mm: discard memblock data later
Roger Pau Monne (1):
xen: fix bio vec merging
Takashi Iwai (2):
ALSA: usb-audio: Apply sample rate quirk to Sennheiser headset
ALSA: usb-audio: Add mute TLV for playback volumes on C-Media devices
Thomas Bogendoerfer (1):
parisc: pci memory bar assignment fails with 64bit kernels on dino/cujo
[email protected] (1):
crypto: x86/sha1 - Fix reads beyond the number of blocks passed
zhong jiang (1):
mm/mempolicy: fix use after free when calling get_mempolicy
Greg KH
maintainerMakefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 4 PATCHLEVEL = 9 -SUBLEVEL = 44 +SUBLEVEL = 45 EXTRAVERSION = NAME = Roaring Lionus
arch/arm64/include/asm/elf.h +2 -2
@@ -114,10 +114,10 @@/* * This is the base location for PIE (ET_DYN with INTERP) loads. On -* 64-bit, this is raised to 4GB to leave the entire 32-bit address +* 64-bit, this is above 4GB to leave the entire 32-bit address * space open for things that want to use the area for 32-bit pointers. */ -#define ELF_ET_DYN_BASE 0x100000000UL +#define ELF_ET_DYN_BASE (2 * TASK_SIZE_64 / 3)#ifndef __ASSEMBLY__
arch/powerpc/kernel/process.c +3 -2
@@ -359,7 +359,8 @@ void enable_kernel_vsx(void) cpumsr =msr_check_and_set (MSR_FP |MSR_VEC |MSR_VSX ); -if (current->thread.regs && (current->thread.regs->msr &MSR_VSX )) { +if (current->thread.regs && + (current->thread.regs->msr & (MSR_VSX |MSR_VEC |MSR_FP ))) {check_if_tm_restore_required (current);/* * If a thread has already been reclaimed then the
@@ -383,7 +384,7 @@ void flush_vsx_to_thread(struct task_struct *tsk) {if (tsk->thread.regs) {preempt_disable (); -if (tsk->thread.regs->msr &MSR_VSX ) { +if (tsk->thread.regs->msr & (MSR_VSX |MSR_VEC |MSR_FP )) {BUG_ON (tsk != current);giveup_vsx (tsk); }
arch/x86/crypto/sha1_avx2_x86_64_asm.S +36 -31
149 lines not on this page · raw message
arch/x86/crypto/sha1_ssse3_glue.c +1 -1
@@ -201,7 +201,7 @@ asmlinkage void sha1_transform_avx2(u32 *digest, const char *data,static bool avx2_usable (void ) { -if (false &&avx_usable () &&boot_cpu_has (X86_FEATURE_AVX2 ) +if (avx_usable () &&boot_cpu_has (X86_FEATURE_AVX2 ) &&boot_cpu_has (X86_FEATURE_BMI1 ) &&boot_cpu_has (X86_FEATURE_BMI2 ))return true;
arch/x86/entry/entry_64.S +2 -0
@@ -1215,6 +1215,8 @@ ENTRY(nmi) * other IST entries. */ + ASM_CLAC + /* Use %rdx as our temp variable throughout */ pushq %rdx
arch/x86/include/asm/elf.h +2 -2
@@ -247,11 +247,11 @@ extern int force_personality32;/* * This is the base location for PIE (ET_DYN with INTERP) loads. On -* 64-bit, this is raised to 4GB to leave the entire 32-bit address +* 64-bit, this is above 4GB to leave the entire 32-bit address * space open for things that want to use the area for 32-bit pointers. */ #define ELF_ET_DYN_BASE (mmap_is_ia32() ? 0x000400000UL : \ - 0x100000000UL) + (TASK_SIZE / 3 * 2))/* This yields a mask that user programs can use to figure out what instruction set this CPU supports. This could be done in user space,
block/blk-mq-pci.c +7 -1
@@ -36,12 +36,18 @@ int blk_mq_pci_map_queues(struct blk_mq_tag_set *set, struct pci_dev *pdev)for (queue =0 ; queue < set->nr_hw_queues; queue++) { mask =pci_irq_get_affinity (pdev, queue);if (!mask) -return -EINVAL ; + goto fallback;for_each_cpu (cpu, mask) set->mq_map[cpu] = queue; }return 0 ; + +fallback: +WARN_ON_ONCE (set->nr_hw_queues >1 ); +for_each_possible_cpu (cpu) + set->mq_map[cpu] =0 ; +return 0 ; }EXPORT_SYMBOL_GPL (blk_mq_pci_map_queues);
drivers/block/xen-blkfront.c +3 -3
@@ -2112,9 +2112,9 @@ static int blkfront_resume(struct xenbus_device *dev)/* * Get the bios in the request so we can re-queue them. */ -if (req_op (shadow[i].request) ==REQ_OP_FLUSH || -req_op (shadow[i].request) ==REQ_OP_DISCARD || -req_op (shadow[i].request) ==REQ_OP_SECURE_ERASE || +if (req_op (shadow[j].request) ==REQ_OP_FLUSH || +req_op (shadow[j].request) ==REQ_OP_DISCARD || +req_op (shadow[j].request) ==REQ_OP_SECURE_ERASE || shadow[j].request->cmd_flags &REQ_FUA ) {/* * Flush operations don't contain bios, so
drivers/crypto/ixp4xx_crypto.c +3 -3
@@ -1074,7 +1074,7 @@ static int aead_perform(struct aead_request *req, int encrypt, req_ctx->hmac_virt =dma_pool_alloc (buffer_pool, flags, &crypt->icv_rev_aes);if (unlikely (!req_ctx->hmac_virt)) - goto free_buf_src; + goto free_buf_dst;if (!encrypt) {scatterwalk_map_and_copy (req_ctx->hmac_virt, req->src, cryptlen, authsize,0 );
@@ -1089,10 +1089,10 @@ static int aead_perform(struct aead_request *req, int encrypt,BUG_ON (qmgr_stat_overflow (SEND_QID ));return -EINPROGRESS ; -free_buf_src: -free_buf_chain (dev, req_ctx->src, crypt->src_buf); free_buf_dst:free_buf_chain (dev, req_ctx->dst, crypt->dst_buf); +free_buf_src: +free_buf_chain (dev, req_ctx->src, crypt->src_buf); crypt->ctl_flags =CTL_FLAG_UNUSED ;return -ENOMEM ; }
drivers/input/mouse/elan_i2c_core.c +4 -0
@@ -1235,6 +1235,10 @@ static const struct acpi_device_id elan_acpi_id[] = { { "ELAN0100", 0 }, { "ELAN0600", 0 }, { "ELAN0605", 0 }, + { "ELAN0608", 0 }, + { "ELAN0605", 0 }, + { "ELAN0609", 0 }, + { "ELAN060B", 0 }, { "ELAN1000", 0 }, { } };
drivers/irqchip/irq-atmel-aic-common.c +2 -3
@@ -142,9 +142,9 @@ void __init aic_common_rtc_irq_fixup(struct device_node *root)struct device_node *np;void __iomem *regs; - np =of_find_compatible_node (root,NULL ,"atmel,at91rm9200-rtc" ); + np =of_find_compatible_node (NULL ,NULL ,"atmel,at91rm9200-rtc" );if (!np) - np =of_find_compatible_node (root,NULL , + np =of_find_compatible_node (NULL ,NULL ,"atmel,at91sam9x5-rtc" );if (!np)
@@ -196,7 +196,6 @@ static void __init aic_common_irq_fixup(const struct of_device_id *matches)return ; match =of_match_node (matches, root); -of_node_put (root);if (match) {void (*fixup)(struct device_node *) = match->data;
drivers/net/usb/qmi_wwan.c +1 -0
@@ -876,6 +876,7 @@ static const struct usb_device_id products[] = { {QMI_FIXED_INTF(0x19d2, 0x1428, 2)}, /* Telewell TW-LTE 4G v2 */ {QMI_FIXED_INTF(0x19d2, 0x2002, 4)}, /* ZTE (Vodafone) K3765-Z */ {QMI_FIXED_INTF(0x2001, 0x7e19, 4)}, /* D-Link DWM-221 B1 */ + {QMI_FIXED_INTF(0x2001, 0x7e35, 4)}, /* D-Link DWM-222 */ {QMI_FIXED_INTF(0x0f3d, 0x68a2, 8)}, /* Sierra Wireless MC7700 */ {QMI_FIXED_INTF(0x114f, 0x68a2, 8)}, /* Sierra Wireless MC7750 */ {QMI_FIXED_INTF(0x1199, 0x68a2, 8)}, /* Sierra Wireless MC7710 in QMI mode */
drivers/parisc/dino.c +1 -1
@@ -956,7 +956,7 @@ static int __init dino_probe(struct parisc_device *dev) dino_dev->hba.dev = dev; dino_dev->hba.base_addr =ioremap_nocache (hpa,4096 ); - dino_dev->hba.lmmio_space_offset =0 ;/* CPU addrs == bus addrs */ + dino_dev->hba.lmmio_space_offset =PCI_F_EXTEND ;spin_lock_init (&dino_dev->dinosaur_pen); dino_dev->hba.iommu =ccio_get_iommu (dev);
drivers/usb/core/usb-acpi.c +23 -3
@@ -127,6 +127,22 @@ static enum usb_port_connect_type usb_acpi_get_connect_type(acpi_handle handle,*/ #define USB_ACPI_LOCATION_VALID (1 << 31) +static struct acpi_device *usb_acpi_find_port (struct acpi_device *parent, +int raw) +{ +struct acpi_device *adev; + +if (!parent) +return NULL ; + +list_for_each_entry (adev, &parent->children, node) { +if (acpi_device_adr (adev) == raw) +return adev; + } + +return acpi_find_child_device (parent, raw, false); +} +static struct acpi_device *usb_acpi_find_companion (struct device *dev) {struct usb_device *udev;
@@ -174,8 +190,10 @@ static struct acpi_device *usb_acpi_find_companion(struct device *dev)int raw; raw =usb_hcd_find_raw_port_number (hcd, port1); - adev =acpi_find_child_device (ACPI_COMPANION (&udev->dev), - raw, false); + + adev =usb_acpi_find_port (ACPI_COMPANION (&udev->dev), + raw); +if (!adev)return NULL ; }else {
@@ -186,7 +204,9 @@ static struct acpi_device *usb_acpi_find_companion(struct device *dev)return NULL ;acpi_bus_get_device (parent_handle, &adev); - adev =acpi_find_child_device (adev, port1, false); + + adev =usb_acpi_find_port (adev, port1); +if (!adev)return NULL ; }
drivers/xen/biomerge.c +1 -2
@@ -10,8 +10,7 @@ bool xen_biovec_phys_mergeable(const struct bio_vec *vec1,unsigned long bfn1 =pfn_to_bfn (page_to_pfn (vec1->bv_page));unsigned long bfn2 =pfn_to_bfn (page_to_pfn (vec2->bv_page)); -return __BIOVEC_PHYS_MERGEABLE (vec1, vec2) && - ((bfn1 == bfn2) || ((bfn1+1 ) == bfn2)); +return bfn1 +PFN_DOWN (vec1->bv_offset + vec1->bv_len) == bfn2;#else /* * XXX: Add support for merging bio_vec when using different page
include/linux/memblock.h +4 -2
@@ -64,6 +64,7 @@ extern bool movable_node_enabled;#ifdef CONFIG_ARCH_DISCARD_MEMBLOCK #define __init_memblock __meminit#define __initdata_memblock __meminitdata +void memblock_discard (void );#else #define __init_memblock#define __initdata_memblock
@@ -77,8 +78,6 @@ phys_addr_t memblock_find_in_range_node(phys_addr_t size, phys_addr_t align, int nid, ulong flags);phys_addr_t memblock_find_in_range (phys_addr_t start,phys_addr_t end,phys_addr_t size,phys_addr_t align); -phys_addr_t get_allocated_memblock_reserved_regions_info (phys_addr_t *addr); -phys_addr_t get_allocated_memblock_memory_regions_info (phys_addr_t *addr);void memblock_allow_resize (void );int memblock_add_node (phys_addr_t base,phys_addr_t size,int nid);int memblock_add (phys_addr_t base,phys_addr_t size);
@@ -112,6 +111,9 @@ void __next_mem_range_rev(u64 *idx, int nid, ulong flags,void __next_reserved_mem_region (u64 *idx,phys_addr_t *out_start,phys_addr_t *out_end); +void __memblock_free_early (phys_addr_t base,phys_addr_t size); +void __memblock_free_late (phys_addr_t base,phys_addr_t size); +/** * for_each_mem_range - iterate through memblock areas from type_a and not * included in type_b. Or just type_a if type_b is NULL.
include/linux/pid.h +3 -1
@@ -8,7 +8,9 @@ enum pid_typePIDTYPE_PID ,PIDTYPE_PGID ,PIDTYPE_SID , - PIDTYPE_MAX +PIDTYPE_MAX , +/* only valid to __task_pid_nr_ns() */ + __PIDTYPE_TGID };/*
include/linux/sched.h +27 -23
64 lines not on this page · raw message
kernel/audit_watch.c +7 -5
@@ -457,13 +457,15 @@ void audit_remove_watch_rule(struct audit_krule *krule)list_del (&krule->rlist);if (list_empty (&watch->rules)) { +/* +* audit_remove_watch() drops our reference to 'parent' which +* can get freed. Grab our own reference to be safe. +*/ +audit_get_parent (parent);audit_remove_watch (watch); - -if (list_empty (&parent->watches)) { -audit_get_parent (parent); +if (list_empty (&parent->watches))fsnotify_destroy_mark (&parent->mark, audit_watch_group); -audit_put_parent (parent); - } +audit_put_parent (parent); } }
kernel/irq/chip.c +8 -2
@@ -895,13 +895,15 @@ EXPORT_SYMBOL_GPL(irq_set_chip_and_handler_name);void irq_modify_status (unsigned int irq,unsigned long clr,unsigned long set) { -unsigned long flags; +unsigned long flags, trigger, tmp;struct irq_desc *desc =irq_get_desc_lock (irq, &flags,0 );if (!desc)return ;irq_settings_clr_and_set (desc, clr, set); + trigger =irqd_get_trigger_type (&desc->irq_data); +irqd_clear (&desc->irq_data,IRQD_NO_BALANCING |IRQD_PER_CPU |IRQD_TRIGGER_MASK |IRQD_LEVEL |IRQD_MOVE_PCNTXT );if (irq_settings_has_no_balance_set (desc))
@@ -913,7 +915,11 @@ void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set)if (irq_settings_is_level (desc))irqd_set (&desc->irq_data,IRQD_LEVEL ); -irqd_set (&desc->irq_data,irq_settings_get_trigger_mask (desc)); + tmp =irq_settings_get_trigger_mask (desc); +if (tmp !=IRQ_TYPE_NONE ) + trigger = tmp; + +irqd_set (&desc->irq_data, trigger);irq_put_desc_unlock (desc, flags); }
kernel/irq/ipi.c +2 -2
@@ -165,7 +165,7 @@ irq_hw_number_t ipi_get_hwirq(unsigned int irq, unsigned int cpu)struct irq_data *data =irq_get_irq_data (irq);struct cpumask *ipimask = data ?irq_data_get_affinity_mask (data) :NULL ; -if (!data || !ipimask || cpu > nr_cpu_ids) +if (!data || !ipimask || cpu >= nr_cpu_ids)return INVALID_HWIRQ ;if (!cpumask_test_cpu (cpu, ipimask))
@@ -195,7 +195,7 @@ static int ipi_send_verify(struct irq_chip *chip, struct irq_data *data,if (!chip->ipi_send_single && !chip->ipi_send_mask)return -EINVAL ; -if (cpu > nr_cpu_ids) +if (cpu >= nr_cpu_ids)return -EINVAL ;if (dest) {
kernel/pid.c +4 -7
@@ -526,8 +526,11 @@ pid_t __task_pid_nr_ns(struct task_struct *task, enum pid_type type,if (!ns) ns =task_active_pid_ns (current);if (likely (pid_alive (task))) { -if (type !=PIDTYPE_PID ) +if (type !=PIDTYPE_PID ) { +if (type == __PIDTYPE_TGID) + type =PIDTYPE_PID ; task = task->group_leader; + } nr =pid_nr_ns (rcu_dereference (task->pids[type].pid), ns); }rcu_read_unlock ();
@@ -536,12 +539,6 @@ pid_t __task_pid_nr_ns(struct task_struct *task, enum pid_type type, }EXPORT_SYMBOL (__task_pid_nr_ns); -pid_t task_tgid_nr_ns (struct task_struct *tsk,struct pid_namespace *ns) -{ -return pid_nr_ns (task_tgid (tsk), ns); -} -EXPORT_SYMBOL (task_tgid_nr_ns); -struct pid_namespace *task_active_pid_ns (struct task_struct *tsk) {return ns_of_pid (task_pid (tsk));
mm/memblock.c +17 -21
@@ -297,31 +297,27 @@ static void __init_memblock memblock_remove_region(struct memblock_type *type, u }#ifdef CONFIG_ARCH_DISCARD_MEMBLOCK - -phys_addr_t __init_memblock get_allocated_memblock_reserved_regions_info( -phys_addr_t *addr) -{ -if (memblock.reserved.regions == memblock_reserved_init_regions) -return 0 ; - - *addr =__pa (memblock.reserved.regions); - -return PAGE_ALIGN (sizeof (struct memblock_region ) * - memblock.reserved.max); -} - -phys_addr_t __init_memblock get_allocated_memblock_memory_regions_info( -phys_addr_t *addr) +/** +* Discard memory and reserved arrays if they were allocated +*/ +void __init memblock_discard (void ) { -if (memblock.memory.regions == memblock_memory_init_regions) -return 0 ; +phys_addr_t addr, size; - *addr =__pa (memblock.memory.regions); +if (memblock.reserved.regions != memblock_reserved_init_regions) { + addr =__pa (memblock.reserved.regions); + size =PAGE_ALIGN (sizeof (struct memblock_region ) * + memblock.reserved.max); +__memblock_free_late (addr, size); + } -return PAGE_ALIGN (sizeof (struct memblock_region ) * - memblock.memory.max); +if (memblock.memory.regions == memblock_memory_init_regions) { + addr =__pa (memblock.memory.regions); + size =PAGE_ALIGN (sizeof (struct memblock_region ) * + memblock.memory.max); +__memblock_free_late (addr, size); + } } -#endif /**
mm/memory.c +11 -1
@@ -3635,8 +3635,18 @@ int handle_mm_fault(struct vm_area_struct *vma, unsigned long address,* further. */ if (unlikely ((current->flags &PF_KTHREAD ) && !(ret &VM_FAULT_ERROR ) - &&test_bit (MMF_UNSTABLE , &vma->vm_mm->flags))) + &&test_bit (MMF_UNSTABLE , &vma->vm_mm->flags))) { + +/* +* We are going to enforce SIGBUS but the PF path might have +* dropped the mmap_sem already so take it again so that +* we do not break expectations of all arch specific PF paths +* and g-u-p +*/ +if (ret &VM_FAULT_RETRY ) +down_read (&vma->vm_mm->mmap_sem); ret =VM_FAULT_SIGBUS ; + }return ret; }
mm/mempolicy.c +0 -5
@@ -926,11 +926,6 @@ static long do_get_mempolicy(int *policy, nodemask_t *nmask, *policy |= (pol->flags &MPOL_MODE_FLAGS ); } -if (vma) { -up_read (¤t->mm->mmap_sem); - vma =NULL ; - } - err =0 ;if (nmask) {if (mpol_store_user_nodemask (pol)) {
mm/migrate.c +3 -8
@@ -40,6 +40,7 @@#include <linux/mmu_notifier.h> #include <linux/page_idle.h> #include <linux/page_owner.h> +#include <linux/ptrace.h> #include <asm/tlbflush.h>
@@ -1663,7 +1664,6 @@ SYSCALL_DEFINE6(move_pages, pid_t, pid, unsigned long, nr_pages, const int __user *, nodes, int __user *, status, int, flags) { - const struct cred *cred = current_cred(), *tcred; struct task_struct *task;struct mm_struct *mm;int err;
@@ -1687,14 +1687,9 @@ SYSCALL_DEFINE6(move_pages, pid_t, pid, unsigned long, nr_pages,/* * Check if this process has the right to modify the specified -* process. The right exists if the process has administrative -* capabilities, superuser privileges or the same -* userid as the target process. +* process. Use the regular "ptrace_may_access()" checks. */ - tcred =__task_cred (task); -if (!uid_eq (cred->euid, tcred->suid) && !uid_eq (cred->euid, tcred->uid) && - !uid_eq (cred->uid, tcred->suid) && !uid_eq (cred->uid, tcred->uid) && - !capable (CAP_SYS_NICE )) { +if (!ptrace_may_access (task,PTRACE_MODE_READ_REALCREDS )) {rcu_read_unlock (); err = -EPERM ; goto out;
mm/nobootmem.c +0 -16
@@ -146,22 +146,6 @@ static unsigned long __init free_low_memory_core_early(void) NULL) count +=__free_memory_core (start, end); -#ifdef CONFIG_ARCH_DISCARD_MEMBLOCK - { -phys_addr_t size; - -/* Free memblock.reserved array if it was allocated */ - size =get_allocated_memblock_reserved_regions_info (&start); -if (size) - count +=__free_memory_core (start, start + size); - -/* Free memblock.memory array if it was allocated */ - size =get_allocated_memblock_memory_regions_info (&start); -if (size) - count +=__free_memory_core (start, start + size); - } -#endif -return count; }
mm/page_alloc.c +4 -0
@@ -1587,6 +1587,10 @@ void __init page_alloc_init_late(void)/* Reinit limits that are based on free pages after the kernel is up */ files_maxfiles_init ();#endif +#ifdef CONFIG_ARCH_DISCARD_MEMBLOCK +/* Discard memblock private memory */ +memblock_discard (); +#endif for_each_populated_zone (zone)set_zone_contiguous (zone);
net/netfilter/nf_conntrack_extend.c +10 -3
@@ -53,7 +53,11 @@ nf_ct_ext_create(struct nf_ct_ext **ext, enum nf_ct_ext_id id,rcu_read_lock (); t =rcu_dereference (nf_ct_ext_types[id]); -BUG_ON (t ==NULL ); +if (!t) { +rcu_read_unlock (); +return NULL ; + } + off =ALIGN (sizeof (struct nf_ct_ext ), t->align); len = off + t->len + var_alloc_len; alloc_size = t->alloc_size + var_alloc_len;
@@ -88,7 +92,10 @@ void *__nf_ct_ext_add_length(struct nf_conn *ct, enum nf_ct_ext_id id,rcu_read_lock (); t =rcu_dereference (nf_ct_ext_types[id]); -BUG_ON (t ==NULL ); +if (!t) { +rcu_read_unlock (); +return NULL ; + } newoff =ALIGN (old->len, t->align); newlen = newoff + t->len + var_alloc_len;
@@ -175,6 +182,6 @@ void nf_ct_extend_unregister(struct nf_ct_ext_type *type)RCU_INIT_POINTER (nf_ct_ext_types[type->id],NULL );update_alloc_size (type);mutex_unlock (&nf_ct_ext_type_mutex); -rcu_barrier ();/* Wait for completion of call_rcu()'s */ +synchronize_rcu (); }EXPORT_SYMBOL_GPL (nf_ct_extend_unregister);
sound/core/seq/seq_clientmgr.c +4 -9
@@ -1502,16 +1502,11 @@ static int snd_seq_ioctl_unsubscribe_port(struct snd_seq_client *client,static int snd_seq_ioctl_create_queue (struct snd_seq_client *client,void *arg) {struct snd_seq_queue_info *info = arg; -int result;struct snd_seq_queue *q; - result =snd_seq_queue_alloc (client->number, info->locked, info->flags); -if (result <0 ) -return result; - - q =queueptr (result); -if (q ==NULL ) -return -EINVAL ; + q =snd_seq_queue_alloc (client->number, info->locked, info->flags); +if (IS_ERR (q)) +return PTR_ERR (q); info->queue = q->queue; info->locked = q->locked;
@@ -1521,7 +1516,7 @@ static int snd_seq_ioctl_create_queue(struct snd_seq_client *client, void *arg)if (!info->name[0 ])snprintf (info->name,sizeof (info->name),"Queue-%d" , q->queue);strlcpy (q->name, info->name,sizeof (q->name)); -queuefree (q); +snd_use_lock_free (&q->use_lock);return 0 ; }
sound/core/seq/seq_queue.c +9 -5
@@ -184,22 +184,26 @@ void __exit snd_seq_queues_delete(void)static void queue_use (struct snd_seq_queue *queue,int client,int use);/* allocate a new queue - -* return queue index value or negative value for error +* return pointer to new queue or ERR_PTR(-errno) for error +* The new queue's use_lock is set to 1. It is the caller's responsibility to +* call snd_use_lock_free(&q->use_lock). */ -int snd_seq_queue_alloc (int client,int locked,unsigned int info_flags) +struct snd_seq_queue *snd_seq_queue_alloc (int client,int locked,unsigned int info_flags) {struct snd_seq_queue *q; q =queue_new (client, locked);if (q ==NULL ) -return -ENOMEM ; +return ERR_PTR (-ENOMEM ); q->info_flags = info_flags;queue_use (q, client,1 ); +snd_use_lock_use (&q->use_lock);if (queue_list_add (q) <0 ) { +snd_use_lock_free (&q->use_lock);queue_delete (q); -return -ENOMEM ; +return ERR_PTR (-ENOMEM ); } -return q->queue; +return q; }/* delete a queue - queue must be owned by the client */
sound/core/seq/seq_queue.h +1 -1
@@ -71,7 +71,7 @@ void snd_seq_queues_delete(void);/* create new queue (constructor) */ -int snd_seq_queue_alloc (int client,int locked,unsigned int flags); +struct snd_seq_queue *snd_seq_queue_alloc (int client,int locked,unsigned int flags);/* delete queue (destructor) */ int snd_seq_queue_delete (int client,int queueid);
sound/usb/mixer.c +2 -0
@@ -542,6 +542,8 @@ int snd_usb_mixer_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,if (size <sizeof (scale))return -ENOMEM ; +if (cval->min_mute) + scale[0 ] =SNDRV_CTL_TLVT_DB_MINMAX_MUTE ; scale[2 ] = cval->dBmin; scale[3 ] = cval->dBmax;if (copy_to_user (_tlv, scale,sizeof (scale)))
sound/usb/mixer.h +1 -0
@@ -64,6 +64,7 @@ struct usb_mixer_elem_info {int cached;int cache_val[MAX_CHANNELS ];u8 initialized; +u8 min_mute;void *private_data; };
sound/usb/mixer_quirks.c +6 -0
@@ -1873,6 +1873,12 @@ void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer,if (unitid ==7 && cval->control ==UAC_FU_VOLUME )snd_dragonfly_quirk_db_scale (mixer, cval, kctl);break ; +/* lowest playback value is muted on C-Media devices */ +case USB_ID (0x0d8c ,0x000c ): +case USB_ID (0x0d8c ,0x0014 ): +if (strstr (kctl->id.name,"Playback" )) + cval->min_mute =1 ; +break ; } }
sound/usb/quirks.c +1 -0
@@ -1142,6 +1142,7 @@ bool snd_usb_get_sample_rate_quirk(struct snd_usb_audio *chip)case USB_ID (0x0556 ,0x0014 ):/* Phoenix Audio TMX320VC */ case USB_ID (0x05A3 ,0x9420 ):/* ELP HD USB Camera */ case USB_ID (0x074D ,0x3553 ):/* Outlaw RR2150 (Micronas UAC3553B) */ +case USB_ID (0x1395 ,0x740a ):/* Sennheiser DECT */ case USB_ID (0x1901 ,0x0191 ):/* GE B850V3 CP2114 audio interface */ case USB_ID (0x1de7 ,0x0013 ):/* Phoenix Audio MT202exe */ case USB_ID (0x1de7 ,0x0014 ):/* Phoenix Audio TMX320 */