Annotation of /trunk/kernel-magellan/patches-3.2/0100-3.2.1-all-fixes.patch
Parent Directory | Revision Log
Revision 1644 -
(hide annotations)
(download)
Thu Feb 16 12:24:52 2012 UTC (12 years, 7 months ago) by niro
File size: 59100 byte(s)
Thu Feb 16 12:24:52 2012 UTC (12 years, 7 months ago) by niro
File size: 59100 byte(s)
-3.2.6-magellan-r1
1 | niro | 1644 | diff --git a/Documentation/HOWTO b/Documentation/HOWTO |
2 | index 81bc1a9..f7ade3b 100644 | ||
3 | --- a/Documentation/HOWTO | ||
4 | +++ b/Documentation/HOWTO | ||
5 | @@ -275,8 +275,8 @@ versions. | ||
6 | If no 2.6.x.y kernel is available, then the highest numbered 2.6.x | ||
7 | kernel is the current stable kernel. | ||
8 | |||
9 | -2.6.x.y are maintained by the "stable" team <stable@kernel.org>, and are | ||
10 | -released as needs dictate. The normal release period is approximately | ||
11 | +2.6.x.y are maintained by the "stable" team <stable@vger.kernel.org>, and | ||
12 | +are released as needs dictate. The normal release period is approximately | ||
13 | two weeks, but it can be longer if there are no pressing problems. A | ||
14 | security-related problem, instead, can cause a release to happen almost | ||
15 | instantly. | ||
16 | diff --git a/Documentation/development-process/5.Posting b/Documentation/development-process/5.Posting | ||
17 | index 903a254..8a48c9b 100644 | ||
18 | --- a/Documentation/development-process/5.Posting | ||
19 | +++ b/Documentation/development-process/5.Posting | ||
20 | @@ -271,10 +271,10 @@ copies should go to: | ||
21 | the linux-kernel list. | ||
22 | |||
23 | - If you are fixing a bug, think about whether the fix should go into the | ||
24 | - next stable update. If so, stable@kernel.org should get a copy of the | ||
25 | - patch. Also add a "Cc: stable@kernel.org" to the tags within the patch | ||
26 | - itself; that will cause the stable team to get a notification when your | ||
27 | - fix goes into the mainline. | ||
28 | + next stable update. If so, stable@vger.kernel.org should get a copy of | ||
29 | + the patch. Also add a "Cc: stable@vger.kernel.org" to the tags within | ||
30 | + the patch itself; that will cause the stable team to get a notification | ||
31 | + when your fix goes into the mainline. | ||
32 | |||
33 | When selecting recipients for a patch, it is good to have an idea of who | ||
34 | you think will eventually accept the patch and get it merged. While it | ||
35 | diff --git a/Documentation/usb/usbmon.txt b/Documentation/usb/usbmon.txt | ||
36 | index a4efa04..5335fa8 100644 | ||
37 | --- a/Documentation/usb/usbmon.txt | ||
38 | +++ b/Documentation/usb/usbmon.txt | ||
39 | @@ -47,10 +47,11 @@ This allows to filter away annoying devices that talk continuously. | ||
40 | |||
41 | 2. Find which bus connects to the desired device | ||
42 | |||
43 | -Run "cat /proc/bus/usb/devices", and find the T-line which corresponds to | ||
44 | -the device. Usually you do it by looking for the vendor string. If you have | ||
45 | -many similar devices, unplug one and compare two /proc/bus/usb/devices outputs. | ||
46 | -The T-line will have a bus number. Example: | ||
47 | +Run "cat /sys/kernel/debug/usb/devices", and find the T-line which corresponds | ||
48 | +to the device. Usually you do it by looking for the vendor string. If you have | ||
49 | +many similar devices, unplug one and compare the two | ||
50 | +/sys/kernel/debug/usb/devices outputs. The T-line will have a bus number. | ||
51 | +Example: | ||
52 | |||
53 | T: Bus=03 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 0 | ||
54 | D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 | ||
55 | @@ -58,7 +59,10 @@ P: Vendor=0557 ProdID=2004 Rev= 1.00 | ||
56 | S: Manufacturer=ATEN | ||
57 | S: Product=UC100KM V2.00 | ||
58 | |||
59 | -Bus=03 means it's bus 3. | ||
60 | +"Bus=03" means it's bus 3. Alternatively, you can look at the output from | ||
61 | +"lsusb" and get the bus number from the appropriate line. Example: | ||
62 | + | ||
63 | +Bus 003 Device 002: ID 0557:2004 ATEN UC100KM V2.00 | ||
64 | |||
65 | 3. Start 'cat' | ||
66 | |||
67 | diff --git a/MAINTAINERS b/MAINTAINERS | ||
68 | index 62f1cd3..f986e7d 100644 | ||
69 | --- a/MAINTAINERS | ||
70 | +++ b/MAINTAINERS | ||
71 | @@ -6258,7 +6258,7 @@ F: arch/alpha/kernel/srm_env.c | ||
72 | |||
73 | STABLE BRANCH | ||
74 | M: Greg Kroah-Hartman <greg@kroah.com> | ||
75 | -L: stable@kernel.org | ||
76 | +L: stable@vger.kernel.org | ||
77 | S: Maintained | ||
78 | |||
79 | STAGING SUBSYSTEM | ||
80 | diff --git a/arch/powerpc/include/asm/time.h b/arch/powerpc/include/asm/time.h | ||
81 | index fe6f7c2..bc3c745 100644 | ||
82 | --- a/arch/powerpc/include/asm/time.h | ||
83 | +++ b/arch/powerpc/include/asm/time.h | ||
84 | @@ -219,5 +219,7 @@ DECLARE_PER_CPU(struct cpu_usage, cpu_usage_array); | ||
85 | extern void secondary_cpu_time_init(void); | ||
86 | extern void iSeries_time_init_early(void); | ||
87 | |||
88 | +extern void decrementer_check_overflow(void); | ||
89 | + | ||
90 | #endif /* __KERNEL__ */ | ||
91 | #endif /* __POWERPC_TIME_H */ | ||
92 | diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c | ||
93 | index 5c3c469..745c1e7 100644 | ||
94 | --- a/arch/powerpc/kernel/irq.c | ||
95 | +++ b/arch/powerpc/kernel/irq.c | ||
96 | @@ -164,16 +164,13 @@ notrace void arch_local_irq_restore(unsigned long en) | ||
97 | */ | ||
98 | local_paca->hard_enabled = en; | ||
99 | |||
100 | -#ifndef CONFIG_BOOKE | ||
101 | - /* On server, re-trigger the decrementer if it went negative since | ||
102 | - * some processors only trigger on edge transitions of the sign bit. | ||
103 | - * | ||
104 | - * BookE has a level sensitive decrementer (latches in TSR) so we | ||
105 | - * don't need that | ||
106 | + /* | ||
107 | + * Trigger the decrementer if we have a pending event. Some processors | ||
108 | + * only trigger on edge transitions of the sign bit. We might also | ||
109 | + * have disabled interrupts long enough that the decrementer wrapped | ||
110 | + * to positive. | ||
111 | */ | ||
112 | - if ((int)mfspr(SPRN_DEC) < 0) | ||
113 | - mtspr(SPRN_DEC, 1); | ||
114 | -#endif /* CONFIG_BOOKE */ | ||
115 | + decrementer_check_overflow(); | ||
116 | |||
117 | /* | ||
118 | * Force the delivery of pending soft-disabled interrupts on PS3. | ||
119 | diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c | ||
120 | index 522bb1d..5db163c 100644 | ||
121 | --- a/arch/powerpc/kernel/time.c | ||
122 | +++ b/arch/powerpc/kernel/time.c | ||
123 | @@ -889,6 +889,15 @@ static void __init clocksource_init(void) | ||
124 | clock->name, clock->mult, clock->shift); | ||
125 | } | ||
126 | |||
127 | +void decrementer_check_overflow(void) | ||
128 | +{ | ||
129 | + u64 now = get_tb_or_rtc(); | ||
130 | + struct decrementer_clock *decrementer = &__get_cpu_var(decrementers); | ||
131 | + | ||
132 | + if (now >= decrementer->next_tb) | ||
133 | + set_dec(1); | ||
134 | +} | ||
135 | + | ||
136 | static int decrementer_set_next_event(unsigned long evt, | ||
137 | struct clock_event_device *dev) | ||
138 | { | ||
139 | diff --git a/arch/powerpc/platforms/pseries/hvCall_inst.c b/arch/powerpc/platforms/pseries/hvCall_inst.c | ||
140 | index f106662..c9311cf 100644 | ||
141 | --- a/arch/powerpc/platforms/pseries/hvCall_inst.c | ||
142 | +++ b/arch/powerpc/platforms/pseries/hvCall_inst.c | ||
143 | @@ -109,7 +109,7 @@ static void probe_hcall_entry(void *ignored, unsigned long opcode, unsigned long | ||
144 | if (opcode > MAX_HCALL_OPCODE) | ||
145 | return; | ||
146 | |||
147 | - h = &get_cpu_var(hcall_stats)[opcode / 4]; | ||
148 | + h = &__get_cpu_var(hcall_stats)[opcode / 4]; | ||
149 | h->tb_start = mftb(); | ||
150 | h->purr_start = mfspr(SPRN_PURR); | ||
151 | } | ||
152 | @@ -126,8 +126,6 @@ static void probe_hcall_exit(void *ignored, unsigned long opcode, unsigned long | ||
153 | h->num_calls++; | ||
154 | h->tb_total += mftb() - h->tb_start; | ||
155 | h->purr_total += mfspr(SPRN_PURR) - h->purr_start; | ||
156 | - | ||
157 | - put_cpu_var(hcall_stats); | ||
158 | } | ||
159 | |||
160 | static int __init hcall_inst_init(void) | ||
161 | diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c | ||
162 | index 27a4950..dc36ea6 100644 | ||
163 | --- a/arch/powerpc/platforms/pseries/lpar.c | ||
164 | +++ b/arch/powerpc/platforms/pseries/lpar.c | ||
165 | @@ -554,6 +554,7 @@ void __trace_hcall_entry(unsigned long opcode, unsigned long *args) | ||
166 | goto out; | ||
167 | |||
168 | (*depth)++; | ||
169 | + preempt_disable(); | ||
170 | trace_hcall_entry(opcode, args); | ||
171 | (*depth)--; | ||
172 | |||
173 | @@ -576,6 +577,7 @@ void __trace_hcall_exit(long opcode, unsigned long retval, | ||
174 | |||
175 | (*depth)++; | ||
176 | trace_hcall_exit(opcode, retval, retbuf); | ||
177 | + preempt_enable(); | ||
178 | (*depth)--; | ||
179 | |||
180 | out: | ||
181 | diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c | ||
182 | index 06ed6b4..3719c94 100644 | ||
183 | --- a/drivers/base/firmware_class.c | ||
184 | +++ b/drivers/base/firmware_class.c | ||
185 | @@ -226,13 +226,13 @@ static ssize_t firmware_loading_store(struct device *dev, | ||
186 | int loading = simple_strtol(buf, NULL, 10); | ||
187 | int i; | ||
188 | |||
189 | + mutex_lock(&fw_lock); | ||
190 | + | ||
191 | + if (!fw_priv->fw) | ||
192 | + goto out; | ||
193 | + | ||
194 | switch (loading) { | ||
195 | case 1: | ||
196 | - mutex_lock(&fw_lock); | ||
197 | - if (!fw_priv->fw) { | ||
198 | - mutex_unlock(&fw_lock); | ||
199 | - break; | ||
200 | - } | ||
201 | firmware_free_data(fw_priv->fw); | ||
202 | memset(fw_priv->fw, 0, sizeof(struct firmware)); | ||
203 | /* If the pages are not owned by 'struct firmware' */ | ||
204 | @@ -243,7 +243,6 @@ static ssize_t firmware_loading_store(struct device *dev, | ||
205 | fw_priv->page_array_size = 0; | ||
206 | fw_priv->nr_pages = 0; | ||
207 | set_bit(FW_STATUS_LOADING, &fw_priv->status); | ||
208 | - mutex_unlock(&fw_lock); | ||
209 | break; | ||
210 | case 0: | ||
211 | if (test_bit(FW_STATUS_LOADING, &fw_priv->status)) { | ||
212 | @@ -274,7 +273,8 @@ static ssize_t firmware_loading_store(struct device *dev, | ||
213 | fw_load_abort(fw_priv); | ||
214 | break; | ||
215 | } | ||
216 | - | ||
217 | +out: | ||
218 | + mutex_unlock(&fw_lock); | ||
219 | return count; | ||
220 | } | ||
221 | |||
222 | diff --git a/drivers/bcma/bcma_private.h b/drivers/bcma/bcma_private.h | ||
223 | index 30a3085..fda56bd 100644 | ||
224 | --- a/drivers/bcma/bcma_private.h | ||
225 | +++ b/drivers/bcma/bcma_private.h | ||
226 | @@ -18,6 +18,9 @@ void bcma_bus_unregister(struct bcma_bus *bus); | ||
227 | int __init bcma_bus_early_register(struct bcma_bus *bus, | ||
228 | struct bcma_device *core_cc, | ||
229 | struct bcma_device *core_mips); | ||
230 | +#ifdef CONFIG_PM | ||
231 | +int bcma_bus_resume(struct bcma_bus *bus); | ||
232 | +#endif | ||
233 | |||
234 | /* scan.c */ | ||
235 | int bcma_bus_scan(struct bcma_bus *bus); | ||
236 | diff --git a/drivers/bcma/host_pci.c b/drivers/bcma/host_pci.c | ||
237 | index 1b51d8b..990f5a8 100644 | ||
238 | --- a/drivers/bcma/host_pci.c | ||
239 | +++ b/drivers/bcma/host_pci.c | ||
240 | @@ -224,6 +224,41 @@ static void bcma_host_pci_remove(struct pci_dev *dev) | ||
241 | pci_set_drvdata(dev, NULL); | ||
242 | } | ||
243 | |||
244 | +#ifdef CONFIG_PM | ||
245 | +static int bcma_host_pci_suspend(struct pci_dev *dev, pm_message_t state) | ||
246 | +{ | ||
247 | + /* Host specific */ | ||
248 | + pci_save_state(dev); | ||
249 | + pci_disable_device(dev); | ||
250 | + pci_set_power_state(dev, pci_choose_state(dev, state)); | ||
251 | + | ||
252 | + return 0; | ||
253 | +} | ||
254 | + | ||
255 | +static int bcma_host_pci_resume(struct pci_dev *dev) | ||
256 | +{ | ||
257 | + struct bcma_bus *bus = pci_get_drvdata(dev); | ||
258 | + int err; | ||
259 | + | ||
260 | + /* Host specific */ | ||
261 | + pci_set_power_state(dev, 0); | ||
262 | + err = pci_enable_device(dev); | ||
263 | + if (err) | ||
264 | + return err; | ||
265 | + pci_restore_state(dev); | ||
266 | + | ||
267 | + /* Bus specific */ | ||
268 | + err = bcma_bus_resume(bus); | ||
269 | + if (err) | ||
270 | + return err; | ||
271 | + | ||
272 | + return 0; | ||
273 | +} | ||
274 | +#else /* CONFIG_PM */ | ||
275 | +# define bcma_host_pci_suspend NULL | ||
276 | +# define bcma_host_pci_resume NULL | ||
277 | +#endif /* CONFIG_PM */ | ||
278 | + | ||
279 | static DEFINE_PCI_DEVICE_TABLE(bcma_pci_bridge_tbl) = { | ||
280 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x0576) }, | ||
281 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4331) }, | ||
282 | @@ -239,6 +274,8 @@ static struct pci_driver bcma_pci_bridge_driver = { | ||
283 | .id_table = bcma_pci_bridge_tbl, | ||
284 | .probe = bcma_host_pci_probe, | ||
285 | .remove = bcma_host_pci_remove, | ||
286 | + .suspend = bcma_host_pci_suspend, | ||
287 | + .resume = bcma_host_pci_resume, | ||
288 | }; | ||
289 | |||
290 | int __init bcma_host_pci_init(void) | ||
291 | diff --git a/drivers/bcma/main.c b/drivers/bcma/main.c | ||
292 | index 70c84b9..10f92b3 100644 | ||
293 | --- a/drivers/bcma/main.c | ||
294 | +++ b/drivers/bcma/main.c | ||
295 | @@ -240,6 +240,22 @@ int __init bcma_bus_early_register(struct bcma_bus *bus, | ||
296 | return 0; | ||
297 | } | ||
298 | |||
299 | +#ifdef CONFIG_PM | ||
300 | +int bcma_bus_resume(struct bcma_bus *bus) | ||
301 | +{ | ||
302 | + struct bcma_device *core; | ||
303 | + | ||
304 | + /* Init CC core */ | ||
305 | + core = bcma_find_core(bus, BCMA_CORE_CHIPCOMMON); | ||
306 | + if (core) { | ||
307 | + bus->drv_cc.setup_done = false; | ||
308 | + bcma_core_chipcommon_init(&bus->drv_cc); | ||
309 | + } | ||
310 | + | ||
311 | + return 0; | ||
312 | +} | ||
313 | +#endif | ||
314 | + | ||
315 | int __bcma_driver_register(struct bcma_driver *drv, struct module *owner) | ||
316 | { | ||
317 | drv->drv.name = drv->name; | ||
318 | diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c | ||
319 | index 0c048dd..d2d0a2a 100644 | ||
320 | --- a/drivers/hv/vmbus_drv.c | ||
321 | +++ b/drivers/hv/vmbus_drv.c | ||
322 | @@ -62,6 +62,14 @@ struct hv_device_info { | ||
323 | struct hv_dev_port_info outbound; | ||
324 | }; | ||
325 | |||
326 | +static int vmbus_exists(void) | ||
327 | +{ | ||
328 | + if (hv_acpi_dev == NULL) | ||
329 | + return -ENODEV; | ||
330 | + | ||
331 | + return 0; | ||
332 | +} | ||
333 | + | ||
334 | |||
335 | static void get_channel_info(struct hv_device *device, | ||
336 | struct hv_device_info *info) | ||
337 | @@ -590,6 +598,10 @@ int __vmbus_driver_register(struct hv_driver *hv_driver, struct module *owner, c | ||
338 | |||
339 | pr_info("registering driver %s\n", hv_driver->name); | ||
340 | |||
341 | + ret = vmbus_exists(); | ||
342 | + if (ret < 0) | ||
343 | + return ret; | ||
344 | + | ||
345 | hv_driver->driver.name = hv_driver->name; | ||
346 | hv_driver->driver.owner = owner; | ||
347 | hv_driver->driver.mod_name = mod_name; | ||
348 | @@ -614,8 +626,8 @@ void vmbus_driver_unregister(struct hv_driver *hv_driver) | ||
349 | { | ||
350 | pr_info("unregistering driver %s\n", hv_driver->name); | ||
351 | |||
352 | - driver_unregister(&hv_driver->driver); | ||
353 | - | ||
354 | + if (!vmbus_exists()) | ||
355 | + driver_unregister(&hv_driver->driver); | ||
356 | } | ||
357 | EXPORT_SYMBOL_GPL(vmbus_driver_unregister); | ||
358 | |||
359 | @@ -776,6 +788,7 @@ static int __init hv_acpi_init(void) | ||
360 | |||
361 | cleanup: | ||
362 | acpi_bus_unregister_driver(&vmbus_acpi_driver); | ||
363 | + hv_acpi_dev = NULL; | ||
364 | return ret; | ||
365 | } | ||
366 | |||
367 | diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c | ||
368 | index 254f164..e3db8ef 100644 | ||
369 | --- a/drivers/infiniband/core/uverbs_cmd.c | ||
370 | +++ b/drivers/infiniband/core/uverbs_cmd.c | ||
371 | @@ -241,11 +241,24 @@ static struct ib_qp *idr_read_qp(int qp_handle, struct ib_ucontext *context) | ||
372 | return idr_read_obj(&ib_uverbs_qp_idr, qp_handle, context, 0); | ||
373 | } | ||
374 | |||
375 | +static struct ib_qp *idr_write_qp(int qp_handle, struct ib_ucontext *context) | ||
376 | +{ | ||
377 | + struct ib_uobject *uobj; | ||
378 | + | ||
379 | + uobj = idr_write_uobj(&ib_uverbs_qp_idr, qp_handle, context); | ||
380 | + return uobj ? uobj->object : NULL; | ||
381 | +} | ||
382 | + | ||
383 | static void put_qp_read(struct ib_qp *qp) | ||
384 | { | ||
385 | put_uobj_read(qp->uobject); | ||
386 | } | ||
387 | |||
388 | +static void put_qp_write(struct ib_qp *qp) | ||
389 | +{ | ||
390 | + put_uobj_write(qp->uobject); | ||
391 | +} | ||
392 | + | ||
393 | static struct ib_srq *idr_read_srq(int srq_handle, struct ib_ucontext *context) | ||
394 | { | ||
395 | return idr_read_obj(&ib_uverbs_srq_idr, srq_handle, context, 0); | ||
396 | @@ -2375,7 +2388,7 @@ ssize_t ib_uverbs_attach_mcast(struct ib_uverbs_file *file, | ||
397 | if (copy_from_user(&cmd, buf, sizeof cmd)) | ||
398 | return -EFAULT; | ||
399 | |||
400 | - qp = idr_read_qp(cmd.qp_handle, file->ucontext); | ||
401 | + qp = idr_write_qp(cmd.qp_handle, file->ucontext); | ||
402 | if (!qp) | ||
403 | return -EINVAL; | ||
404 | |||
405 | @@ -2404,7 +2417,7 @@ ssize_t ib_uverbs_attach_mcast(struct ib_uverbs_file *file, | ||
406 | kfree(mcast); | ||
407 | |||
408 | out_put: | ||
409 | - put_qp_read(qp); | ||
410 | + put_qp_write(qp); | ||
411 | |||
412 | return ret ? ret : in_len; | ||
413 | } | ||
414 | @@ -2422,7 +2435,7 @@ ssize_t ib_uverbs_detach_mcast(struct ib_uverbs_file *file, | ||
415 | if (copy_from_user(&cmd, buf, sizeof cmd)) | ||
416 | return -EFAULT; | ||
417 | |||
418 | - qp = idr_read_qp(cmd.qp_handle, file->ucontext); | ||
419 | + qp = idr_write_qp(cmd.qp_handle, file->ucontext); | ||
420 | if (!qp) | ||
421 | return -EINVAL; | ||
422 | |||
423 | @@ -2441,7 +2454,7 @@ ssize_t ib_uverbs_detach_mcast(struct ib_uverbs_file *file, | ||
424 | } | ||
425 | |||
426 | out_put: | ||
427 | - put_qp_read(qp); | ||
428 | + put_qp_write(qp); | ||
429 | |||
430 | return ret ? ret : in_len; | ||
431 | } | ||
432 | diff --git a/drivers/infiniband/hw/qib/qib_iba6120.c b/drivers/infiniband/hw/qib/qib_iba6120.c | ||
433 | index 781a802..4f18e2d 100644 | ||
434 | --- a/drivers/infiniband/hw/qib/qib_iba6120.c | ||
435 | +++ b/drivers/infiniband/hw/qib/qib_iba6120.c | ||
436 | @@ -2076,9 +2076,11 @@ static void qib_6120_config_ctxts(struct qib_devdata *dd) | ||
437 | static void qib_update_6120_usrhead(struct qib_ctxtdata *rcd, u64 hd, | ||
438 | u32 updegr, u32 egrhd, u32 npkts) | ||
439 | { | ||
440 | - qib_write_ureg(rcd->dd, ur_rcvhdrhead, hd, rcd->ctxt); | ||
441 | if (updegr) | ||
442 | qib_write_ureg(rcd->dd, ur_rcvegrindexhead, egrhd, rcd->ctxt); | ||
443 | + mmiowb(); | ||
444 | + qib_write_ureg(rcd->dd, ur_rcvhdrhead, hd, rcd->ctxt); | ||
445 | + mmiowb(); | ||
446 | } | ||
447 | |||
448 | static u32 qib_6120_hdrqempty(struct qib_ctxtdata *rcd) | ||
449 | diff --git a/drivers/infiniband/hw/qib/qib_iba7220.c b/drivers/infiniband/hw/qib/qib_iba7220.c | ||
450 | index 439d3c5..7ec4048 100644 | ||
451 | --- a/drivers/infiniband/hw/qib/qib_iba7220.c | ||
452 | +++ b/drivers/infiniband/hw/qib/qib_iba7220.c | ||
453 | @@ -2725,9 +2725,11 @@ static int qib_7220_set_loopback(struct qib_pportdata *ppd, const char *what) | ||
454 | static void qib_update_7220_usrhead(struct qib_ctxtdata *rcd, u64 hd, | ||
455 | u32 updegr, u32 egrhd, u32 npkts) | ||
456 | { | ||
457 | - qib_write_ureg(rcd->dd, ur_rcvhdrhead, hd, rcd->ctxt); | ||
458 | if (updegr) | ||
459 | qib_write_ureg(rcd->dd, ur_rcvegrindexhead, egrhd, rcd->ctxt); | ||
460 | + mmiowb(); | ||
461 | + qib_write_ureg(rcd->dd, ur_rcvhdrhead, hd, rcd->ctxt); | ||
462 | + mmiowb(); | ||
463 | } | ||
464 | |||
465 | static u32 qib_7220_hdrqempty(struct qib_ctxtdata *rcd) | ||
466 | diff --git a/drivers/infiniband/hw/qib/qib_iba7322.c b/drivers/infiniband/hw/qib/qib_iba7322.c | ||
467 | index 1d58959..5a070e8 100644 | ||
468 | --- a/drivers/infiniband/hw/qib/qib_iba7322.c | ||
469 | +++ b/drivers/infiniband/hw/qib/qib_iba7322.c | ||
470 | @@ -4082,10 +4082,12 @@ static void qib_update_7322_usrhead(struct qib_ctxtdata *rcd, u64 hd, | ||
471 | */ | ||
472 | if (hd >> IBA7322_HDRHEAD_PKTINT_SHIFT) | ||
473 | adjust_rcv_timeout(rcd, npkts); | ||
474 | - qib_write_ureg(rcd->dd, ur_rcvhdrhead, hd, rcd->ctxt); | ||
475 | - qib_write_ureg(rcd->dd, ur_rcvhdrhead, hd, rcd->ctxt); | ||
476 | if (updegr) | ||
477 | qib_write_ureg(rcd->dd, ur_rcvegrindexhead, egrhd, rcd->ctxt); | ||
478 | + mmiowb(); | ||
479 | + qib_write_ureg(rcd->dd, ur_rcvhdrhead, hd, rcd->ctxt); | ||
480 | + qib_write_ureg(rcd->dd, ur_rcvhdrhead, hd, rcd->ctxt); | ||
481 | + mmiowb(); | ||
482 | } | ||
483 | |||
484 | static u32 qib_7322_hdrqempty(struct qib_ctxtdata *rcd) | ||
485 | diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c | ||
486 | index 7f87568..e58aa2b 100644 | ||
487 | --- a/drivers/net/bonding/bond_main.c | ||
488 | +++ b/drivers/net/bonding/bond_main.c | ||
489 | @@ -1822,7 +1822,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) | ||
490 | "but new slave device does not support netpoll.\n", | ||
491 | bond_dev->name); | ||
492 | res = -EBUSY; | ||
493 | - goto err_close; | ||
494 | + goto err_detach; | ||
495 | } | ||
496 | } | ||
497 | #endif | ||
498 | @@ -1831,7 +1831,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) | ||
499 | |||
500 | res = bond_create_slave_symlinks(bond_dev, slave_dev); | ||
501 | if (res) | ||
502 | - goto err_close; | ||
503 | + goto err_detach; | ||
504 | |||
505 | res = netdev_rx_handler_register(slave_dev, bond_handle_frame, | ||
506 | new_slave); | ||
507 | @@ -1852,6 +1852,11 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) | ||
508 | err_dest_symlinks: | ||
509 | bond_destroy_slave_symlinks(bond_dev, slave_dev); | ||
510 | |||
511 | +err_detach: | ||
512 | + write_lock_bh(&bond->lock); | ||
513 | + bond_detach_slave(bond, new_slave); | ||
514 | + write_unlock_bh(&bond->lock); | ||
515 | + | ||
516 | err_close: | ||
517 | dev_close(slave_dev); | ||
518 | |||
519 | diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c | ||
520 | index e95f0e6..dd2625a 100644 | ||
521 | --- a/drivers/net/usb/asix.c | ||
522 | +++ b/drivers/net/usb/asix.c | ||
523 | @@ -376,7 +376,7 @@ static int asix_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | ||
524 | |||
525 | skb_pull(skb, (size + 1) & 0xfffe); | ||
526 | |||
527 | - if (skb->len == 0) | ||
528 | + if (skb->len < sizeof(header)) | ||
529 | break; | ||
530 | |||
531 | head = (u8 *) skb->data; | ||
532 | diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h | ||
533 | index 69d5f85..8b9ff28 100644 | ||
534 | --- a/drivers/net/wireless/iwlwifi/iwl-commands.h | ||
535 | +++ b/drivers/net/wireless/iwlwifi/iwl-commands.h | ||
536 | @@ -809,7 +809,7 @@ struct iwl_qosparam_cmd { | ||
537 | #define IWLAGN_STATION_COUNT 16 | ||
538 | |||
539 | #define IWL_INVALID_STATION 255 | ||
540 | -#define IWL_MAX_TID_COUNT 9 | ||
541 | +#define IWL_MAX_TID_COUNT 8 | ||
542 | |||
543 | #define STA_FLG_TX_RATE_MSK cpu_to_le32(1 << 2) | ||
544 | #define STA_FLG_PWR_SAVE_MSK cpu_to_le32(1 << 8) | ||
545 | diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-int.h b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-int.h | ||
546 | index 2b6756e..5c29281 100644 | ||
547 | --- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-int.h | ||
548 | +++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-int.h | ||
549 | @@ -219,9 +219,7 @@ struct iwl_trans_pcie { | ||
550 | |||
551 | /* INT ICT Table */ | ||
552 | __le32 *ict_tbl; | ||
553 | - void *ict_tbl_vir; | ||
554 | dma_addr_t ict_tbl_dma; | ||
555 | - dma_addr_t aligned_ict_tbl_dma; | ||
556 | int ict_index; | ||
557 | u32 inta; | ||
558 | bool use_ict; | ||
559 | diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c | ||
560 | index 374c68c..1920237 100644 | ||
561 | --- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c | ||
562 | +++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c | ||
563 | @@ -1136,7 +1136,11 @@ void iwl_irq_tasklet(struct iwl_trans *trans) | ||
564 | * ICT functions | ||
565 | * | ||
566 | ******************************************************************************/ | ||
567 | -#define ICT_COUNT (PAGE_SIZE/sizeof(u32)) | ||
568 | + | ||
569 | +/* a device (PCI-E) page is 4096 bytes long */ | ||
570 | +#define ICT_SHIFT 12 | ||
571 | +#define ICT_SIZE (1 << ICT_SHIFT) | ||
572 | +#define ICT_COUNT (ICT_SIZE / sizeof(u32)) | ||
573 | |||
574 | /* Free dram table */ | ||
575 | void iwl_free_isr_ict(struct iwl_trans *trans) | ||
576 | @@ -1144,21 +1148,19 @@ void iwl_free_isr_ict(struct iwl_trans *trans) | ||
577 | struct iwl_trans_pcie *trans_pcie = | ||
578 | IWL_TRANS_GET_PCIE_TRANS(trans); | ||
579 | |||
580 | - if (trans_pcie->ict_tbl_vir) { | ||
581 | - dma_free_coherent(bus(trans)->dev, | ||
582 | - (sizeof(u32) * ICT_COUNT) + PAGE_SIZE, | ||
583 | - trans_pcie->ict_tbl_vir, | ||
584 | + if (trans_pcie->ict_tbl) { | ||
585 | + dma_free_coherent(bus(trans)->dev, ICT_SIZE, | ||
586 | + trans_pcie->ict_tbl, | ||
587 | trans_pcie->ict_tbl_dma); | ||
588 | - trans_pcie->ict_tbl_vir = NULL; | ||
589 | - memset(&trans_pcie->ict_tbl_dma, 0, | ||
590 | - sizeof(trans_pcie->ict_tbl_dma)); | ||
591 | - memset(&trans_pcie->aligned_ict_tbl_dma, 0, | ||
592 | - sizeof(trans_pcie->aligned_ict_tbl_dma)); | ||
593 | + trans_pcie->ict_tbl = NULL; | ||
594 | + trans_pcie->ict_tbl_dma = 0; | ||
595 | } | ||
596 | } | ||
597 | |||
598 | |||
599 | -/* allocate dram shared table it is a PAGE_SIZE aligned | ||
600 | +/* | ||
601 | + * allocate dram shared table, it is an aligned memory | ||
602 | + * block of ICT_SIZE. | ||
603 | * also reset all data related to ICT table interrupt. | ||
604 | */ | ||
605 | int iwl_alloc_isr_ict(struct iwl_trans *trans) | ||
606 | @@ -1166,36 +1168,26 @@ int iwl_alloc_isr_ict(struct iwl_trans *trans) | ||
607 | struct iwl_trans_pcie *trans_pcie = | ||
608 | IWL_TRANS_GET_PCIE_TRANS(trans); | ||
609 | |||
610 | - /* allocate shrared data table */ | ||
611 | - trans_pcie->ict_tbl_vir = | ||
612 | - dma_alloc_coherent(bus(trans)->dev, | ||
613 | - (sizeof(u32) * ICT_COUNT) + PAGE_SIZE, | ||
614 | - &trans_pcie->ict_tbl_dma, GFP_KERNEL); | ||
615 | - if (!trans_pcie->ict_tbl_vir) | ||
616 | + trans_pcie->ict_tbl = | ||
617 | + dma_alloc_coherent(bus(trans)->dev, ICT_SIZE, | ||
618 | + &trans_pcie->ict_tbl_dma, | ||
619 | + GFP_KERNEL); | ||
620 | + if (!trans_pcie->ict_tbl) | ||
621 | return -ENOMEM; | ||
622 | |||
623 | - /* align table to PAGE_SIZE boundary */ | ||
624 | - trans_pcie->aligned_ict_tbl_dma = | ||
625 | - ALIGN(trans_pcie->ict_tbl_dma, PAGE_SIZE); | ||
626 | - | ||
627 | - IWL_DEBUG_ISR(trans, "ict dma addr %Lx dma aligned %Lx diff %d\n", | ||
628 | - (unsigned long long)trans_pcie->ict_tbl_dma, | ||
629 | - (unsigned long long)trans_pcie->aligned_ict_tbl_dma, | ||
630 | - (int)(trans_pcie->aligned_ict_tbl_dma - | ||
631 | - trans_pcie->ict_tbl_dma)); | ||
632 | + /* just an API sanity check ... it is guaranteed to be aligned */ | ||
633 | + if (WARN_ON(trans_pcie->ict_tbl_dma & (ICT_SIZE - 1))) { | ||
634 | + iwl_free_isr_ict(trans); | ||
635 | + return -EINVAL; | ||
636 | + } | ||
637 | |||
638 | - trans_pcie->ict_tbl = trans_pcie->ict_tbl_vir + | ||
639 | - (trans_pcie->aligned_ict_tbl_dma - | ||
640 | - trans_pcie->ict_tbl_dma); | ||
641 | + IWL_DEBUG_ISR(trans, "ict dma addr %Lx\n", | ||
642 | + (unsigned long long)trans_pcie->ict_tbl_dma); | ||
643 | |||
644 | - IWL_DEBUG_ISR(trans, "ict vir addr %p vir aligned %p diff %d\n", | ||
645 | - trans_pcie->ict_tbl, trans_pcie->ict_tbl_vir, | ||
646 | - (int)(trans_pcie->aligned_ict_tbl_dma - | ||
647 | - trans_pcie->ict_tbl_dma)); | ||
648 | + IWL_DEBUG_ISR(trans, "ict vir addr %p\n", trans_pcie->ict_tbl); | ||
649 | |||
650 | /* reset table and index to all 0 */ | ||
651 | - memset(trans_pcie->ict_tbl_vir, 0, | ||
652 | - (sizeof(u32) * ICT_COUNT) + PAGE_SIZE); | ||
653 | + memset(trans_pcie->ict_tbl, 0, ICT_SIZE); | ||
654 | trans_pcie->ict_index = 0; | ||
655 | |||
656 | /* add periodic RX interrupt */ | ||
657 | @@ -1213,23 +1205,20 @@ int iwl_reset_ict(struct iwl_trans *trans) | ||
658 | struct iwl_trans_pcie *trans_pcie = | ||
659 | IWL_TRANS_GET_PCIE_TRANS(trans); | ||
660 | |||
661 | - if (!trans_pcie->ict_tbl_vir) | ||
662 | + if (!trans_pcie->ict_tbl) | ||
663 | return 0; | ||
664 | |||
665 | spin_lock_irqsave(&trans->shrd->lock, flags); | ||
666 | iwl_disable_interrupts(trans); | ||
667 | |||
668 | - memset(&trans_pcie->ict_tbl[0], 0, sizeof(u32) * ICT_COUNT); | ||
669 | + memset(trans_pcie->ict_tbl, 0, ICT_SIZE); | ||
670 | |||
671 | - val = trans_pcie->aligned_ict_tbl_dma >> PAGE_SHIFT; | ||
672 | + val = trans_pcie->ict_tbl_dma >> ICT_SHIFT; | ||
673 | |||
674 | val |= CSR_DRAM_INT_TBL_ENABLE; | ||
675 | val |= CSR_DRAM_INIT_TBL_WRAP_CHECK; | ||
676 | |||
677 | - IWL_DEBUG_ISR(trans, "CSR_DRAM_INT_TBL_REG =0x%X " | ||
678 | - "aligned dma address %Lx\n", | ||
679 | - val, | ||
680 | - (unsigned long long)trans_pcie->aligned_ict_tbl_dma); | ||
681 | + IWL_DEBUG_ISR(trans, "CSR_DRAM_INT_TBL_REG =0x%x\n", val); | ||
682 | |||
683 | iwl_write32(bus(trans), CSR_DRAM_INT_TBL_REG, val); | ||
684 | trans_pcie->use_ict = true; | ||
685 | diff --git a/drivers/net/wireless/libertas/cfg.c b/drivers/net/wireless/libertas/cfg.c | ||
686 | index a7f1ab2..db64ef1 100644 | ||
687 | --- a/drivers/net/wireless/libertas/cfg.c | ||
688 | +++ b/drivers/net/wireless/libertas/cfg.c | ||
689 | @@ -728,9 +728,11 @@ static void lbs_scan_worker(struct work_struct *work) | ||
690 | le16_to_cpu(scan_cmd->hdr.size), | ||
691 | lbs_ret_scan, 0); | ||
692 | |||
693 | - if (priv->scan_channel >= priv->scan_req->n_channels) | ||
694 | + if (priv->scan_channel >= priv->scan_req->n_channels) { | ||
695 | /* Mark scan done */ | ||
696 | + cancel_delayed_work(&priv->scan_work); | ||
697 | lbs_scan_done(priv); | ||
698 | + } | ||
699 | |||
700 | /* Restart network */ | ||
701 | if (carrier) | ||
702 | @@ -759,12 +761,12 @@ static void _internal_start_scan(struct lbs_private *priv, bool internal, | ||
703 | request->n_ssids, request->n_channels, request->ie_len); | ||
704 | |||
705 | priv->scan_channel = 0; | ||
706 | - queue_delayed_work(priv->work_thread, &priv->scan_work, | ||
707 | - msecs_to_jiffies(50)); | ||
708 | - | ||
709 | priv->scan_req = request; | ||
710 | priv->internal_scan = internal; | ||
711 | |||
712 | + queue_delayed_work(priv->work_thread, &priv->scan_work, | ||
713 | + msecs_to_jiffies(50)); | ||
714 | + | ||
715 | lbs_deb_leave(LBS_DEB_CFG80211); | ||
716 | } | ||
717 | |||
718 | diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c | ||
719 | index 3778763..3265b34 100644 | ||
720 | --- a/drivers/net/wireless/rt2x00/rt2800usb.c | ||
721 | +++ b/drivers/net/wireless/rt2x00/rt2800usb.c | ||
722 | @@ -976,6 +976,7 @@ static struct usb_device_id rt2800usb_device_table[] = { | ||
723 | { USB_DEVICE(0x13b1, 0x0031) }, | ||
724 | { USB_DEVICE(0x1737, 0x0070) }, | ||
725 | { USB_DEVICE(0x1737, 0x0071) }, | ||
726 | + { USB_DEVICE(0x1737, 0x0077) }, | ||
727 | /* Logitec */ | ||
728 | { USB_DEVICE(0x0789, 0x0162) }, | ||
729 | { USB_DEVICE(0x0789, 0x0163) }, | ||
730 | @@ -1171,7 +1172,6 @@ static struct usb_device_id rt2800usb_device_table[] = { | ||
731 | { USB_DEVICE(0x1740, 0x0605) }, | ||
732 | { USB_DEVICE(0x1740, 0x0615) }, | ||
733 | /* Linksys */ | ||
734 | - { USB_DEVICE(0x1737, 0x0077) }, | ||
735 | { USB_DEVICE(0x1737, 0x0078) }, | ||
736 | /* Logitec */ | ||
737 | { USB_DEVICE(0x0789, 0x0168) }, | ||
738 | diff --git a/drivers/net/wireless/wl12xx/boot.c b/drivers/net/wireless/wl12xx/boot.c | ||
739 | index 6813379..a7b327d 100644 | ||
740 | --- a/drivers/net/wireless/wl12xx/boot.c | ||
741 | +++ b/drivers/net/wireless/wl12xx/boot.c | ||
742 | @@ -347,6 +347,9 @@ static int wl1271_boot_upload_nvs(struct wl1271 *wl) | ||
743 | nvs_ptr += 3; | ||
744 | |||
745 | for (i = 0; i < burst_len; i++) { | ||
746 | + if (nvs_ptr + 3 >= (u8 *) wl->nvs + nvs_len) | ||
747 | + goto out_badnvs; | ||
748 | + | ||
749 | val = (nvs_ptr[0] | (nvs_ptr[1] << 8) | ||
750 | | (nvs_ptr[2] << 16) | (nvs_ptr[3] << 24)); | ||
751 | |||
752 | @@ -358,6 +361,9 @@ static int wl1271_boot_upload_nvs(struct wl1271 *wl) | ||
753 | nvs_ptr += 4; | ||
754 | dest_addr += 4; | ||
755 | } | ||
756 | + | ||
757 | + if (nvs_ptr >= (u8 *) wl->nvs + nvs_len) | ||
758 | + goto out_badnvs; | ||
759 | } | ||
760 | |||
761 | /* | ||
762 | @@ -369,6 +375,10 @@ static int wl1271_boot_upload_nvs(struct wl1271 *wl) | ||
763 | */ | ||
764 | nvs_ptr = (u8 *)wl->nvs + | ||
765 | ALIGN(nvs_ptr - (u8 *)wl->nvs + 7, 4); | ||
766 | + | ||
767 | + if (nvs_ptr >= (u8 *) wl->nvs + nvs_len) | ||
768 | + goto out_badnvs; | ||
769 | + | ||
770 | nvs_len -= nvs_ptr - (u8 *)wl->nvs; | ||
771 | |||
772 | /* Now we must set the partition correctly */ | ||
773 | @@ -384,6 +394,10 @@ static int wl1271_boot_upload_nvs(struct wl1271 *wl) | ||
774 | |||
775 | kfree(nvs_aligned); | ||
776 | return 0; | ||
777 | + | ||
778 | +out_badnvs: | ||
779 | + wl1271_error("nvs data is malformed"); | ||
780 | + return -EILSEQ; | ||
781 | } | ||
782 | |||
783 | static void wl1271_boot_enable_interrupts(struct wl1271 *wl) | ||
784 | diff --git a/drivers/net/wireless/wl12xx/cmd.c b/drivers/net/wireless/wl12xx/cmd.c | ||
785 | index a52299e..54a0d66 100644 | ||
786 | --- a/drivers/net/wireless/wl12xx/cmd.c | ||
787 | +++ b/drivers/net/wireless/wl12xx/cmd.c | ||
788 | @@ -120,6 +120,11 @@ int wl1271_cmd_general_parms(struct wl1271 *wl) | ||
789 | if (!wl->nvs) | ||
790 | return -ENODEV; | ||
791 | |||
792 | + if (gp->tx_bip_fem_manufacturer >= WL1271_INI_FEM_MODULE_COUNT) { | ||
793 | + wl1271_warning("FEM index from INI out of bounds"); | ||
794 | + return -EINVAL; | ||
795 | + } | ||
796 | + | ||
797 | gen_parms = kzalloc(sizeof(*gen_parms), GFP_KERNEL); | ||
798 | if (!gen_parms) | ||
799 | return -ENOMEM; | ||
800 | @@ -143,6 +148,12 @@ int wl1271_cmd_general_parms(struct wl1271 *wl) | ||
801 | gp->tx_bip_fem_manufacturer = | ||
802 | gen_parms->general_params.tx_bip_fem_manufacturer; | ||
803 | |||
804 | + if (gp->tx_bip_fem_manufacturer >= WL1271_INI_FEM_MODULE_COUNT) { | ||
805 | + wl1271_warning("FEM index from FW out of bounds"); | ||
806 | + ret = -EINVAL; | ||
807 | + goto out; | ||
808 | + } | ||
809 | + | ||
810 | wl1271_debug(DEBUG_CMD, "FEM autodetect: %s, manufacturer: %d\n", | ||
811 | answer ? "auto" : "manual", gp->tx_bip_fem_manufacturer); | ||
812 | |||
813 | @@ -162,6 +173,11 @@ int wl128x_cmd_general_parms(struct wl1271 *wl) | ||
814 | if (!wl->nvs) | ||
815 | return -ENODEV; | ||
816 | |||
817 | + if (gp->tx_bip_fem_manufacturer >= WL1271_INI_FEM_MODULE_COUNT) { | ||
818 | + wl1271_warning("FEM index from ini out of bounds"); | ||
819 | + return -EINVAL; | ||
820 | + } | ||
821 | + | ||
822 | gen_parms = kzalloc(sizeof(*gen_parms), GFP_KERNEL); | ||
823 | if (!gen_parms) | ||
824 | return -ENOMEM; | ||
825 | @@ -186,6 +202,12 @@ int wl128x_cmd_general_parms(struct wl1271 *wl) | ||
826 | gp->tx_bip_fem_manufacturer = | ||
827 | gen_parms->general_params.tx_bip_fem_manufacturer; | ||
828 | |||
829 | + if (gp->tx_bip_fem_manufacturer >= WL1271_INI_FEM_MODULE_COUNT) { | ||
830 | + wl1271_warning("FEM index from FW out of bounds"); | ||
831 | + ret = -EINVAL; | ||
832 | + goto out; | ||
833 | + } | ||
834 | + | ||
835 | wl1271_debug(DEBUG_CMD, "FEM autodetect: %s, manufacturer: %d\n", | ||
836 | answer ? "auto" : "manual", gp->tx_bip_fem_manufacturer); | ||
837 | |||
838 | diff --git a/drivers/net/wireless/wl12xx/testmode.c b/drivers/net/wireless/wl12xx/testmode.c | ||
839 | index 4ae8eff..abfb120 100644 | ||
840 | --- a/drivers/net/wireless/wl12xx/testmode.c | ||
841 | +++ b/drivers/net/wireless/wl12xx/testmode.c | ||
842 | @@ -36,6 +36,7 @@ enum wl1271_tm_commands { | ||
843 | WL1271_TM_CMD_TEST, | ||
844 | WL1271_TM_CMD_INTERROGATE, | ||
845 | WL1271_TM_CMD_CONFIGURE, | ||
846 | + WL1271_TM_CMD_NVS_PUSH, /* Not in use. Keep to not break ABI */ | ||
847 | WL1271_TM_CMD_SET_PLT_MODE, | ||
848 | WL1271_TM_CMD_RECOVER, | ||
849 | |||
850 | diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c | ||
851 | index 4c823f3..90c8e3a 100644 | ||
852 | --- a/drivers/tty/serial/atmel_serial.c | ||
853 | +++ b/drivers/tty/serial/atmel_serial.c | ||
854 | @@ -212,8 +212,9 @@ void atmel_config_rs485(struct uart_port *port, struct serial_rs485 *rs485conf) | ||
855 | { | ||
856 | struct atmel_uart_port *atmel_port = to_atmel_uart_port(port); | ||
857 | unsigned int mode; | ||
858 | + unsigned long flags; | ||
859 | |||
860 | - spin_lock(&port->lock); | ||
861 | + spin_lock_irqsave(&port->lock, flags); | ||
862 | |||
863 | /* Disable interrupts */ | ||
864 | UART_PUT_IDR(port, atmel_port->tx_done_mask); | ||
865 | @@ -244,7 +245,7 @@ void atmel_config_rs485(struct uart_port *port, struct serial_rs485 *rs485conf) | ||
866 | /* Enable interrupts */ | ||
867 | UART_PUT_IER(port, atmel_port->tx_done_mask); | ||
868 | |||
869 | - spin_unlock(&port->lock); | ||
870 | + spin_unlock_irqrestore(&port->lock, flags); | ||
871 | |||
872 | } | ||
873 | |||
874 | diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c | ||
875 | index a8078d0..e61d9c4 100644 | ||
876 | --- a/drivers/usb/class/cdc-acm.c | ||
877 | +++ b/drivers/usb/class/cdc-acm.c | ||
878 | @@ -554,10 +554,18 @@ static void acm_port_down(struct acm *acm) | ||
879 | |||
880 | static void acm_tty_hangup(struct tty_struct *tty) | ||
881 | { | ||
882 | - struct acm *acm = tty->driver_data; | ||
883 | - tty_port_hangup(&acm->port); | ||
884 | + struct acm *acm; | ||
885 | + | ||
886 | mutex_lock(&open_mutex); | ||
887 | + acm = tty->driver_data; | ||
888 | + | ||
889 | + if (!acm) | ||
890 | + goto out; | ||
891 | + | ||
892 | + tty_port_hangup(&acm->port); | ||
893 | acm_port_down(acm); | ||
894 | + | ||
895 | +out: | ||
896 | mutex_unlock(&open_mutex); | ||
897 | } | ||
898 | |||
899 | @@ -1183,6 +1191,8 @@ made_compressed_probe: | ||
900 | i = device_create_file(&intf->dev, &dev_attr_wCountryCodes); | ||
901 | if (i < 0) { | ||
902 | kfree(acm->country_codes); | ||
903 | + acm->country_codes = NULL; | ||
904 | + acm->country_code_size = 0; | ||
905 | goto skip_countries; | ||
906 | } | ||
907 | |||
908 | @@ -1191,6 +1201,8 @@ made_compressed_probe: | ||
909 | if (i < 0) { | ||
910 | device_remove_file(&intf->dev, &dev_attr_wCountryCodes); | ||
911 | kfree(acm->country_codes); | ||
912 | + acm->country_codes = NULL; | ||
913 | + acm->country_code_size = 0; | ||
914 | goto skip_countries; | ||
915 | } | ||
916 | } | ||
917 | diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c | ||
918 | index e3beaf2..7abf060 100644 | ||
919 | --- a/drivers/usb/core/devio.c | ||
920 | +++ b/drivers/usb/core/devio.c | ||
921 | @@ -249,7 +249,8 @@ static struct async *alloc_async(unsigned int numisoframes) | ||
922 | static void free_async(struct async *as) | ||
923 | { | ||
924 | put_pid(as->pid); | ||
925 | - put_cred(as->cred); | ||
926 | + if (as->cred) | ||
927 | + put_cred(as->cred); | ||
928 | kfree(as->urb->transfer_buffer); | ||
929 | kfree(as->urb->setup_packet); | ||
930 | usb_free_urb(as->urb); | ||
931 | diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c | ||
932 | index 13222d3..179e364 100644 | ||
933 | --- a/drivers/usb/core/hcd.c | ||
934 | +++ b/drivers/usb/core/hcd.c | ||
935 | @@ -1412,11 +1412,10 @@ int usb_hcd_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb, | ||
936 | ret = -EAGAIN; | ||
937 | else | ||
938 | urb->transfer_flags |= URB_DMA_MAP_SG; | ||
939 | - if (n != urb->num_sgs) { | ||
940 | - urb->num_sgs = n; | ||
941 | + urb->num_mapped_sgs = n; | ||
942 | + if (n != urb->num_sgs) | ||
943 | urb->transfer_flags |= | ||
944 | URB_DMA_SG_COMBINED; | ||
945 | - } | ||
946 | } else if (urb->sg) { | ||
947 | struct scatterlist *sg = urb->sg; | ||
948 | urb->transfer_dma = dma_map_page( | ||
949 | diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c | ||
950 | index ecf12e1..4c65eb6 100644 | ||
951 | --- a/drivers/usb/core/quirks.c | ||
952 | +++ b/drivers/usb/core/quirks.c | ||
953 | @@ -117,9 +117,12 @@ static const struct usb_device_id usb_quirk_list[] = { | ||
954 | { USB_DEVICE(0x06a3, 0x0006), .driver_info = | ||
955 | USB_QUIRK_CONFIG_INTF_STRINGS }, | ||
956 | |||
957 | - /* Guillemot Webcam Hercules Dualpix Exchange*/ | ||
958 | + /* Guillemot Webcam Hercules Dualpix Exchange (2nd ID) */ | ||
959 | { USB_DEVICE(0x06f8, 0x0804), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
960 | |||
961 | + /* Guillemot Webcam Hercules Dualpix Exchange*/ | ||
962 | + { USB_DEVICE(0x06f8, 0x3005), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
963 | + | ||
964 | /* M-Systems Flash Disk Pioneers */ | ||
965 | { USB_DEVICE(0x08ec, 0x1000), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
966 | |||
967 | diff --git a/drivers/usb/host/ehci-pxa168.c b/drivers/usb/host/ehci-pxa168.c | ||
968 | index ac0c16e..8d0e7a2 100644 | ||
969 | --- a/drivers/usb/host/ehci-pxa168.c | ||
970 | +++ b/drivers/usb/host/ehci-pxa168.c | ||
971 | @@ -299,7 +299,7 @@ static int __devinit ehci_pxa168_drv_probe(struct platform_device *pdev) | ||
972 | ehci = hcd_to_ehci(hcd); | ||
973 | ehci->caps = hcd->regs + 0x100; | ||
974 | ehci->regs = hcd->regs + 0x100 + | ||
975 | - HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | ||
976 | + HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); | ||
977 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); | ||
978 | hcd->has_tt = 1; | ||
979 | ehci->sbrn = 0x20; | ||
980 | diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c | ||
981 | index 4e4066c..fef1db3 100644 | ||
982 | --- a/drivers/usb/host/ehci-q.c | ||
983 | +++ b/drivers/usb/host/ehci-q.c | ||
984 | @@ -647,7 +647,7 @@ qh_urb_transaction ( | ||
985 | /* | ||
986 | * data transfer stage: buffer setup | ||
987 | */ | ||
988 | - i = urb->num_sgs; | ||
989 | + i = urb->num_mapped_sgs; | ||
990 | if (len > 0 && i > 0) { | ||
991 | sg = urb->sg; | ||
992 | buf = sg_dma_address(sg); | ||
993 | diff --git a/drivers/usb/host/uhci-q.c b/drivers/usb/host/uhci-q.c | ||
994 | index f6ca80e..d2c6f5a 100644 | ||
995 | --- a/drivers/usb/host/uhci-q.c | ||
996 | +++ b/drivers/usb/host/uhci-q.c | ||
997 | @@ -943,7 +943,7 @@ static int uhci_submit_common(struct uhci_hcd *uhci, struct urb *urb, | ||
998 | if (usb_pipein(urb->pipe)) | ||
999 | status |= TD_CTRL_SPD; | ||
1000 | |||
1001 | - i = urb->num_sgs; | ||
1002 | + i = urb->num_mapped_sgs; | ||
1003 | if (len > 0 && i > 0) { | ||
1004 | sg = urb->sg; | ||
1005 | data = sg_dma_address(sg); | ||
1006 | diff --git a/drivers/usb/host/whci/qset.c b/drivers/usb/host/whci/qset.c | ||
1007 | index a403b53..76083ae 100644 | ||
1008 | --- a/drivers/usb/host/whci/qset.c | ||
1009 | +++ b/drivers/usb/host/whci/qset.c | ||
1010 | @@ -443,7 +443,7 @@ static int qset_add_urb_sg(struct whc *whc, struct whc_qset *qset, struct urb *u | ||
1011 | |||
1012 | remaining = urb->transfer_buffer_length; | ||
1013 | |||
1014 | - for_each_sg(urb->sg, sg, urb->num_sgs, i) { | ||
1015 | + for_each_sg(urb->sg, sg, urb->num_mapped_sgs, i) { | ||
1016 | dma_addr_t dma_addr; | ||
1017 | size_t dma_remaining; | ||
1018 | dma_addr_t sp, ep; | ||
1019 | @@ -561,7 +561,7 @@ static int qset_add_urb_sg_linearize(struct whc *whc, struct whc_qset *qset, | ||
1020 | |||
1021 | remaining = urb->transfer_buffer_length; | ||
1022 | |||
1023 | - for_each_sg(urb->sg, sg, urb->num_sgs, i) { | ||
1024 | + for_each_sg(urb->sg, sg, urb->num_mapped_sgs, i) { | ||
1025 | size_t len; | ||
1026 | size_t sg_remaining; | ||
1027 | void *orig; | ||
1028 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c | ||
1029 | index 9f1d4b1..d28c586 100644 | ||
1030 | --- a/drivers/usb/host/xhci-ring.c | ||
1031 | +++ b/drivers/usb/host/xhci-ring.c | ||
1032 | @@ -2561,7 +2561,7 @@ static unsigned int count_sg_trbs_needed(struct xhci_hcd *xhci, struct urb *urb) | ||
1033 | struct scatterlist *sg; | ||
1034 | |||
1035 | sg = NULL; | ||
1036 | - num_sgs = urb->num_sgs; | ||
1037 | + num_sgs = urb->num_mapped_sgs; | ||
1038 | temp = urb->transfer_buffer_length; | ||
1039 | |||
1040 | xhci_dbg(xhci, "count sg list trbs: \n"); | ||
1041 | @@ -2745,7 +2745,7 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | ||
1042 | return -EINVAL; | ||
1043 | |||
1044 | num_trbs = count_sg_trbs_needed(xhci, urb); | ||
1045 | - num_sgs = urb->num_sgs; | ||
1046 | + num_sgs = urb->num_mapped_sgs; | ||
1047 | total_packet_count = roundup(urb->transfer_buffer_length, | ||
1048 | usb_endpoint_maxp(&urb->ep->desc)); | ||
1049 | |||
1050 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c | ||
1051 | index a1afb7c..b33f059 100644 | ||
1052 | --- a/drivers/usb/host/xhci.c | ||
1053 | +++ b/drivers/usb/host/xhci.c | ||
1054 | @@ -1620,6 +1620,7 @@ static int xhci_configure_endpoint_result(struct xhci_hcd *xhci, | ||
1055 | /* FIXME: can we allocate more resources for the HC? */ | ||
1056 | break; | ||
1057 | case COMP_BW_ERR: | ||
1058 | + case COMP_2ND_BW_ERR: | ||
1059 | dev_warn(&udev->dev, "Not enough bandwidth " | ||
1060 | "for new device state.\n"); | ||
1061 | ret = -ENOSPC; | ||
1062 | @@ -2796,8 +2797,7 @@ static int xhci_calculate_streams_and_bitmask(struct xhci_hcd *xhci, | ||
1063 | if (ret < 0) | ||
1064 | return ret; | ||
1065 | |||
1066 | - max_streams = USB_SS_MAX_STREAMS( | ||
1067 | - eps[i]->ss_ep_comp.bmAttributes); | ||
1068 | + max_streams = usb_ss_max_streams(&eps[i]->ss_ep_comp); | ||
1069 | if (max_streams < (*num_streams - 1)) { | ||
1070 | xhci_dbg(xhci, "Ep 0x%x only supports %u stream IDs.\n", | ||
1071 | eps[i]->desc.bEndpointAddress, | ||
1072 | diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h | ||
1073 | index 3c8fbd2..09eda3a 100644 | ||
1074 | --- a/drivers/usb/host/xhci.h | ||
1075 | +++ b/drivers/usb/host/xhci.h | ||
1076 | @@ -1033,7 +1033,6 @@ struct xhci_transfer_event { | ||
1077 | /* Invalid Stream ID Error */ | ||
1078 | #define COMP_STRID_ERR 34 | ||
1079 | /* Secondary Bandwidth Error - may be returned by a Configure Endpoint cmd */ | ||
1080 | -/* FIXME - check for this */ | ||
1081 | #define COMP_2ND_BW_ERR 35 | ||
1082 | /* Split Transaction Error */ | ||
1083 | #define COMP_SPLIT_ERR 36 | ||
1084 | diff --git a/drivers/usb/misc/isight_firmware.c b/drivers/usb/misc/isight_firmware.c | ||
1085 | index fe1d443..8f725f6 100644 | ||
1086 | --- a/drivers/usb/misc/isight_firmware.c | ||
1087 | +++ b/drivers/usb/misc/isight_firmware.c | ||
1088 | @@ -55,8 +55,9 @@ static int isight_firmware_load(struct usb_interface *intf, | ||
1089 | |||
1090 | ptr = firmware->data; | ||
1091 | |||
1092 | + buf[0] = 0x01; | ||
1093 | if (usb_control_msg | ||
1094 | - (dev, usb_sndctrlpipe(dev, 0), 0xa0, 0x40, 0xe600, 0, "\1", 1, | ||
1095 | + (dev, usb_sndctrlpipe(dev, 0), 0xa0, 0x40, 0xe600, 0, buf, 1, | ||
1096 | 300) != 1) { | ||
1097 | printk(KERN_ERR | ||
1098 | "Failed to initialise isight firmware loader\n"); | ||
1099 | @@ -100,8 +101,9 @@ static int isight_firmware_load(struct usb_interface *intf, | ||
1100 | } | ||
1101 | } | ||
1102 | |||
1103 | + buf[0] = 0x00; | ||
1104 | if (usb_control_msg | ||
1105 | - (dev, usb_sndctrlpipe(dev, 0), 0xa0, 0x40, 0xe600, 0, "\0", 1, | ||
1106 | + (dev, usb_sndctrlpipe(dev, 0), 0xa0, 0x40, 0xe600, 0, buf, 1, | ||
1107 | 300) != 1) { | ||
1108 | printk(KERN_ERR "isight firmware loading completion failed\n"); | ||
1109 | ret = -ENODEV; | ||
1110 | diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c | ||
1111 | index b63ab15..920f04e 100644 | ||
1112 | --- a/drivers/usb/musb/musb_core.c | ||
1113 | +++ b/drivers/usb/musb/musb_core.c | ||
1114 | @@ -2012,8 +2012,6 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) | ||
1115 | if (status < 0) | ||
1116 | goto fail3; | ||
1117 | |||
1118 | - pm_runtime_put(musb->controller); | ||
1119 | - | ||
1120 | status = musb_init_debugfs(musb); | ||
1121 | if (status < 0) | ||
1122 | goto fail4; | ||
1123 | diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c | ||
1124 | index fd67cc5..a1a324b 100644 | ||
1125 | --- a/drivers/usb/serial/cp210x.c | ||
1126 | +++ b/drivers/usb/serial/cp210x.c | ||
1127 | @@ -92,6 +92,7 @@ static const struct usb_device_id id_table[] = { | ||
1128 | { USB_DEVICE(0x10C4, 0x818B) }, /* AVIT Research USB to TTL */ | ||
1129 | { USB_DEVICE(0x10C4, 0x819F) }, /* MJS USB Toslink Switcher */ | ||
1130 | { USB_DEVICE(0x10C4, 0x81A6) }, /* ThinkOptics WavIt */ | ||
1131 | + { USB_DEVICE(0x10C4, 0x81A9) }, /* Multiplex RC Interface */ | ||
1132 | { USB_DEVICE(0x10C4, 0x81AC) }, /* MSD Dash Hawk */ | ||
1133 | { USB_DEVICE(0x10C4, 0x81AD) }, /* INSYS USB Modem */ | ||
1134 | { USB_DEVICE(0x10C4, 0x81C8) }, /* Lipowsky Industrie Elektronik GmbH, Baby-JTAG */ | ||
1135 | diff --git a/drivers/usb/serial/omninet.c b/drivers/usb/serial/omninet.c | ||
1136 | index 60f38d5..0a8c1e6 100644 | ||
1137 | --- a/drivers/usb/serial/omninet.c | ||
1138 | +++ b/drivers/usb/serial/omninet.c | ||
1139 | @@ -315,7 +315,7 @@ static int omninet_write_room(struct tty_struct *tty) | ||
1140 | int room = 0; /* Default: no room */ | ||
1141 | |||
1142 | /* FIXME: no consistent locking for write_urb_busy */ | ||
1143 | - if (wport->write_urb_busy) | ||
1144 | + if (!wport->write_urb_busy) | ||
1145 | room = wport->bulk_out_size - OMNINET_HEADERLEN; | ||
1146 | |||
1147 | dbg("%s - returns %d", __func__, room); | ||
1148 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
1149 | index 6dd6453..c96b6b6 100644 | ||
1150 | --- a/drivers/usb/serial/option.c | ||
1151 | +++ b/drivers/usb/serial/option.c | ||
1152 | @@ -476,6 +476,10 @@ static void option_instat_callback(struct urb *urb); | ||
1153 | #define VIETTEL_VENDOR_ID 0x2262 | ||
1154 | #define VIETTEL_PRODUCT_VT1000 0x0002 | ||
1155 | |||
1156 | +/* ZD Incorporated */ | ||
1157 | +#define ZD_VENDOR_ID 0x0685 | ||
1158 | +#define ZD_PRODUCT_7000 0x7000 | ||
1159 | + | ||
1160 | /* some devices interfaces need special handling due to a number of reasons */ | ||
1161 | enum option_blacklist_reason { | ||
1162 | OPTION_BLACKLIST_NONE = 0, | ||
1163 | @@ -1178,6 +1182,7 @@ static const struct usb_device_id option_ids[] = { | ||
1164 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLU528) }, | ||
1165 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLU526) }, | ||
1166 | { USB_DEVICE_AND_INTERFACE_INFO(VIETTEL_VENDOR_ID, VIETTEL_PRODUCT_VT1000, 0xff, 0xff, 0xff) }, | ||
1167 | + { USB_DEVICE_AND_INTERFACE_INFO(ZD_VENDOR_ID, ZD_PRODUCT_7000, 0xff, 0xff, 0xff) }, | ||
1168 | { } /* Terminating entry */ | ||
1169 | }; | ||
1170 | MODULE_DEVICE_TABLE(usb, option_ids); | ||
1171 | diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c | ||
1172 | index c325e69..9e069ef 100644 | ||
1173 | --- a/drivers/usb/storage/usb.c | ||
1174 | +++ b/drivers/usb/storage/usb.c | ||
1175 | @@ -1073,6 +1073,7 @@ static struct usb_driver usb_storage_driver = { | ||
1176 | .id_table = usb_storage_usb_ids, | ||
1177 | .supports_autosuspend = 1, | ||
1178 | .soft_unbind = 1, | ||
1179 | + .no_dynamic_id = 1, | ||
1180 | }; | ||
1181 | |||
1182 | static int __init usb_stor_init(void) | ||
1183 | diff --git a/drivers/video/offb.c b/drivers/video/offb.c | ||
1184 | index cb163a5..3251a02 100644 | ||
1185 | --- a/drivers/video/offb.c | ||
1186 | +++ b/drivers/video/offb.c | ||
1187 | @@ -100,36 +100,32 @@ static int offb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, | ||
1188 | u_int transp, struct fb_info *info) | ||
1189 | { | ||
1190 | struct offb_par *par = (struct offb_par *) info->par; | ||
1191 | - int i, depth; | ||
1192 | - u32 *pal = info->pseudo_palette; | ||
1193 | - | ||
1194 | - depth = info->var.bits_per_pixel; | ||
1195 | - if (depth == 16) | ||
1196 | - depth = (info->var.green.length == 5) ? 15 : 16; | ||
1197 | - | ||
1198 | - if (regno > 255 || | ||
1199 | - (depth == 16 && regno > 63) || | ||
1200 | - (depth == 15 && regno > 31)) | ||
1201 | - return 1; | ||
1202 | - | ||
1203 | - if (regno < 16) { | ||
1204 | - switch (depth) { | ||
1205 | - case 15: | ||
1206 | - pal[regno] = (regno << 10) | (regno << 5) | regno; | ||
1207 | - break; | ||
1208 | - case 16: | ||
1209 | - pal[regno] = (regno << 11) | (regno << 5) | regno; | ||
1210 | - break; | ||
1211 | - case 24: | ||
1212 | - pal[regno] = (regno << 16) | (regno << 8) | regno; | ||
1213 | - break; | ||
1214 | - case 32: | ||
1215 | - i = (regno << 8) | regno; | ||
1216 | - pal[regno] = (i << 16) | i; | ||
1217 | - break; | ||
1218 | + | ||
1219 | + if (info->fix.visual == FB_VISUAL_TRUECOLOR) { | ||
1220 | + u32 *pal = info->pseudo_palette; | ||
1221 | + u32 cr = red >> (16 - info->var.red.length); | ||
1222 | + u32 cg = green >> (16 - info->var.green.length); | ||
1223 | + u32 cb = blue >> (16 - info->var.blue.length); | ||
1224 | + u32 value; | ||
1225 | + | ||
1226 | + if (regno >= 16) | ||
1227 | + return -EINVAL; | ||
1228 | + | ||
1229 | + value = (cr << info->var.red.offset) | | ||
1230 | + (cg << info->var.green.offset) | | ||
1231 | + (cb << info->var.blue.offset); | ||
1232 | + if (info->var.transp.length > 0) { | ||
1233 | + u32 mask = (1 << info->var.transp.length) - 1; | ||
1234 | + mask <<= info->var.transp.offset; | ||
1235 | + value |= mask; | ||
1236 | } | ||
1237 | + pal[regno] = value; | ||
1238 | + return 0; | ||
1239 | } | ||
1240 | |||
1241 | + if (regno > 255) | ||
1242 | + return -EINVAL; | ||
1243 | + | ||
1244 | red >>= 8; | ||
1245 | green >>= 8; | ||
1246 | blue >>= 8; | ||
1247 | @@ -381,7 +377,7 @@ static void __init offb_init_fb(const char *name, const char *full_name, | ||
1248 | int pitch, unsigned long address, | ||
1249 | int foreign_endian, struct device_node *dp) | ||
1250 | { | ||
1251 | - unsigned long res_size = pitch * height * (depth + 7) / 8; | ||
1252 | + unsigned long res_size = pitch * height; | ||
1253 | struct offb_par *par = &default_par; | ||
1254 | unsigned long res_start = address; | ||
1255 | struct fb_fix_screeninfo *fix; | ||
1256 | diff --git a/fs/Kconfig b/fs/Kconfig | ||
1257 | index 5f4c45d..6ad58a5 100644 | ||
1258 | --- a/fs/Kconfig | ||
1259 | +++ b/fs/Kconfig | ||
1260 | @@ -218,6 +218,8 @@ source "fs/exofs/Kconfig" | ||
1261 | |||
1262 | endif # MISC_FILESYSTEMS | ||
1263 | |||
1264 | +source "fs/exofs/Kconfig.ore" | ||
1265 | + | ||
1266 | menuconfig NETWORK_FILESYSTEMS | ||
1267 | bool "Network File Systems" | ||
1268 | default y | ||
1269 | diff --git a/fs/exofs/Kconfig b/fs/exofs/Kconfig | ||
1270 | index da42f32..86194b2 100644 | ||
1271 | --- a/fs/exofs/Kconfig | ||
1272 | +++ b/fs/exofs/Kconfig | ||
1273 | @@ -1,14 +1,3 @@ | ||
1274 | -# Note ORE needs to "select ASYNC_XOR". So Not to force multiple selects | ||
1275 | -# for every ORE user we do it like this. Any user should add itself here | ||
1276 | -# at the "depends on EXOFS_FS || ..." with an ||. The dependencies are | ||
1277 | -# selected here, and we default to "ON". So in effect it is like been | ||
1278 | -# selected by any of the users. | ||
1279 | -config ORE | ||
1280 | - tristate | ||
1281 | - depends on EXOFS_FS || PNFS_OBJLAYOUT | ||
1282 | - select ASYNC_XOR | ||
1283 | - default SCSI_OSD_ULD | ||
1284 | - | ||
1285 | config EXOFS_FS | ||
1286 | tristate "exofs: OSD based file system support" | ||
1287 | depends on SCSI_OSD_ULD | ||
1288 | diff --git a/fs/exofs/Kconfig.ore b/fs/exofs/Kconfig.ore | ||
1289 | new file mode 100644 | ||
1290 | index 0000000..1ca7fb7 | ||
1291 | --- /dev/null | ||
1292 | +++ b/fs/exofs/Kconfig.ore | ||
1293 | @@ -0,0 +1,12 @@ | ||
1294 | +# ORE - Objects Raid Engine (libore.ko) | ||
1295 | +# | ||
1296 | +# Note ORE needs to "select ASYNC_XOR". So Not to force multiple selects | ||
1297 | +# for every ORE user we do it like this. Any user should add itself here | ||
1298 | +# at the "depends on EXOFS_FS || ..." with an ||. The dependencies are | ||
1299 | +# selected here, and we default to "ON". So in effect it is like been | ||
1300 | +# selected by any of the users. | ||
1301 | +config ORE | ||
1302 | + tristate | ||
1303 | + depends on EXOFS_FS || PNFS_OBJLAYOUT | ||
1304 | + select ASYNC_XOR | ||
1305 | + default SCSI_OSD_ULD | ||
1306 | diff --git a/fs/exofs/ore.c b/fs/exofs/ore.c | ||
1307 | index d271ad8..49cf230 100644 | ||
1308 | --- a/fs/exofs/ore.c | ||
1309 | +++ b/fs/exofs/ore.c | ||
1310 | @@ -266,7 +266,7 @@ int ore_get_rw_state(struct ore_layout *layout, struct ore_components *oc, | ||
1311 | |||
1312 | /* first/last seg is split */ | ||
1313 | num_raid_units += layout->group_width; | ||
1314 | - sgs_per_dev = div_u64(num_raid_units, data_devs); | ||
1315 | + sgs_per_dev = div_u64(num_raid_units, data_devs) + 2; | ||
1316 | } else { | ||
1317 | /* For Writes add parity pages array. */ | ||
1318 | max_par_pages = num_raid_units * pages_in_unit * | ||
1319 | @@ -445,10 +445,10 @@ int ore_check_io(struct ore_io_state *ios, ore_on_dev_error on_dev_error) | ||
1320 | u64 residual = ios->reading ? | ||
1321 | or->in.residual : or->out.residual; | ||
1322 | u64 offset = (ios->offset + ios->length) - residual; | ||
1323 | - struct ore_dev *od = ios->oc->ods[ | ||
1324 | - per_dev->dev - ios->oc->first_dev]; | ||
1325 | + unsigned dev = per_dev->dev - ios->oc->first_dev; | ||
1326 | + struct ore_dev *od = ios->oc->ods[dev]; | ||
1327 | |||
1328 | - on_dev_error(ios, od, per_dev->dev, osi.osd_err_pri, | ||
1329 | + on_dev_error(ios, od, dev, osi.osd_err_pri, | ||
1330 | offset, residual); | ||
1331 | } | ||
1332 | if (osi.osd_err_pri >= acumulated_osd_err) { | ||
1333 | diff --git a/fs/exofs/ore_raid.c b/fs/exofs/ore_raid.c | ||
1334 | index 29c47e5..d222c77 100644 | ||
1335 | --- a/fs/exofs/ore_raid.c | ||
1336 | +++ b/fs/exofs/ore_raid.c | ||
1337 | @@ -328,8 +328,8 @@ static int _alloc_read_4_write(struct ore_io_state *ios) | ||
1338 | /* @si contains info of the to-be-inserted page. Update of @si should be | ||
1339 | * maintained by caller. Specificaly si->dev, si->obj_offset, ... | ||
1340 | */ | ||
1341 | -static int _add_to_read_4_write(struct ore_io_state *ios, | ||
1342 | - struct ore_striping_info *si, struct page *page) | ||
1343 | +static int _add_to_r4w(struct ore_io_state *ios, struct ore_striping_info *si, | ||
1344 | + struct page *page, unsigned pg_len) | ||
1345 | { | ||
1346 | struct request_queue *q; | ||
1347 | struct ore_per_dev_state *per_dev; | ||
1348 | @@ -366,17 +366,60 @@ static int _add_to_read_4_write(struct ore_io_state *ios, | ||
1349 | _ore_add_sg_seg(per_dev, gap, true); | ||
1350 | } | ||
1351 | q = osd_request_queue(ore_comp_dev(read_ios->oc, per_dev->dev)); | ||
1352 | - added_len = bio_add_pc_page(q, per_dev->bio, page, PAGE_SIZE, 0); | ||
1353 | - if (unlikely(added_len != PAGE_SIZE)) { | ||
1354 | + added_len = bio_add_pc_page(q, per_dev->bio, page, pg_len, | ||
1355 | + si->obj_offset % PAGE_SIZE); | ||
1356 | + if (unlikely(added_len != pg_len)) { | ||
1357 | ORE_DBGMSG("Failed to bio_add_pc_page bi_vcnt=%d\n", | ||
1358 | per_dev->bio->bi_vcnt); | ||
1359 | return -ENOMEM; | ||
1360 | } | ||
1361 | |||
1362 | - per_dev->length += PAGE_SIZE; | ||
1363 | + per_dev->length += pg_len; | ||
1364 | return 0; | ||
1365 | } | ||
1366 | |||
1367 | +/* read the beginning of an unaligned first page */ | ||
1368 | +static int _add_to_r4w_first_page(struct ore_io_state *ios, struct page *page) | ||
1369 | +{ | ||
1370 | + struct ore_striping_info si; | ||
1371 | + unsigned pg_len; | ||
1372 | + | ||
1373 | + ore_calc_stripe_info(ios->layout, ios->offset, 0, &si); | ||
1374 | + | ||
1375 | + pg_len = si.obj_offset % PAGE_SIZE; | ||
1376 | + si.obj_offset -= pg_len; | ||
1377 | + | ||
1378 | + ORE_DBGMSG("offset=0x%llx len=0x%x index=0x%lx dev=%x\n", | ||
1379 | + _LLU(si.obj_offset), pg_len, page->index, si.dev); | ||
1380 | + | ||
1381 | + return _add_to_r4w(ios, &si, page, pg_len); | ||
1382 | +} | ||
1383 | + | ||
1384 | +/* read the end of an incomplete last page */ | ||
1385 | +static int _add_to_r4w_last_page(struct ore_io_state *ios, u64 *offset) | ||
1386 | +{ | ||
1387 | + struct ore_striping_info si; | ||
1388 | + struct page *page; | ||
1389 | + unsigned pg_len, p, c; | ||
1390 | + | ||
1391 | + ore_calc_stripe_info(ios->layout, *offset, 0, &si); | ||
1392 | + | ||
1393 | + p = si.unit_off / PAGE_SIZE; | ||
1394 | + c = _dev_order(ios->layout->group_width * ios->layout->mirrors_p1, | ||
1395 | + ios->layout->mirrors_p1, si.par_dev, si.dev); | ||
1396 | + page = ios->sp2d->_1p_stripes[p].pages[c]; | ||
1397 | + | ||
1398 | + pg_len = PAGE_SIZE - (si.unit_off % PAGE_SIZE); | ||
1399 | + *offset += pg_len; | ||
1400 | + | ||
1401 | + ORE_DBGMSG("p=%d, c=%d next-offset=0x%llx len=0x%x dev=%x par_dev=%d\n", | ||
1402 | + p, c, _LLU(*offset), pg_len, si.dev, si.par_dev); | ||
1403 | + | ||
1404 | + BUG_ON(!page); | ||
1405 | + | ||
1406 | + return _add_to_r4w(ios, &si, page, pg_len); | ||
1407 | +} | ||
1408 | + | ||
1409 | static void _mark_read4write_pages_uptodate(struct ore_io_state *ios, int ret) | ||
1410 | { | ||
1411 | struct bio_vec *bv; | ||
1412 | @@ -444,9 +487,13 @@ static int _read_4_write(struct ore_io_state *ios) | ||
1413 | struct page **pp = &_1ps->pages[c]; | ||
1414 | bool uptodate; | ||
1415 | |||
1416 | - if (*pp) | ||
1417 | + if (*pp) { | ||
1418 | + if (ios->offset % PAGE_SIZE) | ||
1419 | + /* Read the remainder of the page */ | ||
1420 | + _add_to_r4w_first_page(ios, *pp); | ||
1421 | /* to-be-written pages start here */ | ||
1422 | goto read_last_stripe; | ||
1423 | + } | ||
1424 | |||
1425 | *pp = ios->r4w->get_page(ios->private, offset, | ||
1426 | &uptodate); | ||
1427 | @@ -454,7 +501,7 @@ static int _read_4_write(struct ore_io_state *ios) | ||
1428 | return -ENOMEM; | ||
1429 | |||
1430 | if (!uptodate) | ||
1431 | - _add_to_read_4_write(ios, &read_si, *pp); | ||
1432 | + _add_to_r4w(ios, &read_si, *pp, PAGE_SIZE); | ||
1433 | |||
1434 | /* Mark read-pages to be cache_released */ | ||
1435 | _1ps->page_is_read[c] = true; | ||
1436 | @@ -465,8 +512,11 @@ static int _read_4_write(struct ore_io_state *ios) | ||
1437 | } | ||
1438 | |||
1439 | read_last_stripe: | ||
1440 | - offset = ios->offset + (ios->length + PAGE_SIZE - 1) / | ||
1441 | - PAGE_SIZE * PAGE_SIZE; | ||
1442 | + offset = ios->offset + ios->length; | ||
1443 | + if (offset % PAGE_SIZE) | ||
1444 | + _add_to_r4w_last_page(ios, &offset); | ||
1445 | + /* offset will be aligned to next page */ | ||
1446 | + | ||
1447 | last_stripe_end = div_u64(offset + bytes_in_stripe - 1, bytes_in_stripe) | ||
1448 | * bytes_in_stripe; | ||
1449 | if (offset == last_stripe_end) /* Optimize for the aligned case */ | ||
1450 | @@ -503,7 +553,7 @@ read_last_stripe: | ||
1451 | /* Mark read-pages to be cache_released */ | ||
1452 | _1ps->page_is_read[c] = true; | ||
1453 | if (!uptodate) | ||
1454 | - _add_to_read_4_write(ios, &read_si, page); | ||
1455 | + _add_to_r4w(ios, &read_si, page, PAGE_SIZE); | ||
1456 | } | ||
1457 | |||
1458 | offset += PAGE_SIZE; | ||
1459 | @@ -551,7 +601,11 @@ int _ore_add_parity_unit(struct ore_io_state *ios, | ||
1460 | unsigned cur_len) | ||
1461 | { | ||
1462 | if (ios->reading) { | ||
1463 | - BUG_ON(per_dev->cur_sg >= ios->sgs_per_dev); | ||
1464 | + if (per_dev->cur_sg >= ios->sgs_per_dev) { | ||
1465 | + ORE_DBGMSG("cur_sg(%d) >= sgs_per_dev(%d)\n" , | ||
1466 | + per_dev->cur_sg, ios->sgs_per_dev); | ||
1467 | + return -ENOMEM; | ||
1468 | + } | ||
1469 | _ore_add_sg_seg(per_dev, cur_len, true); | ||
1470 | } else { | ||
1471 | struct __stripe_pages_2d *sp2d = ios->sp2d; | ||
1472 | @@ -612,8 +666,6 @@ int _ore_post_alloc_raid_stuff(struct ore_io_state *ios) | ||
1473 | return -ENOMEM; | ||
1474 | } | ||
1475 | |||
1476 | - BUG_ON(ios->offset % PAGE_SIZE); | ||
1477 | - | ||
1478 | /* Round io down to last full strip */ | ||
1479 | first_stripe = div_u64(ios->offset, stripe_size); | ||
1480 | last_stripe = div_u64(ios->offset + ios->length, stripe_size); | ||
1481 | diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c | ||
1482 | index 85fe655..5b3f907 100644 | ||
1483 | --- a/fs/ext3/inode.c | ||
1484 | +++ b/fs/ext3/inode.c | ||
1485 | @@ -1617,7 +1617,13 @@ static int ext3_ordered_writepage(struct page *page, | ||
1486 | int err; | ||
1487 | |||
1488 | J_ASSERT(PageLocked(page)); | ||
1489 | - WARN_ON_ONCE(IS_RDONLY(inode)); | ||
1490 | + /* | ||
1491 | + * We don't want to warn for emergency remount. The condition is | ||
1492 | + * ordered to avoid dereferencing inode->i_sb in non-error case to | ||
1493 | + * avoid slow-downs. | ||
1494 | + */ | ||
1495 | + WARN_ON_ONCE(IS_RDONLY(inode) && | ||
1496 | + !(EXT3_SB(inode->i_sb)->s_mount_state & EXT3_ERROR_FS)); | ||
1497 | |||
1498 | /* | ||
1499 | * We give up here if we're reentered, because it might be for a | ||
1500 | @@ -1692,7 +1698,13 @@ static int ext3_writeback_writepage(struct page *page, | ||
1501 | int err; | ||
1502 | |||
1503 | J_ASSERT(PageLocked(page)); | ||
1504 | - WARN_ON_ONCE(IS_RDONLY(inode)); | ||
1505 | + /* | ||
1506 | + * We don't want to warn for emergency remount. The condition is | ||
1507 | + * ordered to avoid dereferencing inode->i_sb in non-error case to | ||
1508 | + * avoid slow-downs. | ||
1509 | + */ | ||
1510 | + WARN_ON_ONCE(IS_RDONLY(inode) && | ||
1511 | + !(EXT3_SB(inode->i_sb)->s_mount_state & EXT3_ERROR_FS)); | ||
1512 | |||
1513 | if (ext3_journal_current_handle()) | ||
1514 | goto out_fail; | ||
1515 | @@ -1735,7 +1747,13 @@ static int ext3_journalled_writepage(struct page *page, | ||
1516 | int err; | ||
1517 | |||
1518 | J_ASSERT(PageLocked(page)); | ||
1519 | - WARN_ON_ONCE(IS_RDONLY(inode)); | ||
1520 | + /* | ||
1521 | + * We don't want to warn for emergency remount. The condition is | ||
1522 | + * ordered to avoid dereferencing inode->i_sb in non-error case to | ||
1523 | + * avoid slow-downs. | ||
1524 | + */ | ||
1525 | + WARN_ON_ONCE(IS_RDONLY(inode) && | ||
1526 | + !(EXT3_SB(inode->i_sb)->s_mount_state & EXT3_ERROR_FS)); | ||
1527 | |||
1528 | if (ext3_journal_current_handle()) | ||
1529 | goto no_write; | ||
1530 | diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c | ||
1531 | index 14363b9..5e3527b 100644 | ||
1532 | --- a/fs/reiserfs/super.c | ||
1533 | +++ b/fs/reiserfs/super.c | ||
1534 | @@ -453,16 +453,20 @@ int remove_save_link(struct inode *inode, int truncate) | ||
1535 | static void reiserfs_kill_sb(struct super_block *s) | ||
1536 | { | ||
1537 | if (REISERFS_SB(s)) { | ||
1538 | - if (REISERFS_SB(s)->xattr_root) { | ||
1539 | - d_invalidate(REISERFS_SB(s)->xattr_root); | ||
1540 | - dput(REISERFS_SB(s)->xattr_root); | ||
1541 | - REISERFS_SB(s)->xattr_root = NULL; | ||
1542 | - } | ||
1543 | - if (REISERFS_SB(s)->priv_root) { | ||
1544 | - d_invalidate(REISERFS_SB(s)->priv_root); | ||
1545 | - dput(REISERFS_SB(s)->priv_root); | ||
1546 | - REISERFS_SB(s)->priv_root = NULL; | ||
1547 | - } | ||
1548 | + /* | ||
1549 | + * Force any pending inode evictions to occur now. Any | ||
1550 | + * inodes to be removed that have extended attributes | ||
1551 | + * associated with them need to clean them up before | ||
1552 | + * we can release the extended attribute root dentries. | ||
1553 | + * shrink_dcache_for_umount will BUG if we don't release | ||
1554 | + * those before it's called so ->put_super is too late. | ||
1555 | + */ | ||
1556 | + shrink_dcache_sb(s); | ||
1557 | + | ||
1558 | + dput(REISERFS_SB(s)->xattr_root); | ||
1559 | + REISERFS_SB(s)->xattr_root = NULL; | ||
1560 | + dput(REISERFS_SB(s)->priv_root); | ||
1561 | + REISERFS_SB(s)->priv_root = NULL; | ||
1562 | } | ||
1563 | |||
1564 | kill_block_super(s); | ||
1565 | @@ -1164,7 +1168,8 @@ static void handle_quota_files(struct super_block *s, char **qf_names, | ||
1566 | kfree(REISERFS_SB(s)->s_qf_names[i]); | ||
1567 | REISERFS_SB(s)->s_qf_names[i] = qf_names[i]; | ||
1568 | } | ||
1569 | - REISERFS_SB(s)->s_jquota_fmt = *qfmt; | ||
1570 | + if (*qfmt) | ||
1571 | + REISERFS_SB(s)->s_jquota_fmt = *qfmt; | ||
1572 | } | ||
1573 | #endif | ||
1574 | |||
1575 | diff --git a/fs/udf/file.c b/fs/udf/file.c | ||
1576 | index d8ffa7c..dca0c38 100644 | ||
1577 | --- a/fs/udf/file.c | ||
1578 | +++ b/fs/udf/file.c | ||
1579 | @@ -125,7 +125,6 @@ static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | ||
1580 | err = udf_expand_file_adinicb(inode); | ||
1581 | if (err) { | ||
1582 | udf_debug("udf_expand_adinicb: err=%d\n", err); | ||
1583 | - up_write(&iinfo->i_data_sem); | ||
1584 | return err; | ||
1585 | } | ||
1586 | } else { | ||
1587 | @@ -133,9 +132,10 @@ static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | ||
1588 | iinfo->i_lenAlloc = pos + count; | ||
1589 | else | ||
1590 | iinfo->i_lenAlloc = inode->i_size; | ||
1591 | + up_write(&iinfo->i_data_sem); | ||
1592 | } | ||
1593 | - } | ||
1594 | - up_write(&iinfo->i_data_sem); | ||
1595 | + } else | ||
1596 | + up_write(&iinfo->i_data_sem); | ||
1597 | |||
1598 | retval = generic_file_aio_write(iocb, iov, nr_segs, ppos); | ||
1599 | if (retval > 0) | ||
1600 | diff --git a/fs/udf/inode.c b/fs/udf/inode.c | ||
1601 | index 4fd1d80..e2787d0 100644 | ||
1602 | --- a/fs/udf/inode.c | ||
1603 | +++ b/fs/udf/inode.c | ||
1604 | @@ -151,6 +151,12 @@ const struct address_space_operations udf_aops = { | ||
1605 | .bmap = udf_bmap, | ||
1606 | }; | ||
1607 | |||
1608 | +/* | ||
1609 | + * Expand file stored in ICB to a normal one-block-file | ||
1610 | + * | ||
1611 | + * This function requires i_data_sem for writing and releases it. | ||
1612 | + * This function requires i_mutex held | ||
1613 | + */ | ||
1614 | int udf_expand_file_adinicb(struct inode *inode) | ||
1615 | { | ||
1616 | struct page *page; | ||
1617 | @@ -169,9 +175,15 @@ int udf_expand_file_adinicb(struct inode *inode) | ||
1618 | iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG; | ||
1619 | /* from now on we have normal address_space methods */ | ||
1620 | inode->i_data.a_ops = &udf_aops; | ||
1621 | + up_write(&iinfo->i_data_sem); | ||
1622 | mark_inode_dirty(inode); | ||
1623 | return 0; | ||
1624 | } | ||
1625 | + /* | ||
1626 | + * Release i_data_sem so that we can lock a page - page lock ranks | ||
1627 | + * above i_data_sem. i_mutex still protects us against file changes. | ||
1628 | + */ | ||
1629 | + up_write(&iinfo->i_data_sem); | ||
1630 | |||
1631 | page = find_or_create_page(inode->i_mapping, 0, GFP_NOFS); | ||
1632 | if (!page) | ||
1633 | @@ -187,6 +199,7 @@ int udf_expand_file_adinicb(struct inode *inode) | ||
1634 | SetPageUptodate(page); | ||
1635 | kunmap(page); | ||
1636 | } | ||
1637 | + down_write(&iinfo->i_data_sem); | ||
1638 | memset(iinfo->i_ext.i_data + iinfo->i_lenEAttr, 0x00, | ||
1639 | iinfo->i_lenAlloc); | ||
1640 | iinfo->i_lenAlloc = 0; | ||
1641 | @@ -196,17 +209,20 @@ int udf_expand_file_adinicb(struct inode *inode) | ||
1642 | iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG; | ||
1643 | /* from now on we have normal address_space methods */ | ||
1644 | inode->i_data.a_ops = &udf_aops; | ||
1645 | + up_write(&iinfo->i_data_sem); | ||
1646 | err = inode->i_data.a_ops->writepage(page, &udf_wbc); | ||
1647 | if (err) { | ||
1648 | /* Restore everything back so that we don't lose data... */ | ||
1649 | lock_page(page); | ||
1650 | kaddr = kmap(page); | ||
1651 | + down_write(&iinfo->i_data_sem); | ||
1652 | memcpy(iinfo->i_ext.i_data + iinfo->i_lenEAttr, kaddr, | ||
1653 | inode->i_size); | ||
1654 | kunmap(page); | ||
1655 | unlock_page(page); | ||
1656 | iinfo->i_alloc_type = ICBTAG_FLAG_AD_IN_ICB; | ||
1657 | inode->i_data.a_ops = &udf_adinicb_aops; | ||
1658 | + up_write(&iinfo->i_data_sem); | ||
1659 | } | ||
1660 | page_cache_release(page); | ||
1661 | mark_inode_dirty(inode); | ||
1662 | @@ -1111,10 +1127,9 @@ int udf_setsize(struct inode *inode, loff_t newsize) | ||
1663 | if (bsize < | ||
1664 | (udf_file_entry_alloc_offset(inode) + newsize)) { | ||
1665 | err = udf_expand_file_adinicb(inode); | ||
1666 | - if (err) { | ||
1667 | - up_write(&iinfo->i_data_sem); | ||
1668 | + if (err) | ||
1669 | return err; | ||
1670 | - } | ||
1671 | + down_write(&iinfo->i_data_sem); | ||
1672 | } else | ||
1673 | iinfo->i_lenAlloc = newsize; | ||
1674 | } | ||
1675 | diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c | ||
1676 | index 76e4266..ac702a6 100644 | ||
1677 | --- a/fs/xfs/xfs_acl.c | ||
1678 | +++ b/fs/xfs/xfs_acl.c | ||
1679 | @@ -39,7 +39,7 @@ xfs_acl_from_disk(struct xfs_acl *aclp) | ||
1680 | struct posix_acl_entry *acl_e; | ||
1681 | struct posix_acl *acl; | ||
1682 | struct xfs_acl_entry *ace; | ||
1683 | - int count, i; | ||
1684 | + unsigned int count, i; | ||
1685 | |||
1686 | count = be32_to_cpu(aclp->acl_cnt); | ||
1687 | if (count > XFS_ACL_MAX_ENTRIES) | ||
1688 | diff --git a/include/linux/usb.h b/include/linux/usb.h | ||
1689 | index d3d0c13..7503352 100644 | ||
1690 | --- a/include/linux/usb.h | ||
1691 | +++ b/include/linux/usb.h | ||
1692 | @@ -1221,6 +1221,7 @@ struct urb { | ||
1693 | void *transfer_buffer; /* (in) associated data buffer */ | ||
1694 | dma_addr_t transfer_dma; /* (in) dma addr for transfer_buffer */ | ||
1695 | struct scatterlist *sg; /* (in) scatter gather buffer list */ | ||
1696 | + int num_mapped_sgs; /* (internal) mapped sg entries */ | ||
1697 | int num_sgs; /* (in) number of entries in the sg list */ | ||
1698 | u32 transfer_buffer_length; /* (in) data buffer length */ | ||
1699 | u32 actual_length; /* (return) actual transfer length */ | ||
1700 | diff --git a/include/linux/usb/ch9.h b/include/linux/usb/ch9.h | ||
1701 | index d5da6c6..61b2905 100644 | ||
1702 | --- a/include/linux/usb/ch9.h | ||
1703 | +++ b/include/linux/usb/ch9.h | ||
1704 | @@ -605,8 +605,26 @@ struct usb_ss_ep_comp_descriptor { | ||
1705 | } __attribute__ ((packed)); | ||
1706 | |||
1707 | #define USB_DT_SS_EP_COMP_SIZE 6 | ||
1708 | + | ||
1709 | /* Bits 4:0 of bmAttributes if this is a bulk endpoint */ | ||
1710 | -#define USB_SS_MAX_STREAMS(p) (1 << ((p) & 0x1f)) | ||
1711 | +static inline int | ||
1712 | +usb_ss_max_streams(const struct usb_ss_ep_comp_descriptor *comp) | ||
1713 | +{ | ||
1714 | + int max_streams; | ||
1715 | + | ||
1716 | + if (!comp) | ||
1717 | + return 0; | ||
1718 | + | ||
1719 | + max_streams = comp->bmAttributes & 0x1f; | ||
1720 | + | ||
1721 | + if (!max_streams) | ||
1722 | + return 0; | ||
1723 | + | ||
1724 | + max_streams = 1 << max_streams; | ||
1725 | + | ||
1726 | + return max_streams; | ||
1727 | +} | ||
1728 | + | ||
1729 | /* Bits 1:0 of bmAttributes if this is an isoc endpoint */ | ||
1730 | #define USB_SS_MULT(p) (1 + ((p) & 0x3)) | ||
1731 | |||
1732 | diff --git a/kernel/cgroup.c b/kernel/cgroup.c | ||
1733 | index a184470..cdc0354 100644 | ||
1734 | --- a/kernel/cgroup.c | ||
1735 | +++ b/kernel/cgroup.c | ||
1736 | @@ -1175,10 +1175,10 @@ static int parse_cgroupfs_options(char *data, struct cgroup_sb_opts *opts) | ||
1737 | |||
1738 | /* | ||
1739 | * If the 'all' option was specified select all the subsystems, | ||
1740 | - * otherwise 'all, 'none' and a subsystem name options were not | ||
1741 | - * specified, let's default to 'all' | ||
1742 | + * otherwise if 'none', 'name=' and a subsystem name options | ||
1743 | + * were not specified, let's default to 'all' | ||
1744 | */ | ||
1745 | - if (all_ss || (!all_ss && !one_ss && !opts->none)) { | ||
1746 | + if (all_ss || (!one_ss && !opts->none && !opts->name)) { | ||
1747 | for (i = 0; i < CGROUP_SUBSYS_COUNT; i++) { | ||
1748 | struct cgroup_subsys *ss = subsys[i]; | ||
1749 | if (ss == NULL) | ||
1750 | diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c | ||
1751 | index b2ca095..c3cc64c 100644 | ||
1752 | --- a/net/ipv4/igmp.c | ||
1753 | +++ b/net/ipv4/igmp.c | ||
1754 | @@ -875,6 +875,8 @@ static void igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb, | ||
1755 | * to be intended in a v3 query. | ||
1756 | */ | ||
1757 | max_delay = IGMPV3_MRC(ih3->code)*(HZ/IGMP_TIMER_SCALE); | ||
1758 | + if (!max_delay) | ||
1759 | + max_delay = 1; /* can't mod w/ 0 */ | ||
1760 | } else { /* v3 */ | ||
1761 | if (!pskb_may_pull(skb, sizeof(struct igmpv3_query))) | ||
1762 | return; | ||
1763 | diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c | ||
1764 | index 6c164dc..bf54c48 100644 | ||
1765 | --- a/tools/perf/util/trace-event-parse.c | ||
1766 | +++ b/tools/perf/util/trace-event-parse.c | ||
1767 | @@ -1582,6 +1582,8 @@ process_symbols(struct event *event, struct print_arg *arg, char **tok) | ||
1768 | field = malloc_or_die(sizeof(*field)); | ||
1769 | |||
1770 | type = process_arg(event, field, &token); | ||
1771 | + while (type == EVENT_OP) | ||
1772 | + type = process_op(event, field, &token); | ||
1773 | if (test_type_token(type, token, EVENT_DELIM, ",")) | ||
1774 | goto out_free; | ||
1775 |