Contents of /trunk/kernel-lts/patches-3.4/0145-3.4.46-all-fixes.patch
Parent Directory | Revision Log
Revision 2205 -
(show annotations)
(download)
Thu Jun 13 10:38:23 2013 UTC (11 years, 3 months ago) by niro
File size: 61243 byte(s)
Thu Jun 13 10:38:23 2013 UTC (11 years, 3 months ago) by niro
File size: 61243 byte(s)
-linux-3.4.46
1 | diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c |
2 | index d87ee06..283a8d0 100644 |
3 | --- a/arch/arm/mach-omap2/board-rx51-peripherals.c |
4 | +++ b/arch/arm/mach-omap2/board-rx51-peripherals.c |
5 | @@ -63,11 +63,11 @@ |
6 | #define RX51_TSC2005_RESET_GPIO 104 |
7 | #define RX51_TSC2005_IRQ_GPIO 100 |
8 | |
9 | -/* list all spi devices here */ |
10 | +/* List all SPI devices here. Note that the list/probe order seems to matter! */ |
11 | enum { |
12 | RX51_SPI_WL1251, |
13 | - RX51_SPI_MIPID, /* LCD panel */ |
14 | RX51_SPI_TSC2005, /* Touch Controller */ |
15 | + RX51_SPI_MIPID, /* LCD panel */ |
16 | }; |
17 | |
18 | static struct wl12xx_platform_data wl1251_pdata; |
19 | diff --git a/arch/powerpc/include/asm/rtas.h b/arch/powerpc/include/asm/rtas.h |
20 | index 557cff8..5e7e008 100644 |
21 | --- a/arch/powerpc/include/asm/rtas.h |
22 | +++ b/arch/powerpc/include/asm/rtas.h |
23 | @@ -262,6 +262,8 @@ extern void rtas_progress(char *s, unsigned short hex); |
24 | extern void rtas_initialize(void); |
25 | extern int rtas_suspend_cpu(struct rtas_suspend_me_data *data); |
26 | extern int rtas_suspend_last_cpu(struct rtas_suspend_me_data *data); |
27 | +extern int rtas_online_cpus_mask(cpumask_var_t cpus); |
28 | +extern int rtas_offline_cpus_mask(cpumask_var_t cpus); |
29 | extern int rtas_ibm_suspend_me(struct rtas_args *); |
30 | |
31 | struct rtc_time; |
32 | diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c |
33 | index fcec382..225e9f2 100644 |
34 | --- a/arch/powerpc/kernel/rtas.c |
35 | +++ b/arch/powerpc/kernel/rtas.c |
36 | @@ -19,6 +19,7 @@ |
37 | #include <linux/init.h> |
38 | #include <linux/capability.h> |
39 | #include <linux/delay.h> |
40 | +#include <linux/cpu.h> |
41 | #include <linux/smp.h> |
42 | #include <linux/completion.h> |
43 | #include <linux/cpumask.h> |
44 | @@ -808,6 +809,95 @@ static void rtas_percpu_suspend_me(void *info) |
45 | __rtas_suspend_cpu((struct rtas_suspend_me_data *)info, 1); |
46 | } |
47 | |
48 | +enum rtas_cpu_state { |
49 | + DOWN, |
50 | + UP, |
51 | +}; |
52 | + |
53 | +#ifndef CONFIG_SMP |
54 | +static int rtas_cpu_state_change_mask(enum rtas_cpu_state state, |
55 | + cpumask_var_t cpus) |
56 | +{ |
57 | + if (!cpumask_empty(cpus)) { |
58 | + cpumask_clear(cpus); |
59 | + return -EINVAL; |
60 | + } else |
61 | + return 0; |
62 | +} |
63 | +#else |
64 | +/* On return cpumask will be altered to indicate CPUs changed. |
65 | + * CPUs with states changed will be set in the mask, |
66 | + * CPUs with status unchanged will be unset in the mask. */ |
67 | +static int rtas_cpu_state_change_mask(enum rtas_cpu_state state, |
68 | + cpumask_var_t cpus) |
69 | +{ |
70 | + int cpu; |
71 | + int cpuret = 0; |
72 | + int ret = 0; |
73 | + |
74 | + if (cpumask_empty(cpus)) |
75 | + return 0; |
76 | + |
77 | + for_each_cpu(cpu, cpus) { |
78 | + switch (state) { |
79 | + case DOWN: |
80 | + cpuret = cpu_down(cpu); |
81 | + break; |
82 | + case UP: |
83 | + cpuret = cpu_up(cpu); |
84 | + break; |
85 | + } |
86 | + if (cpuret) { |
87 | + pr_debug("%s: cpu_%s for cpu#%d returned %d.\n", |
88 | + __func__, |
89 | + ((state == UP) ? "up" : "down"), |
90 | + cpu, cpuret); |
91 | + if (!ret) |
92 | + ret = cpuret; |
93 | + if (state == UP) { |
94 | + /* clear bits for unchanged cpus, return */ |
95 | + cpumask_shift_right(cpus, cpus, cpu); |
96 | + cpumask_shift_left(cpus, cpus, cpu); |
97 | + break; |
98 | + } else { |
99 | + /* clear bit for unchanged cpu, continue */ |
100 | + cpumask_clear_cpu(cpu, cpus); |
101 | + } |
102 | + } |
103 | + } |
104 | + |
105 | + return ret; |
106 | +} |
107 | +#endif |
108 | + |
109 | +int rtas_online_cpus_mask(cpumask_var_t cpus) |
110 | +{ |
111 | + int ret; |
112 | + |
113 | + ret = rtas_cpu_state_change_mask(UP, cpus); |
114 | + |
115 | + if (ret) { |
116 | + cpumask_var_t tmp_mask; |
117 | + |
118 | + if (!alloc_cpumask_var(&tmp_mask, GFP_TEMPORARY)) |
119 | + return ret; |
120 | + |
121 | + /* Use tmp_mask to preserve cpus mask from first failure */ |
122 | + cpumask_copy(tmp_mask, cpus); |
123 | + rtas_offline_cpus_mask(tmp_mask); |
124 | + free_cpumask_var(tmp_mask); |
125 | + } |
126 | + |
127 | + return ret; |
128 | +} |
129 | +EXPORT_SYMBOL(rtas_online_cpus_mask); |
130 | + |
131 | +int rtas_offline_cpus_mask(cpumask_var_t cpus) |
132 | +{ |
133 | + return rtas_cpu_state_change_mask(DOWN, cpus); |
134 | +} |
135 | +EXPORT_SYMBOL(rtas_offline_cpus_mask); |
136 | + |
137 | int rtas_ibm_suspend_me(struct rtas_args *args) |
138 | { |
139 | long state; |
140 | @@ -815,6 +905,8 @@ int rtas_ibm_suspend_me(struct rtas_args *args) |
141 | unsigned long retbuf[PLPAR_HCALL_BUFSIZE]; |
142 | struct rtas_suspend_me_data data; |
143 | DECLARE_COMPLETION_ONSTACK(done); |
144 | + cpumask_var_t offline_mask; |
145 | + int cpuret; |
146 | |
147 | if (!rtas_service_present("ibm,suspend-me")) |
148 | return -ENOSYS; |
149 | @@ -838,11 +930,24 @@ int rtas_ibm_suspend_me(struct rtas_args *args) |
150 | return 0; |
151 | } |
152 | |
153 | + if (!alloc_cpumask_var(&offline_mask, GFP_TEMPORARY)) |
154 | + return -ENOMEM; |
155 | + |
156 | atomic_set(&data.working, 0); |
157 | atomic_set(&data.done, 0); |
158 | atomic_set(&data.error, 0); |
159 | data.token = rtas_token("ibm,suspend-me"); |
160 | data.complete = &done; |
161 | + |
162 | + /* All present CPUs must be online */ |
163 | + cpumask_andnot(offline_mask, cpu_present_mask, cpu_online_mask); |
164 | + cpuret = rtas_online_cpus_mask(offline_mask); |
165 | + if (cpuret) { |
166 | + pr_err("%s: Could not bring present CPUs online.\n", __func__); |
167 | + atomic_set(&data.error, cpuret); |
168 | + goto out; |
169 | + } |
170 | + |
171 | stop_topology_update(); |
172 | |
173 | /* Call function on all CPUs. One of us will make the |
174 | @@ -858,6 +963,14 @@ int rtas_ibm_suspend_me(struct rtas_args *args) |
175 | |
176 | start_topology_update(); |
177 | |
178 | + /* Take down CPUs not online prior to suspend */ |
179 | + cpuret = rtas_offline_cpus_mask(offline_mask); |
180 | + if (cpuret) |
181 | + pr_warn("%s: Could not restore CPUs to offline state.\n", |
182 | + __func__); |
183 | + |
184 | +out: |
185 | + free_cpumask_var(offline_mask); |
186 | return atomic_read(&data.error); |
187 | } |
188 | #else /* CONFIG_PPC_PSERIES */ |
189 | diff --git a/arch/powerpc/platforms/pseries/suspend.c b/arch/powerpc/platforms/pseries/suspend.c |
190 | index 47226e0..5f997e7 100644 |
191 | --- a/arch/powerpc/platforms/pseries/suspend.c |
192 | +++ b/arch/powerpc/platforms/pseries/suspend.c |
193 | @@ -16,6 +16,7 @@ |
194 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
195 | */ |
196 | |
197 | +#include <linux/cpu.h> |
198 | #include <linux/delay.h> |
199 | #include <linux/suspend.h> |
200 | #include <linux/stat.h> |
201 | @@ -126,11 +127,15 @@ static ssize_t store_hibernate(struct device *dev, |
202 | struct device_attribute *attr, |
203 | const char *buf, size_t count) |
204 | { |
205 | + cpumask_var_t offline_mask; |
206 | int rc; |
207 | |
208 | if (!capable(CAP_SYS_ADMIN)) |
209 | return -EPERM; |
210 | |
211 | + if (!alloc_cpumask_var(&offline_mask, GFP_TEMPORARY)) |
212 | + return -ENOMEM; |
213 | + |
214 | stream_id = simple_strtoul(buf, NULL, 16); |
215 | |
216 | do { |
217 | @@ -140,15 +145,32 @@ static ssize_t store_hibernate(struct device *dev, |
218 | } while (rc == -EAGAIN); |
219 | |
220 | if (!rc) { |
221 | + /* All present CPUs must be online */ |
222 | + cpumask_andnot(offline_mask, cpu_present_mask, |
223 | + cpu_online_mask); |
224 | + rc = rtas_online_cpus_mask(offline_mask); |
225 | + if (rc) { |
226 | + pr_err("%s: Could not bring present CPUs online.\n", |
227 | + __func__); |
228 | + goto out; |
229 | + } |
230 | + |
231 | stop_topology_update(); |
232 | rc = pm_suspend(PM_SUSPEND_MEM); |
233 | start_topology_update(); |
234 | + |
235 | + /* Take down CPUs not online prior to suspend */ |
236 | + if (!rtas_offline_cpus_mask(offline_mask)) |
237 | + pr_warn("%s: Could not restore CPUs to offline " |
238 | + "state.\n", __func__); |
239 | } |
240 | |
241 | stream_id = 0; |
242 | |
243 | if (!rc) |
244 | rc = count; |
245 | +out: |
246 | + free_cpumask_var(offline_mask); |
247 | return rc; |
248 | } |
249 | |
250 | diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c |
251 | index 4ff0ab9..90f5c0e 100644 |
252 | --- a/arch/x86/kvm/vmx.c |
253 | +++ b/arch/x86/kvm/vmx.c |
254 | @@ -4889,6 +4889,12 @@ static int handle_invalid_guest_state(struct kvm_vcpu *vcpu) |
255 | if (err != EMULATE_DONE) |
256 | return 0; |
257 | |
258 | + if (vcpu->arch.halt_request) { |
259 | + vcpu->arch.halt_request = 0; |
260 | + ret = kvm_emulate_halt(vcpu); |
261 | + goto out; |
262 | + } |
263 | + |
264 | if (signal_pending(current)) |
265 | goto out; |
266 | if (need_resched()) |
267 | diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c |
268 | index 2992678..a7678fa 100644 |
269 | --- a/arch/x86/xen/enlighten.c |
270 | +++ b/arch/x86/xen/enlighten.c |
271 | @@ -139,6 +139,21 @@ static void xen_vcpu_setup(int cpu) |
272 | |
273 | BUG_ON(HYPERVISOR_shared_info == &xen_dummy_shared_info); |
274 | |
275 | + /* |
276 | + * This path is called twice on PVHVM - first during bootup via |
277 | + * smp_init -> xen_hvm_cpu_notify, and then if the VCPU is being |
278 | + * hotplugged: cpu_up -> xen_hvm_cpu_notify. |
279 | + * As we can only do the VCPUOP_register_vcpu_info once lets |
280 | + * not over-write its result. |
281 | + * |
282 | + * For PV it is called during restore (xen_vcpu_restore) and bootup |
283 | + * (xen_setup_vcpu_info_placement). The hotplug mechanism does not |
284 | + * use this function. |
285 | + */ |
286 | + if (xen_hvm_domain()) { |
287 | + if (per_cpu(xen_vcpu, cpu) == &per_cpu(xen_vcpu_info, cpu)) |
288 | + return; |
289 | + } |
290 | if (cpu < MAX_VIRT_CPUS) |
291 | per_cpu(xen_vcpu,cpu) = &HYPERVISOR_shared_info->vcpu_info[cpu]; |
292 | |
293 | diff --git a/drivers/acpi/acpica/exfldio.c b/drivers/acpi/acpica/exfldio.c |
294 | index 149de45..af9f1f6 100644 |
295 | --- a/drivers/acpi/acpica/exfldio.c |
296 | +++ b/drivers/acpi/acpica/exfldio.c |
297 | @@ -722,7 +722,19 @@ acpi_ex_extract_from_field(union acpi_operand_object *obj_desc, |
298 | |
299 | if ((obj_desc->common_field.start_field_bit_offset == 0) && |
300 | (obj_desc->common_field.bit_length == access_bit_width)) { |
301 | - status = acpi_ex_field_datum_io(obj_desc, 0, buffer, ACPI_READ); |
302 | + if (buffer_length >= sizeof(u64)) { |
303 | + status = |
304 | + acpi_ex_field_datum_io(obj_desc, 0, buffer, |
305 | + ACPI_READ); |
306 | + } else { |
307 | + /* Use raw_datum (u64) to handle buffers < 64 bits */ |
308 | + |
309 | + status = |
310 | + acpi_ex_field_datum_io(obj_desc, 0, &raw_datum, |
311 | + ACPI_READ); |
312 | + ACPI_MEMCPY(buffer, &raw_datum, buffer_length); |
313 | + } |
314 | + |
315 | return_ACPI_STATUS(status); |
316 | } |
317 | |
318 | diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c |
319 | index a51df96..f9914e5 100644 |
320 | --- a/drivers/acpi/ec.c |
321 | +++ b/drivers/acpi/ec.c |
322 | @@ -217,7 +217,7 @@ static int ec_check_sci_sync(struct acpi_ec *ec, u8 state) |
323 | static int ec_poll(struct acpi_ec *ec) |
324 | { |
325 | unsigned long flags; |
326 | - int repeat = 2; /* number of command restarts */ |
327 | + int repeat = 5; /* number of command restarts */ |
328 | while (repeat--) { |
329 | unsigned long delay = jiffies + |
330 | msecs_to_jiffies(ec_delay); |
331 | @@ -235,8 +235,6 @@ static int ec_poll(struct acpi_ec *ec) |
332 | } |
333 | advance_transaction(ec, acpi_ec_read_status(ec)); |
334 | } while (time_before(jiffies, delay)); |
335 | - if (acpi_ec_read_status(ec) & ACPI_EC_FLAG_IBF) |
336 | - break; |
337 | pr_debug(PREFIX "controller reset, restart transaction\n"); |
338 | spin_lock_irqsave(&ec->curr_lock, flags); |
339 | start_transaction(ec); |
340 | diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c |
341 | index 43beaca..13cbdd3 100644 |
342 | --- a/drivers/block/drbd/drbd_receiver.c |
343 | +++ b/drivers/block/drbd/drbd_receiver.c |
344 | @@ -2225,7 +2225,6 @@ static int drbd_asb_recover_1p(struct drbd_conf *mdev) __must_hold(local) |
345 | if (hg == -1 && mdev->state.role == R_PRIMARY) { |
346 | enum drbd_state_rv rv2; |
347 | |
348 | - drbd_set_role(mdev, R_SECONDARY, 0); |
349 | /* drbd_change_state() does not sleep while in SS_IN_TRANSIENT_STATE, |
350 | * we might be here in C_WF_REPORT_PARAMS which is transient. |
351 | * we do not need to wait for the after state change work either. */ |
352 | diff --git a/drivers/char/ipmi/ipmi_bt_sm.c b/drivers/char/ipmi/ipmi_bt_sm.c |
353 | index cdd4c09f..a22a7a5 100644 |
354 | --- a/drivers/char/ipmi/ipmi_bt_sm.c |
355 | +++ b/drivers/char/ipmi/ipmi_bt_sm.c |
356 | @@ -95,9 +95,9 @@ struct si_sm_data { |
357 | enum bt_states state; |
358 | unsigned char seq; /* BT sequence number */ |
359 | struct si_sm_io *io; |
360 | - unsigned char write_data[IPMI_MAX_MSG_LENGTH]; |
361 | + unsigned char write_data[IPMI_MAX_MSG_LENGTH + 2]; /* +2 for memcpy */ |
362 | int write_count; |
363 | - unsigned char read_data[IPMI_MAX_MSG_LENGTH]; |
364 | + unsigned char read_data[IPMI_MAX_MSG_LENGTH + 2]; /* +2 for memcpy */ |
365 | int read_count; |
366 | int truncated; |
367 | long timeout; /* microseconds countdown */ |
368 | diff --git a/drivers/char/ipmi/ipmi_devintf.c b/drivers/char/ipmi/ipmi_devintf.c |
369 | index 9eb360f..d5a5f02 100644 |
370 | --- a/drivers/char/ipmi/ipmi_devintf.c |
371 | +++ b/drivers/char/ipmi/ipmi_devintf.c |
372 | @@ -837,13 +837,25 @@ static long compat_ipmi_ioctl(struct file *filep, unsigned int cmd, |
373 | return ipmi_ioctl(filep, cmd, arg); |
374 | } |
375 | } |
376 | + |
377 | +static long unlocked_compat_ipmi_ioctl(struct file *filep, unsigned int cmd, |
378 | + unsigned long arg) |
379 | +{ |
380 | + int ret; |
381 | + |
382 | + mutex_lock(&ipmi_mutex); |
383 | + ret = compat_ipmi_ioctl(filep, cmd, arg); |
384 | + mutex_unlock(&ipmi_mutex); |
385 | + |
386 | + return ret; |
387 | +} |
388 | #endif |
389 | |
390 | static const struct file_operations ipmi_fops = { |
391 | .owner = THIS_MODULE, |
392 | .unlocked_ioctl = ipmi_unlocked_ioctl, |
393 | #ifdef CONFIG_COMPAT |
394 | - .compat_ioctl = compat_ipmi_ioctl, |
395 | + .compat_ioctl = unlocked_compat_ipmi_ioctl, |
396 | #endif |
397 | .open = ipmi_open, |
398 | .release = ipmi_release, |
399 | diff --git a/drivers/dma/pch_dma.c b/drivers/dma/pch_dma.c |
400 | index 65c0495..d05669b 100644 |
401 | --- a/drivers/dma/pch_dma.c |
402 | +++ b/drivers/dma/pch_dma.c |
403 | @@ -476,7 +476,7 @@ static struct pch_dma_desc *pdc_desc_get(struct pch_dma_chan *pd_chan) |
404 | dev_dbg(chan2dev(&pd_chan->chan), "scanned %d descriptors\n", i); |
405 | |
406 | if (!ret) { |
407 | - ret = pdc_alloc_desc(&pd_chan->chan, GFP_NOIO); |
408 | + ret = pdc_alloc_desc(&pd_chan->chan, GFP_ATOMIC); |
409 | if (ret) { |
410 | spin_lock(&pd_chan->lock); |
411 | pd_chan->descs_allocated++; |
412 | diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c |
413 | index 961fb54..7f88de6 100644 |
414 | --- a/drivers/gpu/drm/drm_mm.c |
415 | +++ b/drivers/gpu/drm/drm_mm.c |
416 | @@ -680,33 +680,35 @@ void drm_mm_debug_table(struct drm_mm *mm, const char *prefix) |
417 | EXPORT_SYMBOL(drm_mm_debug_table); |
418 | |
419 | #if defined(CONFIG_DEBUG_FS) |
420 | -int drm_mm_dump_table(struct seq_file *m, struct drm_mm *mm) |
421 | +static unsigned long drm_mm_dump_hole(struct seq_file *m, struct drm_mm_node *entry) |
422 | { |
423 | - struct drm_mm_node *entry; |
424 | - unsigned long total_used = 0, total_free = 0, total = 0; |
425 | unsigned long hole_start, hole_end, hole_size; |
426 | |
427 | - hole_start = drm_mm_hole_node_start(&mm->head_node); |
428 | - hole_end = drm_mm_hole_node_end(&mm->head_node); |
429 | - hole_size = hole_end - hole_start; |
430 | - if (hole_size) |
431 | + if (entry->hole_follows) { |
432 | + hole_start = drm_mm_hole_node_start(entry); |
433 | + hole_end = drm_mm_hole_node_end(entry); |
434 | + hole_size = hole_end - hole_start; |
435 | seq_printf(m, "0x%08lx-0x%08lx: 0x%08lx: free\n", |
436 | hole_start, hole_end, hole_size); |
437 | - total_free += hole_size; |
438 | + return hole_size; |
439 | + } |
440 | + |
441 | + return 0; |
442 | +} |
443 | + |
444 | +int drm_mm_dump_table(struct seq_file *m, struct drm_mm *mm) |
445 | +{ |
446 | + struct drm_mm_node *entry; |
447 | + unsigned long total_used = 0, total_free = 0, total = 0; |
448 | + |
449 | + total_free += drm_mm_dump_hole(m, &mm->head_node); |
450 | |
451 | drm_mm_for_each_node(entry, mm) { |
452 | seq_printf(m, "0x%08lx-0x%08lx: 0x%08lx: used\n", |
453 | entry->start, entry->start + entry->size, |
454 | entry->size); |
455 | total_used += entry->size; |
456 | - if (entry->hole_follows) { |
457 | - hole_start = drm_mm_hole_node_start(entry); |
458 | - hole_end = drm_mm_hole_node_end(entry); |
459 | - hole_size = hole_end - hole_start; |
460 | - seq_printf(m, "0x%08lx-0x%08lx: 0x%08lx: free\n", |
461 | - hole_start, hole_end, hole_size); |
462 | - total_free += hole_size; |
463 | - } |
464 | + total_free += drm_mm_dump_hole(m, entry); |
465 | } |
466 | total = total_free + total_used; |
467 | |
468 | diff --git a/drivers/gpu/drm/radeon/r300_cmdbuf.c b/drivers/gpu/drm/radeon/r300_cmdbuf.c |
469 | index 1fe98b4..9aa02be 100644 |
470 | --- a/drivers/gpu/drm/radeon/r300_cmdbuf.c |
471 | +++ b/drivers/gpu/drm/radeon/r300_cmdbuf.c |
472 | @@ -74,7 +74,7 @@ static int r300_emit_cliprects(drm_radeon_private_t *dev_priv, |
473 | OUT_RING(CP_PACKET0(R300_RE_CLIPRECT_TL_0, nr * 2 - 1)); |
474 | |
475 | for (i = 0; i < nr; ++i) { |
476 | - if (DRM_COPY_FROM_USER_UNCHECKED |
477 | + if (DRM_COPY_FROM_USER |
478 | (&box, &cmdbuf->boxes[n + i], sizeof(box))) { |
479 | DRM_ERROR("copy cliprect faulted\n"); |
480 | return -EFAULT; |
481 | diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c |
482 | index 6f75887..ff62ddc 100644 |
483 | --- a/drivers/md/dm-snap.c |
484 | +++ b/drivers/md/dm-snap.c |
485 | @@ -1117,6 +1117,7 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv) |
486 | s->pending_pool = mempool_create_slab_pool(MIN_IOS, pending_cache); |
487 | if (!s->pending_pool) { |
488 | ti->error = "Could not allocate mempool for pending exceptions"; |
489 | + r = -ENOMEM; |
490 | goto bad_pending_pool; |
491 | } |
492 | |
493 | diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c |
494 | index 1555f0b..7c3ab8f 100644 |
495 | --- a/drivers/md/dm-thin.c |
496 | +++ b/drivers/md/dm-thin.c |
497 | @@ -2027,6 +2027,7 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv) |
498 | * thin devices' discard limits consistent). |
499 | */ |
500 | ti->discards_supported = 1; |
501 | + ti->discard_zeroes_data_unsupported = 1; |
502 | } |
503 | ti->private = pt; |
504 | |
505 | @@ -2443,7 +2444,6 @@ static void set_discard_limits(struct pool *pool, struct queue_limits *limits) |
506 | * bios that overlap 2 blocks. |
507 | */ |
508 | limits->discard_granularity = pool->sectors_per_block << SECTOR_SHIFT; |
509 | - limits->discard_zeroes_data = pool->pf.zero_new_blocks; |
510 | } |
511 | |
512 | static void pool_io_hints(struct dm_target *ti, struct queue_limits *limits) |
513 | diff --git a/drivers/net/ethernet/3com/3c509.c b/drivers/net/ethernet/3com/3c509.c |
514 | index 41719da..9040a62 100644 |
515 | --- a/drivers/net/ethernet/3com/3c509.c |
516 | +++ b/drivers/net/ethernet/3com/3c509.c |
517 | @@ -309,6 +309,7 @@ static int __devinit el3_isa_match(struct device *pdev, |
518 | if (!dev) |
519 | return -ENOMEM; |
520 | |
521 | + SET_NETDEV_DEV(dev, pdev); |
522 | netdev_boot_setup_check(dev); |
523 | |
524 | if (!request_region(ioaddr, EL3_IO_EXTENT, "3c509-isa")) { |
525 | @@ -704,6 +705,7 @@ static int __init el3_eisa_probe (struct device *device) |
526 | return -ENOMEM; |
527 | } |
528 | |
529 | + SET_NETDEV_DEV(dev, device); |
530 | netdev_boot_setup_check(dev); |
531 | |
532 | el3_dev_fill(dev, phys_addr, ioaddr, irq, if_port, EL3_EISA); |
533 | diff --git a/drivers/net/ethernet/3com/3c59x.c b/drivers/net/ethernet/3com/3c59x.c |
534 | index e463d10..5673d6e 100644 |
535 | --- a/drivers/net/ethernet/3com/3c59x.c |
536 | +++ b/drivers/net/ethernet/3com/3c59x.c |
537 | @@ -632,7 +632,6 @@ struct vortex_private { |
538 | pm_state_valid:1, /* pci_dev->saved_config_space has sane contents */ |
539 | open:1, |
540 | medialock:1, |
541 | - must_free_region:1, /* Flag: if zero, Cardbus owns the I/O region */ |
542 | large_frames:1, /* accept large frames */ |
543 | handling_irq:1; /* private in_irq indicator */ |
544 | /* {get|set}_wol operations are already serialized by rtnl. |
545 | @@ -951,7 +950,7 @@ static int __devexit vortex_eisa_remove(struct device *device) |
546 | |
547 | unregister_netdev(dev); |
548 | iowrite16(TotalReset|0x14, ioaddr + EL3_CMD); |
549 | - release_region(dev->base_addr, VORTEX_TOTAL_SIZE); |
550 | + release_region(edev->base_addr, VORTEX_TOTAL_SIZE); |
551 | |
552 | free_netdev(dev); |
553 | return 0; |
554 | @@ -1012,6 +1011,12 @@ static int __devinit vortex_init_one(struct pci_dev *pdev, |
555 | if (rc < 0) |
556 | goto out; |
557 | |
558 | + rc = pci_request_regions(pdev, DRV_NAME); |
559 | + if (rc < 0) { |
560 | + pci_disable_device(pdev); |
561 | + goto out; |
562 | + } |
563 | + |
564 | unit = vortex_cards_found; |
565 | |
566 | if (global_use_mmio < 0 && (unit >= MAX_UNITS || use_mmio[unit] < 0)) { |
567 | @@ -1027,6 +1032,7 @@ static int __devinit vortex_init_one(struct pci_dev *pdev, |
568 | if (!ioaddr) /* If mapping fails, fall-back to BAR 0... */ |
569 | ioaddr = pci_iomap(pdev, 0, 0); |
570 | if (!ioaddr) { |
571 | + pci_release_regions(pdev); |
572 | pci_disable_device(pdev); |
573 | rc = -ENOMEM; |
574 | goto out; |
575 | @@ -1036,6 +1042,7 @@ static int __devinit vortex_init_one(struct pci_dev *pdev, |
576 | ent->driver_data, unit); |
577 | if (rc < 0) { |
578 | pci_iounmap(pdev, ioaddr); |
579 | + pci_release_regions(pdev); |
580 | pci_disable_device(pdev); |
581 | goto out; |
582 | } |
583 | @@ -1179,11 +1186,6 @@ static int __devinit vortex_probe1(struct device *gendev, |
584 | |
585 | /* PCI-only startup logic */ |
586 | if (pdev) { |
587 | - /* EISA resources already marked, so only PCI needs to do this here */ |
588 | - /* Ignore return value, because Cardbus drivers already allocate for us */ |
589 | - if (request_region(dev->base_addr, vci->io_size, print_name) != NULL) |
590 | - vp->must_free_region = 1; |
591 | - |
592 | /* enable bus-mastering if necessary */ |
593 | if (vci->flags & PCI_USES_MASTER) |
594 | pci_set_master(pdev); |
595 | @@ -1221,7 +1223,7 @@ static int __devinit vortex_probe1(struct device *gendev, |
596 | &vp->rx_ring_dma); |
597 | retval = -ENOMEM; |
598 | if (!vp->rx_ring) |
599 | - goto free_region; |
600 | + goto free_device; |
601 | |
602 | vp->tx_ring = (struct boom_tx_desc *)(vp->rx_ring + RX_RING_SIZE); |
603 | vp->tx_ring_dma = vp->rx_ring_dma + sizeof(struct boom_rx_desc) * RX_RING_SIZE; |
604 | @@ -1486,9 +1488,7 @@ free_ring: |
605 | + sizeof(struct boom_tx_desc) * TX_RING_SIZE, |
606 | vp->rx_ring, |
607 | vp->rx_ring_dma); |
608 | -free_region: |
609 | - if (vp->must_free_region) |
610 | - release_region(dev->base_addr, vci->io_size); |
611 | +free_device: |
612 | free_netdev(dev); |
613 | pr_err(PFX "vortex_probe1 fails. Returns %d\n", retval); |
614 | out: |
615 | @@ -3256,8 +3256,9 @@ static void __devexit vortex_remove_one(struct pci_dev *pdev) |
616 | + sizeof(struct boom_tx_desc) * TX_RING_SIZE, |
617 | vp->rx_ring, |
618 | vp->rx_ring_dma); |
619 | - if (vp->must_free_region) |
620 | - release_region(dev->base_addr, vp->io_size); |
621 | + |
622 | + pci_release_regions(pdev); |
623 | + |
624 | free_netdev(dev); |
625 | } |
626 | |
627 | diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c |
628 | index dd037dd..cf20388 100644 |
629 | --- a/drivers/net/ethernet/realtek/r8169.c |
630 | +++ b/drivers/net/ethernet/realtek/r8169.c |
631 | @@ -1690,8 +1690,6 @@ static void rtl8169_rx_vlan_tag(struct RxDesc *desc, struct sk_buff *skb) |
632 | |
633 | if (opts2 & RxVlanTag) |
634 | __vlan_hwaccel_put_tag(skb, swab16(opts2 & 0xffff)); |
635 | - |
636 | - desc->opts2 = 0; |
637 | } |
638 | |
639 | static int rtl8169_gset_tbi(struct net_device *dev, struct ethtool_cmd *cmd) |
640 | @@ -5434,8 +5432,6 @@ static int rtl_rx(struct net_device *dev, struct rtl8169_private *tp, u32 budget |
641 | !(status & (RxRWT | RxFOVF)) && |
642 | (dev->features & NETIF_F_RXALL)) |
643 | goto process_pkt; |
644 | - |
645 | - rtl8169_mark_to_asic(desc, rx_buf_sz); |
646 | } else { |
647 | struct sk_buff *skb; |
648 | dma_addr_t addr; |
649 | @@ -5456,16 +5452,14 @@ process_pkt: |
650 | if (unlikely(rtl8169_fragmented_frame(status))) { |
651 | dev->stats.rx_dropped++; |
652 | dev->stats.rx_length_errors++; |
653 | - rtl8169_mark_to_asic(desc, rx_buf_sz); |
654 | - continue; |
655 | + goto release_descriptor; |
656 | } |
657 | |
658 | skb = rtl8169_try_rx_copy(tp->Rx_databuff[entry], |
659 | tp, pkt_size, addr); |
660 | - rtl8169_mark_to_asic(desc, rx_buf_sz); |
661 | if (!skb) { |
662 | dev->stats.rx_dropped++; |
663 | - continue; |
664 | + goto release_descriptor; |
665 | } |
666 | |
667 | rtl8169_rx_csum(skb, status); |
668 | @@ -5481,6 +5475,10 @@ process_pkt: |
669 | tp->rx_stats.bytes += pkt_size; |
670 | u64_stats_update_end(&tp->rx_stats.syncp); |
671 | } |
672 | +release_descriptor: |
673 | + desc->opts2 = 0; |
674 | + wmb(); |
675 | + rtl8169_mark_to_asic(desc, rx_buf_sz); |
676 | } |
677 | |
678 | count = cur_rx - tp->cur_rx; |
679 | diff --git a/drivers/net/ethernet/sfc/mcdi.c b/drivers/net/ethernet/sfc/mcdi.c |
680 | index eb85217..192026f 100644 |
681 | --- a/drivers/net/ethernet/sfc/mcdi.c |
682 | +++ b/drivers/net/ethernet/sfc/mcdi.c |
683 | @@ -640,7 +640,7 @@ fail: |
684 | int efx_mcdi_get_board_cfg(struct efx_nic *efx, u8 *mac_address, |
685 | u16 *fw_subtype_list, u32 *capabilities) |
686 | { |
687 | - uint8_t outbuf[MC_CMD_GET_BOARD_CFG_OUT_LENMIN]; |
688 | + uint8_t outbuf[MC_CMD_GET_BOARD_CFG_OUT_LENMAX]; |
689 | size_t outlen, offset, i; |
690 | int port_num = efx_port_num(efx); |
691 | int rc; |
692 | diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c |
693 | index 956a5ed..7160523 100644 |
694 | --- a/drivers/net/macvlan.c |
695 | +++ b/drivers/net/macvlan.c |
696 | @@ -205,7 +205,8 @@ static rx_handler_result_t macvlan_handle_frame(struct sk_buff **pskb) |
697 | } |
698 | |
699 | if (port->passthru) |
700 | - vlan = list_first_entry(&port->vlans, struct macvlan_dev, list); |
701 | + vlan = list_first_or_null_rcu(&port->vlans, |
702 | + struct macvlan_dev, list); |
703 | else |
704 | vlan = macvlan_hash_lookup(port, eth->h_dest); |
705 | if (vlan == NULL) |
706 | @@ -724,7 +725,7 @@ int macvlan_common_newlink(struct net *src_net, struct net_device *dev, |
707 | if (err < 0) |
708 | goto destroy_port; |
709 | |
710 | - list_add_tail(&vlan->list, &port->vlans); |
711 | + list_add_tail_rcu(&vlan->list, &port->vlans); |
712 | netif_stacked_transfer_operstate(lowerdev, dev); |
713 | |
714 | return 0; |
715 | @@ -750,7 +751,7 @@ void macvlan_dellink(struct net_device *dev, struct list_head *head) |
716 | { |
717 | struct macvlan_dev *vlan = netdev_priv(dev); |
718 | |
719 | - list_del(&vlan->list); |
720 | + list_del_rcu(&vlan->list); |
721 | unregister_netdevice_queue(dev, head); |
722 | } |
723 | EXPORT_SYMBOL_GPL(macvlan_dellink); |
724 | diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c |
725 | index 8669c77..3b6e932 100644 |
726 | --- a/drivers/net/usb/qmi_wwan.c |
727 | +++ b/drivers/net/usb/qmi_wwan.c |
728 | @@ -9,6 +9,7 @@ |
729 | #include <linux/module.h> |
730 | #include <linux/netdevice.h> |
731 | #include <linux/ethtool.h> |
732 | +#include <linux/etherdevice.h> |
733 | #include <linux/mii.h> |
734 | #include <linux/usb.h> |
735 | #include <linux/usb/cdc.h> |
736 | @@ -174,6 +175,93 @@ err: |
737 | return status; |
738 | } |
739 | |
740 | +/* default ethernet address used by the modem */ |
741 | +static const u8 default_modem_addr[ETH_ALEN] = {0x02, 0x50, 0xf3}; |
742 | + |
743 | +/* Make up an ethernet header if the packet doesn't have one. |
744 | + * |
745 | + * A firmware bug common among several devices cause them to send raw |
746 | + * IP packets under some circumstances. There is no way for the |
747 | + * driver/host to know when this will happen. And even when the bug |
748 | + * hits, some packets will still arrive with an intact header. |
749 | + * |
750 | + * The supported devices are only capably of sending IPv4, IPv6 and |
751 | + * ARP packets on a point-to-point link. Any packet with an ethernet |
752 | + * header will have either our address or a broadcast/multicast |
753 | + * address as destination. ARP packets will always have a header. |
754 | + * |
755 | + * This means that this function will reliably add the appropriate |
756 | + * header iff necessary, provided our hardware address does not start |
757 | + * with 4 or 6. |
758 | + * |
759 | + * Another common firmware bug results in all packets being addressed |
760 | + * to 00:a0:c6:00:00:00 despite the host address being different. |
761 | + * This function will also fixup such packets. |
762 | + */ |
763 | +static int qmi_wwan_rx_fixup(struct usbnet *dev, struct sk_buff *skb) |
764 | +{ |
765 | + __be16 proto; |
766 | + |
767 | + /* usbnet rx_complete guarantees that skb->len is at least |
768 | + * hard_header_len, so we can inspect the dest address without |
769 | + * checking skb->len |
770 | + */ |
771 | + switch (skb->data[0] & 0xf0) { |
772 | + case 0x40: |
773 | + proto = htons(ETH_P_IP); |
774 | + break; |
775 | + case 0x60: |
776 | + proto = htons(ETH_P_IPV6); |
777 | + break; |
778 | + case 0x00: |
779 | + if (is_multicast_ether_addr(skb->data)) |
780 | + return 1; |
781 | + /* possibly bogus destination - rewrite just in case */ |
782 | + skb_reset_mac_header(skb); |
783 | + goto fix_dest; |
784 | + default: |
785 | + /* pass along other packets without modifications */ |
786 | + return 1; |
787 | + } |
788 | + if (skb_headroom(skb) < ETH_HLEN) |
789 | + return 0; |
790 | + skb_push(skb, ETH_HLEN); |
791 | + skb_reset_mac_header(skb); |
792 | + eth_hdr(skb)->h_proto = proto; |
793 | + memset(eth_hdr(skb)->h_source, 0, ETH_ALEN); |
794 | +fix_dest: |
795 | + memcpy(eth_hdr(skb)->h_dest, dev->net->dev_addr, ETH_ALEN); |
796 | + return 1; |
797 | +} |
798 | + |
799 | +/* very simplistic detection of IPv4 or IPv6 headers */ |
800 | +static bool possibly_iphdr(const char *data) |
801 | +{ |
802 | + return (data[0] & 0xd0) == 0x40; |
803 | +} |
804 | + |
805 | +/* disallow addresses which may be confused with IP headers */ |
806 | +static int qmi_wwan_mac_addr(struct net_device *dev, void *p) |
807 | +{ |
808 | + struct sockaddr *addr = p; |
809 | + |
810 | + if (!is_valid_ether_addr(addr->sa_data) || |
811 | + possibly_iphdr(addr->sa_data)) |
812 | + return -EADDRNOTAVAIL; |
813 | + memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); |
814 | + return 0; |
815 | +} |
816 | + |
817 | +static const struct net_device_ops qmi_wwan_netdev_ops = { |
818 | + .ndo_open = usbnet_open, |
819 | + .ndo_stop = usbnet_stop, |
820 | + .ndo_start_xmit = usbnet_start_xmit, |
821 | + .ndo_tx_timeout = usbnet_tx_timeout, |
822 | + .ndo_change_mtu = usbnet_change_mtu, |
823 | + .ndo_set_mac_address = qmi_wwan_mac_addr, |
824 | + .ndo_validate_addr = eth_validate_addr, |
825 | +}; |
826 | + |
827 | /* using a counter to merge subdriver requests with our own into a combined state */ |
828 | static int qmi_wwan_manage_power(struct usbnet *dev, int on) |
829 | { |
830 | @@ -257,6 +345,18 @@ static int qmi_wwan_bind_shared(struct usbnet *dev, struct usb_interface *intf) |
831 | /* save subdriver struct for suspend/resume wrappers */ |
832 | dev->data[0] = (unsigned long)subdriver; |
833 | |
834 | + /* Never use the same address on both ends of the link, even |
835 | + * if the buggy firmware told us to. |
836 | + */ |
837 | + if (!compare_ether_addr(dev->net->dev_addr, default_modem_addr)) |
838 | + eth_hw_addr_random(dev->net); |
839 | + |
840 | + /* make MAC addr easily distinguishable from an IP header */ |
841 | + if (possibly_iphdr(dev->net->dev_addr)) { |
842 | + dev->net->dev_addr[0] |= 0x02; /* set local assignment bit */ |
843 | + dev->net->dev_addr[0] &= 0xbf; /* clear "IP" bit */ |
844 | + } |
845 | + dev->net->netdev_ops = &qmi_wwan_netdev_ops; |
846 | err: |
847 | return rv; |
848 | } |
849 | @@ -326,6 +426,7 @@ static const struct driver_info qmi_wwan_shared = { |
850 | .bind = qmi_wwan_bind_shared, |
851 | .unbind = qmi_wwan_unbind_shared, |
852 | .manage_power = qmi_wwan_manage_power, |
853 | + .rx_fixup = qmi_wwan_rx_fixup, |
854 | }; |
855 | |
856 | static const struct driver_info qmi_wwan_force_int0 = { |
857 | diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c |
858 | index 91e2c4f..f6a095f 100644 |
859 | --- a/drivers/net/wireless/ath/ath9k/main.c |
860 | +++ b/drivers/net/wireless/ath/ath9k/main.c |
861 | @@ -1711,6 +1711,7 @@ static int ath9k_sta_add(struct ieee80211_hw *hw, |
862 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); |
863 | struct ath_node *an = (struct ath_node *) sta->drv_priv; |
864 | struct ieee80211_key_conf ps_key = { }; |
865 | + int key; |
866 | |
867 | ath_node_attach(sc, sta, vif); |
868 | |
869 | @@ -1718,7 +1719,9 @@ static int ath9k_sta_add(struct ieee80211_hw *hw, |
870 | vif->type != NL80211_IFTYPE_AP_VLAN) |
871 | return 0; |
872 | |
873 | - an->ps_key = ath_key_config(common, vif, sta, &ps_key); |
874 | + key = ath_key_config(common, vif, sta, &ps_key); |
875 | + if (key > 0) |
876 | + an->ps_key = key; |
877 | |
878 | return 0; |
879 | } |
880 | @@ -1735,6 +1738,7 @@ static void ath9k_del_ps_key(struct ath_softc *sc, |
881 | return; |
882 | |
883 | ath_key_delete(common, &ps_key); |
884 | + an->ps_key = 0; |
885 | } |
886 | |
887 | static int ath9k_sta_remove(struct ieee80211_hw *hw, |
888 | diff --git a/drivers/net/wireless/b43/dma.c b/drivers/net/wireless/b43/dma.c |
889 | index bb2848a..448f545 100644 |
890 | --- a/drivers/net/wireless/b43/dma.c |
891 | +++ b/drivers/net/wireless/b43/dma.c |
892 | @@ -1733,6 +1733,25 @@ drop_recycle_buffer: |
893 | sync_descbuffer_for_device(ring, dmaaddr, ring->rx_buffersize); |
894 | } |
895 | |
896 | +void b43_dma_handle_rx_overflow(struct b43_dmaring *ring) |
897 | +{ |
898 | + int current_slot, previous_slot; |
899 | + |
900 | + B43_WARN_ON(ring->tx); |
901 | + |
902 | + /* Device has filled all buffers, drop all packets and let TCP |
903 | + * decrease speed. |
904 | + * Decrement RX index by one will let the device to see all slots |
905 | + * as free again |
906 | + */ |
907 | + /* |
908 | + *TODO: How to increase rx_drop in mac80211? |
909 | + */ |
910 | + current_slot = ring->ops->get_current_rxslot(ring); |
911 | + previous_slot = prev_slot(ring, current_slot); |
912 | + ring->ops->set_current_rxslot(ring, previous_slot); |
913 | +} |
914 | + |
915 | void b43_dma_rx(struct b43_dmaring *ring) |
916 | { |
917 | const struct b43_dma_ops *ops = ring->ops; |
918 | diff --git a/drivers/net/wireless/b43/dma.h b/drivers/net/wireless/b43/dma.h |
919 | index 9fdd198..df8c8cd 100644 |
920 | --- a/drivers/net/wireless/b43/dma.h |
921 | +++ b/drivers/net/wireless/b43/dma.h |
922 | @@ -9,7 +9,7 @@ |
923 | /* DMA-Interrupt reasons. */ |
924 | #define B43_DMAIRQ_FATALMASK ((1 << 10) | (1 << 11) | (1 << 12) \ |
925 | | (1 << 14) | (1 << 15)) |
926 | -#define B43_DMAIRQ_NONFATALMASK (1 << 13) |
927 | +#define B43_DMAIRQ_RDESC_UFLOW (1 << 13) |
928 | #define B43_DMAIRQ_RX_DONE (1 << 16) |
929 | |
930 | /*** 32-bit DMA Engine. ***/ |
931 | @@ -295,6 +295,8 @@ int b43_dma_tx(struct b43_wldev *dev, |
932 | void b43_dma_handle_txstatus(struct b43_wldev *dev, |
933 | const struct b43_txstatus *status); |
934 | |
935 | +void b43_dma_handle_rx_overflow(struct b43_dmaring *ring); |
936 | + |
937 | void b43_dma_rx(struct b43_dmaring *ring); |
938 | |
939 | void b43_dma_direct_fifo_rx(struct b43_wldev *dev, |
940 | diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c |
941 | index 14fd2ca..b54c750 100644 |
942 | --- a/drivers/net/wireless/b43/main.c |
943 | +++ b/drivers/net/wireless/b43/main.c |
944 | @@ -1895,30 +1895,18 @@ static void b43_do_interrupt_thread(struct b43_wldev *dev) |
945 | } |
946 | } |
947 | |
948 | - if (unlikely(merged_dma_reason & (B43_DMAIRQ_FATALMASK | |
949 | - B43_DMAIRQ_NONFATALMASK))) { |
950 | - if (merged_dma_reason & B43_DMAIRQ_FATALMASK) { |
951 | - b43err(dev->wl, "Fatal DMA error: " |
952 | - "0x%08X, 0x%08X, 0x%08X, " |
953 | - "0x%08X, 0x%08X, 0x%08X\n", |
954 | - dma_reason[0], dma_reason[1], |
955 | - dma_reason[2], dma_reason[3], |
956 | - dma_reason[4], dma_reason[5]); |
957 | - b43err(dev->wl, "This device does not support DMA " |
958 | + if (unlikely(merged_dma_reason & (B43_DMAIRQ_FATALMASK))) { |
959 | + b43err(dev->wl, |
960 | + "Fatal DMA error: 0x%08X, 0x%08X, 0x%08X, 0x%08X, 0x%08X, 0x%08X\n", |
961 | + dma_reason[0], dma_reason[1], |
962 | + dma_reason[2], dma_reason[3], |
963 | + dma_reason[4], dma_reason[5]); |
964 | + b43err(dev->wl, "This device does not support DMA " |
965 | "on your system. It will now be switched to PIO.\n"); |
966 | - /* Fall back to PIO transfers if we get fatal DMA errors! */ |
967 | - dev->use_pio = true; |
968 | - b43_controller_restart(dev, "DMA error"); |
969 | - return; |
970 | - } |
971 | - if (merged_dma_reason & B43_DMAIRQ_NONFATALMASK) { |
972 | - b43err(dev->wl, "DMA error: " |
973 | - "0x%08X, 0x%08X, 0x%08X, " |
974 | - "0x%08X, 0x%08X, 0x%08X\n", |
975 | - dma_reason[0], dma_reason[1], |
976 | - dma_reason[2], dma_reason[3], |
977 | - dma_reason[4], dma_reason[5]); |
978 | - } |
979 | + /* Fall back to PIO transfers if we get fatal DMA errors! */ |
980 | + dev->use_pio = true; |
981 | + b43_controller_restart(dev, "DMA error"); |
982 | + return; |
983 | } |
984 | |
985 | if (unlikely(reason & B43_IRQ_UCODE_DEBUG)) |
986 | @@ -1937,6 +1925,11 @@ static void b43_do_interrupt_thread(struct b43_wldev *dev) |
987 | handle_irq_noise(dev); |
988 | |
989 | /* Check the DMA reason registers for received data. */ |
990 | + if (dma_reason[0] & B43_DMAIRQ_RDESC_UFLOW) { |
991 | + if (B43_DEBUG) |
992 | + b43warn(dev->wl, "RX descriptor underrun\n"); |
993 | + b43_dma_handle_rx_overflow(dev->dma.rx_ring); |
994 | + } |
995 | if (dma_reason[0] & B43_DMAIRQ_RX_DONE) { |
996 | if (b43_using_pio_transfers(dev)) |
997 | b43_pio_rx(dev->pio.rx_queue); |
998 | @@ -1994,7 +1987,7 @@ static irqreturn_t b43_do_interrupt(struct b43_wldev *dev) |
999 | return IRQ_NONE; |
1000 | |
1001 | dev->dma_reason[0] = b43_read32(dev, B43_MMIO_DMA0_REASON) |
1002 | - & 0x0001DC00; |
1003 | + & 0x0001FC00; |
1004 | dev->dma_reason[1] = b43_read32(dev, B43_MMIO_DMA1_REASON) |
1005 | & 0x0000DC00; |
1006 | dev->dma_reason[2] = b43_read32(dev, B43_MMIO_DMA2_REASON) |
1007 | @@ -3122,7 +3115,7 @@ static int b43_chip_init(struct b43_wldev *dev) |
1008 | b43_write32(dev, 0x018C, 0x02000000); |
1009 | } |
1010 | b43_write32(dev, B43_MMIO_GEN_IRQ_REASON, 0x00004000); |
1011 | - b43_write32(dev, B43_MMIO_DMA0_IRQ_MASK, 0x0001DC00); |
1012 | + b43_write32(dev, B43_MMIO_DMA0_IRQ_MASK, 0x0001FC00); |
1013 | b43_write32(dev, B43_MMIO_DMA1_IRQ_MASK, 0x0000DC00); |
1014 | b43_write32(dev, B43_MMIO_DMA2_IRQ_MASK, 0x0000DC00); |
1015 | b43_write32(dev, B43_MMIO_DMA3_IRQ_MASK, 0x0001DC00); |
1016 | diff --git a/drivers/net/wireless/mwifiex/cmdevt.c b/drivers/net/wireless/mwifiex/cmdevt.c |
1017 | index 2977a12..3050b6a 100644 |
1018 | --- a/drivers/net/wireless/mwifiex/cmdevt.c |
1019 | +++ b/drivers/net/wireless/mwifiex/cmdevt.c |
1020 | @@ -1084,6 +1084,7 @@ mwifiex_process_hs_config(struct mwifiex_adapter *adapter) |
1021 | adapter->if_ops.wakeup(adapter); |
1022 | adapter->hs_activated = false; |
1023 | adapter->is_hs_configured = false; |
1024 | + adapter->is_suspended = false; |
1025 | mwifiex_hs_activated_event(mwifiex_get_priv(adapter, |
1026 | MWIFIEX_BSS_ROLE_ANY), |
1027 | false); |
1028 | diff --git a/drivers/net/wireless/mwifiex/sta_ioctl.c b/drivers/net/wireless/mwifiex/sta_ioctl.c |
1029 | index 4fb146a..dc70c0f 100644 |
1030 | --- a/drivers/net/wireless/mwifiex/sta_ioctl.c |
1031 | +++ b/drivers/net/wireless/mwifiex/sta_ioctl.c |
1032 | @@ -105,7 +105,7 @@ int mwifiex_request_set_multicast_list(struct mwifiex_private *priv, |
1033 | } else { |
1034 | /* Multicast */ |
1035 | priv->curr_pkt_filter &= ~HostCmd_ACT_MAC_PROMISCUOUS_ENABLE; |
1036 | - if (mcast_list->mode == MWIFIEX_MULTICAST_MODE) { |
1037 | + if (mcast_list->mode == MWIFIEX_ALL_MULTI_MODE) { |
1038 | dev_dbg(priv->adapter->dev, |
1039 | "info: Enabling All Multicast!\n"); |
1040 | priv->curr_pkt_filter |= |
1041 | @@ -117,20 +117,11 @@ int mwifiex_request_set_multicast_list(struct mwifiex_private *priv, |
1042 | dev_dbg(priv->adapter->dev, |
1043 | "info: Set multicast list=%d\n", |
1044 | mcast_list->num_multicast_addr); |
1045 | - /* Set multicast addresses to firmware */ |
1046 | - if (old_pkt_filter == priv->curr_pkt_filter) { |
1047 | - /* Send request to firmware */ |
1048 | - ret = mwifiex_send_cmd_async(priv, |
1049 | - HostCmd_CMD_MAC_MULTICAST_ADR, |
1050 | - HostCmd_ACT_GEN_SET, 0, |
1051 | - mcast_list); |
1052 | - } else { |
1053 | - /* Send request to firmware */ |
1054 | - ret = mwifiex_send_cmd_async(priv, |
1055 | - HostCmd_CMD_MAC_MULTICAST_ADR, |
1056 | - HostCmd_ACT_GEN_SET, 0, |
1057 | - mcast_list); |
1058 | - } |
1059 | + /* Send multicast addresses to firmware */ |
1060 | + ret = mwifiex_send_cmd_async(priv, |
1061 | + HostCmd_CMD_MAC_MULTICAST_ADR, |
1062 | + HostCmd_ACT_GEN_SET, 0, |
1063 | + mcast_list); |
1064 | } |
1065 | } |
1066 | } |
1067 | diff --git a/drivers/platform/x86/hp_accel.c b/drivers/platform/x86/hp_accel.c |
1068 | index 22b2dfa..fdacfce 100644 |
1069 | --- a/drivers/platform/x86/hp_accel.c |
1070 | +++ b/drivers/platform/x86/hp_accel.c |
1071 | @@ -362,7 +362,8 @@ static int lis3lv02d_suspend(struct acpi_device *device, pm_message_t state) |
1072 | |
1073 | static int lis3lv02d_resume(struct acpi_device *device) |
1074 | { |
1075 | - return lis3lv02d_poweron(&lis3_dev); |
1076 | + lis3lv02d_poweron(&lis3_dev); |
1077 | + return 0; |
1078 | } |
1079 | #else |
1080 | #define lis3lv02d_suspend NULL |
1081 | diff --git a/drivers/rtc/rtc-pcf2123.c b/drivers/rtc/rtc-pcf2123.c |
1082 | index 8361187..9ea2555 100644 |
1083 | --- a/drivers/rtc/rtc-pcf2123.c |
1084 | +++ b/drivers/rtc/rtc-pcf2123.c |
1085 | @@ -264,6 +264,7 @@ static int __devinit pcf2123_probe(struct spi_device *spi) |
1086 | |
1087 | if (!(rxbuf[0] & 0x20)) { |
1088 | dev_err(&spi->dev, "chip not found\n"); |
1089 | + ret = -ENODEV; |
1090 | goto kfree_exit; |
1091 | } |
1092 | |
1093 | diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c |
1094 | index 5b3cadb..2bbb845 100644 |
1095 | --- a/drivers/scsi/sd.c |
1096 | +++ b/drivers/scsi/sd.c |
1097 | @@ -140,6 +140,7 @@ sd_store_cache_type(struct device *dev, struct device_attribute *attr, |
1098 | char *buffer_data; |
1099 | struct scsi_mode_data data; |
1100 | struct scsi_sense_hdr sshdr; |
1101 | + const char *temp = "temporary "; |
1102 | int len; |
1103 | |
1104 | if (sdp->type != TYPE_DISK) |
1105 | @@ -148,6 +149,13 @@ sd_store_cache_type(struct device *dev, struct device_attribute *attr, |
1106 | * it's not worth the risk */ |
1107 | return -EINVAL; |
1108 | |
1109 | + if (strncmp(buf, temp, sizeof(temp) - 1) == 0) { |
1110 | + buf += sizeof(temp) - 1; |
1111 | + sdkp->cache_override = 1; |
1112 | + } else { |
1113 | + sdkp->cache_override = 0; |
1114 | + } |
1115 | + |
1116 | for (i = 0; i < ARRAY_SIZE(sd_cache_types); i++) { |
1117 | len = strlen(sd_cache_types[i]); |
1118 | if (strncmp(sd_cache_types[i], buf, len) == 0 && |
1119 | @@ -160,6 +168,13 @@ sd_store_cache_type(struct device *dev, struct device_attribute *attr, |
1120 | return -EINVAL; |
1121 | rcd = ct & 0x01 ? 1 : 0; |
1122 | wce = ct & 0x02 ? 1 : 0; |
1123 | + |
1124 | + if (sdkp->cache_override) { |
1125 | + sdkp->WCE = wce; |
1126 | + sdkp->RCD = rcd; |
1127 | + return count; |
1128 | + } |
1129 | + |
1130 | if (scsi_mode_sense(sdp, 0x08, 8, buffer, sizeof(buffer), SD_TIMEOUT, |
1131 | SD_MAX_RETRIES, &data, NULL)) |
1132 | return -EINVAL; |
1133 | @@ -2126,6 +2141,10 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer) |
1134 | int old_rcd = sdkp->RCD; |
1135 | int old_dpofua = sdkp->DPOFUA; |
1136 | |
1137 | + |
1138 | + if (sdkp->cache_override) |
1139 | + return; |
1140 | + |
1141 | first_len = 4; |
1142 | if (sdp->skip_ms_page_8) { |
1143 | if (sdp->type == TYPE_RBC) |
1144 | @@ -2607,6 +2626,7 @@ static void sd_probe_async(void *data, async_cookie_t cookie) |
1145 | sdkp->capacity = 0; |
1146 | sdkp->media_present = 1; |
1147 | sdkp->write_prot = 0; |
1148 | + sdkp->cache_override = 0; |
1149 | sdkp->WCE = 0; |
1150 | sdkp->RCD = 0; |
1151 | sdkp->ATO = 0; |
1152 | diff --git a/drivers/scsi/sd.h b/drivers/scsi/sd.h |
1153 | index f703f48..e2b2956 100644 |
1154 | --- a/drivers/scsi/sd.h |
1155 | +++ b/drivers/scsi/sd.h |
1156 | @@ -67,6 +67,7 @@ struct scsi_disk { |
1157 | u8 protection_type;/* Data Integrity Field */ |
1158 | u8 provisioning_mode; |
1159 | unsigned ATO : 1; /* state of disk ATO bit */ |
1160 | + unsigned cache_override : 1; /* temp override of WCE,RCD */ |
1161 | unsigned WCE : 1; /* state of disk WCE bit */ |
1162 | unsigned RCD : 1; /* state of disk RCD bit, unused */ |
1163 | unsigned DPOFUA : 1; /* state of disk DPOFUA bit */ |
1164 | diff --git a/drivers/target/iscsi/iscsi_target_erl1.c b/drivers/target/iscsi/iscsi_target_erl1.c |
1165 | index 006f605..fd669b5 100644 |
1166 | --- a/drivers/target/iscsi/iscsi_target_erl1.c |
1167 | +++ b/drivers/target/iscsi/iscsi_target_erl1.c |
1168 | @@ -824,7 +824,7 @@ static int iscsit_attach_ooo_cmdsn( |
1169 | /* |
1170 | * CmdSN is greater than the tail of the list. |
1171 | */ |
1172 | - if (ooo_tail->cmdsn < ooo_cmdsn->cmdsn) |
1173 | + if (iscsi_sna_lt(ooo_tail->cmdsn, ooo_cmdsn->cmdsn)) |
1174 | list_add_tail(&ooo_cmdsn->ooo_list, |
1175 | &sess->sess_ooo_cmdsn_list); |
1176 | else { |
1177 | @@ -834,11 +834,12 @@ static int iscsit_attach_ooo_cmdsn( |
1178 | */ |
1179 | list_for_each_entry(ooo_tmp, &sess->sess_ooo_cmdsn_list, |
1180 | ooo_list) { |
1181 | - if (ooo_tmp->cmdsn < ooo_cmdsn->cmdsn) |
1182 | + if (iscsi_sna_lt(ooo_tmp->cmdsn, ooo_cmdsn->cmdsn)) |
1183 | continue; |
1184 | |
1185 | + /* Insert before this entry */ |
1186 | list_add(&ooo_cmdsn->ooo_list, |
1187 | - &ooo_tmp->ooo_list); |
1188 | + ooo_tmp->ooo_list.prev); |
1189 | break; |
1190 | } |
1191 | } |
1192 | diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c |
1193 | index ec970cb..19e4518 100644 |
1194 | --- a/fs/ext4/mballoc.c |
1195 | +++ b/fs/ext4/mballoc.c |
1196 | @@ -1980,7 +1980,11 @@ repeat: |
1197 | group = ac->ac_g_ex.fe_group; |
1198 | |
1199 | for (i = 0; i < ngroups; group++, i++) { |
1200 | - if (group == ngroups) |
1201 | + /* |
1202 | + * Artificially restricted ngroups for non-extent |
1203 | + * files makes group > ngroups possible on first loop. |
1204 | + */ |
1205 | + if (group >= ngroups) |
1206 | group = 0; |
1207 | |
1208 | /* This now checks without needing the buddy page */ |
1209 | diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c |
1210 | index 001ef01..36ad5b4 100644 |
1211 | --- a/fs/hugetlbfs/inode.c |
1212 | +++ b/fs/hugetlbfs/inode.c |
1213 | @@ -927,9 +927,13 @@ static int can_do_hugetlb_shm(void) |
1214 | return capable(CAP_IPC_LOCK) || in_group_p(sysctl_hugetlb_shm_group); |
1215 | } |
1216 | |
1217 | -struct file *hugetlb_file_setup(const char *name, unsigned long addr, |
1218 | - size_t size, vm_flags_t acctflag, |
1219 | - struct user_struct **user, int creat_flags) |
1220 | +/* |
1221 | + * Note that size should be aligned to proper hugepage size in caller side, |
1222 | + * otherwise hugetlb_reserve_pages reserves one less hugepages than intended. |
1223 | + */ |
1224 | +struct file *hugetlb_file_setup(const char *name, size_t size, |
1225 | + vm_flags_t acctflag, struct user_struct **user, |
1226 | + int creat_flags) |
1227 | { |
1228 | int error = -ENOMEM; |
1229 | struct file *file; |
1230 | @@ -937,8 +941,6 @@ struct file *hugetlb_file_setup(const char *name, unsigned long addr, |
1231 | struct path path; |
1232 | struct dentry *root; |
1233 | struct qstr quick_string; |
1234 | - struct hstate *hstate; |
1235 | - unsigned long num_pages; |
1236 | |
1237 | *user = NULL; |
1238 | if (!hugetlbfs_vfsmount) |
1239 | @@ -972,12 +974,10 @@ struct file *hugetlb_file_setup(const char *name, unsigned long addr, |
1240 | if (!inode) |
1241 | goto out_dentry; |
1242 | |
1243 | - hstate = hstate_inode(inode); |
1244 | - size += addr & ~huge_page_mask(hstate); |
1245 | - num_pages = ALIGN(size, huge_page_size(hstate)) >> |
1246 | - huge_page_shift(hstate); |
1247 | error = -ENOMEM; |
1248 | - if (hugetlb_reserve_pages(inode, 0, num_pages, NULL, acctflag)) |
1249 | + if (hugetlb_reserve_pages(inode, 0, |
1250 | + size >> huge_page_shift(hstate_inode(inode)), NULL, |
1251 | + acctflag)) |
1252 | goto out_inode; |
1253 | |
1254 | d_instantiate(path.dentry, inode); |
1255 | diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c |
1256 | index dd0308d..64198ed 100644 |
1257 | --- a/fs/nfsd/nfs4proc.c |
1258 | +++ b/fs/nfsd/nfs4proc.c |
1259 | @@ -270,6 +270,7 @@ static __be32 |
1260 | do_open_fhandle(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_open *open) |
1261 | { |
1262 | __be32 status; |
1263 | + int accmode = 0; |
1264 | |
1265 | /* We don't know the target directory, and therefore can not |
1266 | * set the change info |
1267 | @@ -283,9 +284,19 @@ do_open_fhandle(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_ |
1268 | |
1269 | open->op_truncate = (open->op_iattr.ia_valid & ATTR_SIZE) && |
1270 | (open->op_iattr.ia_size == 0); |
1271 | + /* |
1272 | + * In the delegation case, the client is telling us about an |
1273 | + * open that it *already* performed locally, some time ago. We |
1274 | + * should let it succeed now if possible. |
1275 | + * |
1276 | + * In the case of a CLAIM_FH open, on the other hand, the client |
1277 | + * may be counting on us to enforce permissions (the Linux 4.1 |
1278 | + * client uses this for normal opens, for example). |
1279 | + */ |
1280 | + if (open->op_claim_type == NFS4_OPEN_CLAIM_DELEG_CUR_FH) |
1281 | + accmode = NFSD_MAY_OWNER_OVERRIDE; |
1282 | |
1283 | - status = do_open_permission(rqstp, current_fh, open, |
1284 | - NFSD_MAY_OWNER_OVERRIDE); |
1285 | + status = do_open_permission(rqstp, current_fh, open, accmode); |
1286 | |
1287 | return status; |
1288 | } |
1289 | diff --git a/include/linux/audit.h b/include/linux/audit.h |
1290 | index ed3ef19..4f334d5 100644 |
1291 | --- a/include/linux/audit.h |
1292 | +++ b/include/linux/audit.h |
1293 | @@ -480,7 +480,7 @@ static inline void audit_syscall_entry(int arch, int major, unsigned long a0, |
1294 | unsigned long a1, unsigned long a2, |
1295 | unsigned long a3) |
1296 | { |
1297 | - if (unlikely(!audit_dummy_context())) |
1298 | + if (unlikely(current->audit_context)) |
1299 | __audit_syscall_entry(arch, major, a0, a1, a2, a3); |
1300 | } |
1301 | static inline void audit_syscall_exit(void *pt_regs) |
1302 | diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h |
1303 | index 000837e..2c36a71 100644 |
1304 | --- a/include/linux/hugetlb.h |
1305 | +++ b/include/linux/hugetlb.h |
1306 | @@ -152,8 +152,7 @@ static inline struct hugetlbfs_sb_info *HUGETLBFS_SB(struct super_block *sb) |
1307 | |
1308 | extern const struct file_operations hugetlbfs_file_operations; |
1309 | extern const struct vm_operations_struct hugetlb_vm_ops; |
1310 | -struct file *hugetlb_file_setup(const char *name, unsigned long addr, |
1311 | - size_t size, vm_flags_t acct, |
1312 | +struct file *hugetlb_file_setup(const char *name, size_t size, vm_flags_t acct, |
1313 | struct user_struct **user, int creat_flags); |
1314 | |
1315 | static inline int is_file_hugepages(struct file *file) |
1316 | @@ -170,8 +169,8 @@ static inline int is_file_hugepages(struct file *file) |
1317 | |
1318 | #define is_file_hugepages(file) 0 |
1319 | static inline struct file * |
1320 | -hugetlb_file_setup(const char *name, unsigned long addr, size_t size, |
1321 | - vm_flags_t acctflag, struct user_struct **user, int creat_flags) |
1322 | +hugetlb_file_setup(const char *name, size_t size, vm_flags_t acctflag, |
1323 | + struct user_struct **user, int creat_flags) |
1324 | { |
1325 | return ERR_PTR(-ENOSYS); |
1326 | } |
1327 | @@ -294,7 +293,7 @@ static inline unsigned hstate_index_to_shift(unsigned index) |
1328 | return hstates[index].order + PAGE_SHIFT; |
1329 | } |
1330 | |
1331 | -#else |
1332 | +#else /* CONFIG_HUGETLB_PAGE */ |
1333 | struct hstate {}; |
1334 | #define alloc_huge_page_node(h, nid) NULL |
1335 | #define alloc_bootmem_huge_page(h) NULL |
1336 | diff --git a/include/linux/if_cablemodem.h b/include/linux/if_cablemodem.h |
1337 | index 9ca1007..ee6b3c4 100644 |
1338 | --- a/include/linux/if_cablemodem.h |
1339 | +++ b/include/linux/if_cablemodem.h |
1340 | @@ -12,11 +12,11 @@ |
1341 | */ |
1342 | |
1343 | /* some useful defines for sb1000.c e cmconfig.c - fv */ |
1344 | -#define SIOCGCMSTATS SIOCDEVPRIVATE+0 /* get cable modem stats */ |
1345 | -#define SIOCGCMFIRMWARE SIOCDEVPRIVATE+1 /* get cm firmware version */ |
1346 | -#define SIOCGCMFREQUENCY SIOCDEVPRIVATE+2 /* get cable modem frequency */ |
1347 | -#define SIOCSCMFREQUENCY SIOCDEVPRIVATE+3 /* set cable modem frequency */ |
1348 | -#define SIOCGCMPIDS SIOCDEVPRIVATE+4 /* get cable modem PIDs */ |
1349 | -#define SIOCSCMPIDS SIOCDEVPRIVATE+5 /* set cable modem PIDs */ |
1350 | +#define SIOCGCMSTATS (SIOCDEVPRIVATE+0) /* get cable modem stats */ |
1351 | +#define SIOCGCMFIRMWARE (SIOCDEVPRIVATE+1) /* get cm firmware version */ |
1352 | +#define SIOCGCMFREQUENCY (SIOCDEVPRIVATE+2) /* get cable modem frequency */ |
1353 | +#define SIOCSCMFREQUENCY (SIOCDEVPRIVATE+3) /* set cable modem frequency */ |
1354 | +#define SIOCGCMPIDS (SIOCDEVPRIVATE+4) /* get cable modem PIDs */ |
1355 | +#define SIOCSCMPIDS (SIOCDEVPRIVATE+5) /* set cable modem PIDs */ |
1356 | |
1357 | #endif |
1358 | diff --git a/include/linux/rculist.h b/include/linux/rculist.h |
1359 | index d079290..6f95e24 100644 |
1360 | --- a/include/linux/rculist.h |
1361 | +++ b/include/linux/rculist.h |
1362 | @@ -242,6 +242,23 @@ static inline void list_splice_init_rcu(struct list_head *list, |
1363 | list_entry_rcu((ptr)->next, type, member) |
1364 | |
1365 | /** |
1366 | + * list_first_or_null_rcu - get the first element from a list |
1367 | + * @ptr: the list head to take the element from. |
1368 | + * @type: the type of the struct this is embedded in. |
1369 | + * @member: the name of the list_struct within the struct. |
1370 | + * |
1371 | + * Note that if the list is empty, it returns NULL. |
1372 | + * |
1373 | + * This primitive may safely run concurrently with the _rcu list-mutation |
1374 | + * primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock(). |
1375 | + */ |
1376 | +#define list_first_or_null_rcu(ptr, type, member) \ |
1377 | + ({struct list_head *__ptr = (ptr); \ |
1378 | + struct list_head __rcu *__next = list_next_rcu(__ptr); \ |
1379 | + likely(__ptr != __next) ? container_of(__next, type, member) : NULL; \ |
1380 | + }) |
1381 | + |
1382 | +/** |
1383 | * list_for_each_entry_rcu - iterate over rcu list of given type |
1384 | * @pos: the type * to use as a loop cursor. |
1385 | * @head: the head for your list. |
1386 | diff --git a/include/net/sock.h b/include/net/sock.h |
1387 | index 59a8947..f673ba5 100644 |
1388 | --- a/include/net/sock.h |
1389 | +++ b/include/net/sock.h |
1390 | @@ -793,6 +793,18 @@ struct inet_hashinfo; |
1391 | struct raw_hashinfo; |
1392 | struct module; |
1393 | |
1394 | +/* |
1395 | + * caches using SLAB_DESTROY_BY_RCU should let .next pointer from nulls nodes |
1396 | + * un-modified. Special care is taken when initializing object to zero. |
1397 | + */ |
1398 | +static inline void sk_prot_clear_nulls(struct sock *sk, int size) |
1399 | +{ |
1400 | + if (offsetof(struct sock, sk_node.next) != 0) |
1401 | + memset(sk, 0, offsetof(struct sock, sk_node.next)); |
1402 | + memset(&sk->sk_node.pprev, 0, |
1403 | + size - offsetof(struct sock, sk_node.pprev)); |
1404 | +} |
1405 | + |
1406 | /* Networking protocol blocks we attach to sockets. |
1407 | * socket layer -> transport layer interface |
1408 | * transport -> network interface is defined by struct inet_proto |
1409 | diff --git a/include/net/tcp.h b/include/net/tcp.h |
1410 | index 2757a11..8376a6a 100644 |
1411 | --- a/include/net/tcp.h |
1412 | +++ b/include/net/tcp.h |
1413 | @@ -948,6 +948,7 @@ static inline int tcp_prequeue(struct sock *sk, struct sk_buff *skb) |
1414 | if (sysctl_tcp_low_latency || !tp->ucopy.task) |
1415 | return 0; |
1416 | |
1417 | + skb_dst_force(skb); |
1418 | __skb_queue_tail(&tp->ucopy.prequeue, skb); |
1419 | tp->ucopy.memory += skb->truesize; |
1420 | if (tp->ucopy.memory > sk->sk_rcvbuf) { |
1421 | diff --git a/ipc/shm.c b/ipc/shm.c |
1422 | index 85d81b4..a02ef57 100644 |
1423 | --- a/ipc/shm.c |
1424 | +++ b/ipc/shm.c |
1425 | @@ -479,10 +479,12 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params) |
1426 | |
1427 | sprintf (name, "SYSV%08x", key); |
1428 | if (shmflg & SHM_HUGETLB) { |
1429 | + size_t hugesize = ALIGN(size, huge_page_size(&default_hstate)); |
1430 | + |
1431 | /* hugetlb_file_setup applies strict accounting */ |
1432 | if (shmflg & SHM_NORESERVE) |
1433 | acctflag = VM_NORESERVE; |
1434 | - file = hugetlb_file_setup(name, 0, size, acctflag, |
1435 | + file = hugetlb_file_setup(name, hugesize, acctflag, |
1436 | &shp->mlock_user, HUGETLB_SHMFS_INODE); |
1437 | } else { |
1438 | /* |
1439 | diff --git a/kernel/kmod.c b/kernel/kmod.c |
1440 | index 05698a7..f2490e1 100644 |
1441 | --- a/kernel/kmod.c |
1442 | +++ b/kernel/kmod.c |
1443 | @@ -541,6 +541,11 @@ int call_usermodehelper_exec(struct subprocess_info *sub_info, int wait) |
1444 | int retval = 0; |
1445 | |
1446 | helper_lock(); |
1447 | + if (!sub_info->path) { |
1448 | + retval = -EINVAL; |
1449 | + goto out; |
1450 | + } |
1451 | + |
1452 | if (sub_info->path[0] == '\0') |
1453 | goto out; |
1454 | |
1455 | diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c |
1456 | index 01d8e62..6570548 100644 |
1457 | --- a/kernel/time/tick-sched.c |
1458 | +++ b/kernel/time/tick-sched.c |
1459 | @@ -866,7 +866,7 @@ void tick_cancel_sched_timer(int cpu) |
1460 | hrtimer_cancel(&ts->sched_timer); |
1461 | # endif |
1462 | |
1463 | - ts->nohz_mode = NOHZ_MODE_INACTIVE; |
1464 | + memset(ts, 0, sizeof(*ts)); |
1465 | } |
1466 | #endif |
1467 | |
1468 | diff --git a/kernel/timer.c b/kernel/timer.c |
1469 | index 6dfdb72..dd93d90 100644 |
1470 | --- a/kernel/timer.c |
1471 | +++ b/kernel/timer.c |
1472 | @@ -1680,12 +1680,12 @@ static int __cpuinit init_timers_cpu(int cpu) |
1473 | boot_done = 1; |
1474 | base = &boot_tvec_bases; |
1475 | } |
1476 | + spin_lock_init(&base->lock); |
1477 | tvec_base_done[cpu] = 1; |
1478 | } else { |
1479 | base = per_cpu(tvec_bases, cpu); |
1480 | } |
1481 | |
1482 | - spin_lock_init(&base->lock); |
1483 | |
1484 | for (j = 0; j < TVN_SIZE; j++) { |
1485 | INIT_LIST_HEAD(base->tv5.vec + j); |
1486 | diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c |
1487 | index 431dba8..289197a 100644 |
1488 | --- a/kernel/trace/trace_events_filter.c |
1489 | +++ b/kernel/trace/trace_events_filter.c |
1490 | @@ -777,7 +777,11 @@ static int filter_set_pred(struct event_filter *filter, |
1491 | |
1492 | static void __free_preds(struct event_filter *filter) |
1493 | { |
1494 | + int i; |
1495 | + |
1496 | if (filter->preds) { |
1497 | + for (i = 0; i < filter->n_preds; i++) |
1498 | + kfree(filter->preds[i].ops); |
1499 | kfree(filter->preds); |
1500 | filter->preds = NULL; |
1501 | } |
1502 | diff --git a/mm/mmap.c b/mm/mmap.c |
1503 | index 3635d47..ed884dd 100644 |
1504 | --- a/mm/mmap.c |
1505 | +++ b/mm/mmap.c |
1506 | @@ -1130,15 +1130,19 @@ SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len, |
1507 | file = fget(fd); |
1508 | if (!file) |
1509 | goto out; |
1510 | + if (is_file_hugepages(file)) |
1511 | + len = ALIGN(len, huge_page_size(hstate_file(file))); |
1512 | } else if (flags & MAP_HUGETLB) { |
1513 | struct user_struct *user = NULL; |
1514 | + |
1515 | + len = ALIGN(len, huge_page_size(&default_hstate)); |
1516 | /* |
1517 | * VM_NORESERVE is used because the reservations will be |
1518 | * taken when vm_ops->mmap() is called |
1519 | * A dummy user value is used because we are not locking |
1520 | * memory so no accounting is necessary |
1521 | */ |
1522 | - file = hugetlb_file_setup(HUGETLB_ANON_FILE, addr, len, |
1523 | + file = hugetlb_file_setup(HUGETLB_ANON_FILE, len, |
1524 | VM_NORESERVE, &user, |
1525 | HUGETLB_ANONHUGE_INODE); |
1526 | if (IS_ERR(file)) |
1527 | diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c |
1528 | index 9757c19..daeb19d 100644 |
1529 | --- a/net/8021q/vlan_dev.c |
1530 | +++ b/net/8021q/vlan_dev.c |
1531 | @@ -598,7 +598,7 @@ static netdev_features_t vlan_dev_fix_features(struct net_device *dev, |
1532 | netdev_features_t features) |
1533 | { |
1534 | struct net_device *real_dev = vlan_dev_priv(dev)->real_dev; |
1535 | - u32 old_features = features; |
1536 | + netdev_features_t old_features = features; |
1537 | |
1538 | features &= real_dev->vlan_features; |
1539 | features |= NETIF_F_RXCSUM; |
1540 | diff --git a/net/bridge/br_stp_timer.c b/net/bridge/br_stp_timer.c |
1541 | index 58de2a0..c83ee79 100644 |
1542 | --- a/net/bridge/br_stp_timer.c |
1543 | +++ b/net/bridge/br_stp_timer.c |
1544 | @@ -107,7 +107,7 @@ static void br_tcn_timer_expired(unsigned long arg) |
1545 | |
1546 | br_debug(br, "tcn timer expired\n"); |
1547 | spin_lock(&br->lock); |
1548 | - if (br->dev->flags & IFF_UP) { |
1549 | + if (!br_is_root_bridge(br) && (br->dev->flags & IFF_UP)) { |
1550 | br_transmit_tcn(br); |
1551 | |
1552 | mod_timer(&br->tcn_timer,jiffies + br->bridge_hello_time); |
1553 | diff --git a/net/core/dev.c b/net/core/dev.c |
1554 | index dd12421..7db83d6 100644 |
1555 | --- a/net/core/dev.c |
1556 | +++ b/net/core/dev.c |
1557 | @@ -2170,7 +2170,7 @@ EXPORT_SYMBOL(netif_skb_features); |
1558 | * support DMA from it. |
1559 | */ |
1560 | static inline int skb_needs_linearize(struct sk_buff *skb, |
1561 | - int features) |
1562 | + netdev_features_t features) |
1563 | { |
1564 | return skb_is_nonlinear(skb) && |
1565 | ((skb_has_frag_list(skb) && |
1566 | diff --git a/net/core/ethtool.c b/net/core/ethtool.c |
1567 | index 6d6d7d2..7becb3f 100644 |
1568 | --- a/net/core/ethtool.c |
1569 | +++ b/net/core/ethtool.c |
1570 | @@ -1286,7 +1286,7 @@ int dev_ethtool(struct net *net, struct ifreq *ifr) |
1571 | void __user *useraddr = ifr->ifr_data; |
1572 | u32 ethcmd; |
1573 | int rc; |
1574 | - u32 old_features; |
1575 | + netdev_features_t old_features; |
1576 | |
1577 | if (!dev || !netif_device_present(dev)) |
1578 | return -ENODEV; |
1579 | diff --git a/net/core/sock.c b/net/core/sock.c |
1580 | index f8b5030..561eb57 100644 |
1581 | --- a/net/core/sock.c |
1582 | +++ b/net/core/sock.c |
1583 | @@ -1093,18 +1093,6 @@ static void sock_copy(struct sock *nsk, const struct sock *osk) |
1584 | #endif |
1585 | } |
1586 | |
1587 | -/* |
1588 | - * caches using SLAB_DESTROY_BY_RCU should let .next pointer from nulls nodes |
1589 | - * un-modified. Special care is taken when initializing object to zero. |
1590 | - */ |
1591 | -static inline void sk_prot_clear_nulls(struct sock *sk, int size) |
1592 | -{ |
1593 | - if (offsetof(struct sock, sk_node.next) != 0) |
1594 | - memset(sk, 0, offsetof(struct sock, sk_node.next)); |
1595 | - memset(&sk->sk_node.pprev, 0, |
1596 | - size - offsetof(struct sock, sk_node.pprev)); |
1597 | -} |
1598 | - |
1599 | void sk_prot_clear_portaddr_nulls(struct sock *sk, int size) |
1600 | { |
1601 | unsigned long nulls1, nulls2; |
1602 | diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c |
1603 | index 3889e02..7ee7121 100644 |
1604 | --- a/net/ipv6/tcp_ipv6.c |
1605 | +++ b/net/ipv6/tcp_ipv6.c |
1606 | @@ -2079,6 +2079,17 @@ void tcp6_proc_exit(struct net *net) |
1607 | } |
1608 | #endif |
1609 | |
1610 | +static void tcp_v6_clear_sk(struct sock *sk, int size) |
1611 | +{ |
1612 | + struct inet_sock *inet = inet_sk(sk); |
1613 | + |
1614 | + /* we do not want to clear pinet6 field, because of RCU lookups */ |
1615 | + sk_prot_clear_nulls(sk, offsetof(struct inet_sock, pinet6)); |
1616 | + |
1617 | + size -= offsetof(struct inet_sock, pinet6) + sizeof(inet->pinet6); |
1618 | + memset(&inet->pinet6 + 1, 0, size); |
1619 | +} |
1620 | + |
1621 | struct proto tcpv6_prot = { |
1622 | .name = "TCPv6", |
1623 | .owner = THIS_MODULE, |
1624 | @@ -2120,6 +2131,7 @@ struct proto tcpv6_prot = { |
1625 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR_KMEM |
1626 | .proto_cgroup = tcp_proto_cgroup, |
1627 | #endif |
1628 | + .clear_sk = tcp_v6_clear_sk, |
1629 | }; |
1630 | |
1631 | static const struct inet6_protocol tcpv6_protocol = { |
1632 | diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c |
1633 | index 37b0699..aa2f18b 100644 |
1634 | --- a/net/ipv6/udp.c |
1635 | +++ b/net/ipv6/udp.c |
1636 | @@ -1457,6 +1457,17 @@ void udp6_proc_exit(struct net *net) { |
1637 | } |
1638 | #endif /* CONFIG_PROC_FS */ |
1639 | |
1640 | +void udp_v6_clear_sk(struct sock *sk, int size) |
1641 | +{ |
1642 | + struct inet_sock *inet = inet_sk(sk); |
1643 | + |
1644 | + /* we do not want to clear pinet6 field, because of RCU lookups */ |
1645 | + sk_prot_clear_portaddr_nulls(sk, offsetof(struct inet_sock, pinet6)); |
1646 | + |
1647 | + size -= offsetof(struct inet_sock, pinet6) + sizeof(inet->pinet6); |
1648 | + memset(&inet->pinet6 + 1, 0, size); |
1649 | +} |
1650 | + |
1651 | /* ------------------------------------------------------------------------ */ |
1652 | |
1653 | struct proto udpv6_prot = { |
1654 | @@ -1487,7 +1498,7 @@ struct proto udpv6_prot = { |
1655 | .compat_setsockopt = compat_udpv6_setsockopt, |
1656 | .compat_getsockopt = compat_udpv6_getsockopt, |
1657 | #endif |
1658 | - .clear_sk = sk_prot_clear_portaddr_nulls, |
1659 | + .clear_sk = udp_v6_clear_sk, |
1660 | }; |
1661 | |
1662 | static struct inet_protosw udpv6_protosw = { |
1663 | diff --git a/net/ipv6/udp_impl.h b/net/ipv6/udp_impl.h |
1664 | index d757104..4691ed5 100644 |
1665 | --- a/net/ipv6/udp_impl.h |
1666 | +++ b/net/ipv6/udp_impl.h |
1667 | @@ -31,6 +31,8 @@ extern int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk, |
1668 | extern int udpv6_queue_rcv_skb(struct sock * sk, struct sk_buff *skb); |
1669 | extern void udpv6_destroy_sock(struct sock *sk); |
1670 | |
1671 | +extern void udp_v6_clear_sk(struct sock *sk, int size); |
1672 | + |
1673 | #ifdef CONFIG_PROC_FS |
1674 | extern int udp6_seq_show(struct seq_file *seq, void *v); |
1675 | #endif |
1676 | diff --git a/net/ipv6/udplite.c b/net/ipv6/udplite.c |
1677 | index 1d08e21..dfcc4be 100644 |
1678 | --- a/net/ipv6/udplite.c |
1679 | +++ b/net/ipv6/udplite.c |
1680 | @@ -56,7 +56,7 @@ struct proto udplitev6_prot = { |
1681 | .compat_setsockopt = compat_udpv6_setsockopt, |
1682 | .compat_getsockopt = compat_udpv6_getsockopt, |
1683 | #endif |
1684 | - .clear_sk = sk_prot_clear_portaddr_nulls, |
1685 | + .clear_sk = udp_v6_clear_sk, |
1686 | }; |
1687 | |
1688 | static struct inet_protosw udplite6_protosw = { |
1689 | diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c |
1690 | index 8ea65e0..808fd08 100644 |
1691 | --- a/net/ipv6/xfrm6_policy.c |
1692 | +++ b/net/ipv6/xfrm6_policy.c |
1693 | @@ -96,8 +96,10 @@ static int xfrm6_fill_dst(struct xfrm_dst *xdst, struct net_device *dev, |
1694 | dev_hold(dev); |
1695 | |
1696 | xdst->u.rt6.rt6i_idev = in6_dev_get(dev); |
1697 | - if (!xdst->u.rt6.rt6i_idev) |
1698 | + if (!xdst->u.rt6.rt6i_idev) { |
1699 | + dev_put(dev); |
1700 | return -ENODEV; |
1701 | + } |
1702 | |
1703 | xdst->u.rt6.rt6i_peer = rt->rt6i_peer; |
1704 | if (rt->rt6i_peer) |
1705 | diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c |
1706 | index 38ca5e0..cfcd783 100644 |
1707 | --- a/net/packet/af_packet.c |
1708 | +++ b/net/packet/af_packet.c |
1709 | @@ -812,37 +812,27 @@ static void prb_open_block(struct tpacket_kbdq_core *pkc1, |
1710 | |
1711 | smp_rmb(); |
1712 | |
1713 | - if (likely(TP_STATUS_KERNEL == BLOCK_STATUS(pbd1))) { |
1714 | - |
1715 | - /* We could have just memset this but we will lose the |
1716 | - * flexibility of making the priv area sticky |
1717 | - */ |
1718 | - BLOCK_SNUM(pbd1) = pkc1->knxt_seq_num++; |
1719 | - BLOCK_NUM_PKTS(pbd1) = 0; |
1720 | - BLOCK_LEN(pbd1) = BLK_PLUS_PRIV(pkc1->blk_sizeof_priv); |
1721 | - getnstimeofday(&ts); |
1722 | - h1->ts_first_pkt.ts_sec = ts.tv_sec; |
1723 | - h1->ts_first_pkt.ts_nsec = ts.tv_nsec; |
1724 | - pkc1->pkblk_start = (char *)pbd1; |
1725 | - pkc1->nxt_offset = (char *)(pkc1->pkblk_start + |
1726 | - BLK_PLUS_PRIV(pkc1->blk_sizeof_priv)); |
1727 | - BLOCK_O2FP(pbd1) = (__u32)BLK_PLUS_PRIV(pkc1->blk_sizeof_priv); |
1728 | - BLOCK_O2PRIV(pbd1) = BLK_HDR_LEN; |
1729 | - pbd1->version = pkc1->version; |
1730 | - pkc1->prev = pkc1->nxt_offset; |
1731 | - pkc1->pkblk_end = pkc1->pkblk_start + pkc1->kblk_size; |
1732 | - prb_thaw_queue(pkc1); |
1733 | - _prb_refresh_rx_retire_blk_timer(pkc1); |
1734 | - |
1735 | - smp_wmb(); |
1736 | - |
1737 | - return; |
1738 | - } |
1739 | + /* We could have just memset this but we will lose the |
1740 | + * flexibility of making the priv area sticky |
1741 | + */ |
1742 | + BLOCK_SNUM(pbd1) = pkc1->knxt_seq_num++; |
1743 | + BLOCK_NUM_PKTS(pbd1) = 0; |
1744 | + BLOCK_LEN(pbd1) = BLK_PLUS_PRIV(pkc1->blk_sizeof_priv); |
1745 | + getnstimeofday(&ts); |
1746 | + h1->ts_first_pkt.ts_sec = ts.tv_sec; |
1747 | + h1->ts_first_pkt.ts_nsec = ts.tv_nsec; |
1748 | + pkc1->pkblk_start = (char *)pbd1; |
1749 | + pkc1->nxt_offset = (char *)(pkc1->pkblk_start + |
1750 | + BLK_PLUS_PRIV(pkc1->blk_sizeof_priv)); |
1751 | + BLOCK_O2FP(pbd1) = (__u32)BLK_PLUS_PRIV(pkc1->blk_sizeof_priv); |
1752 | + BLOCK_O2PRIV(pbd1) = BLK_HDR_LEN; |
1753 | + pbd1->version = pkc1->version; |
1754 | + pkc1->prev = pkc1->nxt_offset; |
1755 | + pkc1->pkblk_end = pkc1->pkblk_start + pkc1->kblk_size; |
1756 | + prb_thaw_queue(pkc1); |
1757 | + _prb_refresh_rx_retire_blk_timer(pkc1); |
1758 | |
1759 | - WARN(1, "ERROR block:%p is NOT FREE status:%d kactive_blk_num:%d\n", |
1760 | - pbd1, BLOCK_STATUS(pbd1), pkc1->kactive_blk_num); |
1761 | - dump_stack(); |
1762 | - BUG(); |
1763 | + smp_wmb(); |
1764 | } |
1765 | |
1766 | /* |
1767 | @@ -933,10 +923,6 @@ static void prb_retire_current_block(struct tpacket_kbdq_core *pkc, |
1768 | prb_close_block(pkc, pbd, po, status); |
1769 | return; |
1770 | } |
1771 | - |
1772 | - WARN(1, "ERROR-pbd[%d]:%p\n", pkc->kactive_blk_num, pbd); |
1773 | - dump_stack(); |
1774 | - BUG(); |
1775 | } |
1776 | |
1777 | static int prb_curr_blk_in_use(struct tpacket_kbdq_core *pkc, |
1778 | diff --git a/net/sched/act_ipt.c b/net/sched/act_ipt.c |
1779 | index 60f8f61..57827bf 100644 |
1780 | --- a/net/sched/act_ipt.c |
1781 | +++ b/net/sched/act_ipt.c |
1782 | @@ -8,7 +8,7 @@ |
1783 | * as published by the Free Software Foundation; either version |
1784 | * 2 of the License, or (at your option) any later version. |
1785 | * |
1786 | - * Copyright: Jamal Hadi Salim (2002-4) |
1787 | + * Copyright: Jamal Hadi Salim (2002-13) |
1788 | */ |
1789 | |
1790 | #include <linux/types.h> |
1791 | @@ -299,17 +299,44 @@ static struct tc_action_ops act_ipt_ops = { |
1792 | .walk = tcf_generic_walker |
1793 | }; |
1794 | |
1795 | -MODULE_AUTHOR("Jamal Hadi Salim(2002-4)"); |
1796 | +static struct tc_action_ops act_xt_ops = { |
1797 | + .kind = "xt", |
1798 | + .hinfo = &ipt_hash_info, |
1799 | + .type = TCA_ACT_IPT, |
1800 | + .capab = TCA_CAP_NONE, |
1801 | + .owner = THIS_MODULE, |
1802 | + .act = tcf_ipt, |
1803 | + .dump = tcf_ipt_dump, |
1804 | + .cleanup = tcf_ipt_cleanup, |
1805 | + .lookup = tcf_hash_search, |
1806 | + .init = tcf_ipt_init, |
1807 | + .walk = tcf_generic_walker |
1808 | +}; |
1809 | + |
1810 | +MODULE_AUTHOR("Jamal Hadi Salim(2002-13)"); |
1811 | MODULE_DESCRIPTION("Iptables target actions"); |
1812 | MODULE_LICENSE("GPL"); |
1813 | +MODULE_ALIAS("act_xt"); |
1814 | |
1815 | static int __init ipt_init_module(void) |
1816 | { |
1817 | - return tcf_register_action(&act_ipt_ops); |
1818 | + int ret1, ret2; |
1819 | + ret1 = tcf_register_action(&act_xt_ops); |
1820 | + if (ret1 < 0) |
1821 | + printk("Failed to load xt action\n"); |
1822 | + ret2 = tcf_register_action(&act_ipt_ops); |
1823 | + if (ret2 < 0) |
1824 | + printk("Failed to load ipt action\n"); |
1825 | + |
1826 | + if (ret1 < 0 && ret2 < 0) |
1827 | + return ret1; |
1828 | + else |
1829 | + return 0; |
1830 | } |
1831 | |
1832 | static void __exit ipt_cleanup_module(void) |
1833 | { |
1834 | + tcf_unregister_action(&act_xt_ops); |
1835 | tcf_unregister_action(&act_ipt_ops); |
1836 | } |
1837 | |
1838 | diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c |
1839 | index c72dce0..c74a044 100644 |
1840 | --- a/sound/pci/hda/hda_codec.c |
1841 | +++ b/sound/pci/hda/hda_codec.c |
1842 | @@ -617,6 +617,9 @@ int snd_hda_queue_unsol_event(struct hda_bus *bus, u32 res, u32 res_ex) |
1843 | struct hda_bus_unsolicited *unsol; |
1844 | unsigned int wp; |
1845 | |
1846 | + if (!bus || !bus->workq) |
1847 | + return 0; |
1848 | + |
1849 | trace_hda_unsol_event(bus, res, res_ex); |
1850 | unsol = bus->unsol; |
1851 | if (!unsol) |
1852 | diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c |
1853 | index 4c471a5..d9924d7 100644 |
1854 | --- a/sound/soc/codecs/wm8994.c |
1855 | +++ b/sound/soc/codecs/wm8994.c |
1856 | @@ -2824,6 +2824,7 @@ static int wm8994_aif3_hw_params(struct snd_pcm_substream *substream, |
1857 | default: |
1858 | return 0; |
1859 | } |
1860 | + break; |
1861 | default: |
1862 | return 0; |
1863 | } |