2016-04-14 16:26:21 +02:00
|
|
|
diff --git a/Makefile b/Makefile
|
|
|
|
index a19c22a77728..9053bda13f60 100644
|
|
|
|
--- a/Makefile
|
|
|
|
+++ b/Makefile
|
|
|
|
@@ -1,6 +1,6 @@
|
|
|
|
VERSION = 3
|
|
|
|
PATCHLEVEL = 14
|
|
|
|
-SUBLEVEL = 65
|
|
|
|
+SUBLEVEL = 66
|
|
|
|
EXTRAVERSION =
|
|
|
|
NAME = Remembering Coco
|
|
|
|
|
|
|
|
diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c
|
|
|
|
index 29880c9b324e..e22e57298522 100644
|
|
|
|
--- a/arch/um/drivers/mconsole_kern.c
|
|
|
|
+++ b/arch/um/drivers/mconsole_kern.c
|
|
|
|
@@ -133,7 +133,7 @@ void mconsole_proc(struct mc_request *req)
|
|
|
|
ptr += strlen("proc");
|
|
|
|
ptr = skip_spaces(ptr);
|
|
|
|
|
|
|
|
- file = file_open_root(mnt->mnt_root, mnt, ptr, O_RDONLY);
|
|
|
|
+ file = file_open_root(mnt->mnt_root, mnt, ptr, O_RDONLY, 0);
|
|
|
|
if (IS_ERR(file)) {
|
|
|
|
mconsole_reply(req, "Failed to open file", 1, 0);
|
|
|
|
printk(KERN_ERR "open /proc/%s: %ld\n", ptr, PTR_ERR(file));
|
|
|
|
diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
|
|
|
|
index 1d2091a226bc..29559831c94f 100644
|
|
|
|
--- a/arch/x86/include/asm/apic.h
|
|
|
|
+++ b/arch/x86/include/asm/apic.h
|
|
|
|
@@ -699,8 +699,8 @@ static inline void entering_irq(void)
|
|
|
|
|
|
|
|
static inline void entering_ack_irq(void)
|
|
|
|
{
|
|
|
|
- ack_APIC_irq();
|
|
|
|
entering_irq();
|
|
|
|
+ ack_APIC_irq();
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void exiting_irq(void)
|
|
|
|
diff --git a/arch/x86/kernel/cpu/perf_event.h b/arch/x86/kernel/cpu/perf_event.h
|
|
|
|
index 7876c346ed1a..a614543d3ef5 100644
|
|
|
|
--- a/arch/x86/kernel/cpu/perf_event.h
|
|
|
|
+++ b/arch/x86/kernel/cpu/perf_event.h
|
|
|
|
@@ -445,6 +445,7 @@ struct x86_pmu {
|
|
|
|
pebs_active :1,
|
|
|
|
pebs_broken :1;
|
|
|
|
int pebs_record_size;
|
|
|
|
+ int pebs_buffer_size;
|
|
|
|
void (*drain_pebs)(struct pt_regs *regs);
|
|
|
|
struct event_constraint *pebs_constraints;
|
|
|
|
void (*pebs_aliases)(struct perf_event *event);
|
|
|
|
@@ -703,6 +704,8 @@ void intel_pmu_lbr_init_atom(void);
|
|
|
|
|
|
|
|
void intel_pmu_lbr_init_snb(void);
|
|
|
|
|
|
|
|
+void intel_pmu_pebs_data_source_nhm(void);
|
|
|
|
+
|
|
|
|
int intel_pmu_setup_lbr_filter(struct perf_event *event);
|
|
|
|
|
|
|
|
int p4_pmu_init(void);
|
|
|
|
diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c
|
|
|
|
index d4c0a0e46040..61cd5200608d 100644
|
|
|
|
--- a/arch/x86/kernel/cpu/perf_event_intel.c
|
|
|
|
+++ b/arch/x86/kernel/cpu/perf_event_intel.c
|
|
|
|
@@ -2411,6 +2411,7 @@ __init int intel_pmu_init(void)
|
|
|
|
intel_perfmon_event_map[PERF_COUNT_HW_STALLED_CYCLES_BACKEND] =
|
|
|
|
X86_CONFIG(.event=0xb1, .umask=0x3f, .inv=1, .cmask=1);
|
|
|
|
|
|
|
|
+ intel_pmu_pebs_data_source_nhm();
|
|
|
|
x86_add_quirk(intel_nehalem_quirk);
|
|
|
|
|
|
|
|
pr_cont("Nehalem events, ");
|
|
|
|
@@ -2472,6 +2473,7 @@ __init int intel_pmu_init(void)
|
|
|
|
intel_perfmon_event_map[PERF_COUNT_HW_STALLED_CYCLES_BACKEND] =
|
|
|
|
X86_CONFIG(.event=0xb1, .umask=0x3f, .inv=1, .cmask=1);
|
|
|
|
|
|
|
|
+ intel_pmu_pebs_data_source_nhm();
|
|
|
|
pr_cont("Westmere events, ");
|
|
|
|
break;
|
|
|
|
|
|
|
|
diff --git a/arch/x86/kernel/cpu/perf_event_intel_ds.c b/arch/x86/kernel/cpu/perf_event_intel_ds.c
|
|
|
|
index ae96cfa5eddd..da5f0b60a716 100644
|
|
|
|
--- a/arch/x86/kernel/cpu/perf_event_intel_ds.c
|
|
|
|
+++ b/arch/x86/kernel/cpu/perf_event_intel_ds.c
|
|
|
|
@@ -51,7 +51,8 @@ union intel_x86_pebs_dse {
|
|
|
|
#define OP_LH (P(OP, LOAD) | P(LVL, HIT))
|
|
|
|
#define SNOOP_NONE_MISS (P(SNOOP, NONE) | P(SNOOP, MISS))
|
|
|
|
|
|
|
|
-static const u64 pebs_data_source[] = {
|
|
|
|
+/* Version for Sandy Bridge and later */
|
|
|
|
+static u64 pebs_data_source[] = {
|
|
|
|
P(OP, LOAD) | P(LVL, MISS) | P(LVL, L3) | P(SNOOP, NA),/* 0x00:ukn L3 */
|
|
|
|
OP_LH | P(LVL, L1) | P(SNOOP, NONE), /* 0x01: L1 local */
|
|
|
|
OP_LH | P(LVL, LFB) | P(SNOOP, NONE), /* 0x02: LFB hit */
|
|
|
|
@@ -70,6 +71,14 @@ static const u64 pebs_data_source[] = {
|
|
|
|
OP_LH | P(LVL, UNC) | P(SNOOP, NONE), /* 0x0f: uncached */
|
|
|
|
};
|
|
|
|
|
|
|
|
+/* Patch up minor differences in the bits */
|
|
|
|
+void __init intel_pmu_pebs_data_source_nhm(void)
|
|
|
|
+{
|
|
|
|
+ pebs_data_source[0x05] = OP_LH | P(LVL, L3) | P(SNOOP, HIT);
|
|
|
|
+ pebs_data_source[0x06] = OP_LH | P(LVL, L3) | P(SNOOP, HITM);
|
|
|
|
+ pebs_data_source[0x07] = OP_LH | P(LVL, L3) | P(SNOOP, HITM);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
static u64 precise_store_data(u64 status)
|
|
|
|
{
|
|
|
|
union intel_x86_pebs_dse dse;
|
|
|
|
@@ -241,7 +250,7 @@ static int alloc_pebs_buffer(int cpu)
|
|
|
|
if (!x86_pmu.pebs)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
- buffer = kzalloc_node(PEBS_BUFFER_SIZE, GFP_KERNEL, node);
|
|
|
|
+ buffer = kzalloc_node(x86_pmu.pebs_buffer_size, GFP_KERNEL, node);
|
|
|
|
if (unlikely(!buffer))
|
|
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
@@ -258,7 +267,7 @@ static int alloc_pebs_buffer(int cpu)
|
|
|
|
per_cpu(insn_buffer, cpu) = ibuffer;
|
|
|
|
}
|
|
|
|
|
|
|
|
- max = PEBS_BUFFER_SIZE / x86_pmu.pebs_record_size;
|
|
|
|
+ max = x86_pmu.pebs_buffer_size / x86_pmu.pebs_record_size;
|
|
|
|
|
|
|
|
ds->pebs_buffer_base = (u64)(unsigned long)buffer;
|
|
|
|
ds->pebs_index = ds->pebs_buffer_base;
|
|
|
|
@@ -1047,6 +1056,7 @@ void intel_ds_init(void)
|
|
|
|
|
|
|
|
x86_pmu.bts = boot_cpu_has(X86_FEATURE_BTS);
|
|
|
|
x86_pmu.pebs = boot_cpu_has(X86_FEATURE_PEBS);
|
|
|
|
+ x86_pmu.pebs_buffer_size = PEBS_BUFFER_SIZE;
|
|
|
|
if (x86_pmu.pebs) {
|
|
|
|
char pebs_type = x86_pmu.intel_cap.pebs_trap ? '+' : '-';
|
|
|
|
int format = x86_pmu.intel_cap.pebs_format;
|
|
|
|
@@ -1055,6 +1065,14 @@ void intel_ds_init(void)
|
|
|
|
case 0:
|
|
|
|
printk(KERN_CONT "PEBS fmt0%c, ", pebs_type);
|
|
|
|
x86_pmu.pebs_record_size = sizeof(struct pebs_record_core);
|
|
|
|
+ /*
|
|
|
|
+ * Using >PAGE_SIZE buffers makes the WRMSR to
|
|
|
|
+ * PERF_GLOBAL_CTRL in intel_pmu_enable_all()
|
|
|
|
+ * mysteriously hang on Core2.
|
|
|
|
+ *
|
|
|
|
+ * As a workaround, we don't do this.
|
|
|
|
+ */
|
|
|
|
+ x86_pmu.pebs_buffer_size = PAGE_SIZE;
|
|
|
|
x86_pmu.drain_pebs = intel_pmu_drain_pebs_core;
|
|
|
|
break;
|
|
|
|
|
|
|
|
diff --git a/arch/x86/kernel/ioport.c b/arch/x86/kernel/ioport.c
|
|
|
|
index 4ddaf66ea35f..792621a32457 100644
|
|
|
|
--- a/arch/x86/kernel/ioport.c
|
|
|
|
+++ b/arch/x86/kernel/ioport.c
|
|
|
|
@@ -96,9 +96,14 @@ asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on)
|
|
|
|
SYSCALL_DEFINE1(iopl, unsigned int, level)
|
|
|
|
{
|
|
|
|
struct pt_regs *regs = current_pt_regs();
|
|
|
|
- unsigned int old = (regs->flags >> 12) & 3;
|
|
|
|
struct thread_struct *t = ¤t->thread;
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Careful: the IOPL bits in regs->flags are undefined under Xen PV
|
|
|
|
+ * and changing them has no effect.
|
|
|
|
+ */
|
|
|
|
+ unsigned int old = t->iopl >> X86_EFLAGS_IOPL_BIT;
|
|
|
|
+
|
|
|
|
if (level > 3)
|
|
|
|
return -EINVAL;
|
|
|
|
/* Trying to gain more privileges? */
|
|
|
|
@@ -106,8 +111,9 @@ SYSCALL_DEFINE1(iopl, unsigned int, level)
|
|
|
|
if (!capable(CAP_SYS_RAWIO))
|
|
|
|
return -EPERM;
|
|
|
|
}
|
|
|
|
- regs->flags = (regs->flags & ~X86_EFLAGS_IOPL) | (level << 12);
|
|
|
|
- t->iopl = level << 12;
|
|
|
|
+ regs->flags = (regs->flags & ~X86_EFLAGS_IOPL) |
|
|
|
|
+ (level << X86_EFLAGS_IOPL_BIT);
|
|
|
|
+ t->iopl = level << X86_EFLAGS_IOPL_BIT;
|
|
|
|
set_iopl_mask(t->iopl);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
|
|
|
|
index 1406ffde3e35..b0a706d063cb 100644
|
|
|
|
--- a/arch/x86/kvm/i8254.c
|
|
|
|
+++ b/arch/x86/kvm/i8254.c
|
|
|
|
@@ -244,7 +244,7 @@ static void kvm_pit_ack_irq(struct kvm_irq_ack_notifier *kian)
|
|
|
|
* PIC is being reset. Handle it gracefully here
|
|
|
|
*/
|
|
|
|
atomic_inc(&ps->pending);
|
|
|
|
- else if (value > 0)
|
|
|
|
+ else if (value > 0 && ps->reinject)
|
|
|
|
/* in this case, we had multiple outstanding pit interrupts
|
|
|
|
* that we needed to inject. Reinject
|
|
|
|
*/
|
|
|
|
@@ -287,7 +287,9 @@ static void pit_do_work(struct kthread_work *work)
|
|
|
|
* last one has been acked.
|
|
|
|
*/
|
|
|
|
spin_lock(&ps->inject_lock);
|
|
|
|
- if (ps->irq_ack) {
|
|
|
|
+ if (!ps->reinject)
|
|
|
|
+ inject = 1;
|
|
|
|
+ else if (ps->irq_ack) {
|
|
|
|
ps->irq_ack = 0;
|
|
|
|
inject = 1;
|
|
|
|
}
|
|
|
|
@@ -316,10 +318,10 @@ static enum hrtimer_restart pit_timer_fn(struct hrtimer *data)
|
|
|
|
struct kvm_kpit_state *ps = container_of(data, struct kvm_kpit_state, timer);
|
|
|
|
struct kvm_pit *pt = ps->kvm->arch.vpit;
|
|
|
|
|
|
|
|
- if (ps->reinject || !atomic_read(&ps->pending)) {
|
|
|
|
+ if (ps->reinject)
|
|
|
|
atomic_inc(&ps->pending);
|
|
|
|
- queue_kthread_work(&pt->worker, &pt->expired);
|
|
|
|
- }
|
|
|
|
+
|
|
|
|
+ queue_kthread_work(&pt->worker, &pt->expired);
|
|
|
|
|
|
|
|
if (ps->is_periodic) {
|
|
|
|
hrtimer_add_expires_ns(&ps->timer, ps->period);
|
|
|
|
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
|
|
|
|
index b6fc5fc64cef..397a3ec62f78 100644
|
|
|
|
--- a/arch/x86/kvm/vmx.c
|
|
|
|
+++ b/arch/x86/kvm/vmx.c
|
|
|
|
@@ -6423,6 +6423,7 @@ static int handle_invept(struct kvm_vcpu *vcpu)
|
|
|
|
if (!(types & (1UL << type))) {
|
|
|
|
nested_vmx_failValid(vcpu,
|
|
|
|
VMXERR_INVALID_OPERAND_TO_INVEPT_INVVPID);
|
|
|
|
+ skip_emulated_instruction(vcpu);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
diff --git a/arch/xtensa/kernel/head.S b/arch/xtensa/kernel/head.S
|
|
|
|
index aeeb3cc8a410..288b61f080fe 100644
|
|
|
|
--- a/arch/xtensa/kernel/head.S
|
|
|
|
+++ b/arch/xtensa/kernel/head.S
|
|
|
|
@@ -123,7 +123,7 @@ ENTRY(_startup)
|
|
|
|
wsr a0, icountlevel
|
|
|
|
|
|
|
|
.set _index, 0
|
|
|
|
- .rept XCHAL_NUM_DBREAK - 1
|
|
|
|
+ .rept XCHAL_NUM_DBREAK
|
|
|
|
wsr a0, SREG_DBREAKC + _index
|
|
|
|
.set _index, _index + 1
|
|
|
|
.endr
|
|
|
|
diff --git a/arch/xtensa/platforms/iss/console.c b/arch/xtensa/platforms/iss/console.c
|
|
|
|
index 70cb408bc20d..92d785fefb6d 100644
|
|
|
|
--- a/arch/xtensa/platforms/iss/console.c
|
|
|
|
+++ b/arch/xtensa/platforms/iss/console.c
|
|
|
|
@@ -100,21 +100,23 @@ static void rs_poll(unsigned long priv)
|
|
|
|
{
|
|
|
|
struct tty_port *port = (struct tty_port *)priv;
|
|
|
|
int i = 0;
|
|
|
|
+ int rd = 1;
|
|
|
|
unsigned char c;
|
|
|
|
|
|
|
|
spin_lock(&timer_lock);
|
|
|
|
|
|
|
|
while (simc_poll(0)) {
|
|
|
|
- simc_read(0, &c, 1);
|
|
|
|
+ rd = simc_read(0, &c, 1);
|
|
|
|
+ if (rd <= 0)
|
|
|
|
+ break;
|
|
|
|
tty_insert_flip_char(port, c, TTY_NORMAL);
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (i)
|
|
|
|
tty_flip_buffer_push(port);
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- mod_timer(&serial_timer, jiffies + SERIAL_TIMER_VALUE);
|
|
|
|
+ if (rd)
|
|
|
|
+ mod_timer(&serial_timer, jiffies + SERIAL_TIMER_VALUE);
|
|
|
|
spin_unlock(&timer_lock);
|
|
|
|
}
|
|
|
|
|
|
|
|
diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c
|
|
|
|
index 2a09de8d6d71..6be90f0b3730 100644
|
|
|
|
--- a/drivers/bluetooth/ath3k.c
|
|
|
|
+++ b/drivers/bluetooth/ath3k.c
|
|
|
|
@@ -81,6 +81,7 @@ static const struct usb_device_id ath3k_table[] = {
|
|
|
|
{ USB_DEVICE(0x0489, 0xe05f) },
|
|
|
|
{ USB_DEVICE(0x0489, 0xe076) },
|
|
|
|
{ USB_DEVICE(0x0489, 0xe078) },
|
|
|
|
+ { USB_DEVICE(0x0489, 0xe095) },
|
|
|
|
{ USB_DEVICE(0x04c5, 0x1330) },
|
|
|
|
{ USB_DEVICE(0x04CA, 0x3004) },
|
|
|
|
{ USB_DEVICE(0x04CA, 0x3005) },
|
|
|
|
@@ -89,6 +90,7 @@ static const struct usb_device_id ath3k_table[] = {
|
|
|
|
{ USB_DEVICE(0x04CA, 0x3008) },
|
|
|
|
{ USB_DEVICE(0x04CA, 0x300b) },
|
|
|
|
{ USB_DEVICE(0x04CA, 0x3010) },
|
|
|
|
+ { USB_DEVICE(0x04CA, 0x3014) },
|
|
|
|
{ USB_DEVICE(0x0930, 0x0219) },
|
|
|
|
{ USB_DEVICE(0x0930, 0x021c) },
|
|
|
|
{ USB_DEVICE(0x0930, 0x0220) },
|
|
|
|
@@ -109,9 +111,11 @@ static const struct usb_device_id ath3k_table[] = {
|
|
|
|
{ USB_DEVICE(0x13d3, 0x3362) },
|
|
|
|
{ USB_DEVICE(0x13d3, 0x3375) },
|
|
|
|
{ USB_DEVICE(0x13d3, 0x3393) },
|
|
|
|
+ { USB_DEVICE(0x13d3, 0x3395) },
|
|
|
|
{ USB_DEVICE(0x13d3, 0x3402) },
|
|
|
|
{ USB_DEVICE(0x13d3, 0x3408) },
|
|
|
|
{ USB_DEVICE(0x13d3, 0x3432) },
|
|
|
|
+ { USB_DEVICE(0x13d3, 0x3472) },
|
|
|
|
{ USB_DEVICE(0x13d3, 0x3474) },
|
|
|
|
|
|
|
|
/* Atheros AR5BBU12 with sflash firmware */
|
|
|
|
@@ -139,6 +143,7 @@ static const struct usb_device_id ath3k_blist_tbl[] = {
|
|
|
|
{ USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x0489, 0xe076), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x0489, 0xe078), .driver_info = BTUSB_ATH3012 },
|
|
|
|
+ { USB_DEVICE(0x0489, 0xe095), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
|
|
|
|
@@ -147,6 +152,7 @@ static const struct usb_device_id ath3k_blist_tbl[] = {
|
|
|
|
{ USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x04ca, 0x300b), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x04ca, 0x3010), .driver_info = BTUSB_ATH3012 },
|
|
|
|
+ { USB_DEVICE(0x04ca, 0x3014), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x0930, 0x021c), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x0930, 0x0220), .driver_info = BTUSB_ATH3012 },
|
|
|
|
@@ -167,9 +173,11 @@ static const struct usb_device_id ath3k_blist_tbl[] = {
|
|
|
|
{ USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
|
|
|
|
+ { USB_DEVICE(0x13d3, 0x3395), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 },
|
|
|
|
+ { USB_DEVICE(0x13d3, 0x3472), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 },
|
|
|
|
|
|
|
|
/* Atheros AR5BBU22 with sflash firmware */
|
|
|
|
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
|
|
|
|
index 5d5e99902475..8b82282bab8a 100644
|
|
|
|
--- a/drivers/bluetooth/btusb.c
|
|
|
|
+++ b/drivers/bluetooth/btusb.c
|
|
|
|
@@ -159,6 +159,7 @@ static const struct usb_device_id blacklist_table[] = {
|
|
|
|
{ USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x0489, 0xe076), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x0489, 0xe078), .driver_info = BTUSB_ATH3012 },
|
|
|
|
+ { USB_DEVICE(0x0489, 0xe095), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
|
|
|
|
@@ -167,6 +168,7 @@ static const struct usb_device_id blacklist_table[] = {
|
|
|
|
{ USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x04ca, 0x300b), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x04ca, 0x3010), .driver_info = BTUSB_ATH3012 },
|
|
|
|
+ { USB_DEVICE(0x04ca, 0x3014), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x0930, 0x021c), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x0930, 0x0220), .driver_info = BTUSB_ATH3012 },
|
|
|
|
@@ -187,9 +189,11 @@ static const struct usb_device_id blacklist_table[] = {
|
|
|
|
{ USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
|
|
|
|
+ { USB_DEVICE(0x13d3, 0x3395), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 },
|
|
|
|
+ { USB_DEVICE(0x13d3, 0x3472), .driver_info = BTUSB_ATH3012 },
|
|
|
|
{ USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 },
|
|
|
|
|
|
|
|
/* Atheros AR5BBU12 with sflash firmware */
|
|
|
|
diff --git a/drivers/crypto/ccp/ccp-crypto-aes-cmac.c b/drivers/crypto/ccp/ccp-crypto-aes-cmac.c
|
|
|
|
index 8e162ad82085..5c93afb1841a 100644
|
|
|
|
--- a/drivers/crypto/ccp/ccp-crypto-aes-cmac.c
|
|
|
|
+++ b/drivers/crypto/ccp/ccp-crypto-aes-cmac.c
|
|
|
|
@@ -201,6 +201,39 @@ static int ccp_aes_cmac_digest(struct ahash_request *req)
|
|
|
|
return ccp_aes_cmac_finup(req);
|
|
|
|
}
|
|
|
|
|
|
|
|
+static int ccp_aes_cmac_export(struct ahash_request *req, void *out)
|
|
|
|
+{
|
|
|
|
+ struct ccp_aes_cmac_req_ctx *rctx = ahash_request_ctx(req);
|
|
|
|
+ struct ccp_aes_cmac_exp_ctx state;
|
|
|
|
+
|
|
|
|
+ state.null_msg = rctx->null_msg;
|
|
|
|
+ memcpy(state.iv, rctx->iv, sizeof(state.iv));
|
|
|
|
+ state.buf_count = rctx->buf_count;
|
|
|
|
+ memcpy(state.buf, rctx->buf, sizeof(state.buf));
|
|
|
|
+
|
|
|
|
+ /* 'out' may not be aligned so memcpy from local variable */
|
|
|
|
+ memcpy(out, &state, sizeof(state));
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int ccp_aes_cmac_import(struct ahash_request *req, const void *in)
|
|
|
|
+{
|
|
|
|
+ struct ccp_aes_cmac_req_ctx *rctx = ahash_request_ctx(req);
|
|
|
|
+ struct ccp_aes_cmac_exp_ctx state;
|
|
|
|
+
|
|
|
|
+ /* 'in' may not be aligned so memcpy to local variable */
|
|
|
|
+ memcpy(&state, in, sizeof(state));
|
|
|
|
+
|
|
|
|
+ memset(rctx, 0, sizeof(*rctx));
|
|
|
|
+ rctx->null_msg = state.null_msg;
|
|
|
|
+ memcpy(rctx->iv, state.iv, sizeof(rctx->iv));
|
|
|
|
+ rctx->buf_count = state.buf_count;
|
|
|
|
+ memcpy(rctx->buf, state.buf, sizeof(rctx->buf));
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
static int ccp_aes_cmac_setkey(struct crypto_ahash *tfm, const u8 *key,
|
|
|
|
unsigned int key_len)
|
|
|
|
{
|
|
|
|
@@ -332,10 +365,13 @@ int ccp_register_aes_cmac_algs(struct list_head *head)
|
|
|
|
alg->final = ccp_aes_cmac_final;
|
|
|
|
alg->finup = ccp_aes_cmac_finup;
|
|
|
|
alg->digest = ccp_aes_cmac_digest;
|
|
|
|
+ alg->export = ccp_aes_cmac_export;
|
|
|
|
+ alg->import = ccp_aes_cmac_import;
|
|
|
|
alg->setkey = ccp_aes_cmac_setkey;
|
|
|
|
|
|
|
|
halg = &alg->halg;
|
|
|
|
halg->digestsize = AES_BLOCK_SIZE;
|
|
|
|
+ halg->statesize = sizeof(struct ccp_aes_cmac_exp_ctx);
|
|
|
|
|
|
|
|
base = &halg->base;
|
|
|
|
snprintf(base->cra_name, CRYPTO_MAX_ALG_NAME, "cmac(aes)");
|
|
|
|
diff --git a/drivers/crypto/ccp/ccp-crypto-sha.c b/drivers/crypto/ccp/ccp-crypto-sha.c
|
|
|
|
index 3867290b3531..bdbb5865a50f 100644
|
|
|
|
--- a/drivers/crypto/ccp/ccp-crypto-sha.c
|
|
|
|
+++ b/drivers/crypto/ccp/ccp-crypto-sha.c
|
|
|
|
@@ -257,6 +257,43 @@ static int ccp_sha_digest(struct ahash_request *req)
|
|
|
|
return ccp_sha_finup(req);
|
|
|
|
}
|
|
|
|
|
|
|
|
+static int ccp_sha_export(struct ahash_request *req, void *out)
|
|
|
|
+{
|
|
|
|
+ struct ccp_sha_req_ctx *rctx = ahash_request_ctx(req);
|
|
|
|
+ struct ccp_sha_exp_ctx state;
|
|
|
|
+
|
|
|
|
+ state.type = rctx->type;
|
|
|
|
+ state.msg_bits = rctx->msg_bits;
|
|
|
|
+ state.first = rctx->first;
|
|
|
|
+ memcpy(state.ctx, rctx->ctx, sizeof(state.ctx));
|
|
|
|
+ state.buf_count = rctx->buf_count;
|
|
|
|
+ memcpy(state.buf, rctx->buf, sizeof(state.buf));
|
|
|
|
+
|
|
|
|
+ /* 'out' may not be aligned so memcpy from local variable */
|
|
|
|
+ memcpy(out, &state, sizeof(state));
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int ccp_sha_import(struct ahash_request *req, const void *in)
|
|
|
|
+{
|
|
|
|
+ struct ccp_sha_req_ctx *rctx = ahash_request_ctx(req);
|
|
|
|
+ struct ccp_sha_exp_ctx state;
|
|
|
|
+
|
|
|
|
+ /* 'in' may not be aligned so memcpy to local variable */
|
|
|
|
+ memcpy(&state, in, sizeof(state));
|
|
|
|
+
|
|
|
|
+ memset(rctx, 0, sizeof(*rctx));
|
|
|
|
+ rctx->type = state.type;
|
|
|
|
+ rctx->msg_bits = state.msg_bits;
|
|
|
|
+ rctx->first = state.first;
|
|
|
|
+ memcpy(rctx->ctx, state.ctx, sizeof(rctx->ctx));
|
|
|
|
+ rctx->buf_count = state.buf_count;
|
|
|
|
+ memcpy(rctx->buf, state.buf, sizeof(rctx->buf));
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
static int ccp_sha_setkey(struct crypto_ahash *tfm, const u8 *key,
|
|
|
|
unsigned int key_len)
|
|
|
|
{
|
|
|
|
@@ -469,9 +506,12 @@ static int ccp_register_sha_alg(struct list_head *head,
|
|
|
|
alg->final = ccp_sha_final;
|
|
|
|
alg->finup = ccp_sha_finup;
|
|
|
|
alg->digest = ccp_sha_digest;
|
|
|
|
+ alg->export = ccp_sha_export;
|
|
|
|
+ alg->import = ccp_sha_import;
|
|
|
|
|
|
|
|
halg = &alg->halg;
|
|
|
|
halg->digestsize = def->digest_size;
|
|
|
|
+ halg->statesize = sizeof(struct ccp_sha_exp_ctx);
|
|
|
|
|
|
|
|
base = &halg->base;
|
|
|
|
snprintf(base->cra_name, CRYPTO_MAX_ALG_NAME, "%s", def->name);
|
|
|
|
diff --git a/drivers/crypto/ccp/ccp-crypto.h b/drivers/crypto/ccp/ccp-crypto.h
|
|
|
|
index b222231b6169..79bcc3581092 100644
|
|
|
|
--- a/drivers/crypto/ccp/ccp-crypto.h
|
|
|
|
+++ b/drivers/crypto/ccp/ccp-crypto.h
|
|
|
|
@@ -132,6 +132,15 @@ struct ccp_aes_cmac_req_ctx {
|
|
|
|
struct ccp_cmd cmd;
|
|
|
|
};
|
|
|
|
|
|
|
|
+struct ccp_aes_cmac_exp_ctx {
|
|
|
|
+ unsigned int null_msg;
|
|
|
|
+
|
|
|
|
+ u8 iv[AES_BLOCK_SIZE];
|
|
|
|
+
|
|
|
|
+ unsigned int buf_count;
|
|
|
|
+ u8 buf[AES_BLOCK_SIZE];
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
/***** SHA related defines *****/
|
|
|
|
#define MAX_SHA_CONTEXT_SIZE SHA256_DIGEST_SIZE
|
|
|
|
#define MAX_SHA_BLOCK_SIZE SHA256_BLOCK_SIZE
|
|
|
|
@@ -174,6 +183,19 @@ struct ccp_sha_req_ctx {
|
|
|
|
struct ccp_cmd cmd;
|
|
|
|
};
|
|
|
|
|
|
|
|
+struct ccp_sha_exp_ctx {
|
|
|
|
+ enum ccp_sha_type type;
|
|
|
|
+
|
|
|
|
+ u64 msg_bits;
|
|
|
|
+
|
|
|
|
+ unsigned int first;
|
|
|
|
+
|
|
|
|
+ u8 ctx[MAX_SHA_CONTEXT_SIZE];
|
|
|
|
+
|
|
|
|
+ unsigned int buf_count;
|
|
|
|
+ u8 buf[MAX_SHA_BLOCK_SIZE];
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
/***** Common Context Structure *****/
|
|
|
|
struct ccp_ctx {
|
|
|
|
int (*complete)(struct crypto_async_request *req, int ret);
|
|
|
|
diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c
|
|
|
|
index 278603c373ca..d39e7482586c 100644
|
|
|
|
--- a/drivers/edac/amd64_edac.c
|
|
|
|
+++ b/drivers/edac/amd64_edac.c
|
|
|
|
@@ -1294,7 +1294,7 @@ static u64 f1x_get_norm_dct_addr(struct amd64_pvt *pvt, u8 range,
|
|
|
|
u64 chan_off;
|
|
|
|
u64 dram_base = get_dram_base(pvt, range);
|
|
|
|
u64 hole_off = f10_dhar_offset(pvt);
|
|
|
|
- u64 dct_sel_base_off = (pvt->dct_sel_hi & 0xFFFFFC00) << 16;
|
|
|
|
+ u64 dct_sel_base_off = (u64)(pvt->dct_sel_hi & 0xFFFFFC00) << 16;
|
|
|
|
|
|
|
|
if (hi_rng) {
|
|
|
|
/*
|
|
|
|
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c
|
|
|
|
index e7bfd5502410..eeb1369110ac 100644
|
|
|
|
--- a/drivers/gpu/drm/radeon/atombios_encoders.c
|
|
|
|
+++ b/drivers/gpu/drm/radeon/atombios_encoders.c
|
|
|
|
@@ -895,8 +895,6 @@ atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mo
|
|
|
|
else
|
|
|
|
args.v1.ucLaneNum = 4;
|
|
|
|
|
|
|
|
- if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode) && (dp_clock == 270000))
|
|
|
|
- args.v1.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ;
|
|
|
|
switch (radeon_encoder->encoder_id) {
|
|
|
|
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
|
|
|
|
args.v1.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER1;
|
|
|
|
@@ -913,6 +911,10 @@ atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mo
|
|
|
|
args.v1.ucConfig |= ATOM_ENCODER_CONFIG_LINKB;
|
|
|
|
else
|
|
|
|
args.v1.ucConfig |= ATOM_ENCODER_CONFIG_LINKA;
|
|
|
|
+
|
|
|
|
+ if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode) && (dp_clock == 270000))
|
|
|
|
+ args.v1.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ;
|
|
|
|
+
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
case 3:
|
|
|
|
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
|
|
|
|
index 51f18bf75fa6..66346c4e4104 100644
|
|
|
|
--- a/drivers/hid/hid-core.c
|
|
|
|
+++ b/drivers/hid/hid-core.c
|
|
|
|
@@ -1761,6 +1761,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
|
|
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_ELITE_KBD) },
|
|
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500) },
|
|
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_EXTREME_3D) },
|
|
|
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_DUAL_ACTION) },
|
|
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WHEEL) },
|
|
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD_CORD) },
|
|
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD) },
|
|
|
|
diff --git a/drivers/input/misc/ati_remote2.c b/drivers/input/misc/ati_remote2.c
|
|
|
|
index f63341f20b91..e8c6a4842e91 100644
|
|
|
|
--- a/drivers/input/misc/ati_remote2.c
|
|
|
|
+++ b/drivers/input/misc/ati_remote2.c
|
|
|
|
@@ -817,26 +817,49 @@ static int ati_remote2_probe(struct usb_interface *interface, const struct usb_d
|
|
|
|
|
|
|
|
ar2->udev = udev;
|
|
|
|
|
|
|
|
+ /* Sanity check, first interface must have an endpoint */
|
|
|
|
+ if (alt->desc.bNumEndpoints < 1 || !alt->endpoint) {
|
|
|
|
+ dev_err(&interface->dev,
|
|
|
|
+ "%s(): interface 0 must have an endpoint\n", __func__);
|
|
|
|
+ r = -ENODEV;
|
|
|
|
+ goto fail1;
|
|
|
|
+ }
|
|
|
|
ar2->intf[0] = interface;
|
|
|
|
ar2->ep[0] = &alt->endpoint[0].desc;
|
|
|
|
|
|
|
|
+ /* Sanity check, the device must have two interfaces */
|
|
|
|
ar2->intf[1] = usb_ifnum_to_if(udev, 1);
|
|
|
|
+ if ((udev->actconfig->desc.bNumInterfaces < 2) || !ar2->intf[1]) {
|
|
|
|
+ dev_err(&interface->dev, "%s(): need 2 interfaces, found %d\n",
|
|
|
|
+ __func__, udev->actconfig->desc.bNumInterfaces);
|
|
|
|
+ r = -ENODEV;
|
|
|
|
+ goto fail1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
r = usb_driver_claim_interface(&ati_remote2_driver, ar2->intf[1], ar2);
|
|
|
|
if (r)
|
|
|
|
goto fail1;
|
|
|
|
+
|
|
|
|
+ /* Sanity check, second interface must have an endpoint */
|
|
|
|
alt = ar2->intf[1]->cur_altsetting;
|
|
|
|
+ if (alt->desc.bNumEndpoints < 1 || !alt->endpoint) {
|
|
|
|
+ dev_err(&interface->dev,
|
|
|
|
+ "%s(): interface 1 must have an endpoint\n", __func__);
|
|
|
|
+ r = -ENODEV;
|
|
|
|
+ goto fail2;
|
|
|
|
+ }
|
|
|
|
ar2->ep[1] = &alt->endpoint[0].desc;
|
|
|
|
|
|
|
|
r = ati_remote2_urb_init(ar2);
|
|
|
|
if (r)
|
|
|
|
- goto fail2;
|
|
|
|
+ goto fail3;
|
|
|
|
|
|
|
|
ar2->channel_mask = channel_mask;
|
|
|
|
ar2->mode_mask = mode_mask;
|
|
|
|
|
|
|
|
r = ati_remote2_setup(ar2, ar2->channel_mask);
|
|
|
|
if (r)
|
|
|
|
- goto fail2;
|
|
|
|
+ goto fail3;
|
|
|
|
|
|
|
|
usb_make_path(udev, ar2->phys, sizeof(ar2->phys));
|
|
|
|
strlcat(ar2->phys, "/input0", sizeof(ar2->phys));
|
|
|
|
@@ -845,11 +868,11 @@ static int ati_remote2_probe(struct usb_interface *interface, const struct usb_d
|
|
|
|
|
|
|
|
r = sysfs_create_group(&udev->dev.kobj, &ati_remote2_attr_group);
|
|
|
|
if (r)
|
|
|
|
- goto fail2;
|
|
|
|
+ goto fail3;
|
|
|
|
|
|
|
|
r = ati_remote2_input_init(ar2);
|
|
|
|
if (r)
|
|
|
|
- goto fail3;
|
|
|
|
+ goto fail4;
|
|
|
|
|
|
|
|
usb_set_intfdata(interface, ar2);
|
|
|
|
|
|
|
|
@@ -857,10 +880,11 @@ static int ati_remote2_probe(struct usb_interface *interface, const struct usb_d
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
- fail3:
|
|
|
|
+ fail4:
|
|
|
|
sysfs_remove_group(&udev->dev.kobj, &ati_remote2_attr_group);
|
|
|
|
- fail2:
|
|
|
|
+ fail3:
|
|
|
|
ati_remote2_urb_cleanup(ar2);
|
|
|
|
+ fail2:
|
|
|
|
usb_driver_release_interface(&ati_remote2_driver, ar2->intf[1]);
|
|
|
|
fail1:
|
|
|
|
kfree(ar2);
|
|
|
|
diff --git a/drivers/input/misc/ims-pcu.c b/drivers/input/misc/ims-pcu.c
|
|
|
|
index e204f26b0011..77164dc1bedd 100644
|
|
|
|
--- a/drivers/input/misc/ims-pcu.c
|
|
|
|
+++ b/drivers/input/misc/ims-pcu.c
|
|
|
|
@@ -1433,6 +1433,8 @@ static int ims_pcu_parse_cdc_data(struct usb_interface *intf, struct ims_pcu *pc
|
|
|
|
|
|
|
|
pcu->ctrl_intf = usb_ifnum_to_if(pcu->udev,
|
|
|
|
union_desc->bMasterInterface0);
|
|
|
|
+ if (!pcu->ctrl_intf)
|
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
|
|
alt = pcu->ctrl_intf->cur_altsetting;
|
|
|
|
pcu->ep_ctrl = &alt->endpoint[0].desc;
|
|
|
|
@@ -1440,6 +1442,8 @@ static int ims_pcu_parse_cdc_data(struct usb_interface *intf, struct ims_pcu *pc
|
|
|
|
|
|
|
|
pcu->data_intf = usb_ifnum_to_if(pcu->udev,
|
|
|
|
union_desc->bSlaveInterface0);
|
|
|
|
+ if (!pcu->data_intf)
|
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
|
|
alt = pcu->data_intf->cur_altsetting;
|
|
|
|
if (alt->desc.bNumEndpoints != 2) {
|
|
|
|
diff --git a/drivers/input/misc/powermate.c b/drivers/input/misc/powermate.c
|
|
|
|
index 63b539d3daba..84909a12ff36 100644
|
|
|
|
--- a/drivers/input/misc/powermate.c
|
|
|
|
+++ b/drivers/input/misc/powermate.c
|
|
|
|
@@ -307,6 +307,9 @@ static int powermate_probe(struct usb_interface *intf, const struct usb_device_i
|
|
|
|
int error = -ENOMEM;
|
|
|
|
|
|
|
|
interface = intf->cur_altsetting;
|
|
|
|
+ if (interface->desc.bNumEndpoints < 1)
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
endpoint = &interface->endpoint[0].desc;
|
|
|
|
if (!usb_endpoint_is_int_in(endpoint))
|
|
|
|
return -EIO;
|
|
|
|
diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c
|
|
|
|
index 1b6beb1e3142..51ec648738f4 100644
|
|
|
|
--- a/drivers/md/bcache/super.c
|
|
|
|
+++ b/drivers/md/bcache/super.c
|
|
|
|
@@ -1388,6 +1388,9 @@ static void cache_set_flush(struct closure *cl)
|
|
|
|
struct btree *b;
|
|
|
|
unsigned i;
|
|
|
|
|
|
|
|
+ if (!c)
|
|
|
|
+ closure_return(cl);
|
|
|
|
+
|
|
|
|
bch_cache_accounting_destroy(&c->accounting);
|
|
|
|
|
|
|
|
kobject_put(&c->internal);
|
|
|
|
diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c
|
|
|
|
index 849ad39f547b..79870f4b318d 100644
|
|
|
|
--- a/drivers/md/multipath.c
|
|
|
|
+++ b/drivers/md/multipath.c
|
|
|
|
@@ -131,7 +131,9 @@ static void multipath_make_request(struct mddev *mddev, struct bio * bio)
|
|
|
|
}
|
|
|
|
multipath = conf->multipaths + mp_bh->path;
|
|
|
|
|
|
|
|
- mp_bh->bio = *bio;
|
|
|
|
+ bio_init(&mp_bh->bio);
|
|
|
|
+ __bio_clone_fast(&mp_bh->bio, bio);
|
|
|
|
+
|
|
|
|
mp_bh->bio.bi_iter.bi_sector += multipath->rdev->data_offset;
|
|
|
|
mp_bh->bio.bi_bdev = multipath->rdev->bdev;
|
|
|
|
mp_bh->bio.bi_rw |= REQ_FAILFAST_TRANSPORT;
|
|
|
|
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
|
|
|
|
index 1c829a0b234b..49386766c4e0 100644
|
|
|
|
--- a/drivers/md/raid5.c
|
|
|
|
+++ b/drivers/md/raid5.c
|
|
|
|
@@ -6166,8 +6166,8 @@ static int run(struct mddev *mddev)
|
|
|
|
}
|
|
|
|
|
|
|
|
if (discard_supported &&
|
|
|
|
- mddev->queue->limits.max_discard_sectors >= stripe &&
|
|
|
|
- mddev->queue->limits.discard_granularity >= stripe)
|
|
|
|
+ mddev->queue->limits.max_discard_sectors >= (stripe >> 9) &&
|
|
|
|
+ mddev->queue->limits.discard_granularity >= stripe)
|
|
|
|
queue_flag_set_unlocked(QUEUE_FLAG_DISCARD,
|
|
|
|
mddev->queue);
|
|
|
|
else
|
|
|
|
diff --git a/drivers/media/i2c/adv7511.c b/drivers/media/i2c/adv7511.c
|
|
|
|
index ee618942cb8e..d68f742ab885 100644
|
|
|
|
--- a/drivers/media/i2c/adv7511.c
|
|
|
|
+++ b/drivers/media/i2c/adv7511.c
|
|
|
|
@@ -827,12 +827,23 @@ static void adv7511_dbg_dump_edid(int lvl, int debug, struct v4l2_subdev *sd, in
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
+static void adv7511_notify_no_edid(struct v4l2_subdev *sd)
|
|
|
|
+{
|
|
|
|
+ struct adv7511_state *state = get_adv7511_state(sd);
|
|
|
|
+ struct adv7511_edid_detect ed;
|
|
|
|
+
|
|
|
|
+ /* We failed to read the EDID, so send an event for this. */
|
|
|
|
+ ed.present = false;
|
|
|
|
+ ed.segment = adv7511_rd(sd, 0xc4);
|
|
|
|
+ v4l2_subdev_notify(sd, ADV7511_EDID_DETECT, (void *)&ed);
|
|
|
|
+ v4l2_ctrl_s_ctrl(state->have_edid0_ctrl, 0x0);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
static void adv7511_edid_handler(struct work_struct *work)
|
|
|
|
{
|
|
|
|
struct delayed_work *dwork = to_delayed_work(work);
|
|
|
|
struct adv7511_state *state = container_of(dwork, struct adv7511_state, edid_handler);
|
|
|
|
struct v4l2_subdev *sd = &state->sd;
|
|
|
|
- struct adv7511_edid_detect ed;
|
|
|
|
|
|
|
|
v4l2_dbg(1, debug, sd, "%s:\n", __func__);
|
|
|
|
|
|
|
|
@@ -857,9 +868,7 @@ static void adv7511_edid_handler(struct work_struct *work)
|
|
|
|
}
|
|
|
|
|
|
|
|
/* We failed to read the EDID, so send an event for this. */
|
|
|
|
- ed.present = false;
|
|
|
|
- ed.segment = adv7511_rd(sd, 0xc4);
|
|
|
|
- v4l2_subdev_notify(sd, ADV7511_EDID_DETECT, (void *)&ed);
|
|
|
|
+ adv7511_notify_no_edid(sd);
|
|
|
|
v4l2_dbg(1, debug, sd, "%s: no edid found\n", __func__);
|
|
|
|
}
|
|
|
|
|
|
|
|
@@ -930,7 +939,6 @@ static void adv7511_check_monitor_present_status(struct v4l2_subdev *sd)
|
|
|
|
/* update read only ctrls */
|
|
|
|
v4l2_ctrl_s_ctrl(state->hotplug_ctrl, adv7511_have_hotplug(sd) ? 0x1 : 0x0);
|
|
|
|
v4l2_ctrl_s_ctrl(state->rx_sense_ctrl, adv7511_have_rx_sense(sd) ? 0x1 : 0x0);
|
|
|
|
- v4l2_ctrl_s_ctrl(state->have_edid0_ctrl, state->edid.segments ? 0x1 : 0x0);
|
|
|
|
|
|
|
|
if ((status & MASK_ADV7511_HPD_DETECT) && ((status & MASK_ADV7511_MSEN_DETECT) || state->edid.segments)) {
|
|
|
|
v4l2_dbg(1, debug, sd, "%s: hotplug and (rx-sense or edid)\n", __func__);
|
|
|
|
@@ -960,6 +968,7 @@ static void adv7511_check_monitor_present_status(struct v4l2_subdev *sd)
|
|
|
|
}
|
|
|
|
adv7511_s_power(sd, false);
|
|
|
|
memset(&state->edid, 0, sizeof(struct adv7511_state_edid));
|
|
|
|
+ adv7511_notify_no_edid(sd);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@@ -1036,6 +1045,7 @@ static bool adv7511_check_edid_status(struct v4l2_subdev *sd)
|
|
|
|
}
|
|
|
|
/* one more segment read ok */
|
|
|
|
state->edid.segments = segment + 1;
|
|
|
|
+ v4l2_ctrl_s_ctrl(state->have_edid0_ctrl, 0x1);
|
|
|
|
if (((state->edid.data[0x7e] >> 1) + 1) > state->edid.segments) {
|
|
|
|
/* Request next EDID segment */
|
|
|
|
v4l2_dbg(1, debug, sd, "%s: request segment %d\n", __func__, state->edid.segments);
|
|
|
|
@@ -1055,7 +1065,6 @@ static bool adv7511_check_edid_status(struct v4l2_subdev *sd)
|
|
|
|
ed.present = true;
|
|
|
|
ed.segment = 0;
|
|
|
|
state->edid_detect_counter++;
|
|
|
|
- v4l2_ctrl_s_ctrl(state->have_edid0_ctrl, state->edid.segments ? 0x1 : 0x0);
|
|
|
|
v4l2_subdev_notify(sd, ADV7511_EDID_DETECT, (void *)&ed);
|
|
|
|
return ed.present;
|
|
|
|
}
|
|
|
|
diff --git a/drivers/media/pci/bt8xx/bttv-driver.c b/drivers/media/pci/bt8xx/bttv-driver.c
|
|
|
|
index afcd53bfcf8e..fa65262e7fe1 100644
|
|
|
|
--- a/drivers/media/pci/bt8xx/bttv-driver.c
|
|
|
|
+++ b/drivers/media/pci/bt8xx/bttv-driver.c
|
|
|
|
@@ -2333,6 +2333,19 @@ static int bttv_g_fmt_vid_overlay(struct file *file, void *priv,
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
+static void bttv_get_width_mask_vid_cap(const struct bttv_format *fmt,
|
|
|
|
+ unsigned int *width_mask,
|
|
|
|
+ unsigned int *width_bias)
|
|
|
|
+{
|
|
|
|
+ if (fmt->flags & FORMAT_FLAGS_PLANAR) {
|
|
|
|
+ *width_mask = ~15; /* width must be a multiple of 16 pixels */
|
|
|
|
+ *width_bias = 8; /* nearest */
|
|
|
|
+ } else {
|
|
|
|
+ *width_mask = ~3; /* width must be a multiple of 4 pixels */
|
|
|
|
+ *width_bias = 2; /* nearest */
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
static int bttv_try_fmt_vid_cap(struct file *file, void *priv,
|
|
|
|
struct v4l2_format *f)
|
|
|
|
{
|
|
|
|
@@ -2342,6 +2355,7 @@ static int bttv_try_fmt_vid_cap(struct file *file, void *priv,
|
|
|
|
enum v4l2_field field;
|
|
|
|
__s32 width, height;
|
|
|
|
__s32 height2;
|
|
|
|
+ unsigned int width_mask, width_bias;
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
fmt = format_by_fourcc(f->fmt.pix.pixelformat);
|
|
|
|
@@ -2374,9 +2388,9 @@ static int bttv_try_fmt_vid_cap(struct file *file, void *priv,
|
|
|
|
width = f->fmt.pix.width;
|
|
|
|
height = f->fmt.pix.height;
|
|
|
|
|
|
|
|
+ bttv_get_width_mask_vid_cap(fmt, &width_mask, &width_bias);
|
|
|
|
rc = limit_scaled_size_lock(fh, &width, &height, field,
|
|
|
|
- /* width_mask: 4 pixels */ ~3,
|
|
|
|
- /* width_bias: nearest */ 2,
|
|
|
|
+ width_mask, width_bias,
|
|
|
|
/* adjust_size */ 1,
|
|
|
|
/* adjust_crop */ 0);
|
|
|
|
if (0 != rc)
|
|
|
|
@@ -2409,6 +2423,7 @@ static int bttv_s_fmt_vid_cap(struct file *file, void *priv,
|
|
|
|
struct bttv_fh *fh = priv;
|
|
|
|
struct bttv *btv = fh->btv;
|
|
|
|
__s32 width, height;
|
|
|
|
+ unsigned int width_mask, width_bias;
|
|
|
|
enum v4l2_field field;
|
|
|
|
|
|
|
|
retval = bttv_switch_type(fh, f->type);
|
|
|
|
@@ -2423,9 +2438,10 @@ static int bttv_s_fmt_vid_cap(struct file *file, void *priv,
|
|
|
|
height = f->fmt.pix.height;
|
|
|
|
field = f->fmt.pix.field;
|
|
|
|
|
|
|
|
+ fmt = format_by_fourcc(f->fmt.pix.pixelformat);
|
|
|
|
+ bttv_get_width_mask_vid_cap(fmt, &width_mask, &width_bias);
|
|
|
|
retval = limit_scaled_size_lock(fh, &width, &height, f->fmt.pix.field,
|
|
|
|
- /* width_mask: 4 pixels */ ~3,
|
|
|
|
- /* width_bias: nearest */ 2,
|
|
|
|
+ width_mask, width_bias,
|
|
|
|
/* adjust_size */ 1,
|
|
|
|
/* adjust_crop */ 1);
|
|
|
|
if (0 != retval)
|
|
|
|
@@ -2433,8 +2449,6 @@ static int bttv_s_fmt_vid_cap(struct file *file, void *priv,
|
|
|
|
|
|
|
|
f->fmt.pix.field = field;
|
|
|
|
|
|
|
|
- fmt = format_by_fourcc(f->fmt.pix.pixelformat);
|
|
|
|
-
|
|
|
|
/* update our state informations */
|
|
|
|
fh->fmt = fmt;
|
|
|
|
fh->cap.field = f->fmt.pix.field;
|
|
|
|
diff --git a/drivers/media/pci/saa7134/saa7134-video.c b/drivers/media/pci/saa7134/saa7134-video.c
|
|
|
|
index 40396e8b16a8..b338db3c7185 100644
|
|
|
|
--- a/drivers/media/pci/saa7134/saa7134-video.c
|
|
|
|
+++ b/drivers/media/pci/saa7134/saa7134-video.c
|
|
|
|
@@ -1342,10 +1342,13 @@ static int saa7134_g_fmt_vid_cap(struct file *file, void *priv,
|
|
|
|
f->fmt.pix.height = dev->height;
|
|
|
|
f->fmt.pix.field = dev->cap.field;
|
|
|
|
f->fmt.pix.pixelformat = dev->fmt->fourcc;
|
|
|
|
- f->fmt.pix.bytesperline =
|
|
|
|
- (f->fmt.pix.width * dev->fmt->depth) >> 3;
|
|
|
|
+ if (dev->fmt->planar)
|
|
|
|
+ f->fmt.pix.bytesperline = f->fmt.pix.width;
|
|
|
|
+ else
|
|
|
|
+ f->fmt.pix.bytesperline =
|
|
|
|
+ (f->fmt.pix.width * dev->fmt->depth) / 8;
|
|
|
|
f->fmt.pix.sizeimage =
|
|
|
|
- f->fmt.pix.height * f->fmt.pix.bytesperline;
|
|
|
|
+ (f->fmt.pix.height * f->fmt.pix.width * dev->fmt->depth) / 8;
|
|
|
|
f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
|
|
|
|
f->fmt.pix.priv = 0;
|
|
|
|
return 0;
|
|
|
|
@@ -1424,10 +1427,13 @@ static int saa7134_try_fmt_vid_cap(struct file *file, void *priv,
|
|
|
|
if (f->fmt.pix.height > maxh)
|
|
|
|
f->fmt.pix.height = maxh;
|
|
|
|
f->fmt.pix.width &= ~0x03;
|
|
|
|
- f->fmt.pix.bytesperline =
|
|
|
|
- (f->fmt.pix.width * fmt->depth) >> 3;
|
|
|
|
+ if (fmt->planar)
|
|
|
|
+ f->fmt.pix.bytesperline = f->fmt.pix.width;
|
|
|
|
+ else
|
|
|
|
+ f->fmt.pix.bytesperline =
|
|
|
|
+ (f->fmt.pix.width * fmt->depth) / 8;
|
|
|
|
f->fmt.pix.sizeimage =
|
|
|
|
- f->fmt.pix.height * f->fmt.pix.bytesperline;
|
|
|
|
+ (f->fmt.pix.height * f->fmt.pix.width * fmt->depth) / 8;
|
|
|
|
f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
|
|
|
|
f->fmt.pix.priv = 0;
|
|
|
|
|
|
|
|
diff --git a/drivers/media/usb/pwc/pwc-if.c b/drivers/media/usb/pwc/pwc-if.c
|
|
|
|
index abf365ab025d..73c12c8d125d 100644
|
|
|
|
--- a/drivers/media/usb/pwc/pwc-if.c
|
|
|
|
+++ b/drivers/media/usb/pwc/pwc-if.c
|
|
|
|
@@ -91,6 +91,7 @@ static const struct usb_device_id pwc_device_table [] = {
|
|
|
|
{ USB_DEVICE(0x0471, 0x0312) },
|
|
|
|
{ USB_DEVICE(0x0471, 0x0313) }, /* the 'new' 720K */
|
|
|
|
{ USB_DEVICE(0x0471, 0x0329) }, /* Philips SPC 900NC PC Camera */
|
|
|
|
+ { USB_DEVICE(0x0471, 0x032C) }, /* Philips SPC 880NC PC Camera */
|
|
|
|
{ USB_DEVICE(0x069A, 0x0001) }, /* Askey */
|
|
|
|
{ USB_DEVICE(0x046D, 0x08B0) }, /* Logitech QuickCam Pro 3000 */
|
|
|
|
{ USB_DEVICE(0x046D, 0x08B1) }, /* Logitech QuickCam Notebook Pro */
|
|
|
|
@@ -799,6 +800,11 @@ static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id
|
|
|
|
name = "Philips SPC 900NC webcam";
|
|
|
|
type_id = 740;
|
|
|
|
break;
|
|
|
|
+ case 0x032C:
|
|
|
|
+ PWC_INFO("Philips SPC 880NC USB webcam detected.\n");
|
|
|
|
+ name = "Philips SPC 880NC webcam";
|
|
|
|
+ type_id = 740;
|
|
|
|
+ break;
|
|
|
|
default:
|
|
|
|
return -ENODEV;
|
|
|
|
break;
|
|
|
|
diff --git a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c
|
|
|
|
index 2bece37d0228..61c2cd3be109 100644
|
|
|
|
--- a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c
|
|
|
|
+++ b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c
|
|
|
|
@@ -392,7 +392,8 @@ static int get_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user
|
|
|
|
get_user(kp->index, &up->index) ||
|
|
|
|
get_user(kp->type, &up->type) ||
|
|
|
|
get_user(kp->flags, &up->flags) ||
|
|
|
|
- get_user(kp->memory, &up->memory))
|
|
|
|
+ get_user(kp->memory, &up->memory) ||
|
|
|
|
+ get_user(kp->length, &up->length))
|
|
|
|
return -EFAULT;
|
|
|
|
|
|
|
|
if (V4L2_TYPE_IS_OUTPUT(kp->type))
|
|
|
|
@@ -404,9 +405,6 @@ static int get_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user
|
|
|
|
return -EFAULT;
|
|
|
|
|
|
|
|
if (V4L2_TYPE_IS_MULTIPLANAR(kp->type)) {
|
|
|
|
- if (get_user(kp->length, &up->length))
|
|
|
|
- return -EFAULT;
|
|
|
|
-
|
|
|
|
num_planes = kp->length;
|
|
|
|
if (num_planes == 0) {
|
|
|
|
kp->m.planes = NULL;
|
|
|
|
@@ -439,16 +437,14 @@ static int get_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user
|
|
|
|
} else {
|
|
|
|
switch (kp->memory) {
|
|
|
|
case V4L2_MEMORY_MMAP:
|
|
|
|
- if (get_user(kp->length, &up->length) ||
|
|
|
|
- get_user(kp->m.offset, &up->m.offset))
|
|
|
|
+ if (get_user(kp->m.offset, &up->m.offset))
|
|
|
|
return -EFAULT;
|
|
|
|
break;
|
|
|
|
case V4L2_MEMORY_USERPTR:
|
|
|
|
{
|
|
|
|
compat_long_t tmp;
|
|
|
|
|
|
|
|
- if (get_user(kp->length, &up->length) ||
|
|
|
|
- get_user(tmp, &up->m.userptr))
|
|
|
|
+ if (get_user(tmp, &up->m.userptr))
|
|
|
|
return -EFAULT;
|
|
|
|
|
|
|
|
kp->m.userptr = (unsigned long)compat_ptr(tmp);
|
|
|
|
@@ -490,7 +486,8 @@ static int put_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user
|
|
|
|
copy_to_user(&up->timecode, &kp->timecode, sizeof(struct v4l2_timecode)) ||
|
|
|
|
put_user(kp->sequence, &up->sequence) ||
|
|
|
|
put_user(kp->reserved2, &up->reserved2) ||
|
|
|
|
- put_user(kp->reserved, &up->reserved))
|
|
|
|
+ put_user(kp->reserved, &up->reserved) ||
|
|
|
|
+ put_user(kp->length, &up->length))
|
|
|
|
return -EFAULT;
|
|
|
|
|
|
|
|
if (V4L2_TYPE_IS_MULTIPLANAR(kp->type)) {
|
|
|
|
@@ -513,13 +510,11 @@ static int put_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user
|
|
|
|
} else {
|
|
|
|
switch (kp->memory) {
|
|
|
|
case V4L2_MEMORY_MMAP:
|
|
|
|
- if (put_user(kp->length, &up->length) ||
|
|
|
|
- put_user(kp->m.offset, &up->m.offset))
|
|
|
|
+ if (put_user(kp->m.offset, &up->m.offset))
|
|
|
|
return -EFAULT;
|
|
|
|
break;
|
|
|
|
case V4L2_MEMORY_USERPTR:
|
|
|
|
- if (put_user(kp->length, &up->length) ||
|
|
|
|
- put_user(kp->m.userptr, &up->m.userptr))
|
|
|
|
+ if (put_user(kp->m.userptr, &up->m.userptr))
|
|
|
|
return -EFAULT;
|
|
|
|
break;
|
|
|
|
case V4L2_MEMORY_OVERLAY:
|
|
|
|
diff --git a/drivers/mtd/onenand/onenand_base.c b/drivers/mtd/onenand/onenand_base.c
|
|
|
|
index 1de33b5d3903..fdfde0271d23 100644
|
|
|
|
--- a/drivers/mtd/onenand/onenand_base.c
|
|
|
|
+++ b/drivers/mtd/onenand/onenand_base.c
|
|
|
|
@@ -2606,6 +2606,7 @@ static int onenand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
|
|
|
|
*/
|
|
|
|
static int onenand_block_markbad(struct mtd_info *mtd, loff_t ofs)
|
|
|
|
{
|
|
|
|
+ struct onenand_chip *this = mtd->priv;
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
ret = onenand_block_isbad(mtd, ofs);
|
|
|
|
@@ -2617,7 +2618,7 @@ static int onenand_block_markbad(struct mtd_info *mtd, loff_t ofs)
|
|
|
|
}
|
|
|
|
|
|
|
|
onenand_get_device(mtd, FL_WRITING);
|
|
|
|
- ret = mtd_block_markbad(mtd, ofs);
|
|
|
|
+ ret = this->block_markbad(mtd, ofs);
|
|
|
|
onenand_release_device(mtd);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
diff --git a/drivers/net/irda/irtty-sir.c b/drivers/net/irda/irtty-sir.c
|
|
|
|
index 24b6dddd7f2f..16219162566b 100644
|
|
|
|
--- a/drivers/net/irda/irtty-sir.c
|
|
|
|
+++ b/drivers/net/irda/irtty-sir.c
|
|
|
|
@@ -430,16 +430,6 @@ static int irtty_open(struct tty_struct *tty)
|
|
|
|
|
|
|
|
/* Module stuff handled via irda_ldisc.owner - Jean II */
|
|
|
|
|
|
|
|
- /* First make sure we're not already connected. */
|
|
|
|
- if (tty->disc_data != NULL) {
|
|
|
|
- priv = tty->disc_data;
|
|
|
|
- if (priv && priv->magic == IRTTY_MAGIC) {
|
|
|
|
- ret = -EEXIST;
|
|
|
|
- goto out;
|
|
|
|
- }
|
|
|
|
- tty->disc_data = NULL; /* ### */
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
/* stop the underlying driver */
|
|
|
|
irtty_stop_receiver(tty, TRUE);
|
|
|
|
if (tty->ops->stop)
|
|
|
|
diff --git a/drivers/net/rionet.c b/drivers/net/rionet.c
|
|
|
|
index 6d1f6ed3113f..d93bac129efc 100644
|
|
|
|
--- a/drivers/net/rionet.c
|
|
|
|
+++ b/drivers/net/rionet.c
|
|
|
|
@@ -280,7 +280,7 @@ static void rionet_outb_msg_event(struct rio_mport *mport, void *dev_id, int mbo
|
|
|
|
struct net_device *ndev = dev_id;
|
|
|
|
struct rionet_private *rnet = netdev_priv(ndev);
|
|
|
|
|
|
|
|
- spin_lock(&rnet->lock);
|
|
|
|
+ spin_lock(&rnet->tx_lock);
|
|
|
|
|
|
|
|
if (netif_msg_intr(rnet))
|
|
|
|
printk(KERN_INFO
|
|
|
|
@@ -299,7 +299,7 @@ static void rionet_outb_msg_event(struct rio_mport *mport, void *dev_id, int mbo
|
|
|
|
if (rnet->tx_cnt < RIONET_TX_RING_SIZE)
|
|
|
|
netif_wake_queue(ndev);
|
|
|
|
|
|
|
|
- spin_unlock(&rnet->lock);
|
|
|
|
+ spin_unlock(&rnet->tx_lock);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int rionet_open(struct net_device *ndev)
|
|
|
|
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
|
|
|
|
index 5b428db6a150..146b13752572 100644
|
|
|
|
--- a/drivers/pci/probe.c
|
|
|
|
+++ b/drivers/pci/probe.c
|
|
|
|
@@ -175,6 +175,9 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
|
|
|
|
struct pci_bus_region region, inverted_region;
|
|
|
|
bool bar_too_big = false, bar_disabled = false;
|
|
|
|
|
|
|
|
+ if (dev->non_compliant_bars)
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
mask = type ? PCI_ROM_ADDRESS_MASK : ~0;
|
|
|
|
|
|
|
|
/* No printks while decoding is disabled! */
|
|
|
|
@@ -1074,6 +1077,7 @@ int pci_cfg_space_size(struct pci_dev *dev)
|
|
|
|
int pci_setup_device(struct pci_dev *dev)
|
|
|
|
{
|
|
|
|
u32 class;
|
|
|
|
+ u16 cmd;
|
|
|
|
u8 hdr_type;
|
|
|
|
struct pci_slot *slot;
|
|
|
|
int pos = 0;
|
|
|
|
@@ -1121,6 +1125,16 @@ int pci_setup_device(struct pci_dev *dev)
|
|
|
|
/* device class may be changed after fixup */
|
|
|
|
class = dev->class >> 8;
|
|
|
|
|
|
|
|
+ if (dev->non_compliant_bars) {
|
|
|
|
+ pci_read_config_word(dev, PCI_COMMAND, &cmd);
|
|
|
|
+ if (cmd & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) {
|
|
|
|
+ dev_info(&dev->dev, "device has non-compliant BARs; disabling IO/MEM decoding\n");
|
|
|
|
+ cmd &= ~PCI_COMMAND_IO;
|
|
|
|
+ cmd &= ~PCI_COMMAND_MEMORY;
|
|
|
|
+ pci_write_config_word(dev, PCI_COMMAND, cmd);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
switch (dev->hdr_type) { /* header type */
|
|
|
|
case PCI_HEADER_TYPE_NORMAL: /* standard header */
|
|
|
|
if (class == PCI_CLASS_BRIDGE_PCI)
|
|
|
|
diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c
|
|
|
|
index cab190af6345..6b32ddcefc11 100644
|
|
|
|
--- a/drivers/scsi/aacraid/commsup.c
|
|
|
|
+++ b/drivers/scsi/aacraid/commsup.c
|
|
|
|
@@ -83,9 +83,12 @@ static int fib_map_alloc(struct aac_dev *dev)
|
|
|
|
|
|
|
|
void aac_fib_map_free(struct aac_dev *dev)
|
|
|
|
{
|
|
|
|
- pci_free_consistent(dev->pdev,
|
|
|
|
- dev->max_fib_size * (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB),
|
|
|
|
- dev->hw_fib_va, dev->hw_fib_pa);
|
|
|
|
+ if (dev->hw_fib_va && dev->max_fib_size) {
|
|
|
|
+ pci_free_consistent(dev->pdev,
|
|
|
|
+ (dev->max_fib_size *
|
|
|
|
+ (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB)),
|
|
|
|
+ dev->hw_fib_va, dev->hw_fib_pa);
|
|
|
|
+ }
|
|
|
|
dev->hw_fib_va = NULL;
|
|
|
|
dev->hw_fib_pa = 0;
|
|
|
|
}
|
|
|
|
diff --git a/drivers/scsi/be2iscsi/be_main.c b/drivers/scsi/be2iscsi/be_main.c
|
|
|
|
index 19ddd43a00cf..f4b9ac4ef16e 100644
|
|
|
|
--- a/drivers/scsi/be2iscsi/be_main.c
|
|
|
|
+++ b/drivers/scsi/be2iscsi/be_main.c
|
|
|
|
@@ -4432,6 +4432,7 @@ put_shost:
|
|
|
|
scsi_host_put(phba->shost);
|
|
|
|
free_kset:
|
|
|
|
iscsi_boot_destroy_kset(phba->boot_kset);
|
|
|
|
+ phba->boot_kset = NULL;
|
|
|
|
return -ENOMEM;
|
|
|
|
}
|
|
|
|
|
|
|
|
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c
|
|
|
|
index 128dc2f75186..2b7bc7df1edf 100644
|
|
|
|
--- a/drivers/scsi/ipr.c
|
|
|
|
+++ b/drivers/scsi/ipr.c
|
|
|
|
@@ -3946,13 +3946,17 @@ static ssize_t ipr_store_update_fw(struct device *dev,
|
|
|
|
struct ipr_sglist *sglist;
|
|
|
|
char fname[100];
|
|
|
|
char *src;
|
|
|
|
- int len, result, dnld_size;
|
|
|
|
+ char *endline;
|
|
|
|
+ int result, dnld_size;
|
|
|
|
|
|
|
|
if (!capable(CAP_SYS_ADMIN))
|
|
|
|
return -EACCES;
|
|
|
|
|
|
|
|
- len = snprintf(fname, 99, "%s", buf);
|
|
|
|
- fname[len-1] = '\0';
|
|
|
|
+ snprintf(fname, sizeof(fname), "%s", buf);
|
|
|
|
+
|
|
|
|
+ endline = strchr(fname, '\n');
|
|
|
|
+ if (endline)
|
|
|
|
+ *endline = '\0';
|
|
|
|
|
|
|
|
if (request_firmware(&fw_entry, fname, &ioa_cfg->pdev->dev)) {
|
|
|
|
dev_err(&ioa_cfg->pdev->dev, "Firmware file %s not found\n", fname);
|
|
|
|
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
|
|
|
|
index 0be16bf5f0cd..1f65e32db285 100644
|
|
|
|
--- a/drivers/scsi/sg.c
|
|
|
|
+++ b/drivers/scsi/sg.c
|
|
|
|
@@ -633,7 +633,8 @@ sg_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos)
|
|
|
|
else
|
|
|
|
hp->dxfer_direction = (mxsize > 0) ? SG_DXFER_FROM_DEV : SG_DXFER_NONE;
|
|
|
|
hp->dxfer_len = mxsize;
|
|
|
|
- if (hp->dxfer_direction == SG_DXFER_TO_DEV)
|
|
|
|
+ if ((hp->dxfer_direction == SG_DXFER_TO_DEV) ||
|
|
|
|
+ (hp->dxfer_direction == SG_DXFER_TO_FROM_DEV))
|
|
|
|
hp->dxferp = (char __user *)buf + cmd_size;
|
|
|
|
else
|
|
|
|
hp->dxferp = NULL;
|
|
|
|
diff --git a/drivers/target/target_core_tmr.c b/drivers/target/target_core_tmr.c
|
|
|
|
index 47a90d631a90..77c143854118 100644
|
|
|
|
--- a/drivers/target/target_core_tmr.c
|
|
|
|
+++ b/drivers/target/target_core_tmr.c
|
|
|
|
@@ -181,7 +181,6 @@ void core_tmr_abort_task(
|
|
|
|
|
|
|
|
if (!__target_check_io_state(se_cmd, se_sess, 0)) {
|
|
|
|
spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags);
|
|
|
|
- target_put_sess_cmd(se_sess, se_cmd);
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
|
|
|
|
index cbf927a67160..9ad3d263d5e1 100644
|
|
|
|
--- a/drivers/target/target_core_transport.c
|
|
|
|
+++ b/drivers/target/target_core_transport.c
|
|
|
|
@@ -2484,8 +2484,6 @@ void target_wait_for_sess_cmds(struct se_session *se_sess)
|
|
|
|
|
|
|
|
list_for_each_entry_safe(se_cmd, tmp_cmd,
|
|
|
|
&se_sess->sess_wait_list, se_cmd_list) {
|
|
|
|
- list_del_init(&se_cmd->se_cmd_list);
|
|
|
|
-
|
|
|
|
pr_debug("Waiting for se_cmd: %p t_state: %d, fabric state:"
|
|
|
|
" %d\n", se_cmd, se_cmd->t_state,
|
|
|
|
se_cmd->se_tfo->get_cmd_state(se_cmd));
|
|
|
|
diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c
|
|
|
|
index 612dfc720738..9fffc7295af1 100644
|
|
|
|
--- a/drivers/tty/serial/8250/8250_core.c
|
|
|
|
+++ b/drivers/tty/serial/8250/8250_core.c
|
|
|
|
@@ -686,22 +686,16 @@ static int size_fifo(struct uart_8250_port *up)
|
|
|
|
*/
|
|
|
|
static unsigned int autoconfig_read_divisor_id(struct uart_8250_port *p)
|
|
|
|
{
|
|
|
|
- unsigned char old_dll, old_dlm, old_lcr;
|
|
|
|
- unsigned int id;
|
|
|
|
+ unsigned char old_lcr;
|
|
|
|
+ unsigned int id, old_dl;
|
|
|
|
|
|
|
|
old_lcr = serial_in(p, UART_LCR);
|
|
|
|
serial_out(p, UART_LCR, UART_LCR_CONF_MODE_A);
|
|
|
|
+ old_dl = serial_dl_read(p);
|
|
|
|
+ serial_dl_write(p, 0);
|
|
|
|
+ id = serial_dl_read(p);
|
|
|
|
+ serial_dl_write(p, old_dl);
|
|
|
|
|
|
|
|
- old_dll = serial_in(p, UART_DLL);
|
|
|
|
- old_dlm = serial_in(p, UART_DLM);
|
|
|
|
-
|
|
|
|
- serial_out(p, UART_DLL, 0);
|
|
|
|
- serial_out(p, UART_DLM, 0);
|
|
|
|
-
|
|
|
|
- id = serial_in(p, UART_DLL) | serial_in(p, UART_DLM) << 8;
|
|
|
|
-
|
|
|
|
- serial_out(p, UART_DLL, old_dll);
|
|
|
|
- serial_out(p, UART_DLM, old_dlm);
|
|
|
|
serial_out(p, UART_LCR, old_lcr);
|
|
|
|
|
|
|
|
return id;
|
|
|
|
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
|
|
|
|
index 584514c7ed1f..b6f5c7d3737b 100644
|
|
|
|
--- a/drivers/usb/class/cdc-acm.c
|
|
|
|
+++ b/drivers/usb/class/cdc-acm.c
|
|
|
|
@@ -1079,6 +1079,9 @@ static int acm_probe(struct usb_interface *intf,
|
|
|
|
if (quirks == NO_UNION_NORMAL) {
|
|
|
|
data_interface = usb_ifnum_to_if(usb_dev, 1);
|
|
|
|
control_interface = usb_ifnum_to_if(usb_dev, 0);
|
|
|
|
+ /* we would crash */
|
|
|
|
+ if (!data_interface || !control_interface)
|
|
|
|
+ return -ENODEV;
|
|
|
|
goto skip_normal_probe;
|
|
|
|
}
|
|
|
|
|
|
|
|
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c
|
|
|
|
index 39c7cd6ffa4b..5c65f37536b0 100644
|
|
|
|
--- a/drivers/usb/core/driver.c
|
|
|
|
+++ b/drivers/usb/core/driver.c
|
|
|
|
@@ -494,11 +494,15 @@ static int usb_unbind_interface(struct device *dev)
|
|
|
|
int usb_driver_claim_interface(struct usb_driver *driver,
|
|
|
|
struct usb_interface *iface, void *priv)
|
|
|
|
{
|
|
|
|
- struct device *dev = &iface->dev;
|
|
|
|
+ struct device *dev;
|
|
|
|
struct usb_device *udev;
|
|
|
|
int retval = 0;
|
|
|
|
int lpm_disable_error;
|
|
|
|
|
|
|
|
+ if (!iface)
|
|
|
|
+ return -ENODEV;
|
|
|
|
+
|
|
|
|
+ dev = &iface->dev;
|
|
|
|
if (dev->driver)
|
|
|
|
return -EBUSY;
|
|
|
|
|
|
|
|
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
|
|
|
|
index 648e7eccdde9..f7fdc2c4f8b7 100644
|
|
|
|
--- a/drivers/usb/core/hub.c
|
|
|
|
+++ b/drivers/usb/core/hub.c
|
|
|
|
@@ -4079,7 +4079,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
|
|
|
|
|
|
|
|
struct usb_device *hdev = hub->hdev;
|
|
|
|
struct usb_hcd *hcd = bus_to_hcd(hdev->bus);
|
|
|
|
- int i, j, retval;
|
|
|
|
+ int retries, operations, retval, i;
|
|
|
|
unsigned delay = HUB_SHORT_RESET_TIME;
|
|
|
|
enum usb_device_speed oldspeed = udev->speed;
|
|
|
|
const char *speed;
|
|
|
|
@@ -4181,7 +4181,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
|
|
|
|
* first 8 bytes of the device descriptor to get the ep0 maxpacket
|
|
|
|
* value.
|
|
|
|
*/
|
|
|
|
- for (i = 0; i < GET_DESCRIPTOR_TRIES; (++i, msleep(100))) {
|
|
|
|
+ for (retries = 0; retries < GET_DESCRIPTOR_TRIES; (++retries, msleep(100))) {
|
|
|
|
bool did_new_scheme = false;
|
|
|
|
|
|
|
|
if (use_new_scheme(udev, retry_counter)) {
|
|
|
|
@@ -4204,7 +4204,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
|
|
|
|
* 255 is for WUSB devices, we actually need to use
|
|
|
|
* 512 (WUSB1.0[4.8.1]).
|
|
|
|
*/
|
|
|
|
- for (j = 0; j < 3; ++j) {
|
|
|
|
+ for (operations = 0; operations < 3; ++operations) {
|
|
|
|
buf->bMaxPacketSize0 = 0;
|
|
|
|
r = usb_control_msg(udev, usb_rcvaddr0pipe(),
|
|
|
|
USB_REQ_GET_DESCRIPTOR, USB_DIR_IN,
|
|
|
|
@@ -4224,7 +4224,13 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
|
|
|
|
r = -EPROTO;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
- if (r == 0)
|
|
|
|
+ /*
|
|
|
|
+ * Some devices time out if they are powered on
|
|
|
|
+ * when already connected. They need a second
|
|
|
|
+ * reset. But only on the first attempt,
|
|
|
|
+ * lest we get into a time out/reset loop
|
|
|
|
+ */
|
|
|
|
+ if (r == 0 || (r == -ETIMEDOUT && retries == 0))
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
udev->descriptor.bMaxPacketSize0 =
|
|
|
|
@@ -4256,7 +4262,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
|
|
|
|
* authorization will assign the final address.
|
|
|
|
*/
|
|
|
|
if (udev->wusb == 0) {
|
|
|
|
- for (j = 0; j < SET_ADDRESS_TRIES; ++j) {
|
|
|
|
+ for (operations = 0; operations < SET_ADDRESS_TRIES; ++operations) {
|
|
|
|
retval = hub_set_address(udev, devnum);
|
|
|
|
if (retval >= 0)
|
|
|
|
break;
|
|
|
|
diff --git a/drivers/usb/misc/iowarrior.c b/drivers/usb/misc/iowarrior.c
|
|
|
|
index 20bcfdd7eace..35d1457d84b1 100644
|
|
|
|
--- a/drivers/usb/misc/iowarrior.c
|
|
|
|
+++ b/drivers/usb/misc/iowarrior.c
|
|
|
|
@@ -791,6 +791,12 @@ static int iowarrior_probe(struct usb_interface *interface,
|
|
|
|
iface_desc = interface->cur_altsetting;
|
|
|
|
dev->product_id = le16_to_cpu(udev->descriptor.idProduct);
|
|
|
|
|
|
|
|
+ if (iface_desc->desc.bNumEndpoints < 1) {
|
|
|
|
+ dev_err(&interface->dev, "Invalid number of endpoints\n");
|
|
|
|
+ retval = -EINVAL;
|
|
|
|
+ goto error;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
/* set up the endpoint information */
|
|
|
|
for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
|
|
|
|
endpoint = &iface_desc->endpoint[i].desc;
|
|
|
|
diff --git a/drivers/usb/serial/Kconfig b/drivers/usb/serial/Kconfig
|
|
|
|
index 3ce5c74b29e4..6f483b8a4f56 100644
|
|
|
|
--- a/drivers/usb/serial/Kconfig
|
|
|
|
+++ b/drivers/usb/serial/Kconfig
|
|
|
|
@@ -59,6 +59,7 @@ config USB_SERIAL_SIMPLE
|
|
|
|
driver. Specifically, it supports:
|
|
|
|
- Suunto ANT+ USB device.
|
|
|
|
- Fundamental Software dongle.
|
|
|
|
+ - Google USB serial devices
|
|
|
|
- HP4x calculators
|
|
|
|
- a number of Motorola phones
|
|
|
|
- Siemens USB/MPI adapter.
|
|
|
|
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
|
|
|
|
index 922723edd6b0..b689a2fd960c 100644
|
|
|
|
--- a/drivers/usb/serial/cp210x.c
|
|
|
|
+++ b/drivers/usb/serial/cp210x.c
|
|
|
|
@@ -164,6 +164,7 @@ static const struct usb_device_id id_table[] = {
|
|
|
|
{ USB_DEVICE(0x18EF, 0xE025) }, /* ELV Marble Sound Board 1 */
|
|
|
|
{ USB_DEVICE(0x1901, 0x0190) }, /* GE B850 CP2105 Recorder interface */
|
|
|
|
{ USB_DEVICE(0x1901, 0x0193) }, /* GE B650 CP2104 PMC interface */
|
|
|
|
+ { USB_DEVICE(0x1901, 0x0194) }, /* GE Healthcare Remote Alarm Box */
|
|
|
|
{ USB_DEVICE(0x19CF, 0x3000) }, /* Parrot NMEA GPS Flight Recorder */
|
|
|
|
{ USB_DEVICE(0x1ADB, 0x0001) }, /* Schweitzer Engineering C662 Cable */
|
|
|
|
{ USB_DEVICE(0x1B1C, 0x1C00) }, /* Corsair USB Dongle */
|
|
|
|
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c
|
|
|
|
index bccb1223143a..81001d13774e 100644
|
|
|
|
--- a/drivers/usb/serial/cypress_m8.c
|
|
|
|
+++ b/drivers/usb/serial/cypress_m8.c
|
|
|
|
@@ -447,6 +447,11 @@ static int cypress_generic_port_probe(struct usb_serial_port *port)
|
|
|
|
struct usb_serial *serial = port->serial;
|
|
|
|
struct cypress_private *priv;
|
|
|
|
|
|
|
|
+ if (!port->interrupt_out_urb || !port->interrupt_in_urb) {
|
|
|
|
+ dev_err(&port->dev, "required endpoint is missing\n");
|
|
|
|
+ return -ENODEV;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
priv = kzalloc(sizeof(struct cypress_private), GFP_KERNEL);
|
|
|
|
if (!priv)
|
|
|
|
return -ENOMEM;
|
|
|
|
@@ -606,12 +611,6 @@ static int cypress_open(struct tty_struct *tty, struct usb_serial_port *port)
|
|
|
|
cypress_set_termios(tty, port, &priv->tmp_termios);
|
|
|
|
|
|
|
|
/* setup the port and start reading from the device */
|
|
|
|
- if (!port->interrupt_in_urb) {
|
|
|
|
- dev_err(&port->dev, "%s - interrupt_in_urb is empty!\n",
|
|
|
|
- __func__);
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
usb_fill_int_urb(port->interrupt_in_urb, serial->dev,
|
|
|
|
usb_rcvintpipe(serial->dev, port->interrupt_in_endpointAddress),
|
|
|
|
port->interrupt_in_urb->transfer_buffer,
|
|
|
|
diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c
|
|
|
|
index 8a23c53b946e..cd6df875163e 100644
|
|
|
|
--- a/drivers/usb/serial/digi_acceleport.c
|
|
|
|
+++ b/drivers/usb/serial/digi_acceleport.c
|
|
|
|
@@ -1252,8 +1252,27 @@ static int digi_port_init(struct usb_serial_port *port, unsigned port_num)
|
|
|
|
|
|
|
|
static int digi_startup(struct usb_serial *serial)
|
|
|
|
{
|
|
|
|
+ struct device *dev = &serial->interface->dev;
|
|
|
|
struct digi_serial *serial_priv;
|
|
|
|
int ret;
|
|
|
|
+ int i;
|
|
|
|
+
|
|
|
|
+ /* check whether the device has the expected number of endpoints */
|
|
|
|
+ if (serial->num_port_pointers < serial->type->num_ports + 1) {
|
|
|
|
+ dev_err(dev, "OOB endpoints missing\n");
|
|
|
|
+ return -ENODEV;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < serial->type->num_ports + 1 ; i++) {
|
|
|
|
+ if (!serial->port[i]->read_urb) {
|
|
|
|
+ dev_err(dev, "bulk-in endpoint missing\n");
|
|
|
|
+ return -ENODEV;
|
|
|
|
+ }
|
|
|
|
+ if (!serial->port[i]->write_urb) {
|
|
|
|
+ dev_err(dev, "bulk-out endpoint missing\n");
|
|
|
|
+ return -ENODEV;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
|
|
serial_priv = kzalloc(sizeof(*serial_priv), GFP_KERNEL);
|
|
|
|
if (!serial_priv)
|
|
|
|
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
|
|
|
|
index b5d8e2544b8f..fb3a832d86e3 100644
|
|
|
|
--- a/drivers/usb/serial/ftdi_sio.c
|
|
|
|
+++ b/drivers/usb/serial/ftdi_sio.c
|
|
|
|
@@ -1017,6 +1017,10 @@ static const struct usb_device_id id_table_combined[] = {
|
|
|
|
{ USB_DEVICE(FTDI_VID, CHETCO_SEASMART_DISPLAY_PID) },
|
|
|
|
{ USB_DEVICE(FTDI_VID, CHETCO_SEASMART_LITE_PID) },
|
|
|
|
{ USB_DEVICE(FTDI_VID, CHETCO_SEASMART_ANALOG_PID) },
|
|
|
|
+ /* ICP DAS I-756xU devices */
|
|
|
|
+ { USB_DEVICE(ICPDAS_VID, ICPDAS_I7560U_PID) },
|
|
|
|
+ { USB_DEVICE(ICPDAS_VID, ICPDAS_I7561U_PID) },
|
|
|
|
+ { USB_DEVICE(ICPDAS_VID, ICPDAS_I7563U_PID) },
|
|
|
|
{ } /* Terminating entry */
|
|
|
|
};
|
|
|
|
|
|
|
|
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h
|
|
|
|
index 7850071c0ae1..334bc600282d 100644
|
|
|
|
--- a/drivers/usb/serial/ftdi_sio_ids.h
|
|
|
|
+++ b/drivers/usb/serial/ftdi_sio_ids.h
|
|
|
|
@@ -872,6 +872,14 @@
|
|
|
|
#define NOVITUS_BONO_E_PID 0x6010
|
|
|
|
|
|
|
|
/*
|
|
|
|
+ * ICPDAS I-756*U devices
|
|
|
|
+ */
|
|
|
|
+#define ICPDAS_VID 0x1b5c
|
|
|
|
+#define ICPDAS_I7560U_PID 0x0103
|
|
|
|
+#define ICPDAS_I7561U_PID 0x0104
|
|
|
|
+#define ICPDAS_I7563U_PID 0x0105
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
* RT Systems programming cables for various ham radios
|
|
|
|
*/
|
|
|
|
#define RTSYSTEMS_VID 0x2100 /* Vendor ID */
|
|
|
|
diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c
|
|
|
|
index fd707d6a10e2..89726f702202 100644
|
|
|
|
--- a/drivers/usb/serial/mct_u232.c
|
|
|
|
+++ b/drivers/usb/serial/mct_u232.c
|
|
|
|
@@ -376,14 +376,21 @@ static void mct_u232_msr_to_state(struct usb_serial_port *port,
|
|
|
|
|
|
|
|
static int mct_u232_port_probe(struct usb_serial_port *port)
|
|
|
|
{
|
|
|
|
+ struct usb_serial *serial = port->serial;
|
|
|
|
struct mct_u232_private *priv;
|
|
|
|
|
|
|
|
+ /* check first to simplify error handling */
|
|
|
|
+ if (!serial->port[1] || !serial->port[1]->interrupt_in_urb) {
|
|
|
|
+ dev_err(&port->dev, "expected endpoint missing\n");
|
|
|
|
+ return -ENODEV;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
|
|
|
|
if (!priv)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
/* Use second interrupt-in endpoint for reading. */
|
|
|
|
- priv->read_urb = port->serial->port[1]->interrupt_in_urb;
|
|
|
|
+ priv->read_urb = serial->port[1]->interrupt_in_urb;
|
|
|
|
priv->read_urb->context = port;
|
|
|
|
|
|
|
|
spin_lock_init(&priv->lock);
|
|
|
|
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
|
|
|
|
index 24366a2afea6..99c89d7fa1ad 100644
|
|
|
|
--- a/drivers/usb/serial/option.c
|
|
|
|
+++ b/drivers/usb/serial/option.c
|
|
|
|
@@ -1818,6 +1818,8 @@ static const struct usb_device_id option_ids[] = {
|
|
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d02, 0xff, 0x00, 0x00) },
|
|
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d03, 0xff, 0x02, 0x01) },
|
|
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d03, 0xff, 0x00, 0x00) },
|
|
|
|
+ { USB_DEVICE_INTERFACE_CLASS(0x2001, 0x7e19, 0xff), /* D-Link DWM-221 B1 */
|
|
|
|
+ .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
|
|
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e01, 0xff, 0xff, 0xff) }, /* D-Link DWM-152/C1 */
|
|
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e02, 0xff, 0xff, 0xff) }, /* D-Link DWM-156/C1 */
|
|
|
|
{ USB_DEVICE_INTERFACE_CLASS(0x2020, 0x4000, 0xff) }, /* OLICARD300 - MT6225 */
|
|
|
|
diff --git a/drivers/usb/serial/usb-serial-simple.c b/drivers/usb/serial/usb-serial-simple.c
|
|
|
|
index efb727a49262..5c19d3e7b4b8 100644
|
|
|
|
--- a/drivers/usb/serial/usb-serial-simple.c
|
|
|
|
+++ b/drivers/usb/serial/usb-serial-simple.c
|
|
|
|
@@ -51,6 +51,14 @@ DEVICE(funsoft, FUNSOFT_IDS);
|
|
|
|
{ USB_DEVICE(0x8087, 0x0716) }
|
|
|
|
DEVICE(flashloader, FLASHLOADER_IDS);
|
|
|
|
|
|
|
|
+/* Google Serial USB SubClass */
|
|
|
|
+#define GOOGLE_IDS() \
|
|
|
|
+ { USB_VENDOR_AND_INTERFACE_INFO(0x18d1, \
|
|
|
|
+ USB_CLASS_VENDOR_SPEC, \
|
|
|
|
+ 0x50, \
|
|
|
|
+ 0x01) }
|
|
|
|
+DEVICE(google, GOOGLE_IDS);
|
|
|
|
+
|
|
|
|
/* ViVOpay USB Serial Driver */
|
|
|
|
#define VIVOPAY_IDS() \
|
|
|
|
{ USB_DEVICE(0x1d5f, 0x1004) } /* ViVOpay 8800 */
|
|
|
|
@@ -86,6 +94,7 @@ static struct usb_serial_driver * const serial_drivers[] = {
|
|
|
|
&zio_device,
|
|
|
|
&funsoft_device,
|
|
|
|
&flashloader_device,
|
|
|
|
+ &google_device,
|
|
|
|
&vivopay_device,
|
|
|
|
&moto_modem_device,
|
|
|
|
&hp4x_device,
|
|
|
|
@@ -98,6 +107,7 @@ static const struct usb_device_id id_table[] = {
|
|
|
|
ZIO_IDS(),
|
|
|
|
FUNSOFT_IDS(),
|
|
|
|
FLASHLOADER_IDS(),
|
|
|
|
+ GOOGLE_IDS(),
|
|
|
|
VIVOPAY_IDS(),
|
|
|
|
MOTO_IDS(),
|
|
|
|
HP4X_IDS(),
|
|
|
|
diff --git a/drivers/watchdog/rc32434_wdt.c b/drivers/watchdog/rc32434_wdt.c
|
|
|
|
index 71e78ef4b736..3a75f3b53452 100644
|
|
|
|
--- a/drivers/watchdog/rc32434_wdt.c
|
|
|
|
+++ b/drivers/watchdog/rc32434_wdt.c
|
|
|
|
@@ -237,7 +237,7 @@ static long rc32434_wdt_ioctl(struct file *file, unsigned int cmd,
|
|
|
|
return -EINVAL;
|
|
|
|
/* Fall through */
|
|
|
|
case WDIOC_GETTIMEOUT:
|
|
|
|
- return copy_to_user(argp, &timeout, sizeof(int));
|
|
|
|
+ return copy_to_user(argp, &timeout, sizeof(int)) ? -EFAULT : 0;
|
|
|
|
default:
|
|
|
|
return -ENOTTY;
|
|
|
|
}
|
|
|
|
diff --git a/fs/coredump.c b/fs/coredump.c
|
|
|
|
index 72f97a56966f..09c201161bff 100644
|
|
|
|
--- a/fs/coredump.c
|
|
|
|
+++ b/fs/coredump.c
|
|
|
|
@@ -32,6 +32,9 @@
|
|
|
|
#include <linux/pipe_fs_i.h>
|
|
|
|
#include <linux/oom.h>
|
|
|
|
#include <linux/compat.h>
|
|
|
|
+#include <linux/sched.h>
|
|
|
|
+#include <linux/fs.h>
|
|
|
|
+#include <linux/path.h>
|
|
|
|
|
|
|
|
#include <asm/uaccess.h>
|
|
|
|
#include <asm/mmu_context.h>
|
|
|
|
@@ -613,6 +616,8 @@ void do_coredump(const siginfo_t *siginfo)
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
struct inode *inode;
|
|
|
|
+ int open_flags = O_CREAT | O_RDWR | O_NOFOLLOW |
|
|
|
|
+ O_LARGEFILE | O_EXCL;
|
|
|
|
|
|
|
|
if (cprm.limit < binfmt->min_coredump)
|
|
|
|
goto fail_unlock;
|
|
|
|
@@ -651,10 +656,27 @@ void do_coredump(const siginfo_t *siginfo)
|
|
|
|
* what matters is that at least one of the two processes
|
|
|
|
* writes its coredump successfully, not which one.
|
|
|
|
*/
|
|
|
|
- cprm.file = filp_open(cn.corename,
|
|
|
|
- O_CREAT | 2 | O_NOFOLLOW |
|
|
|
|
- O_LARGEFILE | O_EXCL,
|
|
|
|
- 0600);
|
|
|
|
+ if (need_suid_safe) {
|
|
|
|
+ /*
|
|
|
|
+ * Using user namespaces, normal user tasks can change
|
|
|
|
+ * their current->fs->root to point to arbitrary
|
|
|
|
+ * directories. Since the intention of the "only dump
|
|
|
|
+ * with a fully qualified path" rule is to control where
|
|
|
|
+ * coredumps may be placed using root privileges,
|
|
|
|
+ * current->fs->root must not be used. Instead, use the
|
|
|
|
+ * root directory of init_task.
|
|
|
|
+ */
|
|
|
|
+ struct path root;
|
|
|
|
+
|
|
|
|
+ task_lock(&init_task);
|
|
|
|
+ get_fs_root(init_task.fs, &root);
|
|
|
|
+ task_unlock(&init_task);
|
|
|
|
+ cprm.file = file_open_root(root.dentry, root.mnt,
|
|
|
|
+ cn.corename, open_flags, 0600);
|
|
|
|
+ path_put(&root);
|
|
|
|
+ } else {
|
|
|
|
+ cprm.file = filp_open(cn.corename, open_flags, 0600);
|
|
|
|
+ }
|
|
|
|
if (IS_ERR(cprm.file))
|
|
|
|
goto fail_unlock;
|
|
|
|
|
|
|
|
diff --git a/fs/fhandle.c b/fs/fhandle.c
|
|
|
|
index d59712dfa3e7..ca3c3dd01789 100644
|
|
|
|
--- a/fs/fhandle.c
|
|
|
|
+++ b/fs/fhandle.c
|
|
|
|
@@ -228,7 +228,7 @@ long do_handle_open(int mountdirfd,
|
|
|
|
path_put(&path);
|
|
|
|
return fd;
|
|
|
|
}
|
|
|
|
- file = file_open_root(path.dentry, path.mnt, "", open_flag);
|
|
|
|
+ file = file_open_root(path.dentry, path.mnt, "", open_flag, 0);
|
|
|
|
if (IS_ERR(file)) {
|
|
|
|
put_unused_fd(fd);
|
|
|
|
retval = PTR_ERR(file);
|
|
|
|
diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
|
|
|
|
index ef5f39a73c51..84db6c78541c 100644
|
|
|
|
--- a/fs/jbd2/journal.c
|
|
|
|
+++ b/fs/jbd2/journal.c
|
|
|
|
@@ -1423,11 +1423,12 @@ out:
|
|
|
|
/**
|
|
|
|
* jbd2_mark_journal_empty() - Mark on disk journal as empty.
|
|
|
|
* @journal: The journal to update.
|
|
|
|
+ * @write_op: With which operation should we write the journal sb
|
|
|
|
*
|
|
|
|
* Update a journal's dynamic superblock fields to show that journal is empty.
|
|
|
|
* Write updated superblock to disk waiting for IO to complete.
|
|
|
|
*/
|
|
|
|
-static void jbd2_mark_journal_empty(journal_t *journal)
|
|
|
|
+static void jbd2_mark_journal_empty(journal_t *journal, int write_op)
|
|
|
|
{
|
|
|
|
journal_superblock_t *sb = journal->j_superblock;
|
|
|
|
|
|
|
|
@@ -1445,7 +1446,7 @@ static void jbd2_mark_journal_empty(journal_t *journal)
|
|
|
|
sb->s_start = cpu_to_be32(0);
|
|
|
|
read_unlock(&journal->j_state_lock);
|
|
|
|
|
|
|
|
- jbd2_write_superblock(journal, WRITE_FUA);
|
|
|
|
+ jbd2_write_superblock(journal, write_op);
|
|
|
|
|
|
|
|
/* Log is no longer empty */
|
|
|
|
write_lock(&journal->j_state_lock);
|
|
|
|
@@ -1730,7 +1731,13 @@ int jbd2_journal_destroy(journal_t *journal)
|
|
|
|
if (journal->j_sb_buffer) {
|
|
|
|
if (!is_journal_aborted(journal)) {
|
|
|
|
mutex_lock(&journal->j_checkpoint_mutex);
|
|
|
|
- jbd2_mark_journal_empty(journal);
|
|
|
|
+
|
|
|
|
+ write_lock(&journal->j_state_lock);
|
|
|
|
+ journal->j_tail_sequence =
|
|
|
|
+ ++journal->j_transaction_sequence;
|
|
|
|
+ write_unlock(&journal->j_state_lock);
|
|
|
|
+
|
|
|
|
+ jbd2_mark_journal_empty(journal, WRITE_FLUSH_FUA);
|
|
|
|
mutex_unlock(&journal->j_checkpoint_mutex);
|
|
|
|
} else
|
|
|
|
err = -EIO;
|
|
|
|
@@ -1991,7 +1998,7 @@ int jbd2_journal_flush(journal_t *journal)
|
|
|
|
* the magic code for a fully-recovered superblock. Any future
|
|
|
|
* commits of data to the journal will restore the current
|
|
|
|
* s_start value. */
|
|
|
|
- jbd2_mark_journal_empty(journal);
|
|
|
|
+ jbd2_mark_journal_empty(journal, WRITE_FUA);
|
|
|
|
mutex_unlock(&journal->j_checkpoint_mutex);
|
|
|
|
write_lock(&journal->j_state_lock);
|
|
|
|
J_ASSERT(!journal->j_running_transaction);
|
|
|
|
@@ -2037,7 +2044,7 @@ int jbd2_journal_wipe(journal_t *journal, int write)
|
|
|
|
if (write) {
|
|
|
|
/* Lock to make assertions happy... */
|
|
|
|
mutex_lock(&journal->j_checkpoint_mutex);
|
|
|
|
- jbd2_mark_journal_empty(journal);
|
|
|
|
+ jbd2_mark_journal_empty(journal, WRITE_FUA);
|
|
|
|
mutex_unlock(&journal->j_checkpoint_mutex);
|
|
|
|
}
|
|
|
|
|
|
|
|
diff --git a/fs/ocfs2/dlm/dlmconvert.c b/fs/ocfs2/dlm/dlmconvert.c
|
|
|
|
index e36d63ff1783..f90931335c6b 100644
|
|
|
|
--- a/fs/ocfs2/dlm/dlmconvert.c
|
|
|
|
+++ b/fs/ocfs2/dlm/dlmconvert.c
|
|
|
|
@@ -262,6 +262,7 @@ enum dlm_status dlmconvert_remote(struct dlm_ctxt *dlm,
|
|
|
|
struct dlm_lock *lock, int flags, int type)
|
|
|
|
{
|
|
|
|
enum dlm_status status;
|
|
|
|
+ u8 old_owner = res->owner;
|
|
|
|
|
|
|
|
mlog(0, "type=%d, convert_type=%d, busy=%d\n", lock->ml.type,
|
|
|
|
lock->ml.convert_type, res->state & DLM_LOCK_RES_IN_PROGRESS);
|
|
|
|
@@ -287,6 +288,19 @@ enum dlm_status dlmconvert_remote(struct dlm_ctxt *dlm,
|
|
|
|
status = DLM_DENIED;
|
|
|
|
goto bail;
|
|
|
|
}
|
|
|
|
+
|
|
|
|
+ if (lock->ml.type == type && lock->ml.convert_type == LKM_IVMODE) {
|
|
|
|
+ mlog(0, "last convert request returned DLM_RECOVERING, but "
|
|
|
|
+ "owner has already queued and sent ast to me. res %.*s, "
|
|
|
|
+ "(cookie=%u:%llu, type=%d, conv=%d)\n",
|
|
|
|
+ res->lockname.len, res->lockname.name,
|
|
|
|
+ dlm_get_lock_cookie_node(be64_to_cpu(lock->ml.cookie)),
|
|
|
|
+ dlm_get_lock_cookie_seq(be64_to_cpu(lock->ml.cookie)),
|
|
|
|
+ lock->ml.type, lock->ml.convert_type);
|
|
|
|
+ status = DLM_NORMAL;
|
|
|
|
+ goto bail;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
res->state |= DLM_LOCK_RES_IN_PROGRESS;
|
|
|
|
/* move lock to local convert queue */
|
|
|
|
/* do not alter lock refcount. switching lists. */
|
|
|
|
@@ -316,11 +330,19 @@ enum dlm_status dlmconvert_remote(struct dlm_ctxt *dlm,
|
|
|
|
spin_lock(&res->spinlock);
|
|
|
|
res->state &= ~DLM_LOCK_RES_IN_PROGRESS;
|
|
|
|
lock->convert_pending = 0;
|
|
|
|
- /* if it failed, move it back to granted queue */
|
|
|
|
+ /* if it failed, move it back to granted queue.
|
|
|
|
+ * if master returns DLM_NORMAL and then down before sending ast,
|
|
|
|
+ * it may have already been moved to granted queue, reset to
|
|
|
|
+ * DLM_RECOVERING and retry convert */
|
|
|
|
if (status != DLM_NORMAL) {
|
|
|
|
if (status != DLM_NOTQUEUED)
|
|
|
|
dlm_error(status);
|
|
|
|
dlm_revert_pending_convert(res, lock);
|
|
|
|
+ } else if ((res->state & DLM_LOCK_RES_RECOVERING) ||
|
|
|
|
+ (old_owner != res->owner)) {
|
|
|
|
+ mlog(0, "res %.*s is in recovering or has been recovered.\n",
|
|
|
|
+ res->lockname.len, res->lockname.name);
|
|
|
|
+ status = DLM_RECOVERING;
|
|
|
|
}
|
|
|
|
bail:
|
|
|
|
spin_unlock(&res->spinlock);
|
|
|
|
diff --git a/fs/ocfs2/dlm/dlmrecovery.c b/fs/ocfs2/dlm/dlmrecovery.c
|
|
|
|
index 4b93d96d244f..01be4e409a3f 100644
|
|
|
|
--- a/fs/ocfs2/dlm/dlmrecovery.c
|
|
|
|
+++ b/fs/ocfs2/dlm/dlmrecovery.c
|
|
|
|
@@ -2040,7 +2040,6 @@ void dlm_move_lockres_to_recovery_list(struct dlm_ctxt *dlm,
|
|
|
|
dlm_lock_get(lock);
|
|
|
|
if (lock->convert_pending) {
|
|
|
|
/* move converting lock back to granted */
|
|
|
|
- BUG_ON(i != DLM_CONVERTING_LIST);
|
|
|
|
mlog(0, "node died with convert pending "
|
|
|
|
"on %.*s. move back to granted list.\n",
|
|
|
|
res->lockname.len, res->lockname.name);
|
|
|
|
diff --git a/fs/open.c b/fs/open.c
|
|
|
|
index 17679f2b2f1c..dbe5085f7d89 100644
|
|
|
|
--- a/fs/open.c
|
|
|
|
+++ b/fs/open.c
|
|
|
|
@@ -945,14 +945,12 @@ struct file *filp_open(const char *filename, int flags, umode_t mode)
|
|
|
|
EXPORT_SYMBOL(filp_open);
|
|
|
|
|
|
|
|
struct file *file_open_root(struct dentry *dentry, struct vfsmount *mnt,
|
|
|
|
- const char *filename, int flags)
|
|
|
|
+ const char *filename, int flags, umode_t mode)
|
|
|
|
{
|
|
|
|
struct open_flags op;
|
|
|
|
- int err = build_open_flags(flags, 0, &op);
|
|
|
|
+ int err = build_open_flags(flags, mode, &op);
|
|
|
|
if (err)
|
|
|
|
return ERR_PTR(err);
|
|
|
|
- if (flags & O_CREAT)
|
|
|
|
- return ERR_PTR(-EINVAL);
|
|
|
|
if (!filename && (flags & O_DIRECTORY))
|
|
|
|
if (!dentry->d_inode->i_op->lookup)
|
|
|
|
return ERR_PTR(-ENOTDIR);
|
|
|
|
diff --git a/fs/splice.c b/fs/splice.c
|
|
|
|
index e64f59960ec5..cb29a106f71f 100644
|
|
|
|
--- a/fs/splice.c
|
|
|
|
+++ b/fs/splice.c
|
|
|
|
@@ -189,6 +189,9 @@ ssize_t splice_to_pipe(struct pipe_inode_info *pipe,
|
|
|
|
unsigned int spd_pages = spd->nr_pages;
|
|
|
|
int ret, do_wakeup, page_nr;
|
|
|
|
|
|
|
|
+ if (!spd_pages)
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
ret = 0;
|
|
|
|
do_wakeup = 0;
|
|
|
|
page_nr = 0;
|
|
|
|
diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c
|
|
|
|
index 01db96f60cf0..70433d8e11b8 100644
|
|
|
|
--- a/fs/xfs/xfs_attr_list.c
|
|
|
|
+++ b/fs/xfs/xfs_attr_list.c
|
|
|
|
@@ -205,8 +205,10 @@ xfs_attr_shortform_list(xfs_attr_list_context_t *context)
|
|
|
|
sbp->namelen,
|
|
|
|
sbp->valuelen,
|
|
|
|
&sbp->name[sbp->namelen]);
|
|
|
|
- if (error)
|
|
|
|
+ if (error) {
|
|
|
|
+ kmem_free(sbuf);
|
|
|
|
return error;
|
|
|
|
+ }
|
|
|
|
if (context->seen_enough)
|
|
|
|
break;
|
|
|
|
cursor->offset++;
|
|
|
|
@@ -452,14 +454,13 @@ xfs_attr3_leaf_list_int(
|
|
|
|
args.rmtblkcnt = xfs_attr3_rmt_blocks(
|
|
|
|
args.dp->i_mount, valuelen);
|
|
|
|
retval = xfs_attr_rmtval_get(&args);
|
|
|
|
- if (retval)
|
|
|
|
- return retval;
|
|
|
|
- retval = context->put_listent(context,
|
|
|
|
- entry->flags,
|
|
|
|
- name_rmt->name,
|
|
|
|
- (int)name_rmt->namelen,
|
|
|
|
- valuelen,
|
|
|
|
- args.value);
|
|
|
|
+ if (!retval)
|
|
|
|
+ retval = context->put_listent(context,
|
|
|
|
+ entry->flags,
|
|
|
|
+ name_rmt->name,
|
|
|
|
+ (int)name_rmt->namelen,
|
|
|
|
+ valuelen,
|
|
|
|
+ args.value);
|
|
|
|
kmem_free(args.value);
|
|
|
|
} else {
|
|
|
|
retval = context->put_listent(context,
|
|
|
|
diff --git a/include/linux/fs.h b/include/linux/fs.h
|
|
|
|
index 23b2a35d712e..42dd4c916781 100644
|
|
|
|
--- a/include/linux/fs.h
|
|
|
|
+++ b/include/linux/fs.h
|
2016-09-29 19:40:38 +02:00
|
|
|
@@ -2078,8 +2078,8 @@ extern long do_sys_open(int dfd, const char __user *filename, int flags,
|
2016-04-14 16:26:21 +02:00
|
|
|
extern struct file *file_open_name(struct filename *, int, umode_t);
|
|
|
|
extern struct file *filp_open(const char *, int, umode_t);
|
|
|
|
extern struct file *file_open_root(struct dentry *, struct vfsmount *,
|
|
|
|
- const char *, int);
|
|
|
|
+ const char *, int, umode_t);
|
2016-09-29 19:40:38 +02:00
|
|
|
extern int vfs_open(const struct path *, struct file *, const struct cred *);
|
2016-04-14 16:26:21 +02:00
|
|
|
extern struct file * dentry_open(const struct path *, int, const struct cred *);
|
|
|
|
extern int filp_close(struct file *, fl_owner_t id);
|
|
|
|
|
|
|
|
diff --git a/include/linux/kernel.h b/include/linux/kernel.h
|
|
|
|
index 196d1ea86df0..129438a741bb 100644
|
|
|
|
--- a/include/linux/kernel.h
|
|
|
|
+++ b/include/linux/kernel.h
|
|
|
|
@@ -595,7 +595,7 @@ do { \
|
|
|
|
|
|
|
|
#define do_trace_printk(fmt, args...) \
|
|
|
|
do { \
|
|
|
|
- static const char *trace_printk_fmt \
|
|
|
|
+ static const char *trace_printk_fmt __used \
|
|
|
|
__attribute__((section("__trace_printk_fmt"))) = \
|
|
|
|
__builtin_constant_p(fmt) ? fmt : NULL; \
|
|
|
|
\
|
|
|
|
@@ -639,7 +639,7 @@ int __trace_printk(unsigned long ip, const char *fmt, ...);
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define trace_puts(str) ({ \
|
|
|
|
- static const char *trace_printk_fmt \
|
|
|
|
+ static const char *trace_printk_fmt __used \
|
|
|
|
__attribute__((section("__trace_printk_fmt"))) = \
|
|
|
|
__builtin_constant_p(str) ? str : NULL; \
|
|
|
|
\
|
|
|
|
@@ -661,7 +661,7 @@ extern void trace_dump_stack(int skip);
|
|
|
|
#define ftrace_vprintk(fmt, vargs) \
|
|
|
|
do { \
|
|
|
|
if (__builtin_constant_p(fmt)) { \
|
|
|
|
- static const char *trace_printk_fmt \
|
|
|
|
+ static const char *trace_printk_fmt __used \
|
|
|
|
__attribute__((section("__trace_printk_fmt"))) = \
|
|
|
|
__builtin_constant_p(fmt) ? fmt : NULL; \
|
|
|
|
\
|
|
|
|
diff --git a/include/linux/pci.h b/include/linux/pci.h
|
|
|
|
index d662546f77d8..ecc6e129faa9 100644
|
|
|
|
--- a/include/linux/pci.h
|
|
|
|
+++ b/include/linux/pci.h
|
|
|
|
@@ -344,6 +344,7 @@ struct pci_dev {
|
|
|
|
unsigned int __aer_firmware_first:1;
|
|
|
|
unsigned int broken_intx_masking:1;
|
|
|
|
unsigned int io_window_1k:1; /* Intel P2P bridge 1K I/O windows */
|
|
|
|
+ unsigned int non_compliant_bars:1; /* broken BARs; ignore them */
|
|
|
|
pci_dev_flags_t dev_flags;
|
|
|
|
atomic_t enable_cnt; /* pci_enable_device has been called */
|
|
|
|
|
|
|
|
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
|
|
|
|
index 46afc8cd69dd..1ad2f185827e 100644
|
|
|
|
--- a/kernel/sched/core.c
|
|
|
|
+++ b/kernel/sched/core.c
|
|
|
|
@@ -5064,6 +5064,7 @@ migration_call(struct notifier_block *nfb, unsigned long action, void *hcpu)
|
|
|
|
|
|
|
|
case CPU_UP_PREPARE:
|
|
|
|
rq->calc_load_update = calc_load_update;
|
|
|
|
+ account_reset_rq(rq);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPU_ONLINE:
|
|
|
|
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
|
|
|
|
index 675e147a86f2..3ecc6ce65517 100644
|
|
|
|
--- a/kernel/sched/sched.h
|
|
|
|
+++ b/kernel/sched/sched.h
|
|
|
|
@@ -1563,3 +1563,16 @@ static inline u64 irq_time_read(int cpu)
|
|
|
|
}
|
|
|
|
#endif /* CONFIG_64BIT */
|
|
|
|
#endif /* CONFIG_IRQ_TIME_ACCOUNTING */
|
|
|
|
+
|
|
|
|
+static inline void account_reset_rq(struct rq *rq)
|
|
|
|
+{
|
|
|
|
+#ifdef CONFIG_IRQ_TIME_ACCOUNTING
|
|
|
|
+ rq->prev_irq_time = 0;
|
|
|
|
+#endif
|
|
|
|
+#ifdef CONFIG_PARAVIRT
|
|
|
|
+ rq->prev_steal_time = 0;
|
|
|
|
+#endif
|
|
|
|
+#ifdef CONFIG_PARAVIRT_TIME_ACCOUNTING
|
|
|
|
+ rq->prev_steal_time_rq = 0;
|
|
|
|
+#endif
|
|
|
|
+}
|
|
|
|
diff --git a/kernel/sysctl_binary.c b/kernel/sysctl_binary.c
|
|
|
|
index 653cbbd9e7ad..b93763d780d6 100644
|
|
|
|
--- a/kernel/sysctl_binary.c
|
|
|
|
+++ b/kernel/sysctl_binary.c
|
|
|
|
@@ -1320,7 +1320,7 @@ static ssize_t binary_sysctl(const int *name, int nlen,
|
|
|
|
}
|
|
|
|
|
|
|
|
mnt = task_active_pid_ns(current)->proc_mnt;
|
|
|
|
- file = file_open_root(mnt->mnt_root, mnt, pathname, flags);
|
|
|
|
+ file = file_open_root(mnt->mnt_root, mnt, pathname, flags, 0);
|
|
|
|
result = PTR_ERR(file);
|
|
|
|
if (IS_ERR(file))
|
|
|
|
goto out_putname;
|
|
|
|
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
|
|
|
|
index a2d62b3b90c7..6ea1b943fb1e 100644
|
|
|
|
--- a/kernel/trace/trace.c
|
|
|
|
+++ b/kernel/trace/trace.c
|
|
|
|
@@ -4457,7 +4457,10 @@ static ssize_t tracing_splice_read_pipe(struct file *filp,
|
|
|
|
|
|
|
|
spd.nr_pages = i;
|
|
|
|
|
|
|
|
- ret = splice_to_pipe(pipe, &spd);
|
|
|
|
+ if (i)
|
|
|
|
+ ret = splice_to_pipe(pipe, &spd);
|
|
|
|
+ else
|
|
|
|
+ ret = 0;
|
|
|
|
out:
|
|
|
|
splice_shrink_spd(&spd);
|
|
|
|
return ret;
|
|
|
|
diff --git a/kernel/trace/trace_irqsoff.c b/kernel/trace/trace_irqsoff.c
|
|
|
|
index 2aefbee93a6d..56e083e26ca9 100644
|
|
|
|
--- a/kernel/trace/trace_irqsoff.c
|
|
|
|
+++ b/kernel/trace/trace_irqsoff.c
|
|
|
|
@@ -118,8 +118,12 @@ static int func_prolog_dec(struct trace_array *tr,
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
local_save_flags(*flags);
|
|
|
|
- /* slight chance to get a false positive on tracing_cpu */
|
|
|
|
- if (!irqs_disabled_flags(*flags))
|
|
|
|
+ /*
|
|
|
|
+ * Slight chance to get a false positive on tracing_cpu,
|
|
|
|
+ * although I'm starting to think there isn't a chance.
|
|
|
|
+ * Leave this for now just to be paranoid.
|
|
|
|
+ */
|
|
|
|
+ if (!irqs_disabled_flags(*flags) && !preempt_count())
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
*data = per_cpu_ptr(tr->trace_buffer.data, cpu);
|
|
|
|
diff --git a/kernel/trace/trace_printk.c b/kernel/trace/trace_printk.c
|
|
|
|
index 7c8cef653166..7b900474209d 100644
|
|
|
|
--- a/kernel/trace/trace_printk.c
|
|
|
|
+++ b/kernel/trace/trace_printk.c
|
|
|
|
@@ -292,6 +292,9 @@ static int t_show(struct seq_file *m, void *v)
|
|
|
|
const char *str = *fmt;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
+ if (!*fmt)
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
seq_printf(m, "0x%lx : \"", *(unsigned long *)fmt);
|
|
|
|
|
|
|
|
/*
|
|
|
|
diff --git a/scripts/coccinelle/iterators/use_after_iter.cocci b/scripts/coccinelle/iterators/use_after_iter.cocci
|
|
|
|
index f085f5968c52..ce8cc9c006e5 100644
|
|
|
|
--- a/scripts/coccinelle/iterators/use_after_iter.cocci
|
|
|
|
+++ b/scripts/coccinelle/iterators/use_after_iter.cocci
|
|
|
|
@@ -123,7 +123,7 @@ list_remove_head(x,c,...)
|
|
|
|
|
|
|
|
|
sizeof(<+...c...+>)
|
|
|
|
|
|
|
|
|
-&c->member
|
|
|
|
+ &c->member
|
|
|
|
|
|
|
|
|
c = E
|
|
|
|
|
|
|
|
|
diff --git a/scripts/package/mkspec b/scripts/package/mkspec
|
|
|
|
index 13957602f7ca..c92358d61e26 100755
|
|
|
|
--- a/scripts/package/mkspec
|
|
|
|
+++ b/scripts/package/mkspec
|
|
|
|
@@ -131,11 +131,11 @@ echo 'rm -rf $RPM_BUILD_ROOT'
|
|
|
|
echo ""
|
|
|
|
echo "%post"
|
|
|
|
echo "if [ -x /sbin/installkernel -a -r /boot/vmlinuz-$KERNELRELEASE -a -r /boot/System.map-$KERNELRELEASE ]; then"
|
|
|
|
-echo "cp /boot/vmlinuz-$KERNELRELEASE /boot/vmlinuz-$KERNELRELEASE-rpm"
|
|
|
|
-echo "cp /boot/System.map-$KERNELRELEASE /boot/System.map-$KERNELRELEASE-rpm"
|
|
|
|
+echo "cp /boot/vmlinuz-$KERNELRELEASE /boot/.vmlinuz-$KERNELRELEASE-rpm"
|
|
|
|
+echo "cp /boot/System.map-$KERNELRELEASE /boot/.System.map-$KERNELRELEASE-rpm"
|
|
|
|
echo "rm -f /boot/vmlinuz-$KERNELRELEASE /boot/System.map-$KERNELRELEASE"
|
|
|
|
-echo "/sbin/installkernel $KERNELRELEASE /boot/vmlinuz-$KERNELRELEASE-rpm /boot/System.map-$KERNELRELEASE-rpm"
|
|
|
|
-echo "rm -f /boot/vmlinuz-$KERNELRELEASE-rpm /boot/System.map-$KERNELRELEASE-rpm"
|
|
|
|
+echo "/sbin/installkernel $KERNELRELEASE /boot/.vmlinuz-$KERNELRELEASE-rpm /boot/.System.map-$KERNELRELEASE-rpm"
|
|
|
|
+echo "rm -f /boot/.vmlinuz-$KERNELRELEASE-rpm /boot/.System.map-$KERNELRELEASE-rpm"
|
|
|
|
echo "fi"
|
|
|
|
echo ""
|
|
|
|
echo "%files"
|
|
|
|
diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c
|
|
|
|
index eef182bea2ad..6d8151d949ca 100644
|
|
|
|
--- a/sound/pci/hda/patch_cirrus.c
|
|
|
|
+++ b/sound/pci/hda/patch_cirrus.c
|
|
|
|
@@ -177,8 +177,12 @@ static void cs_automute(struct hda_codec *codec)
|
|
|
|
snd_hda_gen_update_outputs(codec);
|
|
|
|
|
|
|
|
if (spec->gpio_eapd_hp || spec->gpio_eapd_speaker) {
|
|
|
|
- spec->gpio_data = spec->gen.hp_jack_present ?
|
|
|
|
- spec->gpio_eapd_hp : spec->gpio_eapd_speaker;
|
|
|
|
+ if (spec->gen.automute_speaker)
|
|
|
|
+ spec->gpio_data = spec->gen.hp_jack_present ?
|
|
|
|
+ spec->gpio_eapd_hp : spec->gpio_eapd_speaker;
|
|
|
|
+ else
|
|
|
|
+ spec->gpio_data =
|
|
|
|
+ spec->gpio_eapd_hp | spec->gpio_eapd_speaker;
|
|
|
|
snd_hda_codec_write(codec, 0x01, 0,
|
|
|
|
AC_VERB_SET_GPIO_DATA, spec->gpio_data);
|
|
|
|
}
|
|
|
|
diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c
|
|
|
|
index 08d8733604a2..339915647c9a 100644
|
|
|
|
--- a/sound/pci/intel8x0.c
|
|
|
|
+++ b/sound/pci/intel8x0.c
|
|
|
|
@@ -2884,6 +2884,7 @@ static void intel8x0_measure_ac97_clock(struct intel8x0 *chip)
|
|
|
|
|
|
|
|
static struct snd_pci_quirk intel8x0_clock_list[] = {
|
|
|
|
SND_PCI_QUIRK(0x0e11, 0x008a, "AD1885", 41000),
|
|
|
|
+ SND_PCI_QUIRK(0x1014, 0x0581, "AD1981B", 48000),
|
|
|
|
SND_PCI_QUIRK(0x1028, 0x00be, "AD1885", 44100),
|
|
|
|
SND_PCI_QUIRK(0x1028, 0x0177, "AD1980", 48000),
|
|
|
|
SND_PCI_QUIRK(0x1028, 0x01ad, "AD1981B", 48000),
|
|
|
|
diff --git a/sound/usb/clock.c b/sound/usb/clock.c
|
|
|
|
index 86f80c60b21f..1329d7725196 100644
|
|
|
|
--- a/sound/usb/clock.c
|
|
|
|
+++ b/sound/usb/clock.c
|
|
|
|
@@ -283,6 +283,8 @@ static int set_sample_rate_v1(struct snd_usb_audio *chip, int iface,
|
|
|
|
unsigned char data[3];
|
|
|
|
int err, crate;
|
|
|
|
|
|
|
|
+ if (get_iface_desc(alts)->bNumEndpoints < 1)
|
|
|
|
+ return -EINVAL;
|
|
|
|
ep = get_endpoint(alts, 0)->bEndpointAddress;
|
|
|
|
|
|
|
|
/* if endpoint doesn't have sampling rate control, bail out */
|
|
|
|
diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c
|
|
|
|
index 105ece3c14e3..c686ec8e8fa1 100644
|
|
|
|
--- a/sound/usb/endpoint.c
|
|
|
|
+++ b/sound/usb/endpoint.c
|
|
|
|
@@ -409,6 +409,9 @@ exit_clear:
|
|
|
|
*
|
|
|
|
* New endpoints will be added to chip->ep_list and must be freed by
|
|
|
|
* calling snd_usb_endpoint_free().
|
|
|
|
+ *
|
|
|
|
+ * For SND_USB_ENDPOINT_TYPE_SYNC, the caller needs to guarantee that
|
|
|
|
+ * bNumEndpoints > 1 beforehand.
|
|
|
|
*/
|
|
|
|
struct snd_usb_endpoint *snd_usb_add_endpoint(struct snd_usb_audio *chip,
|
|
|
|
struct usb_host_interface *alts,
|
|
|
|
diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
|
|
|
|
index a82ec53b8fb3..aca30e600bde 100644
|
|
|
|
--- a/sound/usb/mixer_quirks.c
|
|
|
|
+++ b/sound/usb/mixer_quirks.c
|
|
|
|
@@ -1455,7 +1455,11 @@ static int snd_microii_spdif_default_get(struct snd_kcontrol *kcontrol,
|
|
|
|
|
|
|
|
/* use known values for that card: interface#1 altsetting#1 */
|
|
|
|
iface = usb_ifnum_to_if(mixer->chip->dev, 1);
|
|
|
|
+ if (!iface || iface->num_altsetting < 2)
|
|
|
|
+ return -EINVAL;
|
|
|
|
alts = &iface->altsetting[1];
|
|
|
|
+ if (get_iface_desc(alts)->bNumEndpoints < 1)
|
|
|
|
+ return -EINVAL;
|
|
|
|
ep = get_endpoint(alts, 0)->bEndpointAddress;
|
|
|
|
|
|
|
|
err = snd_usb_ctl_msg(mixer->chip->dev,
|
|
|
|
diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
|
|
|
|
index ede4b92710aa..d2fba888a485 100644
|
|
|
|
--- a/sound/usb/pcm.c
|
|
|
|
+++ b/sound/usb/pcm.c
|
|
|
|
@@ -159,6 +159,8 @@ static int init_pitch_v1(struct snd_usb_audio *chip, int iface,
|
|
|
|
unsigned char data[1];
|
|
|
|
int err;
|
|
|
|
|
|
|
|
+ if (get_iface_desc(alts)->bNumEndpoints < 1)
|
|
|
|
+ return -EINVAL;
|
|
|
|
ep = get_endpoint(alts, 0)->bEndpointAddress;
|
|
|
|
|
|
|
|
data[0] = 1;
|
|
|
|
diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
|
|
|
|
index 9a599b1bc6ba..2ad6ba95f02d 100644
|
|
|
|
--- a/sound/usb/quirks.c
|
|
|
|
+++ b/sound/usb/quirks.c
|
|
|
|
@@ -138,6 +138,7 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip,
|
|
|
|
snd_printk(KERN_ERR "cannot memdup\n");
|
|
|
|
return -ENOMEM;
|
|
|
|
}
|
|
|
|
+ INIT_LIST_HEAD(&fp->list);
|
|
|
|
if (fp->nr_rates > MAX_NR_RATES) {
|
|
|
|
kfree(fp);
|
|
|
|
return -EINVAL;
|
|
|
|
@@ -155,19 +156,20 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip,
|
|
|
|
stream = (fp->endpoint & USB_DIR_IN)
|
|
|
|
? SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK;
|
|
|
|
err = snd_usb_add_audio_stream(chip, stream, fp);
|
|
|
|
- if (err < 0) {
|
|
|
|
- kfree(fp);
|
|
|
|
- kfree(rate_table);
|
|
|
|
- return err;
|
|
|
|
- }
|
|
|
|
+ if (err < 0)
|
|
|
|
+ goto error;
|
|
|
|
if (fp->iface != get_iface_desc(&iface->altsetting[0])->bInterfaceNumber ||
|
|
|
|
fp->altset_idx >= iface->num_altsetting) {
|
|
|
|
- kfree(fp);
|
|
|
|
- kfree(rate_table);
|
|
|
|
- return -EINVAL;
|
|
|
|
+ err = -EINVAL;
|
|
|
|
+ goto error;
|
|
|
|
}
|
|
|
|
alts = &iface->altsetting[fp->altset_idx];
|
|
|
|
altsd = get_iface_desc(alts);
|
|
|
|
+ if (altsd->bNumEndpoints < 1) {
|
|
|
|
+ err = -EINVAL;
|
|
|
|
+ goto error;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
fp->protocol = altsd->bInterfaceProtocol;
|
|
|
|
|
|
|
|
if (fp->datainterval == 0)
|
|
|
|
@@ -178,6 +180,12 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip,
|
|
|
|
snd_usb_init_pitch(chip, fp->iface, alts, fp);
|
|
|
|
snd_usb_init_sample_rate(chip, fp->iface, alts, fp, fp->rate_max);
|
|
|
|
return 0;
|
|
|
|
+
|
|
|
|
+ error:
|
|
|
|
+ list_del(&fp->list); /* unlink for avoiding double-free */
|
|
|
|
+ kfree(fp);
|
|
|
|
+ kfree(rate_table);
|
|
|
|
+ return err;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int create_auto_pcm_quirk(struct snd_usb_audio *chip,
|
|
|
|
@@ -450,6 +458,7 @@ static int create_uaxx_quirk(struct snd_usb_audio *chip,
|
|
|
|
fp->ep_attr = get_endpoint(alts, 0)->bmAttributes;
|
|
|
|
fp->datainterval = 0;
|
|
|
|
fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize);
|
|
|
|
+ INIT_LIST_HEAD(&fp->list);
|
|
|
|
|
|
|
|
switch (fp->maxpacksize) {
|
|
|
|
case 0x120:
|
|
|
|
@@ -473,6 +482,7 @@ static int create_uaxx_quirk(struct snd_usb_audio *chip,
|
|
|
|
? SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK;
|
|
|
|
err = snd_usb_add_audio_stream(chip, stream, fp);
|
|
|
|
if (err < 0) {
|
|
|
|
+ list_del(&fp->list); /* unlink for avoiding double-free */
|
|
|
|
kfree(fp);
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
diff --git a/sound/usb/stream.c b/sound/usb/stream.c
|
|
|
|
index 2fb71be5e100..f06c754c9783 100644
|
|
|
|
--- a/sound/usb/stream.c
|
|
|
|
+++ b/sound/usb/stream.c
|
|
|
|
@@ -315,7 +315,9 @@ static struct snd_pcm_chmap_elem *convert_chmap(int channels, unsigned int bits,
|
|
|
|
/*
|
|
|
|
* add this endpoint to the chip instance.
|
|
|
|
* if a stream with the same endpoint already exists, append to it.
|
|
|
|
- * if not, create a new pcm stream.
|
|
|
|
+ * if not, create a new pcm stream. note, fp is added to the substream
|
|
|
|
+ * fmt_list and will be freed on the chip instance release. do not free
|
|
|
|
+ * fp or do remove it from the substream fmt_list to avoid double-free.
|
|
|
|
*/
|
|
|
|
int snd_usb_add_audio_stream(struct snd_usb_audio *chip,
|
|
|
|
int stream,
|
|
|
|
@@ -662,6 +664,7 @@ int snd_usb_parse_audio_interface(struct snd_usb_audio *chip, int iface_no)
|
|
|
|
* (fp->maxpacksize & 0x7ff);
|
|
|
|
fp->attributes = parse_uac_endpoint_attributes(chip, alts, protocol, iface_no);
|
|
|
|
fp->clock = clock;
|
|
|
|
+ INIT_LIST_HEAD(&fp->list);
|
|
|
|
|
|
|
|
/* some quirks for attributes here */
|
|
|
|
|
|
|
|
@@ -710,6 +713,7 @@ int snd_usb_parse_audio_interface(struct snd_usb_audio *chip, int iface_no)
|
|
|
|
snd_printdd(KERN_INFO "%d:%u:%d: add audio endpoint %#x\n", dev->devnum, iface_no, altno, fp->endpoint);
|
|
|
|
err = snd_usb_add_audio_stream(chip, stream, fp);
|
|
|
|
if (err < 0) {
|
|
|
|
+ list_del(&fp->list); /* unlink for avoiding double-free */
|
|
|
|
kfree(fp->rate_table);
|
|
|
|
kfree(fp->chmap);
|
|
|
|
kfree(fp);
|
|
|
|
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
|
|
|
|
index d7d950f51b55..9e5cd217ffaf 100644
|
|
|
|
--- a/virt/kvm/kvm_main.c
|
|
|
|
+++ b/virt/kvm/kvm_main.c
|
|
|
|
@@ -454,6 +454,16 @@ static struct kvm *kvm_create_vm(unsigned long type)
|
|
|
|
if (!kvm)
|
|
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
|
|
+ spin_lock_init(&kvm->mmu_lock);
|
|
|
|
+ atomic_inc(¤t->mm->mm_count);
|
|
|
|
+ kvm->mm = current->mm;
|
|
|
|
+ kvm_eventfd_init(kvm);
|
|
|
|
+ mutex_init(&kvm->lock);
|
|
|
|
+ mutex_init(&kvm->irq_lock);
|
|
|
|
+ mutex_init(&kvm->slots_lock);
|
|
|
|
+ atomic_set(&kvm->users_count, 1);
|
|
|
|
+ INIT_LIST_HEAD(&kvm->devices);
|
|
|
|
+
|
|
|
|
r = kvm_arch_init_vm(kvm, type);
|
|
|
|
if (r)
|
|
|
|
goto out_err_nodisable;
|
|
|
|
@@ -483,16 +493,6 @@ static struct kvm *kvm_create_vm(unsigned long type)
|
|
|
|
goto out_err;
|
|
|
|
}
|
|
|
|
|
|
|
|
- spin_lock_init(&kvm->mmu_lock);
|
|
|
|
- kvm->mm = current->mm;
|
|
|
|
- atomic_inc(&kvm->mm->mm_count);
|
|
|
|
- kvm_eventfd_init(kvm);
|
|
|
|
- mutex_init(&kvm->lock);
|
|
|
|
- mutex_init(&kvm->irq_lock);
|
|
|
|
- mutex_init(&kvm->slots_lock);
|
|
|
|
- atomic_set(&kvm->users_count, 1);
|
|
|
|
- INIT_LIST_HEAD(&kvm->devices);
|
|
|
|
-
|
|
|
|
r = kvm_init_mmu_notifier(kvm);
|
|
|
|
if (r)
|
|
|
|
goto out_err;
|
|
|
|
@@ -512,6 +512,7 @@ out_err_nodisable:
|
|
|
|
kfree(kvm->buses[i]);
|
|
|
|
kfree(kvm->memslots);
|
|
|
|
kvm_arch_free_vm(kvm);
|
|
|
|
+ mmdrop(current->mm);
|
|
|
|
return ERR_PTR(r);
|
|
|
|
}
|
|
|
|
|