Annotation of /trunk/kernel-lts/patches-3.4/0145-3.4.46-all-fixes.patch
Parent Directory | Revision Log
Revision 2205 -
(hide 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 | niro | 2205 | 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 | } |