mirror of
https://github.com/Fishwaldo/build.git
synced 2025-03-22 06:41:23 +00:00
1457 lines
46 KiB
Diff
1457 lines
46 KiB
Diff
|
diff --git a/Documentation/scsi/scsi_eh.txt b/Documentation/scsi/scsi_eh.txt
|
||
|
index a0c85110a07e..689ab9b9953a 100644
|
||
|
--- a/Documentation/scsi/scsi_eh.txt
|
||
|
+++ b/Documentation/scsi/scsi_eh.txt
|
||
|
@@ -263,19 +263,23 @@ scmd->allowed.
|
||
|
|
||
|
3. scmd recovered
|
||
|
ACTION: scsi_eh_finish_cmd() is invoked to EH-finish scmd
|
||
|
- - shost->host_failed--
|
||
|
- clear scmd->eh_eflags
|
||
|
- scsi_setup_cmd_retry()
|
||
|
- move from local eh_work_q to local eh_done_q
|
||
|
LOCKING: none
|
||
|
+ CONCURRENCY: at most one thread per separate eh_work_q to
|
||
|
+ keep queue manipulation lockless
|
||
|
|
||
|
4. EH completes
|
||
|
ACTION: scsi_eh_flush_done_q() retries scmds or notifies upper
|
||
|
- layer of failure.
|
||
|
+ layer of failure. May be called concurrently but must have
|
||
|
+ a no more than one thread per separate eh_work_q to
|
||
|
+ manipulate the queue locklessly
|
||
|
- scmd is removed from eh_done_q and scmd->eh_entry is cleared
|
||
|
- if retry is necessary, scmd is requeued using
|
||
|
scsi_queue_insert()
|
||
|
- otherwise, scsi_finish_command() is invoked for scmd
|
||
|
+ - zero shost->host_failed
|
||
|
LOCKING: queue or finish function performs appropriate locking
|
||
|
|
||
|
|
||
|
diff --git a/Makefile b/Makefile
|
||
|
index 939dfae7bb5f..d2fb4dae6ecb 100644
|
||
|
--- a/Makefile
|
||
|
+++ b/Makefile
|
||
|
@@ -1,6 +1,6 @@
|
||
|
VERSION = 3
|
||
|
PATCHLEVEL = 14
|
||
|
-SUBLEVEL = 73
|
||
|
+SUBLEVEL = 74
|
||
|
EXTRAVERSION =
|
||
|
NAME = Remembering Coco
|
||
|
|
||
|
diff --git a/arch/arm/include/asm/pgtable-2level.h b/arch/arm/include/asm/pgtable-2level.h
|
||
|
index 219ac88a9542..bed6c8fa54b5 100644
|
||
|
--- a/arch/arm/include/asm/pgtable-2level.h
|
||
|
+++ b/arch/arm/include/asm/pgtable-2level.h
|
||
|
@@ -163,6 +163,7 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr)
|
||
|
|
||
|
#define pmd_large(pmd) (pmd_val(pmd) & 2)
|
||
|
#define pmd_bad(pmd) (pmd_val(pmd) & 2)
|
||
|
+#define pmd_present(pmd) (pmd_val(pmd))
|
||
|
|
||
|
#define copy_pmd(pmdpd,pmdps) \
|
||
|
do { \
|
||
|
diff --git a/arch/arm/include/asm/pgtable-3level.h b/arch/arm/include/asm/pgtable-3level.h
|
||
|
index 06e0bc0f8b00..ab7ee9205ca4 100644
|
||
|
--- a/arch/arm/include/asm/pgtable-3level.h
|
||
|
+++ b/arch/arm/include/asm/pgtable-3level.h
|
||
|
@@ -212,6 +212,7 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr)
|
||
|
: !!(pmd_val(pmd) & (val)))
|
||
|
#define pmd_isclear(pmd, val) (!(pmd_val(pmd) & (val)))
|
||
|
|
||
|
+#define pmd_present(pmd) (pmd_isset((pmd), L_PMD_SECT_VALID))
|
||
|
#define pmd_young(pmd) (pmd_isset((pmd), PMD_SECT_AF))
|
||
|
|
||
|
#define __HAVE_ARCH_PMD_WRITE
|
||
|
diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h
|
||
|
index 89dba131703b..9a9701815b57 100644
|
||
|
--- a/arch/arm/include/asm/pgtable.h
|
||
|
+++ b/arch/arm/include/asm/pgtable.h
|
||
|
@@ -182,7 +182,6 @@ extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
|
||
|
#define pgd_offset_k(addr) pgd_offset(&init_mm, addr)
|
||
|
|
||
|
#define pmd_none(pmd) (!pmd_val(pmd))
|
||
|
-#define pmd_present(pmd) (pmd_val(pmd))
|
||
|
|
||
|
static inline pte_t *pmd_page_vaddr(pmd_t pmd)
|
||
|
{
|
||
|
diff --git a/arch/mips/include/asm/kvm_host.h b/arch/mips/include/asm/kvm_host.h
|
||
|
index a995fce87791..3ff5b4921b76 100644
|
||
|
--- a/arch/mips/include/asm/kvm_host.h
|
||
|
+++ b/arch/mips/include/asm/kvm_host.h
|
||
|
@@ -342,6 +342,7 @@ struct kvm_mips_tlb {
|
||
|
#define KVM_MIPS_GUEST_TLB_SIZE 64
|
||
|
struct kvm_vcpu_arch {
|
||
|
void *host_ebase, *guest_ebase;
|
||
|
+ int (*vcpu_run)(struct kvm_run *run, struct kvm_vcpu *vcpu);
|
||
|
unsigned long host_stack;
|
||
|
unsigned long host_gp;
|
||
|
|
||
|
diff --git a/arch/mips/kvm/kvm_locore.S b/arch/mips/kvm/kvm_locore.S
|
||
|
index ba5ce99c021d..d1fa2a57218b 100644
|
||
|
--- a/arch/mips/kvm/kvm_locore.S
|
||
|
+++ b/arch/mips/kvm/kvm_locore.S
|
||
|
@@ -229,6 +229,7 @@ FEXPORT(__kvm_mips_load_k0k1)
|
||
|
|
||
|
/* Jump to guest */
|
||
|
eret
|
||
|
+EXPORT(__kvm_mips_vcpu_run_end)
|
||
|
|
||
|
VECTOR(MIPSX(exception), unknown)
|
||
|
/*
|
||
|
diff --git a/arch/mips/kvm/kvm_mips.c b/arch/mips/kvm/kvm_mips.c
|
||
|
index 12d850b68763..2b2dd4ec03fb 100644
|
||
|
--- a/arch/mips/kvm/kvm_mips.c
|
||
|
+++ b/arch/mips/kvm/kvm_mips.c
|
||
|
@@ -348,6 +348,15 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, unsigned int id)
|
||
|
memcpy(gebase + offset, mips32_GuestException,
|
||
|
mips32_GuestExceptionEnd - mips32_GuestException);
|
||
|
|
||
|
+#ifdef MODULE
|
||
|
+ offset += mips32_GuestExceptionEnd - mips32_GuestException;
|
||
|
+ memcpy(gebase + offset, (char *)__kvm_mips_vcpu_run,
|
||
|
+ __kvm_mips_vcpu_run_end - (char *)__kvm_mips_vcpu_run);
|
||
|
+ vcpu->arch.vcpu_run = gebase + offset;
|
||
|
+#else
|
||
|
+ vcpu->arch.vcpu_run = __kvm_mips_vcpu_run;
|
||
|
+#endif
|
||
|
+
|
||
|
/* Invalidate the icache for these ranges */
|
||
|
mips32_SyncICache((unsigned long) gebase, ALIGN(size, PAGE_SIZE));
|
||
|
|
||
|
@@ -431,7 +440,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
||
|
|
||
|
kvm_guest_enter();
|
||
|
|
||
|
- r = __kvm_mips_vcpu_run(run, vcpu);
|
||
|
+ r = vcpu->arch.vcpu_run(run, vcpu);
|
||
|
|
||
|
kvm_guest_exit();
|
||
|
local_irq_enable();
|
||
|
diff --git a/arch/mips/kvm/kvm_mips_int.h b/arch/mips/kvm/kvm_mips_int.h
|
||
|
index 20da7d29eede..bf41ea36210e 100644
|
||
|
--- a/arch/mips/kvm/kvm_mips_int.h
|
||
|
+++ b/arch/mips/kvm/kvm_mips_int.h
|
||
|
@@ -27,6 +27,8 @@
|
||
|
#define MIPS_EXC_MAX 12
|
||
|
/* XXXSL More to follow */
|
||
|
|
||
|
+extern char __kvm_mips_vcpu_run_end[];
|
||
|
+
|
||
|
#define C_TI (_ULCAST_(1) << 30)
|
||
|
|
||
|
#define KVM_MIPS_IRQ_DELIVER_ALL_AT_ONCE (0)
|
||
|
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
|
||
|
index 6e15abf30eb8..916b3a5db859 100644
|
||
|
--- a/arch/powerpc/kernel/process.c
|
||
|
+++ b/arch/powerpc/kernel/process.c
|
||
|
@@ -1237,6 +1237,16 @@ void start_thread(struct pt_regs *regs, unsigned long start, unsigned long sp)
|
||
|
current->thread.regs = regs - 1;
|
||
|
}
|
||
|
|
||
|
+#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
|
||
|
+ /*
|
||
|
+ * Clear any transactional state, we're exec()ing. The cause is
|
||
|
+ * not important as there will never be a recheckpoint so it's not
|
||
|
+ * user visible.
|
||
|
+ */
|
||
|
+ if (MSR_TM_SUSPENDED(mfmsr()))
|
||
|
+ tm_reclaim_current(0);
|
||
|
+#endif
|
||
|
+
|
||
|
memset(regs->gpr, 0, sizeof(regs->gpr));
|
||
|
regs->ctr = 0;
|
||
|
regs->link = 0;
|
||
|
diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c
|
||
|
index de1ec54a2a57..a2082be599c8 100644
|
||
|
--- a/arch/powerpc/platforms/pseries/iommu.c
|
||
|
+++ b/arch/powerpc/platforms/pseries/iommu.c
|
||
|
@@ -826,7 +826,8 @@ machine_arch_initcall(pseries, find_existing_ddw_windows);
|
||
|
static int query_ddw(struct pci_dev *dev, const u32 *ddw_avail,
|
||
|
struct ddw_query_response *query)
|
||
|
{
|
||
|
- struct eeh_dev *edev;
|
||
|
+ struct device_node *dn;
|
||
|
+ struct pci_dn *pdn;
|
||
|
u32 cfg_addr;
|
||
|
u64 buid;
|
||
|
int ret;
|
||
|
@@ -837,11 +838,10 @@ static int query_ddw(struct pci_dev *dev, const u32 *ddw_avail,
|
||
|
* Retrieve them from the pci device, not the node with the
|
||
|
* dma-window property
|
||
|
*/
|
||
|
- edev = pci_dev_to_eeh_dev(dev);
|
||
|
- cfg_addr = edev->config_addr;
|
||
|
- if (edev->pe_config_addr)
|
||
|
- cfg_addr = edev->pe_config_addr;
|
||
|
- buid = edev->phb->buid;
|
||
|
+ dn = pci_device_to_OF_node(dev);
|
||
|
+ pdn = PCI_DN(dn);
|
||
|
+ buid = pdn->phb->buid;
|
||
|
+ cfg_addr = ((pdn->busno << 16) | (pdn->devfn << 8));
|
||
|
|
||
|
ret = rtas_call(ddw_avail[0], 3, 5, (u32 *)query,
|
||
|
cfg_addr, BUID_HI(buid), BUID_LO(buid));
|
||
|
@@ -855,7 +855,8 @@ static int create_ddw(struct pci_dev *dev, const u32 *ddw_avail,
|
||
|
struct ddw_create_response *create, int page_shift,
|
||
|
int window_shift)
|
||
|
{
|
||
|
- struct eeh_dev *edev;
|
||
|
+ struct device_node *dn;
|
||
|
+ struct pci_dn *pdn;
|
||
|
u32 cfg_addr;
|
||
|
u64 buid;
|
||
|
int ret;
|
||
|
@@ -866,11 +867,10 @@ static int create_ddw(struct pci_dev *dev, const u32 *ddw_avail,
|
||
|
* Retrieve them from the pci device, not the node with the
|
||
|
* dma-window property
|
||
|
*/
|
||
|
- edev = pci_dev_to_eeh_dev(dev);
|
||
|
- cfg_addr = edev->config_addr;
|
||
|
- if (edev->pe_config_addr)
|
||
|
- cfg_addr = edev->pe_config_addr;
|
||
|
- buid = edev->phb->buid;
|
||
|
+ dn = pci_device_to_OF_node(dev);
|
||
|
+ pdn = PCI_DN(dn);
|
||
|
+ buid = pdn->phb->buid;
|
||
|
+ cfg_addr = ((pdn->busno << 16) | (pdn->devfn << 8));
|
||
|
|
||
|
do {
|
||
|
/* extra outputs are LIOBN and dma-addr (hi, lo) */
|
||
|
diff --git a/arch/s390/include/asm/syscall.h b/arch/s390/include/asm/syscall.h
|
||
|
index cd29d2f4e4f3..749313b452ae 100644
|
||
|
--- a/arch/s390/include/asm/syscall.h
|
||
|
+++ b/arch/s390/include/asm/syscall.h
|
||
|
@@ -54,7 +54,7 @@ static inline void syscall_set_return_value(struct task_struct *task,
|
||
|
struct pt_regs *regs,
|
||
|
int error, long val)
|
||
|
{
|
||
|
- regs->gprs[2] = error ? -error : val;
|
||
|
+ regs->gprs[2] = error ? error : val;
|
||
|
}
|
||
|
|
||
|
static inline void syscall_get_arguments(struct task_struct *task,
|
||
|
diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile
|
||
|
index 878df7e88cd4..3ef7e11b06fb 100644
|
||
|
--- a/arch/x86/boot/Makefile
|
||
|
+++ b/arch/x86/boot/Makefile
|
||
|
@@ -156,6 +156,9 @@ isoimage: $(obj)/bzImage
|
||
|
for i in lib lib64 share end ; do \
|
||
|
if [ -f /usr/$$i/syslinux/isolinux.bin ] ; then \
|
||
|
cp /usr/$$i/syslinux/isolinux.bin $(obj)/isoimage ; \
|
||
|
+ if [ -f /usr/$$i/syslinux/ldlinux.c32 ]; then \
|
||
|
+ cp /usr/$$i/syslinux/ldlinux.c32 $(obj)/isoimage ; \
|
||
|
+ fi ; \
|
||
|
break ; \
|
||
|
fi ; \
|
||
|
if [ $$i = end ] ; then exit 1 ; fi ; \
|
||
|
diff --git a/arch/x86/kernel/amd_nb.c b/arch/x86/kernel/amd_nb.c
|
||
|
index dec8de4e1663..0c02d794e802 100644
|
||
|
--- a/arch/x86/kernel/amd_nb.c
|
||
|
+++ b/arch/x86/kernel/amd_nb.c
|
||
|
@@ -67,8 +67,8 @@ int amd_cache_northbridges(void)
|
||
|
while ((misc = next_northbridge(misc, amd_nb_misc_ids)) != NULL)
|
||
|
i++;
|
||
|
|
||
|
- if (i == 0)
|
||
|
- return 0;
|
||
|
+ if (!i)
|
||
|
+ return -ENODEV;
|
||
|
|
||
|
nb = kzalloc(i * sizeof(struct amd_northbridge), GFP_KERNEL);
|
||
|
if (!nb)
|
||
|
diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c
|
||
|
index 61cd5200608d..a5186a47b12f 100644
|
||
|
--- a/arch/x86/kernel/cpu/perf_event_intel.c
|
||
|
+++ b/arch/x86/kernel/cpu/perf_event_intel.c
|
||
|
@@ -2606,13 +2606,13 @@ __init int intel_pmu_init(void)
|
||
|
* counter, so do not extend mask to generic counters
|
||
|
*/
|
||
|
for_each_event_constraint(c, x86_pmu.event_constraints) {
|
||
|
- if (c->cmask != FIXED_EVENT_FLAGS
|
||
|
- || c->idxmsk64 == INTEL_PMC_MSK_FIXED_REF_CYCLES) {
|
||
|
- continue;
|
||
|
+ if (c->cmask == FIXED_EVENT_FLAGS
|
||
|
+ && c->idxmsk64 != INTEL_PMC_MSK_FIXED_REF_CYCLES) {
|
||
|
+ c->idxmsk64 |= (1ULL << x86_pmu.num_counters) - 1;
|
||
|
}
|
||
|
-
|
||
|
- c->idxmsk64 |= (1ULL << x86_pmu.num_counters) - 1;
|
||
|
- c->weight += x86_pmu.num_counters;
|
||
|
+ c->idxmsk64 &=
|
||
|
+ ~(~0ULL << (INTEL_PMC_IDX_FIXED + x86_pmu.num_counters_fixed));
|
||
|
+ c->weight = hweight64(c->idxmsk64);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c
|
||
|
index 490fee15fea5..6cd32acb376f 100644
|
||
|
--- a/arch/x86/kernel/kprobes/core.c
|
||
|
+++ b/arch/x86/kernel/kprobes/core.c
|
||
|
@@ -911,7 +911,19 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr)
|
||
|
* normal page fault.
|
||
|
*/
|
||
|
regs->ip = (unsigned long)cur->addr;
|
||
|
+ /*
|
||
|
+ * Trap flag (TF) has been set here because this fault
|
||
|
+ * happened where the single stepping will be done.
|
||
|
+ * So clear it by resetting the current kprobe:
|
||
|
+ */
|
||
|
+ regs->flags &= ~X86_EFLAGS_TF;
|
||
|
+
|
||
|
+ /*
|
||
|
+ * If the TF flag was set before the kprobe hit,
|
||
|
+ * don't touch it:
|
||
|
+ */
|
||
|
regs->flags |= kcb->kprobe_old_flags;
|
||
|
+
|
||
|
if (kcb->kprobe_status == KPROBE_REENTER)
|
||
|
restore_previous_kprobe(kcb);
|
||
|
else
|
||
|
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
|
||
|
index c6c77b767a8d..05383d644e3a 100644
|
||
|
--- a/drivers/ata/libata-eh.c
|
||
|
+++ b/drivers/ata/libata-eh.c
|
||
|
@@ -604,7 +604,7 @@ void ata_scsi_error(struct Scsi_Host *host)
|
||
|
ata_scsi_port_error_handler(host, ap);
|
||
|
|
||
|
/* finish or retry handled scmd's and clean up */
|
||
|
- WARN_ON(host->host_failed || !list_empty(&eh_work_q));
|
||
|
+ WARN_ON(!list_empty(&eh_work_q));
|
||
|
|
||
|
DPRINTK("EXIT\n");
|
||
|
}
|
||
|
diff --git a/drivers/base/module.c b/drivers/base/module.c
|
||
|
index db930d3ee312..2a215780eda2 100644
|
||
|
--- a/drivers/base/module.c
|
||
|
+++ b/drivers/base/module.c
|
||
|
@@ -24,10 +24,12 @@ static char *make_driver_name(struct device_driver *drv)
|
||
|
|
||
|
static void module_create_drivers_dir(struct module_kobject *mk)
|
||
|
{
|
||
|
- if (!mk || mk->drivers_dir)
|
||
|
- return;
|
||
|
+ static DEFINE_MUTEX(drivers_dir_mutex);
|
||
|
|
||
|
- mk->drivers_dir = kobject_create_and_add("drivers", &mk->kobj);
|
||
|
+ mutex_lock(&drivers_dir_mutex);
|
||
|
+ if (mk && !mk->drivers_dir)
|
||
|
+ mk->drivers_dir = kobject_create_and_add("drivers", &mk->kobj);
|
||
|
+ mutex_unlock(&drivers_dir_mutex);
|
||
|
}
|
||
|
|
||
|
void module_add_driver(struct module *mod, struct device_driver *drv)
|
||
|
diff --git a/drivers/crypto/ux500/hash/hash_core.c b/drivers/crypto/ux500/hash/hash_core.c
|
||
|
index 8e5e0187506f..3ff21c3e9ab2 100644
|
||
|
--- a/drivers/crypto/ux500/hash/hash_core.c
|
||
|
+++ b/drivers/crypto/ux500/hash/hash_core.c
|
||
|
@@ -797,7 +797,7 @@ static int hash_process_data(struct hash_device_data *device_data,
|
||
|
&device_data->state);
|
||
|
memmove(req_ctx->state.buffer,
|
||
|
device_data->state.buffer,
|
||
|
- HASH_BLOCK_SIZE / sizeof(u32));
|
||
|
+ HASH_BLOCK_SIZE);
|
||
|
if (ret) {
|
||
|
dev_err(device_data->dev,
|
||
|
"%s: hash_resume_state() failed!\n",
|
||
|
@@ -848,7 +848,7 @@ static int hash_process_data(struct hash_device_data *device_data,
|
||
|
|
||
|
memmove(device_data->state.buffer,
|
||
|
req_ctx->state.buffer,
|
||
|
- HASH_BLOCK_SIZE / sizeof(u32));
|
||
|
+ HASH_BLOCK_SIZE);
|
||
|
if (ret) {
|
||
|
dev_err(device_data->dev, "%s: hash_save_state() failed!\n",
|
||
|
__func__);
|
||
|
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
|
||
|
index 0a9d1fd32994..d30aba867a3a 100644
|
||
|
--- a/drivers/gpu/drm/i915/intel_display.c
|
||
|
+++ b/drivers/gpu/drm/i915/intel_display.c
|
||
|
@@ -5590,12 +5590,14 @@ static void ironlake_init_pch_refclk(struct drm_device *dev)
|
||
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||
|
struct drm_mode_config *mode_config = &dev->mode_config;
|
||
|
struct intel_encoder *encoder;
|
||
|
+ int i;
|
||
|
u32 val, final;
|
||
|
bool has_lvds = false;
|
||
|
bool has_cpu_edp = false;
|
||
|
bool has_panel = false;
|
||
|
bool has_ck505 = false;
|
||
|
bool can_ssc = false;
|
||
|
+ bool using_ssc_source = false;
|
||
|
|
||
|
/* We need to take the global config into account */
|
||
|
list_for_each_entry(encoder, &mode_config->encoder_list,
|
||
|
@@ -5621,8 +5623,22 @@ static void ironlake_init_pch_refclk(struct drm_device *dev)
|
||
|
can_ssc = true;
|
||
|
}
|
||
|
|
||
|
- DRM_DEBUG_KMS("has_panel %d has_lvds %d has_ck505 %d\n",
|
||
|
- has_panel, has_lvds, has_ck505);
|
||
|
+ /* Check if any DPLLs are using the SSC source */
|
||
|
+ for (i = 0; i < dev_priv->num_shared_dpll; i++) {
|
||
|
+ u32 temp = I915_READ(PCH_DPLL(i));
|
||
|
+
|
||
|
+ if (!(temp & DPLL_VCO_ENABLE))
|
||
|
+ continue;
|
||
|
+
|
||
|
+ if ((temp & PLL_REF_INPUT_MASK) ==
|
||
|
+ PLLB_REF_INPUT_SPREADSPECTRUMIN) {
|
||
|
+ using_ssc_source = true;
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ DRM_DEBUG_KMS("has_panel %d has_lvds %d has_ck505 %d using_ssc_source %d\n",
|
||
|
+ has_panel, has_lvds, has_ck505, using_ssc_source);
|
||
|
|
||
|
/* Ironlake: try to setup display ref clock before DPLL
|
||
|
* enabling. This is only under driver's control after
|
||
|
@@ -5659,9 +5675,9 @@ static void ironlake_init_pch_refclk(struct drm_device *dev)
|
||
|
final |= DREF_CPU_SOURCE_OUTPUT_NONSPREAD;
|
||
|
} else
|
||
|
final |= DREF_CPU_SOURCE_OUTPUT_DISABLE;
|
||
|
- } else {
|
||
|
- final |= DREF_SSC_SOURCE_DISABLE;
|
||
|
- final |= DREF_CPU_SOURCE_OUTPUT_DISABLE;
|
||
|
+ } else if (using_ssc_source) {
|
||
|
+ final |= DREF_SSC_SOURCE_ENABLE;
|
||
|
+ final |= DREF_SSC1_ENABLE;
|
||
|
}
|
||
|
|
||
|
if (final == val)
|
||
|
@@ -5708,7 +5724,7 @@ static void ironlake_init_pch_refclk(struct drm_device *dev)
|
||
|
POSTING_READ(PCH_DREF_CONTROL);
|
||
|
udelay(200);
|
||
|
} else {
|
||
|
- DRM_DEBUG_KMS("Disabling SSC entirely\n");
|
||
|
+ DRM_DEBUG_KMS("Disabling CPU source output\n");
|
||
|
|
||
|
val &= ~DREF_CPU_SOURCE_OUTPUT_MASK;
|
||
|
|
||
|
@@ -5719,16 +5735,20 @@ static void ironlake_init_pch_refclk(struct drm_device *dev)
|
||
|
POSTING_READ(PCH_DREF_CONTROL);
|
||
|
udelay(200);
|
||
|
|
||
|
- /* Turn off the SSC source */
|
||
|
- val &= ~DREF_SSC_SOURCE_MASK;
|
||
|
- val |= DREF_SSC_SOURCE_DISABLE;
|
||
|
+ if (!using_ssc_source) {
|
||
|
+ DRM_DEBUG_KMS("Disabling SSC source\n");
|
||
|
|
||
|
- /* Turn off SSC1 */
|
||
|
- val &= ~DREF_SSC1_ENABLE;
|
||
|
+ /* Turn off the SSC source */
|
||
|
+ val &= ~DREF_SSC_SOURCE_MASK;
|
||
|
+ val |= DREF_SSC_SOURCE_DISABLE;
|
||
|
|
||
|
- I915_WRITE(PCH_DREF_CONTROL, val);
|
||
|
- POSTING_READ(PCH_DREF_CONTROL);
|
||
|
- udelay(200);
|
||
|
+ /* Turn off SSC1 */
|
||
|
+ val &= ~DREF_SSC1_ENABLE;
|
||
|
+
|
||
|
+ I915_WRITE(PCH_DREF_CONTROL, val);
|
||
|
+ POSTING_READ(PCH_DREF_CONTROL);
|
||
|
+ udelay(200);
|
||
|
+ }
|
||
|
}
|
||
|
|
||
|
BUG_ON(val != final);
|
||
|
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
|
||
|
index 129915eca07b..578eb21ca584 100644
|
||
|
--- a/drivers/gpu/drm/radeon/radeon_device.c
|
||
|
+++ b/drivers/gpu/drm/radeon/radeon_device.c
|
||
|
@@ -548,6 +548,23 @@ void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
|
||
|
/*
|
||
|
* GPU helpers function.
|
||
|
*/
|
||
|
+
|
||
|
+/**
|
||
|
+ * radeon_device_is_virtual - check if we are running is a virtual environment
|
||
|
+ *
|
||
|
+ * Check if the asic has been passed through to a VM (all asics).
|
||
|
+ * Used at driver startup.
|
||
|
+ * Returns true if virtual or false if not.
|
||
|
+ */
|
||
|
+static bool radeon_device_is_virtual(void)
|
||
|
+{
|
||
|
+#ifdef CONFIG_X86
|
||
|
+ return boot_cpu_has(X86_FEATURE_HYPERVISOR);
|
||
|
+#else
|
||
|
+ return false;
|
||
|
+#endif
|
||
|
+}
|
||
|
+
|
||
|
/**
|
||
|
* radeon_card_posted - check if the hw has already been initialized
|
||
|
*
|
||
|
@@ -561,6 +578,10 @@ bool radeon_card_posted(struct radeon_device *rdev)
|
||
|
{
|
||
|
uint32_t reg;
|
||
|
|
||
|
+ /* for pass through, always force asic_init */
|
||
|
+ if (radeon_device_is_virtual())
|
||
|
+ return false;
|
||
|
+
|
||
|
/* required for EFI mode on macbook2,1 which uses an r5xx asic */
|
||
|
if (efi_enabled(EFI_BOOT) &&
|
||
|
(rdev->pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE) &&
|
||
|
diff --git a/drivers/hid/hid-elo.c b/drivers/hid/hid-elo.c
|
||
|
index 4e49462870ab..d0c8a1c1e1fe 100644
|
||
|
--- a/drivers/hid/hid-elo.c
|
||
|
+++ b/drivers/hid/hid-elo.c
|
||
|
@@ -259,7 +259,7 @@ static void elo_remove(struct hid_device *hdev)
|
||
|
struct elo_priv *priv = hid_get_drvdata(hdev);
|
||
|
|
||
|
hid_hw_stop(hdev);
|
||
|
- flush_workqueue(wq);
|
||
|
+ cancel_delayed_work_sync(&priv->work);
|
||
|
kfree(priv);
|
||
|
}
|
||
|
|
||
|
diff --git a/drivers/hid/usbhid/hiddev.c b/drivers/hid/usbhid/hiddev.c
|
||
|
index 2f1ddca6f2e0..700145b15088 100644
|
||
|
--- a/drivers/hid/usbhid/hiddev.c
|
||
|
+++ b/drivers/hid/usbhid/hiddev.c
|
||
|
@@ -516,13 +516,13 @@ static noinline int hiddev_ioctl_usage(struct hiddev *hiddev, unsigned int cmd,
|
||
|
goto inval;
|
||
|
} else if (uref->usage_index >= field->report_count)
|
||
|
goto inval;
|
||
|
-
|
||
|
- else if ((cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) &&
|
||
|
- (uref_multi->num_values > HID_MAX_MULTI_USAGES ||
|
||
|
- uref->usage_index + uref_multi->num_values > field->report_count))
|
||
|
- goto inval;
|
||
|
}
|
||
|
|
||
|
+ if ((cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) &&
|
||
|
+ (uref_multi->num_values > HID_MAX_MULTI_USAGES ||
|
||
|
+ uref->usage_index + uref_multi->num_values > field->report_count))
|
||
|
+ goto inval;
|
||
|
+
|
||
|
switch (cmd) {
|
||
|
case HIDIOCGUSAGE:
|
||
|
uref->value = field->value[uref->usage_index];
|
||
|
diff --git a/drivers/iio/accel/kxsd9.c b/drivers/iio/accel/kxsd9.c
|
||
|
index 98ba761cbb9c..d8738d4f8df3 100644
|
||
|
--- a/drivers/iio/accel/kxsd9.c
|
||
|
+++ b/drivers/iio/accel/kxsd9.c
|
||
|
@@ -81,7 +81,7 @@ static int kxsd9_write_scale(struct iio_dev *indio_dev, int micro)
|
||
|
|
||
|
mutex_lock(&st->buf_lock);
|
||
|
ret = spi_w8r8(st->us, KXSD9_READ(KXSD9_REG_CTRL_C));
|
||
|
- if (ret)
|
||
|
+ if (ret < 0)
|
||
|
goto error_ret;
|
||
|
st->tx[0] = KXSD9_WRITE(KXSD9_REG_CTRL_C);
|
||
|
st->tx[1] = (ret & ~KXSD9_FS_MASK) | i;
|
||
|
@@ -163,7 +163,7 @@ static int kxsd9_read_raw(struct iio_dev *indio_dev,
|
||
|
break;
|
||
|
case IIO_CHAN_INFO_SCALE:
|
||
|
ret = spi_w8r8(st->us, KXSD9_READ(KXSD9_REG_CTRL_C));
|
||
|
- if (ret)
|
||
|
+ if (ret < 0)
|
||
|
goto error_ret;
|
||
|
*val2 = kxsd9_micro_scales[ret & KXSD9_FS_MASK];
|
||
|
ret = IIO_VAL_INT_PLUS_MICRO;
|
||
|
diff --git a/drivers/iio/adc/ad7266.c b/drivers/iio/adc/ad7266.c
|
||
|
index 70f78c3062a7..8e2b9e70511d 100644
|
||
|
--- a/drivers/iio/adc/ad7266.c
|
||
|
+++ b/drivers/iio/adc/ad7266.c
|
||
|
@@ -396,8 +396,8 @@ static int ad7266_probe(struct spi_device *spi)
|
||
|
|
||
|
st = iio_priv(indio_dev);
|
||
|
|
||
|
- st->reg = devm_regulator_get(&spi->dev, "vref");
|
||
|
- if (!IS_ERR_OR_NULL(st->reg)) {
|
||
|
+ st->reg = devm_regulator_get_optional(&spi->dev, "vref");
|
||
|
+ if (!IS_ERR(st->reg)) {
|
||
|
ret = regulator_enable(st->reg);
|
||
|
if (ret)
|
||
|
return ret;
|
||
|
@@ -408,6 +408,9 @@ static int ad7266_probe(struct spi_device *spi)
|
||
|
|
||
|
st->vref_mv = ret / 1000;
|
||
|
} else {
|
||
|
+ /* Any other error indicates that the regulator does exist */
|
||
|
+ if (PTR_ERR(st->reg) != -ENODEV)
|
||
|
+ return PTR_ERR(st->reg);
|
||
|
/* Use internal reference */
|
||
|
st->vref_mv = 2500;
|
||
|
}
|
||
|
diff --git a/drivers/iio/industrialio-trigger.c b/drivers/iio/industrialio-trigger.c
|
||
|
index 766fab24b720..bc7f51f9a00a 100644
|
||
|
--- a/drivers/iio/industrialio-trigger.c
|
||
|
+++ b/drivers/iio/industrialio-trigger.c
|
||
|
@@ -205,22 +205,35 @@ static int iio_trigger_attach_poll_func(struct iio_trigger *trig,
|
||
|
|
||
|
/* Prevent the module from being removed whilst attached to a trigger */
|
||
|
__module_get(pf->indio_dev->info->driver_module);
|
||
|
+
|
||
|
+ /* Get irq number */
|
||
|
pf->irq = iio_trigger_get_irq(trig);
|
||
|
+ if (pf->irq < 0)
|
||
|
+ goto out_put_module;
|
||
|
+
|
||
|
+ /* Request irq */
|
||
|
ret = request_threaded_irq(pf->irq, pf->h, pf->thread,
|
||
|
pf->type, pf->name,
|
||
|
pf);
|
||
|
- if (ret < 0) {
|
||
|
- module_put(pf->indio_dev->info->driver_module);
|
||
|
- return ret;
|
||
|
- }
|
||
|
+ if (ret < 0)
|
||
|
+ goto out_put_irq;
|
||
|
|
||
|
+ /* Enable trigger in driver */
|
||
|
if (trig->ops && trig->ops->set_trigger_state && notinuse) {
|
||
|
ret = trig->ops->set_trigger_state(trig, true);
|
||
|
if (ret < 0)
|
||
|
- module_put(pf->indio_dev->info->driver_module);
|
||
|
+ goto out_free_irq;
|
||
|
}
|
||
|
|
||
|
return ret;
|
||
|
+
|
||
|
+out_free_irq:
|
||
|
+ free_irq(pf->irq, pf);
|
||
|
+out_put_irq:
|
||
|
+ iio_trigger_put_irq(trig, pf->irq);
|
||
|
+out_put_module:
|
||
|
+ module_put(pf->indio_dev->info->driver_module);
|
||
|
+ return ret;
|
||
|
}
|
||
|
|
||
|
static int iio_trigger_detach_poll_func(struct iio_trigger *trig,
|
||
|
diff --git a/drivers/infiniband/hw/mlx4/ah.c b/drivers/infiniband/hw/mlx4/ah.c
|
||
|
index 1ddcebd84622..e05c73aeec66 100644
|
||
|
--- a/drivers/infiniband/hw/mlx4/ah.c
|
||
|
+++ b/drivers/infiniband/hw/mlx4/ah.c
|
||
|
@@ -46,6 +46,7 @@ static struct ib_ah *create_ib_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr,
|
||
|
|
||
|
ah->av.ib.port_pd = cpu_to_be32(to_mpd(pd)->pdn | (ah_attr->port_num << 24));
|
||
|
ah->av.ib.g_slid = ah_attr->src_path_bits;
|
||
|
+ ah->av.ib.sl_tclass_flowlabel = cpu_to_be32(ah_attr->sl << 28);
|
||
|
if (ah_attr->ah_flags & IB_AH_GRH) {
|
||
|
ah->av.ib.g_slid |= 0x80;
|
||
|
ah->av.ib.gid_index = ah_attr->grh.sgid_index;
|
||
|
@@ -63,7 +64,6 @@ static struct ib_ah *create_ib_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr,
|
||
|
!(1 << ah->av.ib.stat_rate & dev->caps.stat_rate_support))
|
||
|
--ah->av.ib.stat_rate;
|
||
|
}
|
||
|
- ah->av.ib.sl_tclass_flowlabel = cpu_to_be32(ah_attr->sl << 28);
|
||
|
|
||
|
return &ah->ibah;
|
||
|
}
|
||
|
diff --git a/drivers/net/ethernet/atheros/alx/main.c b/drivers/net/ethernet/atheros/alx/main.c
|
||
|
index 3e1d7d29b4ec..758596021cf0 100644
|
||
|
--- a/drivers/net/ethernet/atheros/alx/main.c
|
||
|
+++ b/drivers/net/ethernet/atheros/alx/main.c
|
||
|
@@ -86,9 +86,14 @@ static int alx_refill_rx_ring(struct alx_priv *alx, gfp_t gfp)
|
||
|
while (!cur_buf->skb && next != rxq->read_idx) {
|
||
|
struct alx_rfd *rfd = &rxq->rfd[cur];
|
||
|
|
||
|
- skb = __netdev_alloc_skb(alx->dev, alx->rxbuf_size, gfp);
|
||
|
+ skb = __netdev_alloc_skb(alx->dev, alx->rxbuf_size + 64, gfp);
|
||
|
if (!skb)
|
||
|
break;
|
||
|
+
|
||
|
+ /* Workround for the HW RX DMA overflow issue */
|
||
|
+ if (((unsigned long)skb->data & 0xfff) == 0xfc0)
|
||
|
+ skb_reserve(skb, 64);
|
||
|
+
|
||
|
dma = dma_map_single(&alx->hw.pdev->dev,
|
||
|
skb->data, alx->rxbuf_size,
|
||
|
DMA_FROM_DEVICE);
|
||
|
diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c
|
||
|
index c6637229bdb8..584504e6e95c 100644
|
||
|
--- a/drivers/net/usb/cdc_ncm.c
|
||
|
+++ b/drivers/net/usb/cdc_ncm.c
|
||
|
@@ -438,6 +438,13 @@ advance:
|
||
|
if (cdc_ncm_setup(dev))
|
||
|
goto error2;
|
||
|
|
||
|
+ /* Some firmwares need a pause here or they will silently fail
|
||
|
+ * to set up the interface properly. This value was decided
|
||
|
+ * empirically on a Sierra Wireless MC7455 running 02.08.02.00
|
||
|
+ * firmware.
|
||
|
+ */
|
||
|
+ usleep_range(10000, 20000);
|
||
|
+
|
||
|
/* configure data interface */
|
||
|
temp = usb_set_interface(dev->udev, iface_no, data_altsetting);
|
||
|
if (temp) {
|
||
|
diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
|
||
|
index 505ff601d9f4..cb58ad0311da 100644
|
||
|
--- a/drivers/net/wireless/mac80211_hwsim.c
|
||
|
+++ b/drivers/net/wireless/mac80211_hwsim.c
|
||
|
@@ -2251,6 +2251,7 @@ static int hwsim_tx_info_frame_received_nl(struct sk_buff *skb_2,
|
||
|
if (!info->attrs[HWSIM_ATTR_ADDR_TRANSMITTER] ||
|
||
|
!info->attrs[HWSIM_ATTR_FLAGS] ||
|
||
|
!info->attrs[HWSIM_ATTR_COOKIE] ||
|
||
|
+ !info->attrs[HWSIM_ATTR_SIGNAL] ||
|
||
|
!info->attrs[HWSIM_ATTR_TX_INFO])
|
||
|
goto out;
|
||
|
|
||
|
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
|
||
|
index 787c8a883c3c..e11ca1f7bef6 100644
|
||
|
--- a/drivers/scsi/scsi_error.c
|
||
|
+++ b/drivers/scsi/scsi_error.c
|
||
|
@@ -1111,7 +1111,6 @@ static int scsi_eh_action(struct scsi_cmnd *scmd, int rtn)
|
||
|
*/
|
||
|
void scsi_eh_finish_cmd(struct scsi_cmnd *scmd, struct list_head *done_q)
|
||
|
{
|
||
|
- scmd->device->host->host_failed--;
|
||
|
scmd->eh_eflags = 0;
|
||
|
list_move_tail(&scmd->eh_entry, done_q);
|
||
|
}
|
||
|
@@ -2193,6 +2192,9 @@ int scsi_error_handler(void *data)
|
||
|
else
|
||
|
scsi_unjam_host(shost);
|
||
|
|
||
|
+ /* All scmds have been handled */
|
||
|
+ shost->host_failed = 0;
|
||
|
+
|
||
|
/*
|
||
|
* Note - if the above fails completely, the action is to take
|
||
|
* individual devices offline and flush the queue of any
|
||
|
diff --git a/drivers/staging/iio/accel/sca3000_core.c b/drivers/staging/iio/accel/sca3000_core.c
|
||
|
index 7f6ccdfaf168..99e148899404 100644
|
||
|
--- a/drivers/staging/iio/accel/sca3000_core.c
|
||
|
+++ b/drivers/staging/iio/accel/sca3000_core.c
|
||
|
@@ -592,7 +592,7 @@ static ssize_t sca3000_read_frequency(struct device *dev,
|
||
|
goto error_ret_mut;
|
||
|
ret = sca3000_read_ctrl_reg(st, SCA3000_REG_CTRL_SEL_OUT_CTRL);
|
||
|
mutex_unlock(&st->lock);
|
||
|
- if (ret)
|
||
|
+ if (ret < 0)
|
||
|
goto error_ret;
|
||
|
val = ret;
|
||
|
if (base_freq > 0)
|
||
|
diff --git a/drivers/tty/vt/keyboard.c b/drivers/tty/vt/keyboard.c
|
||
|
index d0e3a4497707..adf4d3124cc6 100644
|
||
|
--- a/drivers/tty/vt/keyboard.c
|
||
|
+++ b/drivers/tty/vt/keyboard.c
|
||
|
@@ -365,34 +365,22 @@ static void to_utf8(struct vc_data *vc, uint c)
|
||
|
|
||
|
static void do_compute_shiftstate(void)
|
||
|
{
|
||
|
- unsigned int i, j, k, sym, val;
|
||
|
+ unsigned int k, sym, val;
|
||
|
|
||
|
shift_state = 0;
|
||
|
memset(shift_down, 0, sizeof(shift_down));
|
||
|
|
||
|
- for (i = 0; i < ARRAY_SIZE(key_down); i++) {
|
||
|
-
|
||
|
- if (!key_down[i])
|
||
|
+ for_each_set_bit(k, key_down, min(NR_KEYS, KEY_CNT)) {
|
||
|
+ sym = U(key_maps[0][k]);
|
||
|
+ if (KTYP(sym) != KT_SHIFT && KTYP(sym) != KT_SLOCK)
|
||
|
continue;
|
||
|
|
||
|
- k = i * BITS_PER_LONG;
|
||
|
-
|
||
|
- for (j = 0; j < BITS_PER_LONG; j++, k++) {
|
||
|
-
|
||
|
- if (!test_bit(k, key_down))
|
||
|
- continue;
|
||
|
+ val = KVAL(sym);
|
||
|
+ if (val == KVAL(K_CAPSSHIFT))
|
||
|
+ val = KVAL(K_SHIFT);
|
||
|
|
||
|
- sym = U(key_maps[0][k]);
|
||
|
- if (KTYP(sym) != KT_SHIFT && KTYP(sym) != KT_SLOCK)
|
||
|
- continue;
|
||
|
-
|
||
|
- val = KVAL(sym);
|
||
|
- if (val == KVAL(K_CAPSSHIFT))
|
||
|
- val = KVAL(K_SHIFT);
|
||
|
-
|
||
|
- shift_down[val]++;
|
||
|
- shift_state |= (1 << val);
|
||
|
- }
|
||
|
+ shift_down[val]++;
|
||
|
+ shift_state |= BIT(val);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
|
||
|
index 00addda9ad53..b6c85fbd0a14 100644
|
||
|
--- a/drivers/usb/core/quirks.c
|
||
|
+++ b/drivers/usb/core/quirks.c
|
||
|
@@ -205,6 +205,9 @@ static const struct usb_device_id usb_amd_resume_quirk_list[] = {
|
||
|
/* Logitech Optical Mouse M90/M100 */
|
||
|
{ USB_DEVICE(0x046d, 0xc05a), .driver_info = USB_QUIRK_RESET_RESUME },
|
||
|
|
||
|
+ /* Acer C120 LED Projector */
|
||
|
+ { USB_DEVICE(0x1de1, 0xc102), .driver_info = USB_QUIRK_NO_LPM },
|
||
|
+
|
||
|
/* Blackmagic Design Intensity Shuttle */
|
||
|
{ USB_DEVICE(0x1edb, 0xbd3b), .driver_info = USB_QUIRK_NO_LPM },
|
||
|
|
||
|
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c
|
||
|
index 6b0fb6af6815..a2df3e7e66e2 100644
|
||
|
--- a/drivers/usb/musb/musb_host.c
|
||
|
+++ b/drivers/usb/musb/musb_host.c
|
||
|
@@ -583,14 +583,13 @@ musb_rx_reinit(struct musb *musb, struct musb_qh *qh, struct musb_hw_ep *ep)
|
||
|
musb_writew(ep->regs, MUSB_TXCSR, 0);
|
||
|
|
||
|
/* scrub all previous state, clearing toggle */
|
||
|
- } else {
|
||
|
- csr = musb_readw(ep->regs, MUSB_RXCSR);
|
||
|
- if (csr & MUSB_RXCSR_RXPKTRDY)
|
||
|
- WARNING("rx%d, packet/%d ready?\n", ep->epnum,
|
||
|
- musb_readw(ep->regs, MUSB_RXCOUNT));
|
||
|
-
|
||
|
- musb_h_flush_rxfifo(ep, MUSB_RXCSR_CLRDATATOG);
|
||
|
}
|
||
|
+ csr = musb_readw(ep->regs, MUSB_RXCSR);
|
||
|
+ if (csr & MUSB_RXCSR_RXPKTRDY)
|
||
|
+ WARNING("rx%d, packet/%d ready?\n", ep->epnum,
|
||
|
+ musb_readw(ep->regs, MUSB_RXCOUNT));
|
||
|
+
|
||
|
+ musb_h_flush_rxfifo(ep, MUSB_RXCSR_CLRDATATOG);
|
||
|
|
||
|
/* target addr and (for multipoint) hub addr/port */
|
||
|
if (musb->is_multipoint) {
|
||
|
@@ -950,9 +949,15 @@ static void musb_bulk_nak_timeout(struct musb *musb, struct musb_hw_ep *ep,
|
||
|
if (is_in) {
|
||
|
dma = is_dma_capable() ? ep->rx_channel : NULL;
|
||
|
|
||
|
- /* clear nak timeout bit */
|
||
|
+ /*
|
||
|
+ * Need to stop the transaction by clearing REQPKT first
|
||
|
+ * then the NAK Timeout bit ref MUSBMHDRC USB 2.0 HIGH-SPEED
|
||
|
+ * DUAL-ROLE CONTROLLER Programmer's Guide, section 9.2.2
|
||
|
+ */
|
||
|
rx_csr = musb_readw(epio, MUSB_RXCSR);
|
||
|
rx_csr |= MUSB_RXCSR_H_WZC_BITS;
|
||
|
+ rx_csr &= ~MUSB_RXCSR_H_REQPKT;
|
||
|
+ musb_writew(epio, MUSB_RXCSR, rx_csr);
|
||
|
rx_csr &= ~MUSB_RXCSR_DATAERROR;
|
||
|
musb_writew(epio, MUSB_RXCSR, rx_csr);
|
||
|
|
||
|
diff --git a/drivers/xen/xen-acpi-processor.c b/drivers/xen/xen-acpi-processor.c
|
||
|
index 7231859119f1..9deb30b0e077 100644
|
||
|
--- a/drivers/xen/xen-acpi-processor.c
|
||
|
+++ b/drivers/xen/xen-acpi-processor.c
|
||
|
@@ -423,36 +423,7 @@ upload:
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
-static int __init check_prereq(void)
|
||
|
-{
|
||
|
- struct cpuinfo_x86 *c = &cpu_data(0);
|
||
|
-
|
||
|
- if (!xen_initial_domain())
|
||
|
- return -ENODEV;
|
||
|
-
|
||
|
- if (!acpi_gbl_FADT.smi_command)
|
||
|
- return -ENODEV;
|
||
|
-
|
||
|
- if (c->x86_vendor == X86_VENDOR_INTEL) {
|
||
|
- if (!cpu_has(c, X86_FEATURE_EST))
|
||
|
- return -ENODEV;
|
||
|
|
||
|
- return 0;
|
||
|
- }
|
||
|
- if (c->x86_vendor == X86_VENDOR_AMD) {
|
||
|
- /* Copied from powernow-k8.h, can't include ../cpufreq/powernow
|
||
|
- * as we get compile warnings for the static functions.
|
||
|
- */
|
||
|
-#define CPUID_FREQ_VOLT_CAPABILITIES 0x80000007
|
||
|
-#define USE_HW_PSTATE 0x00000080
|
||
|
- u32 eax, ebx, ecx, edx;
|
||
|
- cpuid(CPUID_FREQ_VOLT_CAPABILITIES, &eax, &ebx, &ecx, &edx);
|
||
|
- if ((edx & USE_HW_PSTATE) != USE_HW_PSTATE)
|
||
|
- return -ENODEV;
|
||
|
- return 0;
|
||
|
- }
|
||
|
- return -ENODEV;
|
||
|
-}
|
||
|
/* acpi_perf_data is a pointer to percpu data. */
|
||
|
static struct acpi_processor_performance __percpu *acpi_perf_data;
|
||
|
|
||
|
@@ -508,10 +479,10 @@ static struct syscore_ops xap_syscore_ops = {
|
||
|
static int __init xen_acpi_processor_init(void)
|
||
|
{
|
||
|
unsigned int i;
|
||
|
- int rc = check_prereq();
|
||
|
+ int rc;
|
||
|
|
||
|
- if (rc)
|
||
|
- return rc;
|
||
|
+ if (!xen_initial_domain())
|
||
|
+ return -ENODEV;
|
||
|
|
||
|
nr_acpi_bits = get_max_acpi_id() + 1;
|
||
|
acpi_ids_done = kcalloc(BITS_TO_LONGS(nr_acpi_bits), sizeof(unsigned long), GFP_KERNEL);
|
||
|
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
|
||
|
index 8813ff776ba3..7522829b29ef 100644
|
||
|
--- a/fs/cifs/connect.c
|
||
|
+++ b/fs/cifs/connect.c
|
||
|
@@ -410,7 +410,9 @@ cifs_echo_request(struct work_struct *work)
|
||
|
* server->ops->need_neg() == true. Also, no need to ping if
|
||
|
* we got a response recently.
|
||
|
*/
|
||
|
- if (!server->ops->need_neg || server->ops->need_neg(server) ||
|
||
|
+
|
||
|
+ if (server->tcpStatus == CifsNeedReconnect ||
|
||
|
+ server->tcpStatus == CifsExiting || server->tcpStatus == CifsNew ||
|
||
|
(server->ops->can_echo && !server->ops->can_echo(server)) ||
|
||
|
time_before(jiffies, server->lstrp + SMB_ECHO_INTERVAL - HZ))
|
||
|
goto requeue_echo;
|
||
|
diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
|
||
|
index fc656bc5d6cb..e83f7d2b585b 100644
|
||
|
--- a/fs/cifs/smb2pdu.c
|
||
|
+++ b/fs/cifs/smb2pdu.c
|
||
|
@@ -1590,6 +1590,33 @@ SMB2_echo(struct TCP_Server_Info *server)
|
||
|
|
||
|
cifs_dbg(FYI, "In echo request\n");
|
||
|
|
||
|
+ if (server->tcpStatus == CifsNeedNegotiate) {
|
||
|
+ struct list_head *tmp, *tmp2;
|
||
|
+ struct cifs_ses *ses;
|
||
|
+ struct cifs_tcon *tcon;
|
||
|
+
|
||
|
+ cifs_dbg(FYI, "Need negotiate, reconnecting tcons\n");
|
||
|
+ spin_lock(&cifs_tcp_ses_lock);
|
||
|
+ list_for_each(tmp, &server->smb_ses_list) {
|
||
|
+ ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
|
||
|
+ list_for_each(tmp2, &ses->tcon_list) {
|
||
|
+ tcon = list_entry(tmp2, struct cifs_tcon,
|
||
|
+ tcon_list);
|
||
|
+ /* add check for persistent handle reconnect */
|
||
|
+ if (tcon && tcon->need_reconnect) {
|
||
|
+ spin_unlock(&cifs_tcp_ses_lock);
|
||
|
+ rc = smb2_reconnect(SMB2_ECHO, tcon);
|
||
|
+ spin_lock(&cifs_tcp_ses_lock);
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ spin_unlock(&cifs_tcp_ses_lock);
|
||
|
+ }
|
||
|
+
|
||
|
+ /* if no session, renegotiate failed above */
|
||
|
+ if (server->tcpStatus == CifsNeedNegotiate)
|
||
|
+ return -EIO;
|
||
|
+
|
||
|
rc = small_smb2_init(SMB2_ECHO, NULL, (void **)&req);
|
||
|
if (rc)
|
||
|
return rc;
|
||
|
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
|
||
|
index 4a48fe4b84b6..589418d44310 100644
|
||
|
--- a/fs/nfs/dir.c
|
||
|
+++ b/fs/nfs/dir.c
|
||
|
@@ -1459,9 +1459,9 @@ int nfs_atomic_open(struct inode *dir, struct dentry *dentry,
|
||
|
err = PTR_ERR(inode);
|
||
|
trace_nfs_atomic_open_exit(dir, ctx, open_flags, err);
|
||
|
put_nfs_open_context(ctx);
|
||
|
+ d_drop(dentry);
|
||
|
switch (err) {
|
||
|
case -ENOENT:
|
||
|
- d_drop(dentry);
|
||
|
d_add(dentry, NULL);
|
||
|
break;
|
||
|
case -EISDIR:
|
||
|
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
|
||
|
index 3b5e86fd2800..98eae9cc78be 100644
|
||
|
--- a/fs/nfs/nfs4proc.c
|
||
|
+++ b/fs/nfs/nfs4proc.c
|
||
|
@@ -2583,12 +2583,11 @@ static void nfs4_close_prepare(struct rpc_task *task, void *data)
|
||
|
call_close |= is_wronly;
|
||
|
else if (is_wronly)
|
||
|
calldata->arg.fmode |= FMODE_WRITE;
|
||
|
+ if (calldata->arg.fmode != (FMODE_READ|FMODE_WRITE))
|
||
|
+ call_close |= is_rdwr;
|
||
|
} else if (is_rdwr)
|
||
|
calldata->arg.fmode |= FMODE_READ|FMODE_WRITE;
|
||
|
|
||
|
- if (calldata->arg.fmode == 0)
|
||
|
- call_close |= is_rdwr;
|
||
|
-
|
||
|
if (!nfs4_valid_open_stateid(state))
|
||
|
call_close = 0;
|
||
|
spin_unlock(&state->owner->so_lock);
|
||
|
diff --git a/fs/nfsd/nfs2acl.c b/fs/nfsd/nfs2acl.c
|
||
|
index 11c1fba29312..f8e5593884a5 100644
|
||
|
--- a/fs/nfsd/nfs2acl.c
|
||
|
+++ b/fs/nfsd/nfs2acl.c
|
||
|
@@ -104,22 +104,21 @@ static __be32 nfsacld_proc_setacl(struct svc_rqst * rqstp,
|
||
|
goto out;
|
||
|
|
||
|
inode = fh->fh_dentry->d_inode;
|
||
|
- if (!IS_POSIXACL(inode) || !inode->i_op->set_acl) {
|
||
|
- error = -EOPNOTSUPP;
|
||
|
- goto out_errno;
|
||
|
- }
|
||
|
|
||
|
error = fh_want_write(fh);
|
||
|
if (error)
|
||
|
goto out_errno;
|
||
|
|
||
|
- error = inode->i_op->set_acl(inode, argp->acl_access, ACL_TYPE_ACCESS);
|
||
|
+ fh_lock(fh);
|
||
|
+
|
||
|
+ error = set_posix_acl(inode, ACL_TYPE_ACCESS, argp->acl_access);
|
||
|
if (error)
|
||
|
- goto out_drop_write;
|
||
|
- error = inode->i_op->set_acl(inode, argp->acl_default,
|
||
|
- ACL_TYPE_DEFAULT);
|
||
|
+ goto out_drop_lock;
|
||
|
+ error = set_posix_acl(inode, ACL_TYPE_DEFAULT, argp->acl_default);
|
||
|
if (error)
|
||
|
- goto out_drop_write;
|
||
|
+ goto out_drop_lock;
|
||
|
+
|
||
|
+ fh_unlock(fh);
|
||
|
|
||
|
fh_drop_write(fh);
|
||
|
|
||
|
@@ -131,7 +130,8 @@ out:
|
||
|
posix_acl_release(argp->acl_access);
|
||
|
posix_acl_release(argp->acl_default);
|
||
|
return nfserr;
|
||
|
-out_drop_write:
|
||
|
+out_drop_lock:
|
||
|
+ fh_unlock(fh);
|
||
|
fh_drop_write(fh);
|
||
|
out_errno:
|
||
|
nfserr = nfserrno(error);
|
||
|
diff --git a/fs/nfsd/nfs3acl.c b/fs/nfsd/nfs3acl.c
|
||
|
index adc5f1b1dc26..bcfef1c2b2a5 100644
|
||
|
--- a/fs/nfsd/nfs3acl.c
|
||
|
+++ b/fs/nfsd/nfs3acl.c
|
||
|
@@ -95,22 +95,20 @@ static __be32 nfsd3_proc_setacl(struct svc_rqst * rqstp,
|
||
|
goto out;
|
||
|
|
||
|
inode = fh->fh_dentry->d_inode;
|
||
|
- if (!IS_POSIXACL(inode) || !inode->i_op->set_acl) {
|
||
|
- error = -EOPNOTSUPP;
|
||
|
- goto out_errno;
|
||
|
- }
|
||
|
|
||
|
error = fh_want_write(fh);
|
||
|
if (error)
|
||
|
goto out_errno;
|
||
|
|
||
|
- error = inode->i_op->set_acl(inode, argp->acl_access, ACL_TYPE_ACCESS);
|
||
|
+ fh_lock(fh);
|
||
|
+
|
||
|
+ error = set_posix_acl(inode, ACL_TYPE_ACCESS, argp->acl_access);
|
||
|
if (error)
|
||
|
- goto out_drop_write;
|
||
|
- error = inode->i_op->set_acl(inode, argp->acl_default,
|
||
|
- ACL_TYPE_DEFAULT);
|
||
|
+ goto out_drop_lock;
|
||
|
+ error = set_posix_acl(inode, ACL_TYPE_DEFAULT, argp->acl_default);
|
||
|
|
||
|
-out_drop_write:
|
||
|
+out_drop_lock:
|
||
|
+ fh_unlock(fh);
|
||
|
fh_drop_write(fh);
|
||
|
out_errno:
|
||
|
nfserr = nfserrno(error);
|
||
|
diff --git a/fs/nfsd/nfs4acl.c b/fs/nfsd/nfs4acl.c
|
||
|
index dea8c60954ba..1e8857b6dbba 100644
|
||
|
--- a/fs/nfsd/nfs4acl.c
|
||
|
+++ b/fs/nfsd/nfs4acl.c
|
||
|
@@ -818,9 +818,6 @@ nfsd4_set_nfs4_acl(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
||
|
dentry = fhp->fh_dentry;
|
||
|
inode = dentry->d_inode;
|
||
|
|
||
|
- if (!inode->i_op->set_acl || !IS_POSIXACL(inode))
|
||
|
- return nfserr_attrnotsupp;
|
||
|
-
|
||
|
if (S_ISDIR(inode->i_mode))
|
||
|
flags = NFS4_ACL_DIR;
|
||
|
|
||
|
@@ -830,16 +827,19 @@ nfsd4_set_nfs4_acl(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
||
|
if (host_error < 0)
|
||
|
goto out_nfserr;
|
||
|
|
||
|
- host_error = inode->i_op->set_acl(inode, pacl, ACL_TYPE_ACCESS);
|
||
|
+ fh_lock(fhp);
|
||
|
+
|
||
|
+ host_error = set_posix_acl(inode, ACL_TYPE_ACCESS, pacl);
|
||
|
if (host_error < 0)
|
||
|
- goto out_release;
|
||
|
+ goto out_drop_lock;
|
||
|
|
||
|
if (S_ISDIR(inode->i_mode)) {
|
||
|
- host_error = inode->i_op->set_acl(inode, dpacl,
|
||
|
- ACL_TYPE_DEFAULT);
|
||
|
+ host_error = set_posix_acl(inode, ACL_TYPE_DEFAULT, dpacl);
|
||
|
}
|
||
|
|
||
|
-out_release:
|
||
|
+out_drop_lock:
|
||
|
+ fh_unlock(fhp);
|
||
|
+
|
||
|
posix_acl_release(pacl);
|
||
|
posix_acl_release(dpacl);
|
||
|
out_nfserr:
|
||
|
diff --git a/fs/posix_acl.c b/fs/posix_acl.c
|
||
|
index 0855f772cd41..3de7c223c963 100644
|
||
|
--- a/fs/posix_acl.c
|
||
|
+++ b/fs/posix_acl.c
|
||
|
@@ -787,38 +787,42 @@ posix_acl_xattr_get(struct dentry *dentry, const char *name,
|
||
|
return error;
|
||
|
}
|
||
|
|
||
|
-static int
|
||
|
-posix_acl_xattr_set(struct dentry *dentry, const char *name,
|
||
|
- const void *value, size_t size, int flags, int type)
|
||
|
+int
|
||
|
+set_posix_acl(struct inode *inode, int type, struct posix_acl *acl)
|
||
|
{
|
||
|
- struct inode *inode = dentry->d_inode;
|
||
|
- struct posix_acl *acl = NULL;
|
||
|
- int ret;
|
||
|
-
|
||
|
if (!IS_POSIXACL(inode))
|
||
|
return -EOPNOTSUPP;
|
||
|
if (!inode->i_op->set_acl)
|
||
|
return -EOPNOTSUPP;
|
||
|
|
||
|
if (type == ACL_TYPE_DEFAULT && !S_ISDIR(inode->i_mode))
|
||
|
- return value ? -EACCES : 0;
|
||
|
+ return acl ? -EACCES : 0;
|
||
|
if (!inode_owner_or_capable(inode))
|
||
|
return -EPERM;
|
||
|
|
||
|
+ if (acl) {
|
||
|
+ int ret = posix_acl_valid(acl);
|
||
|
+ if (ret)
|
||
|
+ return ret;
|
||
|
+ }
|
||
|
+ return inode->i_op->set_acl(inode, acl, type);
|
||
|
+}
|
||
|
+EXPORT_SYMBOL(set_posix_acl);
|
||
|
+
|
||
|
+static int
|
||
|
+posix_acl_xattr_set(struct dentry *dentry, const char *name,
|
||
|
+ const void *value, size_t size, int flags, int type)
|
||
|
+{
|
||
|
+ struct inode *inode = dentry->d_inode;
|
||
|
+ struct posix_acl *acl = NULL;
|
||
|
+ int ret;
|
||
|
+
|
||
|
if (value) {
|
||
|
acl = posix_acl_from_xattr(&init_user_ns, value, size);
|
||
|
if (IS_ERR(acl))
|
||
|
return PTR_ERR(acl);
|
||
|
-
|
||
|
- if (acl) {
|
||
|
- ret = posix_acl_valid(acl);
|
||
|
- if (ret)
|
||
|
- goto out;
|
||
|
- }
|
||
|
}
|
||
|
-
|
||
|
- ret = inode->i_op->set_acl(inode, acl, type);
|
||
|
-out:
|
||
|
+ ret = set_posix_acl(inode, type, acl);
|
||
|
posix_acl_release(acl);
|
||
|
return ret;
|
||
|
}
|
||
|
diff --git a/fs/ubifs/file.c b/fs/ubifs/file.c
|
||
|
index b56eb6275744..c0d8fde3e6d9 100644
|
||
|
--- a/fs/ubifs/file.c
|
||
|
+++ b/fs/ubifs/file.c
|
||
|
@@ -54,6 +54,7 @@
|
||
|
#include <linux/mount.h>
|
||
|
#include <linux/namei.h>
|
||
|
#include <linux/slab.h>
|
||
|
+#include <linux/migrate.h>
|
||
|
|
||
|
static int read_block(struct inode *inode, void *addr, unsigned int block,
|
||
|
struct ubifs_data_node *dn)
|
||
|
@@ -1423,6 +1424,26 @@ static int ubifs_set_page_dirty(struct page *page)
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
+#ifdef CONFIG_MIGRATION
|
||
|
+static int ubifs_migrate_page(struct address_space *mapping,
|
||
|
+ struct page *newpage, struct page *page, enum migrate_mode mode)
|
||
|
+{
|
||
|
+ int rc;
|
||
|
+
|
||
|
+ rc = migrate_page_move_mapping(mapping, newpage, page, NULL, mode, 0);
|
||
|
+ if (rc != MIGRATEPAGE_SUCCESS)
|
||
|
+ return rc;
|
||
|
+
|
||
|
+ if (PagePrivate(page)) {
|
||
|
+ ClearPagePrivate(page);
|
||
|
+ SetPagePrivate(newpage);
|
||
|
+ }
|
||
|
+
|
||
|
+ migrate_page_copy(newpage, page);
|
||
|
+ return MIGRATEPAGE_SUCCESS;
|
||
|
+}
|
||
|
+#endif
|
||
|
+
|
||
|
static int ubifs_releasepage(struct page *page, gfp_t unused_gfp_flags)
|
||
|
{
|
||
|
/*
|
||
|
@@ -1559,6 +1580,9 @@ const struct address_space_operations ubifs_file_address_operations = {
|
||
|
.write_end = ubifs_write_end,
|
||
|
.invalidatepage = ubifs_invalidatepage,
|
||
|
.set_page_dirty = ubifs_set_page_dirty,
|
||
|
+#ifdef CONFIG_MIGRATION
|
||
|
+ .migratepage = ubifs_migrate_page,
|
||
|
+#endif
|
||
|
.releasepage = ubifs_releasepage,
|
||
|
};
|
||
|
|
||
|
diff --git a/include/linux/usb/ehci_def.h b/include/linux/usb/ehci_def.h
|
||
|
index daec99af5d54..1c88b177cb9c 100644
|
||
|
--- a/include/linux/usb/ehci_def.h
|
||
|
+++ b/include/linux/usb/ehci_def.h
|
||
|
@@ -178,11 +178,11 @@ struct ehci_regs {
|
||
|
* PORTSCx
|
||
|
*/
|
||
|
/* HOSTPC: offset 0x84 */
|
||
|
- u32 hostpc[1]; /* HOSTPC extension */
|
||
|
+ u32 hostpc[0]; /* HOSTPC extension */
|
||
|
#define HOSTPC_PHCD (1<<22) /* Phy clock disable */
|
||
|
#define HOSTPC_PSPD (3<<25) /* Port speed detection */
|
||
|
|
||
|
- u32 reserved5[16];
|
||
|
+ u32 reserved5[17];
|
||
|
|
||
|
/* USBMODE_EX: offset 0xc8 */
|
||
|
u32 usbmode_ex; /* USB Device mode extension */
|
||
|
diff --git a/kernel/signal.c b/kernel/signal.c
|
||
|
index d8db156e5f5c..78d0e8f3f4ad 100644
|
||
|
--- a/kernel/signal.c
|
||
|
+++ b/kernel/signal.c
|
||
|
@@ -3004,11 +3004,9 @@ static int do_rt_sigqueueinfo(pid_t pid, int sig, siginfo_t *info)
|
||
|
* Nor can they impersonate a kill()/tgkill(), which adds source info.
|
||
|
*/
|
||
|
if ((info->si_code >= 0 || info->si_code == SI_TKILL) &&
|
||
|
- (task_pid_vnr(current) != pid)) {
|
||
|
- /* We used to allow any < 0 si_code */
|
||
|
- WARN_ON_ONCE(info->si_code < 0);
|
||
|
+ (task_pid_vnr(current) != pid))
|
||
|
return -EPERM;
|
||
|
- }
|
||
|
+
|
||
|
info->si_signo = sig;
|
||
|
|
||
|
/* POSIX.1b doesn't mention process groups. */
|
||
|
@@ -3053,12 +3051,10 @@ static int do_rt_tgsigqueueinfo(pid_t tgid, pid_t pid, int sig, siginfo_t *info)
|
||
|
/* Not even root can pretend to send signals from the kernel.
|
||
|
* Nor can they impersonate a kill()/tgkill(), which adds source info.
|
||
|
*/
|
||
|
- if (((info->si_code >= 0 || info->si_code == SI_TKILL)) &&
|
||
|
- (task_pid_vnr(current) != pid)) {
|
||
|
- /* We used to allow any < 0 si_code */
|
||
|
- WARN_ON_ONCE(info->si_code < 0);
|
||
|
+ if ((info->si_code >= 0 || info->si_code == SI_TKILL) &&
|
||
|
+ (task_pid_vnr(current) != pid))
|
||
|
return -EPERM;
|
||
|
- }
|
||
|
+
|
||
|
info->si_signo = sig;
|
||
|
|
||
|
return do_send_specific(tgid, pid, sig, info);
|
||
|
diff --git a/kernel/trace/trace_printk.c b/kernel/trace/trace_printk.c
|
||
|
index 7b900474209d..6973eeca7d99 100644
|
||
|
--- a/kernel/trace/trace_printk.c
|
||
|
+++ b/kernel/trace/trace_printk.c
|
||
|
@@ -38,6 +38,10 @@ struct trace_bprintk_fmt {
|
||
|
static inline struct trace_bprintk_fmt *lookup_format(const char *fmt)
|
||
|
{
|
||
|
struct trace_bprintk_fmt *pos;
|
||
|
+
|
||
|
+ if (!fmt)
|
||
|
+ return ERR_PTR(-EINVAL);
|
||
|
+
|
||
|
list_for_each_entry(pos, &trace_bprintk_fmt_list, list) {
|
||
|
if (!strcmp(pos->fmt, fmt))
|
||
|
return pos;
|
||
|
@@ -59,7 +63,8 @@ void hold_module_trace_bprintk_format(const char **start, const char **end)
|
||
|
for (iter = start; iter < end; iter++) {
|
||
|
struct trace_bprintk_fmt *tb_fmt = lookup_format(*iter);
|
||
|
if (tb_fmt) {
|
||
|
- *iter = tb_fmt->fmt;
|
||
|
+ if (!IS_ERR(tb_fmt))
|
||
|
+ *iter = tb_fmt->fmt;
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
diff --git a/mm/migrate.c b/mm/migrate.c
|
||
|
index 3acac4a62c4b..23ca861c93e9 100644
|
||
|
--- a/mm/migrate.c
|
||
|
+++ b/mm/migrate.c
|
||
|
@@ -423,6 +423,7 @@ int migrate_page_move_mapping(struct address_space *mapping,
|
||
|
|
||
|
return MIGRATEPAGE_SUCCESS;
|
||
|
}
|
||
|
+EXPORT_SYMBOL(migrate_page_move_mapping);
|
||
|
|
||
|
/*
|
||
|
* The expected number of remaining references is the same as that
|
||
|
@@ -582,6 +583,7 @@ void migrate_page_copy(struct page *newpage, struct page *page)
|
||
|
if (PageWriteback(newpage))
|
||
|
end_page_writeback(newpage);
|
||
|
}
|
||
|
+EXPORT_SYMBOL(migrate_page_copy);
|
||
|
|
||
|
/************************************************************
|
||
|
* Migration functions
|
||
|
diff --git a/mm/shmem.c b/mm/shmem.c
|
||
|
index 85d8a1a3626c..8791289974c3 100644
|
||
|
--- a/mm/shmem.c
|
||
|
+++ b/mm/shmem.c
|
||
|
@@ -1893,9 +1893,11 @@ static long shmem_fallocate(struct file *file, int mode, loff_t offset,
|
||
|
NULL);
|
||
|
if (error) {
|
||
|
/* Remove the !PageUptodate pages we added */
|
||
|
- shmem_undo_range(inode,
|
||
|
- (loff_t)start << PAGE_CACHE_SHIFT,
|
||
|
- (loff_t)index << PAGE_CACHE_SHIFT, true);
|
||
|
+ if (index > start) {
|
||
|
+ shmem_undo_range(inode,
|
||
|
+ (loff_t)start << PAGE_CACHE_SHIFT,
|
||
|
+ ((loff_t)index << PAGE_CACHE_SHIFT) - 1, true);
|
||
|
+ }
|
||
|
goto undone;
|
||
|
}
|
||
|
|
||
|
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c
|
||
|
index 42809cf91488..afdbfd65e71f 100644
|
||
|
--- a/net/ipv4/ipmr.c
|
||
|
+++ b/net/ipv4/ipmr.c
|
||
|
@@ -883,8 +883,10 @@ static struct mfc_cache *ipmr_cache_alloc(void)
|
||
|
{
|
||
|
struct mfc_cache *c = kmem_cache_zalloc(mrt_cachep, GFP_KERNEL);
|
||
|
|
||
|
- if (c)
|
||
|
+ if (c) {
|
||
|
+ c->mfc_un.res.last_assert = jiffies - MFC_ASSERT_THRESH - 1;
|
||
|
c->mfc_un.res.minvif = MAXVIFS;
|
||
|
+ }
|
||
|
return c;
|
||
|
}
|
||
|
|
||
|
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c
|
||
|
index 8b61288e5746..86d30e60242a 100644
|
||
|
--- a/net/ipv6/ip6mr.c
|
||
|
+++ b/net/ipv6/ip6mr.c
|
||
|
@@ -1076,6 +1076,7 @@ static struct mfc6_cache *ip6mr_cache_alloc(void)
|
||
|
struct mfc6_cache *c = kmem_cache_zalloc(mrt_cachep, GFP_KERNEL);
|
||
|
if (c == NULL)
|
||
|
return NULL;
|
||
|
+ c->mfc_un.res.last_assert = jiffies - MFC_ASSERT_THRESH - 1;
|
||
|
c->mfc_un.res.minvif = MAXMIFS;
|
||
|
return c;
|
||
|
}
|
||
|
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c
|
||
|
index 317b6dbf3190..fe2c3320e8fe 100644
|
||
|
--- a/net/ipv6/sit.c
|
||
|
+++ b/net/ipv6/sit.c
|
||
|
@@ -559,13 +559,13 @@ static int ipip6_err(struct sk_buff *skb, u32 info)
|
||
|
|
||
|
if (type == ICMP_DEST_UNREACH && code == ICMP_FRAG_NEEDED) {
|
||
|
ipv4_update_pmtu(skb, dev_net(skb->dev), info,
|
||
|
- t->parms.link, 0, IPPROTO_IPV6, 0);
|
||
|
+ t->parms.link, 0, iph->protocol, 0);
|
||
|
err = 0;
|
||
|
goto out;
|
||
|
}
|
||
|
if (type == ICMP_REDIRECT) {
|
||
|
ipv4_redirect(skb, dev_net(skb->dev), t->parms.link, 0,
|
||
|
- IPPROTO_IPV6, 0);
|
||
|
+ iph->protocol, 0);
|
||
|
err = 0;
|
||
|
goto out;
|
||
|
}
|
||
|
diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c
|
||
|
index 3d52d1d68431..f3057767b53d 100644
|
||
|
--- a/net/mac80211/mesh.c
|
||
|
+++ b/net/mac80211/mesh.c
|
||
|
@@ -161,6 +161,10 @@ void mesh_sta_cleanup(struct sta_info *sta)
|
||
|
del_timer_sync(&sta->plink_timer);
|
||
|
}
|
||
|
|
||
|
+ /* make sure no readers can access nexthop sta from here on */
|
||
|
+ mesh_path_flush_by_nexthop(sta);
|
||
|
+ synchronize_net();
|
||
|
+
|
||
|
if (changed)
|
||
|
ieee80211_mbss_info_change_notify(sdata, changed);
|
||
|
}
|
||
|
diff --git a/security/keys/key.c b/security/keys/key.c
|
||
|
index 6e21c11e48bc..9478d668f874 100644
|
||
|
--- a/security/keys/key.c
|
||
|
+++ b/security/keys/key.c
|
||
|
@@ -575,7 +575,7 @@ int key_reject_and_link(struct key *key,
|
||
|
|
||
|
mutex_unlock(&key_construction_mutex);
|
||
|
|
||
|
- if (keyring)
|
||
|
+ if (keyring && link_ret == 0)
|
||
|
__key_link_end(keyring, &key->index_key, edit);
|
||
|
|
||
|
/* wake up anyone waiting for a key to be constructed */
|
||
|
diff --git a/sound/core/control.c b/sound/core/control.c
|
||
|
index 3fcead61f0ef..251bc575f5c3 100644
|
||
|
--- a/sound/core/control.c
|
||
|
+++ b/sound/core/control.c
|
||
|
@@ -150,6 +150,8 @@ void snd_ctl_notify(struct snd_card *card, unsigned int mask,
|
||
|
|
||
|
if (snd_BUG_ON(!card || !id))
|
||
|
return;
|
||
|
+ if (card->shutdown)
|
||
|
+ return;
|
||
|
read_lock(&card->ctl_files_rwlock);
|
||
|
#if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)
|
||
|
card->mixer_oss_change_count++;
|
||
|
diff --git a/sound/drivers/dummy.c b/sound/drivers/dummy.c
|
||
|
index 8946cef245fc..fe5750a05368 100644
|
||
|
--- a/sound/drivers/dummy.c
|
||
|
+++ b/sound/drivers/dummy.c
|
||
|
@@ -422,6 +422,7 @@ static int dummy_hrtimer_stop(struct snd_pcm_substream *substream)
|
||
|
|
||
|
static inline void dummy_hrtimer_sync(struct dummy_hrtimer_pcm *dpcm)
|
||
|
{
|
||
|
+ hrtimer_cancel(&dpcm->timer);
|
||
|
tasklet_kill(&dpcm->tasklet);
|
||
|
}
|
||
|
|
||
|
diff --git a/sound/pci/au88x0/au88x0_core.c b/sound/pci/au88x0/au88x0_core.c
|
||
|
index ae59dbaa53d9..42d4b13f1fa7 100644
|
||
|
--- a/sound/pci/au88x0/au88x0_core.c
|
||
|
+++ b/sound/pci/au88x0/au88x0_core.c
|
||
|
@@ -1442,9 +1442,8 @@ static int vortex_wtdma_bufshift(vortex_t * vortex, int wtdma)
|
||
|
int page, p, pp, delta, i;
|
||
|
|
||
|
page =
|
||
|
- (hwread(vortex->mmio, VORTEX_WTDMA_STAT + (wtdma << 2)) &
|
||
|
- WT_SUBBUF_MASK)
|
||
|
- >> WT_SUBBUF_SHIFT;
|
||
|
+ (hwread(vortex->mmio, VORTEX_WTDMA_STAT + (wtdma << 2))
|
||
|
+ >> WT_SUBBUF_SHIFT) & WT_SUBBUF_MASK;
|
||
|
if (dma->nr_periods >= 4)
|
||
|
delta = (page - dma->period_real) & 3;
|
||
|
else {
|
||
|
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
|
||
|
index 9e5cd217ffaf..2b7ad3a908de 100644
|
||
|
--- a/virt/kvm/kvm_main.c
|
||
|
+++ b/virt/kvm/kvm_main.c
|
||
|
@@ -2455,7 +2455,7 @@ static long kvm_vm_ioctl(struct file *filp,
|
||
|
if (copy_from_user(&routing, argp, sizeof(routing)))
|
||
|
goto out;
|
||
|
r = -EINVAL;
|
||
|
- if (routing.nr >= KVM_MAX_IRQ_ROUTES)
|
||
|
+ if (routing.nr > KVM_MAX_IRQ_ROUTES)
|
||
|
goto out;
|
||
|
if (routing.flags)
|
||
|
goto out;
|