Linux 2.6.30.6
Subsystems (42)
I'm announcing the release of the 2.6.30.6 kernel. All users of the 2.6.30 kernel series are very strongly encouraged to upgrade.
I'll also be replying to this message with a copy of the patch between 2.6.30.5 and 2.6.30.6
The updated 2.6.30.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-2.6.30.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.30.y.git;a=summarythanks,
greg k-h
------------
Makefile | 2 arch/ia64/kernel/pci-dma.c | 5 - arch/powerpc/platforms/ps3/time.c | 4 arch/x86/include/asm/kvm_host.h | 3 arch/x86/include/asm/kvm_x86_emulate.h | 6 + arch/x86/kernel/apic/ipi.c | 3 arch/x86/kernel/cpu/amd.c | 2 arch/x86/kvm/mmu.c | 85 ++++++++++++----- arch/x86/kvm/svm.c | 31 +++++- arch/x86/kvm/vmx.c | 42 ++++++-- arch/x86/kvm/x86.c | 70 +++++++++++++- arch/x86/kvm/x86_emulate.c | 20 ++++ arch/x86/mm/tlb.c | 21 ++-- drivers/acpi/processor_thermal.c | 6 - drivers/acpi/processor_throttling.c | 26 ++--- drivers/ata/libata-core.c | 3 drivers/media/video/gspca/ov534.c | 4 drivers/net/ehea/ehea.h | 2 drivers/net/ehea/ehea_main.c | 3 drivers/net/wireless/ar9170/main.c | 5 - drivers/net/wireless/iwlwifi/iwl-rfkill.c | 26 +++-- drivers/net/wireless/iwlwifi/iwl-sta.c | 12 ++ drivers/net/wireless/rt2x00/rt2x00.h | 6 - drivers/platform/x86/wmi.c | 8 - drivers/scsi/mpt2sas/mpt2sas_base.c | 98 ++++++++++++++------ drivers/scsi/mpt2sas/mpt2sas_base.h | 2 drivers/scsi/mpt2sas/mpt2sas_config.c | 91 +++++-------------- drivers/scsi/mpt2sas/mpt2sas_scsih.c | 124 ++++++++++++++++++-------- drivers/usb/core/hcd.h | 4 drivers/usb/core/hub.c | 40 +++++--- drivers/usb/core/hub.h | 6 - drivers/usb/host/ehci-au1xxx.c | 2 drivers/usb/host/ehci-fsl.c | 2 drivers/usb/host/ehci-hcd.c | 5 - drivers/usb/host/ehci-ixp4xx.c | 2 drivers/usb/host/ehci-orion.c | 2 drivers/usb/host/ehci-pci.c | 2 drivers/usb/host/ehci-ppc-of.c | 2 drivers/usb/host/ehci-ps3.c | 2 drivers/usb/host/ehci-q.c | 97 +++++++++++++++----- drivers/usb/host/ehci.h | 2 drivers/video/xen-fbfront.c | 8 - fs/buffer.c | 7 + fs/exec.c | 4 fs/hugetlbfs/inode.c | 20 ++-- fs/inode.c | 40 +++++--- fs/ocfs2/aops.c | 66 +++++++++---- fs/select.c | 1 fs/xfs/xfs_iget.c | 142 +++++++++++++++--------------- fs/xfs/xfs_inode.h | 17 --- fs/xfs/xfs_log.c | 2 include/acpi/processor.h | 5 - include/linux/bitmap.h | 18 +-- include/linux/cpumask.h | 20 ++-- include/linux/fs.h | 5 - include/linux/hugetlb.h | 6 - include/linux/kvm_host.h | 1 init/main.c | 7 - ipc/shm.c | 8 + kernel/fork.c | 20 +--- kernel/kthread.c | 2 kernel/signal.c | 15 +-- lib/bitmap.c | 12 +- mm/page_alloc.c | 4 net/appletalk/ddp.c | 1 net/can/raw.c | 1 net/econet/af_econet.c | 1 net/ipv4/ip_output.c | 2 net/ipv6/af_inet6.c | 4 net/irda/af_irda.c | 1 net/llc/af_llc.c | 1 net/mac80211/agg-tx.c | 8 + net/netrom/af_netrom.c | 1 net/rose/af_rose.c | 1 net/sunrpc/clnt.c | 1 security/integrity/ima/ima_crypto.c | 6 - sound/core/pcm_lib.c | 39 +------- sound/pci/hda/patch_realtek.c | 34 ++++--- virt/kvm/irq_comm.c | 4 virt/kvm/kvm_main.c | 4 80 files changed, 896 insertions(+), 521 deletions(-)
Alan Stern (3):
USB: fix the clear_tt_buffer interface
USB: EHCI: use the new clear_tt_buffer interface
USB: EHCI: fix two new bugs related to Clear-TT-Buffer
Amit Shah (2):
KVM: x86: Ignore reads to EVNTSEL MSRs
KVM: Ignore reads to K7 EVNTSEL MSRs
Avi Kivity (2):
KVM: MMU: Use different shadows when EFER.NXE changes
KVM: Fix cpuid feature misreporting
Bo Liu (1):
mm: build_zonelists(): move clear node_load[] to __build_all_zonelists()
Bruno Prémont (1):
ipv6: Fix commit 63d9950b08184e6531adceb65f64b429909cc101 (ipv6: Make v4-mapped bindings consistent with IPv4)
Christoph Hellwig (4):
vfs: fix inode_init_always calling convention
vfs: add __destroy_inode
xfs: fix freeing of inodes not yet added to the inode cache
xfs: fix spin_is_locked assert on uni-processor builds
Clemens Ladisch (1):
sound: pcm_lib: fix unsorted list constraint handling
Costantino Leandro (1):
wmi: fix kernel panic when stack protection enabled.
Dan Carpenter (1):
ar9170: fix read & write outside array bounds
Eric Dumazet (6):
can: Fix raw_getname() leak
irda: Fix irda_getname() leak
appletalk: fix atalk_getname() leak
netrom: Fix nr_getname() leak
econet: Fix econet_getname() leak
rose: Fix rose_getname() leak
Fenghua Yu (1):
Bug Fix arch/ia64/kernel/pci-dma.c: fix recursive dma_supported() call in iommu_dma_supported()
Frans Pop (1):
ACPI processor: force throttling state when BIOS returns incorrect value
Geert Uytterhoeven (1):
powerpc/ps3: Add missing check for PS3 to rtc-ps3 platform device registration
Glauber Costa (2):
KVM: Introduce {set/get}_interrupt_shadow()
KVM: Deal with interrupt shadow state for emulated instructions
Gleb Natapov (1):
KVM: MMU: do not free active mmu pages in free_mmu_pages()
Greg Kroah-Hartman (1):
Linux 2.6.30.6
Guillaume Knispel (1):
poll/select: initialize triggered field of struct poll_wqueues
Hannes Hering (1):
ehea: Fix napi list corruption on ifconfig down
Hugh Dickins (1):
mm: fix hugetlb bug due to user_shm_unlock call
Ingo Molnar (1):
tracing: Fix too large stack usage in do_one_initcall()
Jan Kiszka (1):
KVM: Fix KVM_GET_MSR_INDEX_LIST
Jean-Francois Moine (1):
gspca - ov534: Fix ov772x
Jeremy Fitzhardinge (1):
x86, amd: Don't probe for extended APIC ID if APICs are disabled
Jiri Slaby (1):
NET: llc, zero sockaddr_llc struct
Julien TINNES (1):
ipv4: make ip_append_data() handle NULL routing table
Kashyap, Desai (8):
SCSI: mpt2sas: Introduced check for enclosure_handle to avoid crash
SCSI: mpt2sas: Expander fix oops saying "Already part of another port"
SCSI: mpt2sas: Raid 10 Value is showing as Raid 1E in /va/log/messages
SCSI: mpt2sas: Excessive log info causes sas iounit page time out
SCSI: mpt2sas: fix infinite loop inside config request
SCSI: mpt2sas: fix crash due to Watchdog is active while OS in standby mode
SCSI: mpt2sas: fix oops because drv data points to NULL on resume from hibernate
mpt2sas: fix config request and diag reset deadlock
Linus Torvalds (5):
Make bitmask 'and' operators return a result code
x86: don't send an IPI to the empty set of CPU's
x86: don't call '->send_IPI_mask()' with an empty mask Re-introduce page mapping check in mark_buffer_dirty()
do_sigaltstack: avoid copying 'stack_t' as a structure to user space
Luis R. Rodriguez (1):
mac80211: fix panic when splicing unprepared TIDs
Marcelo Tosatti (7):
KVM: take mmu_lock when updating a deleted slot
KVM: x86: check for cr3 validity in mmu_alloc_roots
KVM: MMU: protect kvm_mmu_change_mmu_pages with mmu_lock
KVM: x86: verify MTRR/PAT validity
KVM: SVM: force new asid on vcpu migration
KVM: MMU: handle n_free_mmu_pages > n_alloc_mmu_pages in kvm_mmu_change_mmu_pages
KVM: MMU: limit rmap chain length
Michael S. Tsirkin (1):
KVM: fix ack not being delivered when msi present
Michal Schmidt (1):
xenfb: connect to backend before registering fb
Mimi Zohar (2):
ima: hashing large files bug fix
kernel_read: redefine offset type
Oleg Nesterov (2):
clone(): fix race between copy_process() and de_thread()
kthreads: fix kthread_create() vs kthread_stop() race
Pavel Roskin (1):
rt2x00: fix memory corruption in rf cache, add a sanity check
Reinette Chatre (1):
iwlagn: do not send key clear commands when rfkill enabled
Stanislaw Gruszka (1):
iwl3945: fix rfkill switch
Sunil Mushran (2):
ocfs2: Initialize the cluster we're writing to in a non-sparse extend
ocfs2: ocfs2_write_begin_nolock() should handle len=0
Takashi Iwai (1):
ALSA: hda - Fix MacBookPro 3,1/4,1 quirk with ALC889A
Tejun Heo (1):
libata: OCZ Vertex can't do HPA
Trond Myklebust (1):
SUNRPC: Fix rpc_task_force_reencode
Makefile +1 -1
@@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 30 -EXTRAVERSION = .5 +EXTRAVERSION = .6 NAME = Man-Eating Seals of Antiquity # *DOCUMENTATION*
arch/ia64/kernel/pci-dma.c +0 -5
@@ -67,11 +67,6 @@ iommu_dma_init(void)int iommu_dma_supported (struct device *dev,u64 mask) { -struct dma_map_ops *ops =platform_dma_get_ops (dev); - -if (ops->dma_supported) -return ops->dma_supported (dev, mask); -/* Copied from i386. Doesn't make much sense, because it will only work for pci_alloc_coherent. The caller just has to use GFP_DMA in this case. */
arch/powerpc/platforms/ps3/time.c +4 -0
@@ -21,6 +21,7 @@#include <linux/kernel.h> #include <linux/platform_device.h> +#include <asm/firmware.h> #include <asm/rtc.h> #include <asm/lv1call.h> #include <asm/ps3.h>
@@ -84,6 +85,9 @@ static int __init ps3_rtc_init(void) {struct platform_device *pdev; +if (!firmware_has_feature (FW_FEATURE_PS3_LV1 )) +return -ENODEV ; + pdev =platform_device_register_simple ("rtc-ps3" ,-1 ,NULL ,0 );if (IS_ERR (pdev))return PTR_ERR (pdev);
arch/x86/include/asm/kvm_host.h +3 -0
@@ -185,6 +185,7 @@ union kvm_mmu_page_role { unsigned access:3; unsigned invalid:1; unsigned cr4_pge:1; + unsigned nxe:1; }; };
@@ -513,6 +514,8 @@ struct kvm_x86_ops {void (*run)(struct kvm_vcpu *vcpu,struct kvm_run *run);int (*handle_exit)(struct kvm_run *run,struct kvm_vcpu *vcpu);void (*skip_emulated_instruction)(struct kvm_vcpu *vcpu); +void (*set_interrupt_shadow)(struct kvm_vcpu *vcpu,int mask); +u32 (*get_interrupt_shadow)(struct kvm_vcpu *vcpu,int mask);void (*patch_hypercall)(struct kvm_vcpu *vcpu,unsigned char *hypercall_addr);int (*get_irq)(struct kvm_vcpu *vcpu);
arch/x86/include/asm/kvm_x86_emulate.h +6 -0
@@ -143,6 +143,9 @@ struct decode_cache {struct fetch_cache fetch; }; +#define X86_SHADOW_INT_MOV_SS 1 +#define X86_SHADOW_INT_STI 2 +struct x86_emulate_ctxt {/* Register state before/after emulation. */ struct kvm_vcpu *vcpu;
@@ -152,6 +155,9 @@ struct x86_emulate_ctxt {int mode;u32 cs_base; +/* interruptibility state, as a result of execution of STI or MOV SS */ +int interruptibility; +/* decode cache */ struct decode_cache decode; };
arch/x86/kernel/apic/ipi.c +3 -0
@@ -106,6 +106,9 @@ void default_send_IPI_mask_logical(const struct cpumask *cpumask, int vector)unsigned long mask =cpumask_bits (cpumask)[0 ];unsigned long flags; +if (WARN_ONCE (!mask,"empty IPI mask" )) +return ; +local_irq_save (flags);WARN_ON (mask & ~cpumask_bits (cpu_online_mask)[0 ]);__default_send_IPI_dest_field (mask, vector, apic->dest_logical);
arch/x86/kernel/cpu/amd.c +1 -1
@@ -356,7 +356,7 @@ static void __cpuinit early_init_amd(struct cpuinfo_x86 *c)#endif #if defined(CONFIG_X86_LOCAL_APIC ) && defined(CONFIG_PCI )/* check CPU config space for extended APIC ID */ -if (c->x86 >=0xf ) { +if (cpu_has_apic && c->x86 >=0xf ) {unsigned int val; val =read_pci_config (0 ,24 ,0 ,0x68 );if ((val & ((1 <<17 ) | (1 <<18 ))) == ((1 <<17 ) | (1 <<18 )))
arch/x86/kvm/mmu.c +59 -26
210 lines not on this page · raw message
arch/x86/kvm/svm.c +27 -4
@@ -227,6 +227,27 @@ static int is_external_interrupt(u32 info)return info == (SVM_EVTINJ_VALID |SVM_EVTINJ_TYPE_INTR ); } +static u32 svm_get_interrupt_shadow (struct kvm_vcpu *vcpu,int mask) +{ +struct vcpu_svm *svm =to_svm (vcpu); +u32 ret =0 ; + +if (svm->vmcb->control.int_state &SVM_INTERRUPT_SHADOW_MASK ) + ret |=X86_SHADOW_INT_STI |X86_SHADOW_INT_MOV_SS ; +return ret & mask; +} + +static void svm_set_interrupt_shadow (struct kvm_vcpu *vcpu,int mask) +{ +struct vcpu_svm *svm =to_svm (vcpu); + +if (mask ==0 ) + svm->vmcb->control.int_state &= ~SVM_INTERRUPT_SHADOW_MASK ; +else + svm->vmcb->control.int_state |=SVM_INTERRUPT_SHADOW_MASK ; + +} +static void skip_emulated_instruction (struct kvm_vcpu *vcpu) {struct vcpu_svm *svm =to_svm (vcpu);
@@ -240,7 +261,7 @@ static void skip_emulated_instruction(struct kvm_vcpu *vcpu) __func__, kvm_rip_read(vcpu), svm->next_rip);kvm_rip_write (vcpu, svm->next_rip); - svm->vmcb->control.int_state &= ~SVM_INTERRUPT_SHADOW_MASK ; +svm_set_interrupt_shadow (vcpu,0 ); vcpu->arch.interrupt_window_open = (svm->vcpu.arch.hflags &HF_GIF_MASK ); }
@@ -715,6 +736,7 @@ static void svm_vcpu_load(struct kvm_vcpu *vcpu, int cpu) svm->vmcb->control.tsc_offset += delta; vcpu->cpu = cpu;kvm_migrate_timers (vcpu); + svm->asid_generation =0 ; }for (i =0 ; i <NR_HOST_SAVE_USER_MSRS ; i++)
@@ -1025,7 +1047,6 @@ static void new_asid(struct vcpu_svm *svm, struct svm_cpu_data *svm_data) svm->vmcb->control.tlb_ctl =TLB_CONTROL_FLUSH_ALL_ASID ; } - svm->vcpu.cpu = svm_data->cpu; svm->asid_generation = svm_data->asid_generation; svm->vmcb->control.asid = svm_data->next_asid++; }
@@ -2237,8 +2258,8 @@ static void pre_svm_run(struct vcpu_svm *svm)struct svm_cpu_data *svm_data =per_cpu (svm_data, cpu); svm->vmcb->control.tlb_ctl =TLB_CONTROL_DO_NOTHING ; -if (svm->vcpu.cpu != cpu || - svm->asid_generation != svm_data->asid_generation) +/* FIXME: handle wraparound of asid_generation */ +if (svm->asid_generation != svm_data->asid_generation)new_asid (svm, svm_data); }
@@ -2667,6 +2688,8 @@ static struct kvm_x86_ops svm_x86_ops = { .run = svm_vcpu_run, .handle_exit = handle_exit, .skip_emulated_instruction = skip_emulated_instruction, + .set_interrupt_shadow = svm_set_interrupt_shadow, + .get_interrupt_shadow = svm_get_interrupt_shadow, .patch_hypercall = svm_patch_hypercall, .get_irq = svm_get_irq, .set_irq = svm_set_irq,
arch/x86/kvm/vmx.c +33 -9
62 lines not on this page · raw message
arch/x86/kvm/x86.c +63 -7
157 lines not on this page · raw message
arch/x86/kvm/x86_emulate.c +20 -0
@@ -1349,6 +1349,20 @@ static inline int writeback(struct x86_emulate_ctxt *ctxt,return 0 ; } +void toggle_interruptibility (struct x86_emulate_ctxt *ctxt,u32 mask) +{ +u32 int_shadow = kvm_x86_ops->get_interrupt_shadow (ctxt->vcpu, mask); +/* +* an sti; sti; sequence only disable interrupts for the first +* instruction. So, if the last instruction, be it emulated or +* not, left the system with the INT_STI flag enabled, it +* means that the last instruction is an sti. We should not +* leave the flag on in this case. The same goes for mov ss +*/ +if (!(int_shadow & mask)) + ctxt->interruptibility = mask; +} +int x86_emulate_insn (struct x86_emulate_ctxt *ctxt,struct x86_emulate_ops *ops) {
@@ -1360,6 +1374,8 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)int io_dir_in;int rc =0 ; + ctxt->interruptibility =0 ; +/* Shadow copy of register state. Committed on successful emulation. * NOTE: we can copy them from vcpu as x86_decode_insn() doesn't * modify them.
@@ -1609,6 +1625,9 @@ special_insn:int err; sel = c->src.val; +if (c->modrm_reg ==VCPU_SREG_SS ) +toggle_interruptibility (ctxt,X86_SHADOW_INT_MOV_SS ); +if (c->modrm_reg <=5 ) { type_bits = (c->modrm_reg ==1 ) ?9 :1 ; err = kvm_load_segment_descriptor(ctxt->vcpu, sel,
@@ -1865,6 +1884,7 @@ special_insn: c->dst.type =OP_NONE ;/* Disable writeback. */ break ;case 0xfb :/* sti */ +toggle_interruptibility (ctxt,X86_SHADOW_INT_STI ); ctxt->eflags |=X86_EFLAGS_IF ; c->dst.type =OP_NONE ;/* Disable writeback. */ break ;
arch/x86/mm/tlb.c +10 -11
@@ -183,18 +183,17 @@ static void flush_tlb_others_ipi(const struct cpumask *cpumask, f->flush_mm = mm; f->flush_va = va; -cpumask_andnot (to_cpumask (f->flush_cpumask), - cpumask,cpumask_of (smp_processor_id ())); - -/* -* We have to send the IPI only to -* CPUs affected. -*/ - apic->send_IPI_mask (to_cpumask (f->flush_cpumask), -INVALIDATE_TLB_VECTOR_START + sender); +if (cpumask_andnot (to_cpumask (f->flush_cpumask), cpumask,cpumask_of (smp_processor_id ()))) { +/* +* We have to send the IPI only to +* CPUs affected. +*/ + apic->send_IPI_mask (to_cpumask (f->flush_cpumask), +INVALIDATE_TLB_VECTOR_START + sender); -while (!cpumask_empty (to_cpumask (f->flush_cpumask))) -cpu_relax (); +while (!cpumask_empty (to_cpumask (f->flush_cpumask))) +cpu_relax (); + } f->flush_mm =NULL ; f->flush_va =0 ;
drivers/acpi/processor_thermal.c +3 -3
@@ -66,7 +66,7 @@ static int acpi_processor_apply_limit(struct acpi_processor *pr)if (pr->limit.thermal.tx > tx) tx = pr->limit.thermal.tx; - result =acpi_processor_set_throttling (pr, tx); + result =acpi_processor_set_throttling (pr, tx, false);if (result) goto end; }
@@ -421,12 +421,12 @@ processor_set_cur_state(struct thermal_cooling_device *cdev,if (state <= max_pstate) {if (pr->flags.throttling && pr->throttling.state) - result =acpi_processor_set_throttling (pr,0 ); + result =acpi_processor_set_throttling (pr,0 , false);cpufreq_set_cur_state (pr->id, state); }else {cpufreq_set_cur_state (pr->id, max_pstate); result =acpi_processor_set_throttling (pr, - state - max_pstate); + state - max_pstate, false); }return result; }
drivers/acpi/processor_throttling.c +14 -12
@@ -62,7 +62,8 @@ struct throttling_tstate {#define THROTTLING_POSTCHANGE (2)static int acpi_processor_get_throttling (struct acpi_processor *pr); -int acpi_processor_set_throttling (struct acpi_processor *pr,int state); +int acpi_processor_set_throttling (struct acpi_processor *pr, +int state,bool force);static int acpi_processor_update_tsd_coord (void ) {
@@ -361,7 +362,7 @@ int acpi_processor_tstate_has_changed(struct acpi_processor *pr)*/ target_state = throttling_limit; } -return acpi_processor_set_throttling (pr, target_state); +return acpi_processor_set_throttling (pr, target_state, false); }/*
@@ -842,7 +843,7 @@ static int acpi_processor_get_throttling_ptc(struct acpi_processor *pr)ACPI_WARNING ((AE_INFO ,"Invalid throttling state, reset" )); state =0 ; - ret =acpi_processor_set_throttling (pr, state); + ret =acpi_processor_set_throttling (pr, state, true);if (ret)return ret; }
@@ -915,7 +916,7 @@ static int acpi_processor_get_fadt_info(struct acpi_processor *pr) }static int acpi_processor_set_throttling_fadt (struct acpi_processor *pr, -int state) +int state,bool force) {u32 value =0 ;u32 duty_mask =0 ;
@@ -930,7 +931,7 @@ static int acpi_processor_set_throttling_fadt(struct acpi_processor *pr,if (!pr->flags.throttling)return -ENODEV ; -if (state == pr->throttling.state) +if (!force && (state == pr->throttling.state))return 0 ;if (state < pr->throttling_platform_limit)
@@ -988,7 +989,7 @@ static int acpi_processor_set_throttling_fadt(struct acpi_processor *pr, }static int acpi_processor_set_throttling_ptc (struct acpi_processor *pr, -int state) +int state,bool force) {int ret;acpi_integer value;
@@ -1002,7 +1003,7 @@ static int acpi_processor_set_throttling_ptc(struct acpi_processor *pr,if (!pr->flags.throttling)return -ENODEV ; -if (state == pr->throttling.state) +if (!force && (state == pr->throttling.state))return 0 ;if (state < pr->throttling_platform_limit)
@@ -1018,7 +1019,8 @@ static int acpi_processor_set_throttling_ptc(struct acpi_processor *pr,return 0 ; } -int acpi_processor_set_throttling (struct acpi_processor *pr,int state) +int acpi_processor_set_throttling (struct acpi_processor *pr, +int state,bool force) {cpumask_var_t saved_mask;int ret =0 ;
@@ -1070,7 +1072,7 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, int state)/* FIXME: use work_on_cpu() */ set_cpus_allowed_ptr (current,cpumask_of (pr->id)); ret = p_throttling->acpi_processor_set_throttling (pr, - t_state.target_state); + t_state.target_state, force); }else {/* * When the T-state coordination is SW_ALL or HW_ALL,
@@ -1103,7 +1105,7 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, int state)set_cpus_allowed_ptr (current,cpumask_of (i)); ret = match_pr->throttling.acpi_processor_set_throttling ( - match_pr, t_state.target_state); + match_pr, t_state.target_state, force); } }/*
@@ -1201,7 +1203,7 @@ int acpi_processor_get_throttling_info(struct acpi_processor *pr)ACPI_DEBUG_PRINT ((ACPI_DB_INFO ,"Disabling throttling (was T%d)\n" , pr->throttling.state)); - result =acpi_processor_set_throttling (pr,0 ); + result =acpi_processor_set_throttling (pr,0 , false);if (result) goto end; }
@@ -1307,7 +1309,7 @@ static ssize_t acpi_processor_write_throttling(struct file *file,if (strcmp (tmpbuf, charp) !=0 )return -EINVAL ; - result =acpi_processor_set_throttling (pr, state_val); + result =acpi_processor_set_throttling (pr, state_val, false);if (result)return result;
drivers/ata/libata-core.c +3 -0
@@ -4271,6 +4271,9 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { { "WDC WD2500JD-00HBB0", "WD-WMAL71490727", ATA_HORKAGE_BROKEN_HPA }, { "MAXTOR 6L080L4", "A93.0500", ATA_HORKAGE_BROKEN_HPA }, +/* this one allows HPA unlocking but fails IOs on the area */ + { "OCZ-VERTEX", "1.30", ATA_HORKAGE_BROKEN_HPA }, +/* Devices which report 1 sector over size HPA */ { "ST340823A", NULL, ATA_HORKAGE_HPA_SIZE, }, { "ST320413A", NULL, ATA_HORKAGE_HPA_SIZE, },
drivers/media/video/gspca/ov534.c +3 -1
@@ -832,9 +832,11 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, struct gspca_frame *frame,__u32 this_pts;u16 this_fid;int remaining_len = len; +int payload_len; + payload_len = (sd->sensor ==SENSOR_OV772X ) ?2048 :2040 ; do { - len = min(remaining_len, 2040); /*fixme: was 2048*/ + len = min(remaining_len, payload_len); /* Payloads are prefixed with a UVC-style header. We consider a frame to start when the FID toggles, or the PTS
drivers/net/ehea/ehea.h +1 -1
@@ -40,7 +40,7 @@#include <asm/io.h> #define DRV_NAME "ehea" -#define DRV_VERSION "EHEA_0101" +#define DRV_VERSION "EHEA_0102"/* eHEA capability flags */ #define DLPAR_PORT_ADD_REM 1
drivers/net/ehea/ehea_main.c +3 -0
@@ -1545,6 +1545,9 @@ static int ehea_clean_portres(struct ehea_port *port, struct ehea_port_res *pr) {int ret, i; +if (pr->qp) +netif_napi_del (&pr->napi); + ret =ehea_destroy_qp (pr->qp);if (!ret) {
drivers/net/wireless/ar9170/main.c +3 -2
@@ -1486,13 +1486,14 @@ static int ar9170_conf_tx(struct ieee80211_hw *hw, u16 queue,int ret;mutex_lock (&ar->mutex); -if ((param) && !(queue > ar->hw->queues)) { +if (queue < __AR9170_NUM_TXQ) {memcpy (&ar->edcf[ar9170_qos_hwmap[queue]], param,sizeof (*param)); ret =ar9170_set_qos (ar); - }else + }else { ret = -EINVAL ; + }mutex_unlock (&ar->mutex);return ret;
drivers/net/wireless/iwlwifi/iwl-rfkill.c +16 -10
@@ -53,22 +53,31 @@ static int iwl_rfkill_soft_rf_kill(void *data, enum rfkill_state state)switch (state) {case RFKILL_STATE_UNBLOCKED :if (iwl_is_rfkill_hw (priv)) { +/* pass error to rfkill core, make it state HARD +* BLOCKED (rfkill->mutex taken) and disable +* software kill switch */ err = -EBUSY ; - goto out_unlock; + priv->rfkill->state =RFKILL_STATE_HARD_BLOCKED ; }iwl_radio_kill_sw_enable_radio (priv);break ;case RFKILL_STATE_SOFT_BLOCKED :iwl_radio_kill_sw_disable_radio (priv); +/* rfkill->mutex is taken */ +if (priv->rfkill->state ==RFKILL_STATE_HARD_BLOCKED ) { +/* force rfkill core state to be SOFT BLOCKED, +* otherwise core will be unable to disable software +* kill switch */ + priv->rfkill->state =RFKILL_STATE_SOFT_BLOCKED ; + }break ;default :IWL_WARN (priv,"we received unexpected RFKILL state %d\n" , state);break ; } -out_unlock: -mutex_unlock (&priv->mutex); +mutex_unlock (&priv->mutex);return err; }
@@ -132,14 +141,11 @@ void iwl_rfkill_set_hw_state(struct iwl_priv *priv)if (!priv->rfkill)return ; -if (iwl_is_rfkill_hw (priv)) { +if (iwl_is_rfkill_sw (priv)) +rfkill_force_state (priv->rfkill,RFKILL_STATE_SOFT_BLOCKED ); +else if (iwl_is_rfkill_hw (priv))rfkill_force_state (priv->rfkill,RFKILL_STATE_HARD_BLOCKED ); -return ; - } - -if (!iwl_is_rfkill_sw (priv)) -rfkill_force_state (priv->rfkill,RFKILL_STATE_UNBLOCKED );else -rfkill_force_state (priv->rfkill,RFKILL_STATE_SOFT_BLOCKED ); +rfkill_force_state (priv->rfkill,RFKILL_STATE_UNBLOCKED ); }EXPORT_SYMBOL (iwl_rfkill_set_hw_state);
drivers/net/wireless/iwlwifi/iwl-sta.c +12 -0
@@ -560,6 +560,8 @@ int iwl_remove_default_wep_key(struct iwl_priv *priv,unsigned long flags;spin_lock_irqsave (&priv->sta_lock, flags); +IWL_DEBUG_WEP (priv,"Removing default WEP key: idx=%d\n" , + keyconf->keyidx);if (!test_and_clear_bit (keyconf->keyidx, &priv->ucode_key_table)) IWL_ERR(priv, "index %d not used in uCode key table.\n",
@@ -567,6 +569,11 @@ int iwl_remove_default_wep_key(struct iwl_priv *priv, priv->default_wep_key--;memset (&priv->wep_keys[keyconf->keyidx],0 ,sizeof (priv->wep_keys[0 ])); +if (iwl_is_rfkill (priv)) { +IWL_DEBUG_WEP (priv,"Not sending REPLY_WEPKEY command due to RFKILL.\n" ); +spin_unlock_irqrestore (&priv->sta_lock, flags); +return 0 ; + } ret =iwl_send_static_wepkey_cmd (priv,1 );IWL_DEBUG_WEP (priv,"Remove default WEP key: idx=%d ret=%d\n" , keyconf->keyidx, ret);
@@ -847,6 +854,11 @@ int iwl_remove_dynamic_key(struct iwl_priv *priv, priv->stations[sta_id].sta.sta.modify_mask =STA_MODIFY_KEY_MASK ; priv->stations[sta_id].sta.mode =STA_CONTROL_MODIFY_MSK ; +if (iwl_is_rfkill (priv)) { +IWL_DEBUG_WEP (priv,"Not sending REPLY_ADD_STA command because RFKILL enabled. \n" ); +spin_unlock_irqrestore (&priv->sta_lock, flags); +return 0 ; + } ret =iwl_send_add_sta (priv, &priv->stations[sta_id].sta,CMD_ASYNC );spin_unlock_irqrestore (&priv->sta_lock, flags);return ret;
drivers/net/wireless/rt2x00/rt2x00.h +4 -2
@@ -814,13 +814,15 @@ struct rt2x00_dev {static inline void rt2x00_rf_read (struct rt2x00_dev *rt2x00dev,const unsigned int word,u32 *data) { - *data = rt2x00dev->rf[word]; +BUG_ON (word <1 || word > rt2x00dev->ops->rf_size /sizeof (u32)); + *data = rt2x00dev->rf[word -1 ]; }static inline void rt2x00_rf_write (struct rt2x00_dev *rt2x00dev,const unsigned int word,u32 data) { - rt2x00dev->rf[word] = data; +BUG_ON (word <1 || word > rt2x00dev->ops->rf_size /sizeof (u32)); + rt2x00dev->rf[word -1 ] = data; }/*
drivers/platform/x86/wmi.c +4 -4
@@ -270,7 +270,7 @@ u32 method_id, const struct acpi_buffer *in, struct acpi_buffer *out)acpi_status status;struct acpi_object_list input;union acpi_object params[3 ]; -char method[4 ] ="WM" ; +char method[5 ] ="WM" ;if (!find_guid (guid_string, &wblock))return AE_ERROR ;
@@ -328,8 +328,8 @@ struct acpi_buffer *out)acpi_status status, wc_status =AE_ERROR ;struct acpi_object_list input, wc_input;union acpi_object wc_params[1 ], wq_params[1 ]; -char method[4 ]; -char wc_method[4 ] ="WC" ; +char method[5 ]; +char wc_method[5 ] ="WC" ;if (!guid_string || !out)return AE_BAD_PARAMETER ;
@@ -410,7 +410,7 @@ const struct acpi_buffer *in)acpi_handle handle;struct acpi_object_list input;union acpi_object params[2 ]; -char method[4 ] ="WS" ; +char method[5 ] ="WS" ;if (!guid_string || !in)return AE_BAD_DATA ;
drivers/scsi/mpt2sas/mpt2sas_base.c +67 -31
164 lines not on this page · raw message
drivers/scsi/mpt2sas/mpt2sas_base.h +2 -0
@@ -672,6 +672,8 @@ typedef void (*MPT_CALLBACK)(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 VF_ID,/* base shared API */ extern struct list_head mpt2sas_ioc_list; +void mpt2sas_base_start_watchdog (struct MPT2SAS_ADAPTER *ioc); +void mpt2sas_base_stop_watchdog (struct MPT2SAS_ADAPTER *ioc);int mpt2sas_base_attach (struct MPT2SAS_ADAPTER *ioc);void mpt2sas_base_detach (struct MPT2SAS_ADAPTER *ioc);
drivers/scsi/mpt2sas/mpt2sas_config.c +26 -65
398 lines not on this page · raw message
drivers/scsi/mpt2sas/mpt2sas_scsih.c +88 -36
234 lines not on this page · raw message
drivers/usb/core/hcd.h +4 -0
@@ -224,6 +224,10 @@ struct hc_driver {void (*relinquish_port)(struct usb_hcd *,int );/* has a port been handed over to a companion? */ int (*port_handed_over)(struct usb_hcd *,int ); + +/* CLEAR_TT_BUFFER completion callback */ +void (*clear_tt_buffer_complete)(struct usb_hcd *, +struct usb_host_endpoint *); };extern int usb_hcd_link_urb_to_ep (struct usb_hcd *hcd,struct urb *urb);
drivers/usb/core/hub.c +26 -14
@@ -448,10 +448,10 @@ hub_clear_tt_buffer (struct usb_device *hdev, u16 devinfo, u16 tt)* talking to TTs must queue control transfers (not just bulk and iso), so * both can talk to the same hub concurrently. */ -static void hub_tt_kevent (struct work_struct *work) +static void hub_tt_work (struct work_struct *work) {struct usb_hub *hub = - container_of(work, struct usb_hub, tt.kevent); + container_of(work, struct usb_hub, tt.clear_work);unsigned long flags;int limit =100 ;
@@ -460,6 +460,7 @@ static void hub_tt_kevent (struct work_struct *work)struct list_head *temp;struct usb_tt_clear *clear;struct usb_device *hdev = hub->hdev; +const struct hc_driver *drv;int status; temp = hub->tt.clear_list.next;
@@ -469,21 +470,25 @@ static void hub_tt_kevent (struct work_struct *work)/* drop lock so HCD can concurrently report other TT errors */ spin_unlock_irqrestore (&hub->tt.lock, flags); status =hub_clear_tt_buffer (hdev, clear->devinfo, clear->tt); -spin_lock_irqsave (&hub->tt.lock, flags); -if (status)dev_err (&hdev->dev,"clear tt %d (%04x) error %d\n" , clear->tt, clear->devinfo, status); + +/* Tell the HCD, even if the operation failed */ + drv = clear->hcd->driver; +if (drv->clear_tt_buffer_complete) + (drv->clear_tt_buffer_complete)(clear->hcd, clear->ep); +kfree (clear); +spin_lock_irqsave (&hub->tt.lock, flags); }spin_unlock_irqrestore (&hub->tt.lock, flags); }/** -* usb_hub_tt_clear_buffer - clear control/bulk TT state in high speed hub -* @udev: the device whose split transaction failed -* @pipe: identifies the endpoint of the failed transaction +* usb_hub_clear_tt_buffer - clear control/bulk TT state in high speed hub +* @urb: an URB associated with the failed or incomplete split transaction * * High speed HCDs use this to tell the hub driver that some split control or * bulk transaction failed in a way that requires clearing internal state of
@@ -493,8 +498,10 @@ static void hub_tt_kevent (struct work_struct *work)* It may not be possible for that hub to handle additional full (or low) * speed transactions until that state is fully cleared out. */ -void usb_hub_tt_clear_buffer (struct usb_device *udev,int pipe) +int usb_hub_clear_tt_buffer (struct urb *urb) { +struct usb_device *udev = urb->dev; +int pipe = urb->pipe;struct usb_tt *tt = udev->tt;unsigned long flags;struct usb_tt_clear *clear;
@@ -506,7 +513,7 @@ void usb_hub_tt_clear_buffer (struct usb_device *udev, int pipe)if ((clear =kmalloc (sizeof *clear,GFP_ATOMIC )) ==NULL ) {dev_err (&udev->dev,"can't save CLEAR_TT_BUFFER state\n" );/* FIXME recover somehow ... RESET_TT? */ -return ; +return -ENOMEM ; }/* info that CLEAR_TT_BUFFER needs */
@@ -518,14 +525,19 @@ void usb_hub_tt_clear_buffer (struct usb_device *udev, int pipe) : (USB_ENDPOINT_XFER_BULK << 11);if (usb_pipein (pipe)) clear->devinfo |=1 <<15 ; - + +/* info for completion callback */ + clear->hcd =bus_to_hcd (udev->bus); + clear->ep = urb->ep; +/* tell keventd to clear state for this TT */ spin_lock_irqsave (&tt->lock, flags);list_add_tail (&clear->clear_list, &tt->clear_list); -schedule_work (&tt->kevent); +schedule_work (&tt->clear_work);spin_unlock_irqrestore (&tt->lock, flags); +return 0 ; } -EXPORT_SYMBOL_GPL (usb_hub_tt_clear_buffer); +EXPORT_SYMBOL_GPL (usb_hub_clear_tt_buffer);/* If do_delay is false, return the number of milliseconds the caller * needs to delay.
@@ -816,7 +828,7 @@ static void hub_quiesce(struct usb_hub *hub, enum hub_quiescing_type type)if (hub->has_indicators)cancel_delayed_work_sync (&hub->leds);if (hub->tt.hub) -cancel_work_sync (&hub->tt.kevent); +cancel_work_sync (&hub->tt.clear_work); }/* caller has locked the hub device */
@@ -933,7 +945,7 @@ static int hub_configure(struct usb_hub *hub,spin_lock_init (&hub->tt.lock);INIT_LIST_HEAD (&hub->tt.clear_list); -INIT_WORK (&hub->tt.kevent, hub_tt_kevent); +INIT_WORK (&hub->tt.clear_work, hub_tt_work);switch (hdev->descriptor.bDeviceProtocol) {case 0 :break ;
drivers/usb/core/hub.h +4 -2
@@ -185,16 +185,18 @@ struct usb_tt {/* for control/bulk error recovery (CLEAR_TT_BUFFER) */ spinlock_t lock;struct list_head clear_list;/* of usb_tt_clear */ - struct work_struct kevent; + struct work_struct clear_work; };struct usb_tt_clear {struct list_head clear_list;unsigned tt;u16 devinfo; +struct usb_hcd *hcd; +struct usb_host_endpoint *ep; }; -extern void usb_hub_tt_clear_buffer (struct usb_device *dev,int pipe); +extern int usb_hub_clear_tt_buffer (struct urb *urb);extern void usb_ep0_reinit (struct usb_device *);#endif /* __LINUX_HUB_H */
drivers/usb/host/ehci-au1xxx.c +2 -0
@@ -112,6 +112,8 @@ static const struct hc_driver ehci_au1xxx_hc_driver = { .bus_resume = ehci_bus_resume, .relinquish_port = ehci_relinquish_port, .port_handed_over = ehci_port_handed_over, + + .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, };static int ehci_hcd_au1xxx_drv_probe (struct platform_device *pdev)
drivers/usb/host/ehci-fsl.c +2 -0
@@ -324,6 +324,8 @@ static const struct hc_driver ehci_fsl_hc_driver = { .bus_resume = ehci_bus_resume, .relinquish_port = ehci_relinquish_port, .port_handed_over = ehci_port_handed_over, + + .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, };static int ehci_fsl_drv_probe (struct platform_device *pdev)
drivers/usb/host/ehci-hcd.c +4 -1
@@ -903,7 +903,8 @@ static int ehci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)/* already started */ break ;case QH_STATE_IDLE : -WARN_ON (1 ); +/* QH might be waiting for a Clear-TT-Buffer */ +qh_completions (ehci, qh);break ; }break ;
@@ -1003,6 +1004,8 @@ idle_timeout:schedule_timeout_uninterruptible (1 ); goto rescan;case QH_STATE_IDLE :/* fully unlinked */ +if (qh->clearing_tt) + goto idle_timeout;if (list_empty (&qh->qtd_list)) {qh_put (qh);break ;
drivers/usb/host/ehci-ixp4xx.c +2 -0
@@ -60,6 +60,8 @@ static const struct hc_driver ixp4xx_ehci_hc_driver = {#endif .relinquish_port = ehci_relinquish_port, .port_handed_over = ehci_port_handed_over, + + .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, };static int ixp4xx_ehci_probe (struct platform_device *pdev)
drivers/usb/host/ehci-orion.c +2 -0
@@ -164,6 +164,8 @@ static const struct hc_driver ehci_orion_hc_driver = { .bus_resume = ehci_bus_resume, .relinquish_port = ehci_relinquish_port, .port_handed_over = ehci_port_handed_over, + + .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, }; static void __init
drivers/usb/host/ehci-pci.c +2 -0
@@ -408,6 +408,8 @@ static const struct hc_driver ehci_pci_hc_driver = { .bus_resume = ehci_bus_resume, .relinquish_port = ehci_relinquish_port, .port_handed_over = ehci_port_handed_over, + + .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, };/*-------------------------------------------------------------------------*/
drivers/usb/host/ehci-ppc-of.c +2 -0
@@ -78,6 +78,8 @@ static const struct hc_driver ehci_ppc_of_hc_driver = {#endif .relinquish_port = ehci_relinquish_port, .port_handed_over = ehci_port_handed_over, + + .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, };
drivers/usb/host/ehci-ps3.c +2 -0
@@ -74,6 +74,8 @@ static const struct hc_driver ps3_ehci_hc_driver = {#endif .relinquish_port = ehci_relinquish_port, .port_handed_over = ehci_port_handed_over, + + .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, };static int ps3_ehci_probe (struct ps3_system_bus_device *dev)
drivers/usb/host/ehci-q.c +71 -26
153 lines not on this page · raw message
drivers/usb/host/ehci.h +2 -0
@@ -353,7 +353,9 @@ struct ehci_qh {unsigned short period;/* polling interval */ unsigned short start;/* where polling starts */ #define NO_FRAME ((unsigned short)~0)/* pick new start */ +struct usb_device *dev;/* access to TT */ + unsigned clearing_tt:1; /* Clear-TT-Buf in progress */ } __attribute__ ((aligned (32)));/*-------------------------------------------------------------------------*/
drivers/video/xen-fbfront.c +4 -4
@@ -454,6 +454,10 @@ static int __devinit xenfb_probe(struct xenbus_device *dev,xenfb_init_shared_page (info, fb_info); + ret =xenfb_connect_backend (dev, info); +if (ret <0 ) + goto error; + ret =register_framebuffer (fb_info);if (ret) {fb_deferred_io_cleanup (fb_info);
@@ -464,10 +468,6 @@ static int __devinit xenfb_probe(struct xenbus_device *dev, } info->fb_info = fb_info; - ret =xenfb_connect_backend (dev, info); -if (ret <0 ) - goto error; -xenfb_make_preferred_console ();return 0 ;
fs/buffer.c +5 -2
@@ -1165,8 +1165,11 @@ void mark_buffer_dirty(struct buffer_head *bh)if (!test_set_buffer_dirty (bh)) {struct page *page = bh->b_page; -if (!TestSetPageDirty (page)) -__set_page_dirty (page,page_mapping (page),0 ); +if (!TestSetPageDirty (page)) { +struct address_space *mapping =page_mapping (page); +if (mapping) +__set_page_dirty (page, mapping,0 ); + } } }
fs/exec.c +2 -2
@@ -677,8 +677,8 @@ exit: }EXPORT_SYMBOL (open_exec); -int kernel_read (struct file *file,unsigned long offset, -char *addr,unsigned long count) +int kernel_read (struct file *file,loff_t offset, +char *addr,unsigned long count) {mm_segment_t old_fs;loff_t pos = offset;
fs/hugetlbfs/inode.c +12 -8
@@ -934,26 +934,28 @@ static int can_do_hugetlb_shm(void)return capable (CAP_IPC_LOCK ) ||in_group_p (sysctl_hugetlb_shm_group); } -struct file *hugetlb_file_setup (const char *name,size_t size,int acctflag) +struct file *hugetlb_file_setup (const char *name,size_t size,int acctflag, +struct user_struct **user) {int error = -ENOMEM ; -int unlock_shm =0 ;struct file *file;struct inode *inode;struct dentry *dentry, *root;struct qstr quick_string; -struct user_struct *user =current_user (); + *user =NULL ;if (!hugetlbfs_vfsmount)return ERR_PTR (-ENOENT );if (!can_do_hugetlb_shm ()) { -if (user_shm_lock (size, user)) { - unlock_shm =1 ; + *user =current_user (); +if (user_shm_lock (size, *user)) {WARN_ONCE (1 ,"Using mlock ulimits for SHM_HUGETLB deprecated\n" ); - }else + }else { + *user =NULL ;return ERR_PTR (-EPERM ); + } } root = hugetlbfs_vfsmount->mnt_root;
@@ -994,8 +996,10 @@ out_inode: out_dentry:dput (dentry); out_shm_unlock: -if (unlock_shm) -user_shm_unlock (size, user); +if (*user) { +user_shm_unlock (size, *user); + *user =NULL ; + }return ERR_PTR (error); }
fs/inode.c +24 -16
@@ -118,12 +118,11 @@ static void wake_up_inode(struct inode *inode)* These are initializations that need to be done on every inode * allocation as the fields are not initialised by slab allocation. */ -struct inode *inode_init_always (struct super_block *sb,struct inode *inode) +int inode_init_always (struct super_block *sb,struct inode *inode) {static const struct address_space_operations empty_aops;static struct inode_operations empty_iops;static const struct file_operations empty_fops; -struct address_space *const mapping = &inode->i_data; inode->i_sb = sb;
@@ -150,7 +149,7 @@ struct inode *inode_init_always(struct super_block *sb, struct inode *inode) inode->dirtied_when =0 ;if (security_inode_alloc (inode)) - goto out_free_inode; + goto out;/* allocate and initialize an i_integrity */ if (ima_inode_alloc (inode))
@@ -189,16 +188,12 @@ struct inode *inode_init_always(struct super_block *sb, struct inode *inode) inode->i_private =NULL ; inode->i_mapping = mapping; -return inode; +return 0 ; out_free_security:security_inode_free (inode); -out_free_inode: -if (inode->i_sb->s_op->destroy_inode) - inode->i_sb->s_op->destroy_inode (inode); -else -kmem_cache_free (inode_cachep, (inode)); -return NULL ; +out: +return -ENOMEM ; }EXPORT_SYMBOL (inode_init_always);
@@ -211,23 +206,36 @@ static struct inode *alloc_inode(struct super_block *sb)else inode =kmem_cache_alloc (inode_cachep,GFP_KERNEL ); -if (inode) -return inode_init_always (sb, inode); -return NULL ; +if (!inode) +return NULL ; + +if (unlikely (inode_init_always (sb, inode))) { +if (inode->i_sb->s_op->destroy_inode) + inode->i_sb->s_op->destroy_inode (inode); +else +kmem_cache_free (inode_cachep, inode); +return NULL ; + } + +return inode; } -void destroy_inode (struct inode *inode) +void __destroy_inode (struct inode *inode) {BUG_ON (inode_has_buffers (inode));ima_inode_free (inode);security_inode_free (inode); +} +EXPORT_SYMBOL (__destroy_inode); + +void destroy_inode (struct inode *inode) +{ +__destroy_inode (inode);if (inode->i_sb->s_op->destroy_inode) inode->i_sb->s_op->destroy_inode (inode);else kmem_cache_free (inode_cachep, (inode)); } -EXPORT_SYMBOL (destroy_inode); -/* * These are initializations that only need to be done
fs/ocfs2/aops.c +47 -19
158 lines not on this page · raw message
fs/select.c +1 -0
@@ -110,6 +110,7 @@ void poll_initwait(struct poll_wqueues *pwq) {init_poll_funcptr (&pwq->pt, __pollwait); pwq->polling_task = current; + pwq->triggered =0 ; pwq->error =0 ; pwq->table =NULL ; pwq->inline_index =0 ;
fs/xfs/xfs_iget.c +73 -69
178 lines not on this page · raw message
fs/xfs/xfs_inode.h +0 -17
@@ -309,23 +309,6 @@ static inline struct inode *VFS_I(struct xfs_inode *ip) }/* -* Get rid of a partially initialized inode. -* -* We have to go through destroy_inode to make sure allocations -* from init_inode_always like the security data are undone. -* -* We mark the inode bad so that it takes the short cut in -* the reclaim path instead of going through the flush path -* which doesn't make sense for an inode that has never seen the -* light of day. -*/ -static inline void xfs_destroy_inode (struct xfs_inode *ip) -{ -make_bad_inode (VFS_I (ip)); -return destroy_inode (VFS_I (ip)); -} - -/* * i_flags helper functions */ static inline void
fs/xfs/xfs_log.c +1 -1
@@ -3180,7 +3180,7 @@ try_again: STATIC voidxlog_state_want_sync (xlog_t *log,xlog_in_core_t *iclog) { -ASSERT (spin_is_locked (&log->l_icloglock)); +assert_spin_locked (&log->l_icloglock);if (iclog->ic_state ==XLOG_STATE_ACTIVE ) {xlog_state_switch_iclogs (log, iclog,0 );
include/acpi/processor.h +3 -2
@@ -174,7 +174,7 @@ struct acpi_processor_throttling {cpumask_var_t shared_cpu_map;int (*acpi_processor_get_throttling) (struct acpi_processor * pr);int (*acpi_processor_set_throttling) (struct acpi_processor * pr, -int state); +int state,bool force);u32 address;u8 duty_offset;
@@ -320,7 +320,8 @@ static inline int acpi_processor_ppc_has_changed(struct acpi_processor *pr)/* in processor_throttling.c */ int acpi_processor_tstate_has_changed (struct acpi_processor *pr);int acpi_processor_get_throttling_info (struct acpi_processor *pr); -extern int acpi_processor_set_throttling (struct acpi_processor *pr,int state); +extern int acpi_processor_set_throttling (struct acpi_processor *pr, +int state,bool force);extern const struct file_operations acpi_processor_throttling_fops;extern void acpi_processor_throttling_init (void );/* in processor_idle.c */
include/linux/bitmap.h +8 -10
@@ -94,13 +94,13 @@ extern void __bitmap_shift_right(unsigned long *dst, const unsigned long *src, int shift, int bits);extern void __bitmap_shift_left (unsigned long *dst,const unsigned long *src,int shift,int bits); -extern void __bitmap_and (unsigned long *dst,const unsigned long *bitmap1, +extern int __bitmap_and (unsigned long *dst,const unsigned long *bitmap1,const unsigned long *bitmap2,int bits);extern void __bitmap_or (unsigned long *dst,const unsigned long *bitmap1,const unsigned long *bitmap2,int bits);extern void __bitmap_xor (unsigned long *dst,const unsigned long *bitmap1,const unsigned long *bitmap2,int bits); -extern void __bitmap_andnot (unsigned long *dst,const unsigned long *bitmap1, +extern int __bitmap_andnot (unsigned long *dst,const unsigned long *bitmap1,const unsigned long *bitmap2,int bits);extern int __bitmap_intersects (const unsigned long *bitmap1,const unsigned long *bitmap2,int bits);
@@ -171,13 +171,12 @@ static inline void bitmap_copy(unsigned long *dst, const unsigned long *src, } } -static inline void bitmap_and (unsigned long *dst,const unsigned long *src1, +static inline int bitmap_and (unsigned long *dst,const unsigned long *src1,const unsigned long *src2,int nbits) {if (small_const_nbits (nbits)) - *dst = *src1 & *src2; -else -__bitmap_and (dst, src1, src2, nbits); +return (*dst = *src1 & *src2) !=0 ; +return __bitmap_and (dst, src1, src2, nbits); } static inline void bitmap_or(unsigned long *dst, const unsigned long *src1,
@@ -198,13 +197,12 @@ static inline void bitmap_xor(unsigned long *dst, const unsigned long *src1,__bitmap_xor (dst, src1, src2, nbits); } -static inline void bitmap_andnot (unsigned long *dst,const unsigned long *src1, +static inline int bitmap_andnot (unsigned long *dst,const unsigned long *src1,const unsigned long *src2,int nbits) {if (small_const_nbits (nbits)) - *dst = *src1 & ~(*src2); -else -__bitmap_andnot (dst, src1, src2, nbits); +return (*dst = *src1 & ~(*src2)) !=0 ; +return __bitmap_andnot (dst, src1, src2, nbits); } static inline void bitmap_complement(unsigned long *dst, const unsigned long *src,
include/linux/cpumask.h +10 -10
@@ -43,10 +43,10 @@* int cpu_isset(cpu, mask) true iff bit 'cpu' set in mask * int cpu_test_and_set(cpu, mask) test and set bit 'cpu' in mask * -* void cpus_and(dst, src1, src2) dst = src1 & src2 [intersection] +* int cpus_and(dst, src1, src2) dst = src1 & src2 [intersection] * void cpus_or(dst, src1, src2) dst = src1 | src2 [union] * void cpus_xor(dst, src1, src2) dst = src1 ^ src2 -* void cpus_andnot(dst, src1, src2) dst = src1 & ~src2 +* int cpus_andnot(dst, src1, src2) dst = src1 & ~src2 * void cpus_complement(dst, src) dst = ~src * * int cpus_equal(mask1, mask2) Does mask1 == mask2?
@@ -179,10 +179,10 @@ static inline int __cpu_test_and_set(int cpu, cpumask_t *addr) }#define cpus_and (dst, src1, src2) __cpus_and(&(dst), &(src1), &(src2), NR_CPUS) -static inline void __cpus_and (cpumask_t *dstp,const cpumask_t *src1p, +static inline int __cpus_and (cpumask_t *dstp,const cpumask_t *src1p,const cpumask_t *src2p,int nbits) { -bitmap_and (dstp->bits, src1p->bits, src2p->bits, nbits); +return bitmap_and (dstp->bits, src1p->bits, src2p->bits, nbits); }#define cpus_or (dst, src1, src2) __cpus_or(&(dst), &(src1), &(src2), NR_CPUS)
@@ -201,10 +201,10 @@ static inline void __cpus_xor(cpumask_t *dstp, const cpumask_t *src1p,#define cpus_andnot (dst, src1, src2) \ __cpus_andnot(&(dst), &(src1), &(src2), NR_CPUS) -static inline void __cpus_andnot (cpumask_t *dstp,const cpumask_t *src1p, +static inline int __cpus_andnot (cpumask_t *dstp,const cpumask_t *src1p,const cpumask_t *src2p,int nbits) { -bitmap_andnot (dstp->bits, src1p->bits, src2p->bits, nbits); +return bitmap_andnot (dstp->bits, src1p->bits, src2p->bits, nbits); }#define cpus_complement (dst, src) __cpus_complement(&(dst), &(src), NR_CPUS)
@@ -738,11 +738,11 @@ static inline void cpumask_clear(struct cpumask *dstp)* @src1p: the first input * @src2p: the second input */ -static inline void cpumask_and (struct cpumask *dstp, +static inline int cpumask_and (struct cpumask *dstp,const struct cpumask *src1p,const struct cpumask *src2p) { -bitmap_and (cpumask_bits (dstp),cpumask_bits (src1p), +return bitmap_and (cpumask_bits (dstp),cpumask_bits (src1p),cpumask_bits (src2p), nr_cpumask_bits); }
@@ -779,11 +779,11 @@ static inline void cpumask_xor(struct cpumask *dstp,* @src1p: the first input * @src2p: the second input */ -static inline void cpumask_andnot (struct cpumask *dstp, +static inline int cpumask_andnot (struct cpumask *dstp,const struct cpumask *src1p,const struct cpumask *src2p) { -bitmap_andnot (cpumask_bits (dstp),cpumask_bits (src1p), +return bitmap_andnot (cpumask_bits (dstp),cpumask_bits (src1p),cpumask_bits (src2p), nr_cpumask_bits); }
include/linux/fs.h +3 -2
@@ -2121,7 +2121,7 @@ extern struct file *do_filp_open(int dfd, const char *pathname, int open_flag, int mode, int acc_mode);extern int may_open (struct path *,int ,int ); -extern int kernel_read (struct file *,unsigned long ,char *,unsigned long ); +extern int kernel_read (struct file *,loff_t ,char *,unsigned long );extern struct file *open_exec (const char *);/* fs/dcache.c -- generic fs support functions */
@@ -2135,7 +2135,7 @@ extern loff_t default_llseek(struct file *file, loff_t offset, int origin);extern loff_t vfs_llseek (struct file *file,loff_t offset,int origin); -extern struct inode *inode_init_always (struct super_block *,struct inode *); +extern int inode_init_always (struct super_block *,struct inode *);extern void inode_init_once (struct inode *);extern void inode_add_to_lists (struct super_block *,struct inode *);extern void iput (struct inode *);
@@ -2162,6 +2162,7 @@ extern void __iget(struct inode * inode);extern void iget_failed (struct inode *);extern void clear_inode (struct inode *);extern void destroy_inode (struct inode *); +extern void __destroy_inode (struct inode *);extern struct inode *new_inode (struct super_block *);extern int should_remove_suid (struct dentry *);extern int file_remove_suid (struct file *);
include/linux/hugetlb.h +4 -2
@@ -10,6 +10,7 @@#include <asm/tlbflush.h> struct ctl_table ; +struct user_struct ;static inline int is_vm_hugetlb_page (struct vm_area_struct *vma) {
@@ -139,7 +140,8 @@ static inline struct hugetlbfs_sb_info *HUGETLBFS_SB(struct super_block *sb)extern const struct file_operations hugetlbfs_file_operations;extern struct vm_operations_struct hugetlb_vm_ops; -struct file *hugetlb_file_setup (const char *name,size_t ,int ); +struct file *hugetlb_file_setup (const char *name,size_t size,int acct, +struct user_struct **user);int hugetlb_get_quota (struct address_space *mapping,long delta);void hugetlb_put_quota (struct address_space *mapping,long delta);
@@ -161,7 +163,7 @@ static inline void set_file_hugepages(struct file *file)#define is_file_hugepages (file) 0#define set_file_hugepages (file) BUG() -#define hugetlb_file_setup (name,size,acctflag) ERR_PTR(-ENOSYS) +#define hugetlb_file_setup (name,size,acct,user) ERR_PTR(-ENOSYS)#endif /* !CONFIG_HUGETLBFS */
include/linux/kvm_host.h +1 -0
@@ -110,6 +110,7 @@ struct kvm_memory_slot {struct kvm_kernel_irq_routing_entry {u32 gsi; +u32 type;int (*set)(struct kvm_kernel_irq_routing_entry *e,struct kvm *kvm,int level);union {
init/main.c +4 -3
@@ -702,13 +702,14 @@ asmlinkage void __init start_kernel(void)int initcall_debug;core_param (initcall_debug, initcall_debug, bool,0644 ); +static char msgbuf[64 ]; +static struct boot_trace_call call; +static struct boot_trace_ret ret; +int do_one_initcall (initcall_t fn) {int count =preempt_count ();ktime_t calltime, delta, rettime; -char msgbuf[64 ]; -struct boot_trace_call call; -struct boot_trace_ret ret;if (initcall_debug) { call.caller =task_pid_nr (current);
ipc/shm.c +5 -3
@@ -174,7 +174,7 @@ static void shm_destroy(struct ipc_namespace *ns, struct shmid_kernel *shp)shm_unlock (shp);if (!is_file_hugepages (shp->shm_file))shmem_lock (shp->shm_file,0 , shp->mlock_user); -else +else if (shp->mlock_user)user_shm_unlock (shp->shm_file->f_path.dentry->d_inode->i_size, shp->mlock_user);fput (shp->shm_file);
@@ -369,8 +369,8 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params)/* hugetlb_file_setup applies strict accounting */ if (shmflg &SHM_NORESERVE ) acctflag =VM_NORESERVE ; - file =hugetlb_file_setup (name, size, acctflag); - shp->mlock_user =current_user (); + file =hugetlb_file_setup (name, size, acctflag, + &shp->mlock_user); }else {/* * Do not allow no accounting for OVERCOMMIT_NEVER, even
@@ -411,6 +411,8 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params)return error; no_id: +if (shp->mlock_user)/* shmflg & SHM_HUGETLB case */ +user_shm_unlock (size, shp->mlock_user);fput (file); no_file:security_shm_free (shp);
kernel/fork.c +5 -15
@@ -816,11 +816,8 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk) {struct signal_struct *sig; -if (clone_flags &CLONE_THREAD ) { -atomic_inc (¤t->signal->count); -atomic_inc (¤t->signal->live); +if (clone_flags &CLONE_THREAD )return 0 ; - } sig =kmem_cache_alloc (signal_cachep,GFP_KERNEL ); tsk->signal = sig;
@@ -878,16 +875,6 @@ void __cleanup_signal(struct signal_struct *sig)kmem_cache_free (signal_cachep, sig); } -static void cleanup_signal (struct task_struct *tsk) -{ -struct signal_struct *sig = tsk->signal; - -atomic_dec (&sig->live); - -if (atomic_dec_and_test (&sig->count)) -__cleanup_signal (sig); -} -static void copy_flags (unsigned long clone_flags,struct task_struct *p) {unsigned long new_flags = p->flags;
@@ -1237,6 +1224,8 @@ static struct task_struct *copy_process(unsigned long clone_flags, }if (clone_flags &CLONE_THREAD ) { +atomic_inc (¤t->signal->count); +atomic_inc (¤t->signal->live); p->group_leader = current->group_leader;list_add_tail_rcu (&p->thread_group, &p->group_leader->thread_group); }
@@ -1281,7 +1270,8 @@ bad_fork_cleanup_mm:if (p->mm)mmput (p->mm); bad_fork_cleanup_signal: -cleanup_signal (p); +if (!(clone_flags &CLONE_THREAD )) +__cleanup_signal (p->signal); bad_fork_cleanup_sighand:__cleanup_sighand (p->sighand); bad_fork_cleanup_fs:
kernel/kthread.c +1 -1
@@ -216,12 +216,12 @@ int kthread_stop(struct task_struct *k)/* Now set kthread_should_stop() to true, and wake it up. */ kthread_stop_info.k = k;wake_up_process (k); -put_task_struct (k);/* Once it dies, reset stop ptr, gather result and we're done. */ wait_for_completion (&kthread_stop_info.done); kthread_stop_info.k =NULL ; ret = kthread_stop_info.err; +put_task_struct (k);mutex_unlock (&kthread_stop_lock);trace_sched_kthread_stop_ret (ret);
kernel/signal.c +8 -7
@@ -2414,11 +2414,9 @@ do_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, unsigned long sstack_t oss;int error; -if (uoss) { - oss.ss_sp = (void __user *) current->sas_ss_sp; - oss.ss_size = current->sas_ss_size; - oss.ss_flags =sas_ss_flags (sp); - } + oss.ss_sp = (void __user *) current->sas_ss_sp; + oss.ss_size = current->sas_ss_size; + oss.ss_flags =sas_ss_flags (sp);if (uss) {void __user *ss_sp;
@@ -2461,13 +2459,16 @@ do_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, unsigned long s current->sas_ss_size = ss_size; } + error =0 ;if (uoss) { error = -EFAULT ; -if (copy_to_user (uoss, &oss,sizeof (oss))) +if (!access_ok (VERIFY_WRITE , uoss,sizeof (*uoss))) goto out; + error =__put_user (oss.ss_sp, &uoss->ss_sp) | +__put_user (oss.ss_size, &uoss->ss_size) | +__put_user (oss.ss_flags, &uoss->ss_flags); } - error =0 ; out:return error; }
lib/bitmap.c +8 -4
@@ -179,14 +179,16 @@ void __bitmap_shift_left(unsigned long *dst, }EXPORT_SYMBOL (__bitmap_shift_left); -void __bitmap_and (unsigned long *dst,const unsigned long *bitmap1, +int __bitmap_and (unsigned long *dst,const unsigned long *bitmap1,const unsigned long *bitmap2,int bits) {int k;int nr =BITS_TO_LONGS (bits); +unsigned long result =0 ;for (k =0 ; k < nr; k++) - dst[k] = bitmap1[k] & bitmap2[k]; + result |= (dst[k] = bitmap1[k] & bitmap2[k]); +return result !=0 ;
Lines of this file are not shown. View the raw message.
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.