Annotation of /trunk/kernel-alx-legacy/patches-4.9/0392-4.9.293-all-fixes.patch
Parent Directory | Revision Log
Revision 3694 -
(hide annotations)
(download)
Mon Oct 24 14:08:08 2022 UTC (18 months, 2 weeks ago) by niro
File size: 49247 byte(s)
Mon Oct 24 14:08:08 2022 UTC (18 months, 2 weeks ago) by niro
File size: 49247 byte(s)
-linux-4.9.293
1 | niro | 3694 | diff --git a/Makefile b/Makefile |
2 | index 6e941bc98dbd3..a07a010095bc9 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,6 +1,6 @@ | ||
6 | VERSION = 4 | ||
7 | PATCHLEVEL = 9 | ||
8 | -SUBLEVEL = 292 | ||
9 | +SUBLEVEL = 293 | ||
10 | EXTRAVERSION = | ||
11 | NAME = Roaring Lionus | ||
12 | |||
13 | diff --git a/block/ioprio.c b/block/ioprio.c | ||
14 | index 01b8116298a13..284bdfa3aacfc 100644 | ||
15 | --- a/block/ioprio.c | ||
16 | +++ b/block/ioprio.c | ||
17 | @@ -202,6 +202,7 @@ SYSCALL_DEFINE2(ioprio_get, int, which, int, who) | ||
18 | pgrp = task_pgrp(current); | ||
19 | else | ||
20 | pgrp = find_vpid(who); | ||
21 | + read_lock(&tasklist_lock); | ||
22 | do_each_pid_thread(pgrp, PIDTYPE_PGID, p) { | ||
23 | tmpio = get_task_ioprio(p); | ||
24 | if (tmpio < 0) | ||
25 | @@ -211,6 +212,8 @@ SYSCALL_DEFINE2(ioprio_get, int, which, int, who) | ||
26 | else | ||
27 | ret = ioprio_best(ret, tmpio); | ||
28 | } while_each_pid_thread(pgrp, PIDTYPE_PGID, p); | ||
29 | + read_unlock(&tasklist_lock); | ||
30 | + | ||
31 | break; | ||
32 | case IOPRIO_WHO_USER: | ||
33 | uid = make_kuid(current_user_ns(), who); | ||
34 | diff --git a/drivers/android/binder.c b/drivers/android/binder.c | ||
35 | index bf047f16fce9e..31a204ebfa6c5 100644 | ||
36 | --- a/drivers/android/binder.c | ||
37 | +++ b/drivers/android/binder.c | ||
38 | @@ -2641,21 +2641,18 @@ static int binder_free_thread(struct binder_proc *proc, | ||
39 | } | ||
40 | |||
41 | /* | ||
42 | - * If this thread used poll, make sure we remove the waitqueue | ||
43 | - * from any epoll data structures holding it with POLLFREE. | ||
44 | - * waitqueue_active() is safe to use here because we're holding | ||
45 | - * the global lock. | ||
46 | + * If this thread used poll, make sure we remove the waitqueue from any | ||
47 | + * poll data structures holding it. | ||
48 | */ | ||
49 | - if ((thread->looper & BINDER_LOOPER_STATE_POLL) && | ||
50 | - waitqueue_active(&thread->wait)) { | ||
51 | - wake_up_poll(&thread->wait, POLLHUP | POLLFREE); | ||
52 | - } | ||
53 | + if (thread->looper & BINDER_LOOPER_STATE_POLL) | ||
54 | + wake_up_pollfree(&thread->wait); | ||
55 | |||
56 | /* | ||
57 | - * This is needed to avoid races between wake_up_poll() above and | ||
58 | - * and ep_remove_waitqueue() called for other reasons (eg the epoll file | ||
59 | - * descriptor being closed); ep_remove_waitqueue() holds an RCU read | ||
60 | - * lock, so we can be sure it's done after calling synchronize_rcu(). | ||
61 | + * This is needed to avoid races between wake_up_pollfree() above and | ||
62 | + * someone else removing the last entry from the queue for other reasons | ||
63 | + * (e.g. ep_remove_wait_queue() being called due to an epoll file | ||
64 | + * descriptor being closed). Such other users hold an RCU read lock, so | ||
65 | + * we can be sure they're done after we call synchronize_rcu(). | ||
66 | */ | ||
67 | if (thread->looper & BINDER_LOOPER_STATE_POLL) | ||
68 | synchronize_rcu(); | ||
69 | diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c | ||
70 | index d3804b215ffa6..a92cbe1aa72a2 100644 | ||
71 | --- a/drivers/ata/libata-core.c | ||
72 | +++ b/drivers/ata/libata-core.c | ||
73 | @@ -4332,6 +4332,8 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | ||
74 | { "VRFDFC22048UCHC-TE*", NULL, ATA_HORKAGE_NODMA }, | ||
75 | /* Odd clown on sil3726/4726 PMPs */ | ||
76 | { "Config Disk", NULL, ATA_HORKAGE_DISABLE }, | ||
77 | + /* Similar story with ASMedia 1092 */ | ||
78 | + { "ASMT109x- Config", NULL, ATA_HORKAGE_DISABLE }, | ||
79 | |||
80 | /* Weird ATAPI devices */ | ||
81 | { "TORiSAN DVD-ROM DRD-N216", NULL, ATA_HORKAGE_MAX_SEC_128 }, | ||
82 | diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig | ||
83 | index 8eed456a67bed..2d2422705ccf7 100644 | ||
84 | --- a/drivers/hid/Kconfig | ||
85 | +++ b/drivers/hid/Kconfig | ||
86 | @@ -176,14 +176,14 @@ config HID_CHERRY | ||
87 | |||
88 | config HID_CHICONY | ||
89 | tristate "Chicony devices" | ||
90 | - depends on HID | ||
91 | + depends on USB_HID | ||
92 | default !EXPERT | ||
93 | ---help--- | ||
94 | Support for Chicony Tactical pad and special keys on Chicony keyboards. | ||
95 | |||
96 | config HID_CORSAIR | ||
97 | tristate "Corsair devices" | ||
98 | - depends on HID && USB && LEDS_CLASS | ||
99 | + depends on USB_HID && LEDS_CLASS | ||
100 | ---help--- | ||
101 | Support for Corsair devices that are not fully compliant with the | ||
102 | HID standard. | ||
103 | @@ -194,7 +194,7 @@ config HID_CORSAIR | ||
104 | |||
105 | config HID_PRODIKEYS | ||
106 | tristate "Prodikeys PC-MIDI Keyboard support" | ||
107 | - depends on HID && SND | ||
108 | + depends on USB_HID && SND | ||
109 | select SND_RAWMIDI | ||
110 | ---help--- | ||
111 | Support for Prodikeys PC-MIDI Keyboard device support. | ||
112 | @@ -421,7 +421,7 @@ config HID_LENOVO | ||
113 | |||
114 | config HID_LOGITECH | ||
115 | tristate "Logitech devices" | ||
116 | - depends on HID | ||
117 | + depends on USB_HID | ||
118 | default !EXPERT | ||
119 | ---help--- | ||
120 | Support for Logitech devices that are not fully compliant with HID standard. | ||
121 | @@ -730,7 +730,7 @@ config HID_SAITEK | ||
122 | |||
123 | config HID_SAMSUNG | ||
124 | tristate "Samsung InfraRed remote control or keyboards" | ||
125 | - depends on HID | ||
126 | + depends on USB_HID | ||
127 | ---help--- | ||
128 | Support for Samsung InfraRed remote control or keyboards. | ||
129 | |||
130 | diff --git a/drivers/hid/hid-chicony.c b/drivers/hid/hid-chicony.c | ||
131 | index f04ed9aabc3f9..f11948ddf642e 100644 | ||
132 | --- a/drivers/hid/hid-chicony.c | ||
133 | +++ b/drivers/hid/hid-chicony.c | ||
134 | @@ -61,8 +61,12 @@ static int ch_input_mapping(struct hid_device *hdev, struct hid_input *hi, | ||
135 | static __u8 *ch_switch12_report_fixup(struct hid_device *hdev, __u8 *rdesc, | ||
136 | unsigned int *rsize) | ||
137 | { | ||
138 | - struct usb_interface *intf = to_usb_interface(hdev->dev.parent); | ||
139 | - | ||
140 | + struct usb_interface *intf; | ||
141 | + | ||
142 | + if (!hid_is_usb(hdev)) | ||
143 | + return rdesc; | ||
144 | + | ||
145 | + intf = to_usb_interface(hdev->dev.parent); | ||
146 | if (intf->cur_altsetting->desc.bInterfaceNumber == 1) { | ||
147 | /* Change usage maximum and logical maximum from 0x7fff to | ||
148 | * 0x2fff, so they don't exceed HID_MAX_USAGES */ | ||
149 | diff --git a/drivers/hid/hid-corsair.c b/drivers/hid/hid-corsair.c | ||
150 | index 9ba5d98a11804..d8cf08b6b31c6 100644 | ||
151 | --- a/drivers/hid/hid-corsair.c | ||
152 | +++ b/drivers/hid/hid-corsair.c | ||
153 | @@ -553,7 +553,12 @@ static int corsair_probe(struct hid_device *dev, const struct hid_device_id *id) | ||
154 | int ret; | ||
155 | unsigned long quirks = id->driver_data; | ||
156 | struct corsair_drvdata *drvdata; | ||
157 | - struct usb_interface *usbif = to_usb_interface(dev->dev.parent); | ||
158 | + struct usb_interface *usbif; | ||
159 | + | ||
160 | + if (!hid_is_usb(dev)) | ||
161 | + return -EINVAL; | ||
162 | + | ||
163 | + usbif = to_usb_interface(dev->dev.parent); | ||
164 | |||
165 | drvdata = devm_kzalloc(&dev->dev, sizeof(struct corsair_drvdata), | ||
166 | GFP_KERNEL); | ||
167 | diff --git a/drivers/hid/hid-elo.c b/drivers/hid/hid-elo.c | ||
168 | index 5eea6fe0d7bd8..c3ecac13e6203 100644 | ||
169 | --- a/drivers/hid/hid-elo.c | ||
170 | +++ b/drivers/hid/hid-elo.c | ||
171 | @@ -230,6 +230,9 @@ static int elo_probe(struct hid_device *hdev, const struct hid_device_id *id) | ||
172 | struct elo_priv *priv; | ||
173 | int ret; | ||
174 | |||
175 | + if (!hid_is_usb(hdev)) | ||
176 | + return -EINVAL; | ||
177 | + | ||
178 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); | ||
179 | if (!priv) | ||
180 | return -ENOMEM; | ||
181 | diff --git a/drivers/hid/hid-holtek-kbd.c b/drivers/hid/hid-holtek-kbd.c | ||
182 | index ab9da597106fa..2f8eb66397444 100644 | ||
183 | --- a/drivers/hid/hid-holtek-kbd.c | ||
184 | +++ b/drivers/hid/hid-holtek-kbd.c | ||
185 | @@ -143,12 +143,17 @@ static int holtek_kbd_input_event(struct input_dev *dev, unsigned int type, | ||
186 | static int holtek_kbd_probe(struct hid_device *hdev, | ||
187 | const struct hid_device_id *id) | ||
188 | { | ||
189 | - struct usb_interface *intf = to_usb_interface(hdev->dev.parent); | ||
190 | - int ret = hid_parse(hdev); | ||
191 | + struct usb_interface *intf; | ||
192 | + int ret; | ||
193 | + | ||
194 | + if (!hid_is_usb(hdev)) | ||
195 | + return -EINVAL; | ||
196 | |||
197 | + ret = hid_parse(hdev); | ||
198 | if (!ret) | ||
199 | ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); | ||
200 | |||
201 | + intf = to_usb_interface(hdev->dev.parent); | ||
202 | if (!ret && intf->cur_altsetting->desc.bInterfaceNumber == 1) { | ||
203 | struct hid_input *hidinput; | ||
204 | list_for_each_entry(hidinput, &hdev->inputs, list) { | ||
205 | diff --git a/drivers/hid/hid-holtek-mouse.c b/drivers/hid/hid-holtek-mouse.c | ||
206 | index 78b3a0c767751..27c08ddab0e1a 100644 | ||
207 | --- a/drivers/hid/hid-holtek-mouse.c | ||
208 | +++ b/drivers/hid/hid-holtek-mouse.c | ||
209 | @@ -65,6 +65,14 @@ static __u8 *holtek_mouse_report_fixup(struct hid_device *hdev, __u8 *rdesc, | ||
210 | return rdesc; | ||
211 | } | ||
212 | |||
213 | +static int holtek_mouse_probe(struct hid_device *hdev, | ||
214 | + const struct hid_device_id *id) | ||
215 | +{ | ||
216 | + if (!hid_is_usb(hdev)) | ||
217 | + return -EINVAL; | ||
218 | + return 0; | ||
219 | +} | ||
220 | + | ||
221 | static const struct hid_device_id holtek_mouse_devices[] = { | ||
222 | { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, | ||
223 | USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A067) }, | ||
224 | @@ -86,6 +94,7 @@ static struct hid_driver holtek_mouse_driver = { | ||
225 | .name = "holtek_mouse", | ||
226 | .id_table = holtek_mouse_devices, | ||
227 | .report_fixup = holtek_mouse_report_fixup, | ||
228 | + .probe = holtek_mouse_probe, | ||
229 | }; | ||
230 | |||
231 | module_hid_driver(holtek_mouse_driver); | ||
232 | diff --git a/drivers/hid/hid-lg.c b/drivers/hid/hid-lg.c | ||
233 | index 7e55d3f755dd5..f8d1d481c8384 100644 | ||
234 | --- a/drivers/hid/hid-lg.c | ||
235 | +++ b/drivers/hid/hid-lg.c | ||
236 | @@ -714,12 +714,18 @@ static int lg_raw_event(struct hid_device *hdev, struct hid_report *report, | ||
237 | |||
238 | static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id) | ||
239 | { | ||
240 | - struct usb_interface *iface = to_usb_interface(hdev->dev.parent); | ||
241 | - __u8 iface_num = iface->cur_altsetting->desc.bInterfaceNumber; | ||
242 | + struct usb_interface *iface; | ||
243 | + __u8 iface_num; | ||
244 | unsigned int connect_mask = HID_CONNECT_DEFAULT; | ||
245 | struct lg_drv_data *drv_data; | ||
246 | int ret; | ||
247 | |||
248 | + if (!hid_is_usb(hdev)) | ||
249 | + return -EINVAL; | ||
250 | + | ||
251 | + iface = to_usb_interface(hdev->dev.parent); | ||
252 | + iface_num = iface->cur_altsetting->desc.bInterfaceNumber; | ||
253 | + | ||
254 | /* G29 only work with the 1st interface */ | ||
255 | if ((hdev->product == USB_DEVICE_ID_LOGITECH_G29_WHEEL) && | ||
256 | (iface_num != 0)) { | ||
257 | diff --git a/drivers/hid/hid-prodikeys.c b/drivers/hid/hid-prodikeys.c | ||
258 | index 762f33817dd0d..7c3e42efbc567 100644 | ||
259 | --- a/drivers/hid/hid-prodikeys.c | ||
260 | +++ b/drivers/hid/hid-prodikeys.c | ||
261 | @@ -803,12 +803,18 @@ static int pk_raw_event(struct hid_device *hdev, struct hid_report *report, | ||
262 | static int pk_probe(struct hid_device *hdev, const struct hid_device_id *id) | ||
263 | { | ||
264 | int ret; | ||
265 | - struct usb_interface *intf = to_usb_interface(hdev->dev.parent); | ||
266 | - unsigned short ifnum = intf->cur_altsetting->desc.bInterfaceNumber; | ||
267 | + struct usb_interface *intf; | ||
268 | + unsigned short ifnum; | ||
269 | unsigned long quirks = id->driver_data; | ||
270 | struct pk_device *pk; | ||
271 | struct pcmidi_snd *pm = NULL; | ||
272 | |||
273 | + if (!hid_is_usb(hdev)) | ||
274 | + return -EINVAL; | ||
275 | + | ||
276 | + intf = to_usb_interface(hdev->dev.parent); | ||
277 | + ifnum = intf->cur_altsetting->desc.bInterfaceNumber; | ||
278 | + | ||
279 | pk = kzalloc(sizeof(*pk), GFP_KERNEL); | ||
280 | if (pk == NULL) { | ||
281 | hid_err(hdev, "can't alloc descriptor\n"); | ||
282 | diff --git a/drivers/hid/hid-roccat-arvo.c b/drivers/hid/hid-roccat-arvo.c | ||
283 | index 329c5d1270f94..fb545a11214f0 100644 | ||
284 | --- a/drivers/hid/hid-roccat-arvo.c | ||
285 | +++ b/drivers/hid/hid-roccat-arvo.c | ||
286 | @@ -347,6 +347,9 @@ static int arvo_probe(struct hid_device *hdev, | ||
287 | { | ||
288 | int retval; | ||
289 | |||
290 | + if (!hid_is_usb(hdev)) | ||
291 | + return -EINVAL; | ||
292 | + | ||
293 | retval = hid_parse(hdev); | ||
294 | if (retval) { | ||
295 | hid_err(hdev, "parse failed\n"); | ||
296 | diff --git a/drivers/hid/hid-roccat-isku.c b/drivers/hid/hid-roccat-isku.c | ||
297 | index 02db537f8f3ea..c07a7ea8a6873 100644 | ||
298 | --- a/drivers/hid/hid-roccat-isku.c | ||
299 | +++ b/drivers/hid/hid-roccat-isku.c | ||
300 | @@ -327,6 +327,9 @@ static int isku_probe(struct hid_device *hdev, | ||
301 | { | ||
302 | int retval; | ||
303 | |||
304 | + if (!hid_is_usb(hdev)) | ||
305 | + return -EINVAL; | ||
306 | + | ||
307 | retval = hid_parse(hdev); | ||
308 | if (retval) { | ||
309 | hid_err(hdev, "parse failed\n"); | ||
310 | diff --git a/drivers/hid/hid-roccat-kone.c b/drivers/hid/hid-roccat-kone.c | ||
311 | index 9be8c31f613fd..ef978586ff2f5 100644 | ||
312 | --- a/drivers/hid/hid-roccat-kone.c | ||
313 | +++ b/drivers/hid/hid-roccat-kone.c | ||
314 | @@ -752,6 +752,9 @@ static int kone_probe(struct hid_device *hdev, const struct hid_device_id *id) | ||
315 | { | ||
316 | int retval; | ||
317 | |||
318 | + if (!hid_is_usb(hdev)) | ||
319 | + return -EINVAL; | ||
320 | + | ||
321 | retval = hid_parse(hdev); | ||
322 | if (retval) { | ||
323 | hid_err(hdev, "parse failed\n"); | ||
324 | diff --git a/drivers/hid/hid-roccat-koneplus.c b/drivers/hid/hid-roccat-koneplus.c | ||
325 | index 09e8fc72aa1d4..b63de4c5b5dd3 100644 | ||
326 | --- a/drivers/hid/hid-roccat-koneplus.c | ||
327 | +++ b/drivers/hid/hid-roccat-koneplus.c | ||
328 | @@ -434,6 +434,9 @@ static int koneplus_probe(struct hid_device *hdev, | ||
329 | { | ||
330 | int retval; | ||
331 | |||
332 | + if (!hid_is_usb(hdev)) | ||
333 | + return -EINVAL; | ||
334 | + | ||
335 | retval = hid_parse(hdev); | ||
336 | if (retval) { | ||
337 | hid_err(hdev, "parse failed\n"); | ||
338 | diff --git a/drivers/hid/hid-roccat-konepure.c b/drivers/hid/hid-roccat-konepure.c | ||
339 | index 07de2f9014c67..ef9508822e5f0 100644 | ||
340 | --- a/drivers/hid/hid-roccat-konepure.c | ||
341 | +++ b/drivers/hid/hid-roccat-konepure.c | ||
342 | @@ -136,6 +136,9 @@ static int konepure_probe(struct hid_device *hdev, | ||
343 | { | ||
344 | int retval; | ||
345 | |||
346 | + if (!hid_is_usb(hdev)) | ||
347 | + return -EINVAL; | ||
348 | + | ||
349 | retval = hid_parse(hdev); | ||
350 | if (retval) { | ||
351 | hid_err(hdev, "parse failed\n"); | ||
352 | diff --git a/drivers/hid/hid-roccat-kovaplus.c b/drivers/hid/hid-roccat-kovaplus.c | ||
353 | index 317c9c2c0a7ce..6256c211398a1 100644 | ||
354 | --- a/drivers/hid/hid-roccat-kovaplus.c | ||
355 | +++ b/drivers/hid/hid-roccat-kovaplus.c | ||
356 | @@ -504,6 +504,9 @@ static int kovaplus_probe(struct hid_device *hdev, | ||
357 | { | ||
358 | int retval; | ||
359 | |||
360 | + if (!hid_is_usb(hdev)) | ||
361 | + return -EINVAL; | ||
362 | + | ||
363 | retval = hid_parse(hdev); | ||
364 | if (retval) { | ||
365 | hid_err(hdev, "parse failed\n"); | ||
366 | diff --git a/drivers/hid/hid-roccat-lua.c b/drivers/hid/hid-roccat-lua.c | ||
367 | index ac1a7313e2596..13ae2a7d176d3 100644 | ||
368 | --- a/drivers/hid/hid-roccat-lua.c | ||
369 | +++ b/drivers/hid/hid-roccat-lua.c | ||
370 | @@ -163,6 +163,9 @@ static int lua_probe(struct hid_device *hdev, | ||
371 | { | ||
372 | int retval; | ||
373 | |||
374 | + if (!hid_is_usb(hdev)) | ||
375 | + return -EINVAL; | ||
376 | + | ||
377 | retval = hid_parse(hdev); | ||
378 | if (retval) { | ||
379 | hid_err(hdev, "parse failed\n"); | ||
380 | diff --git a/drivers/hid/hid-roccat-pyra.c b/drivers/hid/hid-roccat-pyra.c | ||
381 | index b30aa7b82bf87..027aa9d0ec1f2 100644 | ||
382 | --- a/drivers/hid/hid-roccat-pyra.c | ||
383 | +++ b/drivers/hid/hid-roccat-pyra.c | ||
384 | @@ -452,6 +452,9 @@ static int pyra_probe(struct hid_device *hdev, const struct hid_device_id *id) | ||
385 | { | ||
386 | int retval; | ||
387 | |||
388 | + if (!hid_is_usb(hdev)) | ||
389 | + return -EINVAL; | ||
390 | + | ||
391 | retval = hid_parse(hdev); | ||
392 | if (retval) { | ||
393 | hid_err(hdev, "parse failed\n"); | ||
394 | diff --git a/drivers/hid/hid-roccat-ryos.c b/drivers/hid/hid-roccat-ryos.c | ||
395 | index 47cc8f30ff6d4..fda4a396a12e8 100644 | ||
396 | --- a/drivers/hid/hid-roccat-ryos.c | ||
397 | +++ b/drivers/hid/hid-roccat-ryos.c | ||
398 | @@ -144,6 +144,9 @@ static int ryos_probe(struct hid_device *hdev, | ||
399 | { | ||
400 | int retval; | ||
401 | |||
402 | + if (!hid_is_usb(hdev)) | ||
403 | + return -EINVAL; | ||
404 | + | ||
405 | retval = hid_parse(hdev); | ||
406 | if (retval) { | ||
407 | hid_err(hdev, "parse failed\n"); | ||
408 | diff --git a/drivers/hid/hid-roccat-savu.c b/drivers/hid/hid-roccat-savu.c | ||
409 | index 6dbf6e04dce75..0230fb54f08a5 100644 | ||
410 | --- a/drivers/hid/hid-roccat-savu.c | ||
411 | +++ b/drivers/hid/hid-roccat-savu.c | ||
412 | @@ -116,6 +116,9 @@ static int savu_probe(struct hid_device *hdev, | ||
413 | { | ||
414 | int retval; | ||
415 | |||
416 | + if (!hid_is_usb(hdev)) | ||
417 | + return -EINVAL; | ||
418 | + | ||
419 | retval = hid_parse(hdev); | ||
420 | if (retval) { | ||
421 | hid_err(hdev, "parse failed\n"); | ||
422 | diff --git a/drivers/hid/hid-samsung.c b/drivers/hid/hid-samsung.c | ||
423 | index 7cbb067d4a9e3..89bb2260367f3 100644 | ||
424 | --- a/drivers/hid/hid-samsung.c | ||
425 | +++ b/drivers/hid/hid-samsung.c | ||
426 | @@ -157,6 +157,9 @@ static int samsung_probe(struct hid_device *hdev, | ||
427 | int ret; | ||
428 | unsigned int cmask = HID_CONNECT_DEFAULT; | ||
429 | |||
430 | + if (!hid_is_usb(hdev)) | ||
431 | + return -EINVAL; | ||
432 | + | ||
433 | ret = hid_parse(hdev); | ||
434 | if (ret) { | ||
435 | hid_err(hdev, "parse failed\n"); | ||
436 | diff --git a/drivers/hid/hid-uclogic.c b/drivers/hid/hid-uclogic.c | ||
437 | index 1509d7287ff3e..b3f2e40b1c5bd 100644 | ||
438 | --- a/drivers/hid/hid-uclogic.c | ||
439 | +++ b/drivers/hid/hid-uclogic.c | ||
440 | @@ -791,6 +791,9 @@ static int uclogic_tablet_enable(struct hid_device *hdev) | ||
441 | __u8 *p; | ||
442 | s32 v; | ||
443 | |||
444 | + if (!hid_is_usb(hdev)) | ||
445 | + return -EINVAL; | ||
446 | + | ||
447 | /* | ||
448 | * Read string descriptor containing tablet parameters. The specific | ||
449 | * string descriptor and data were discovered by sniffing the Windows | ||
450 | diff --git a/drivers/hid/i2c-hid/i2c-hid-core.c b/drivers/hid/i2c-hid/i2c-hid-core.c | ||
451 | index 800c477dd0761..518ccf15188ef 100644 | ||
452 | --- a/drivers/hid/i2c-hid/i2c-hid-core.c | ||
453 | +++ b/drivers/hid/i2c-hid/i2c-hid-core.c | ||
454 | @@ -875,7 +875,7 @@ static int i2c_hid_power(struct hid_device *hid, int lvl) | ||
455 | return 0; | ||
456 | } | ||
457 | |||
458 | -static struct hid_ll_driver i2c_hid_ll_driver = { | ||
459 | +struct hid_ll_driver i2c_hid_ll_driver = { | ||
460 | .parse = i2c_hid_parse, | ||
461 | .start = i2c_hid_start, | ||
462 | .stop = i2c_hid_stop, | ||
463 | @@ -885,6 +885,7 @@ static struct hid_ll_driver i2c_hid_ll_driver = { | ||
464 | .output_report = i2c_hid_output_report, | ||
465 | .raw_request = i2c_hid_raw_request, | ||
466 | }; | ||
467 | +EXPORT_SYMBOL_GPL(i2c_hid_ll_driver); | ||
468 | |||
469 | static int i2c_hid_init_irq(struct i2c_client *client) | ||
470 | { | ||
471 | diff --git a/drivers/hid/uhid.c b/drivers/hid/uhid.c | ||
472 | index 731a7b3e01870..e60e41e775020 100644 | ||
473 | --- a/drivers/hid/uhid.c | ||
474 | +++ b/drivers/hid/uhid.c | ||
475 | @@ -372,7 +372,7 @@ static int uhid_hid_output_report(struct hid_device *hid, __u8 *buf, | ||
476 | return uhid_hid_output_raw(hid, buf, count, HID_OUTPUT_REPORT); | ||
477 | } | ||
478 | |||
479 | -static struct hid_ll_driver uhid_hid_driver = { | ||
480 | +struct hid_ll_driver uhid_hid_driver = { | ||
481 | .start = uhid_hid_start, | ||
482 | .stop = uhid_hid_stop, | ||
483 | .open = uhid_hid_open, | ||
484 | @@ -381,6 +381,7 @@ static struct hid_ll_driver uhid_hid_driver = { | ||
485 | .raw_request = uhid_hid_raw_request, | ||
486 | .output_report = uhid_hid_output_report, | ||
487 | }; | ||
488 | +EXPORT_SYMBOL_GPL(uhid_hid_driver); | ||
489 | |||
490 | #ifdef CONFIG_COMPAT | ||
491 | |||
492 | diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c | ||
493 | index 368f849decd1f..cb57ccff31c20 100644 | ||
494 | --- a/drivers/hid/usbhid/hid-core.c | ||
495 | +++ b/drivers/hid/usbhid/hid-core.c | ||
496 | @@ -1272,7 +1272,7 @@ static int usbhid_idle(struct hid_device *hid, int report, int idle, | ||
497 | return hid_set_idle(dev, ifnum, report, idle); | ||
498 | } | ||
499 | |||
500 | -static struct hid_ll_driver usb_hid_driver = { | ||
501 | +struct hid_ll_driver usb_hid_driver = { | ||
502 | .parse = usbhid_parse, | ||
503 | .start = usbhid_start, | ||
504 | .stop = usbhid_stop, | ||
505 | @@ -1285,6 +1285,7 @@ static struct hid_ll_driver usb_hid_driver = { | ||
506 | .output_report = usbhid_output_report, | ||
507 | .idle = usbhid_idle, | ||
508 | }; | ||
509 | +EXPORT_SYMBOL_GPL(usb_hid_driver); | ||
510 | |||
511 | static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id *id) | ||
512 | { | ||
513 | diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c | ||
514 | index e8b90b534f08e..b74fcda49a223 100644 | ||
515 | --- a/drivers/hid/wacom_sys.c | ||
516 | +++ b/drivers/hid/wacom_sys.c | ||
517 | @@ -506,7 +506,7 @@ static void wacom_retrieve_hid_descriptor(struct hid_device *hdev, | ||
518 | * Skip the query for this type and modify defaults based on | ||
519 | * interface number. | ||
520 | */ | ||
521 | - if (features->type == WIRELESS) { | ||
522 | + if (features->type == WIRELESS && intf) { | ||
523 | if (intf->cur_altsetting->desc.bInterfaceNumber == 0) | ||
524 | features->device_type = WACOM_DEVICETYPE_WL_MONITOR; | ||
525 | else | ||
526 | @@ -2115,6 +2115,9 @@ static void wacom_wireless_work(struct work_struct *work) | ||
527 | |||
528 | wacom_destroy_battery(wacom); | ||
529 | |||
530 | + if (!usbdev) | ||
531 | + return; | ||
532 | + | ||
533 | /* Stylus interface */ | ||
534 | hdev1 = usb_get_intfdata(usbdev->config->interface[1]); | ||
535 | wacom1 = hid_get_drvdata(hdev1); | ||
536 | @@ -2354,8 +2357,6 @@ static void wacom_remote_work(struct work_struct *work) | ||
537 | static int wacom_probe(struct hid_device *hdev, | ||
538 | const struct hid_device_id *id) | ||
539 | { | ||
540 | - struct usb_interface *intf = to_usb_interface(hdev->dev.parent); | ||
541 | - struct usb_device *dev = interface_to_usbdev(intf); | ||
542 | struct wacom *wacom; | ||
543 | struct wacom_wac *wacom_wac; | ||
544 | struct wacom_features *features; | ||
545 | @@ -2388,8 +2389,14 @@ static int wacom_probe(struct hid_device *hdev, | ||
546 | wacom_wac->hid_data.inputmode = -1; | ||
547 | wacom_wac->mode_report = -1; | ||
548 | |||
549 | - wacom->usbdev = dev; | ||
550 | - wacom->intf = intf; | ||
551 | + if (hid_is_usb(hdev)) { | ||
552 | + struct usb_interface *intf = to_usb_interface(hdev->dev.parent); | ||
553 | + struct usb_device *dev = interface_to_usbdev(intf); | ||
554 | + | ||
555 | + wacom->usbdev = dev; | ||
556 | + wacom->intf = intf; | ||
557 | + } | ||
558 | + | ||
559 | mutex_init(&wacom->lock); | ||
560 | INIT_WORK(&wacom->wireless_work, wacom_wireless_work); | ||
561 | INIT_WORK(&wacom->battery_work, wacom_battery_work); | ||
562 | diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c | ||
563 | index 626a605a0c0e6..799457aa36020 100644 | ||
564 | --- a/drivers/iio/accel/kxcjk-1013.c | ||
565 | +++ b/drivers/iio/accel/kxcjk-1013.c | ||
566 | @@ -1290,8 +1290,7 @@ static int kxcjk1013_probe(struct i2c_client *client, | ||
567 | return 0; | ||
568 | |||
569 | err_buffer_cleanup: | ||
570 | - if (data->dready_trig) | ||
571 | - iio_triggered_buffer_cleanup(indio_dev); | ||
572 | + iio_triggered_buffer_cleanup(indio_dev); | ||
573 | err_trigger_unregister: | ||
574 | if (data->dready_trig) | ||
575 | iio_trigger_unregister(data->dready_trig); | ||
576 | @@ -1314,8 +1313,8 @@ static int kxcjk1013_remove(struct i2c_client *client) | ||
577 | pm_runtime_set_suspended(&client->dev); | ||
578 | pm_runtime_put_noidle(&client->dev); | ||
579 | |||
580 | + iio_triggered_buffer_cleanup(indio_dev); | ||
581 | if (data->dready_trig) { | ||
582 | - iio_triggered_buffer_cleanup(indio_dev); | ||
583 | iio_trigger_unregister(data->dready_trig); | ||
584 | iio_trigger_unregister(data->motion_trig); | ||
585 | } | ||
586 | diff --git a/drivers/iio/accel/kxsd9.c b/drivers/iio/accel/kxsd9.c | ||
587 | index 1bda730a71c0b..c3ac798083f4f 100644 | ||
588 | --- a/drivers/iio/accel/kxsd9.c | ||
589 | +++ b/drivers/iio/accel/kxsd9.c | ||
590 | @@ -227,14 +227,14 @@ static irqreturn_t kxsd9_trigger_handler(int irq, void *p) | ||
591 | hw_values.chan, | ||
592 | sizeof(hw_values.chan)); | ||
593 | if (ret) { | ||
594 | - dev_err(st->dev, | ||
595 | - "error reading data\n"); | ||
596 | - return ret; | ||
597 | + dev_err(st->dev, "error reading data: %d\n", ret); | ||
598 | + goto out; | ||
599 | } | ||
600 | |||
601 | iio_push_to_buffers_with_timestamp(indio_dev, | ||
602 | &hw_values, | ||
603 | iio_get_time_ns(indio_dev)); | ||
604 | +out: | ||
605 | iio_trigger_notify_done(indio_dev->trig); | ||
606 | |||
607 | return IRQ_HANDLED; | ||
608 | diff --git a/drivers/iio/accel/mma8452.c b/drivers/iio/accel/mma8452.c | ||
609 | index 90d4179e8c3de..0346c37b1e285 100644 | ||
610 | --- a/drivers/iio/accel/mma8452.c | ||
611 | +++ b/drivers/iio/accel/mma8452.c | ||
612 | @@ -1389,7 +1389,7 @@ static int mma8452_trigger_setup(struct iio_dev *indio_dev) | ||
613 | if (ret) | ||
614 | return ret; | ||
615 | |||
616 | - indio_dev->trig = trig; | ||
617 | + indio_dev->trig = iio_trigger_get(trig); | ||
618 | |||
619 | return 0; | ||
620 | } | ||
621 | diff --git a/drivers/iio/gyro/itg3200_buffer.c b/drivers/iio/gyro/itg3200_buffer.c | ||
622 | index e04483254b283..7157b1a731a60 100644 | ||
623 | --- a/drivers/iio/gyro/itg3200_buffer.c | ||
624 | +++ b/drivers/iio/gyro/itg3200_buffer.c | ||
625 | @@ -64,9 +64,9 @@ static irqreturn_t itg3200_trigger_handler(int irq, void *p) | ||
626 | |||
627 | iio_push_to_buffers_with_timestamp(indio_dev, &scan, pf->timestamp); | ||
628 | |||
629 | +error_ret: | ||
630 | iio_trigger_notify_done(indio_dev->trig); | ||
631 | |||
632 | -error_ret: | ||
633 | return IRQ_HANDLED; | ||
634 | } | ||
635 | |||
636 | diff --git a/drivers/iio/light/ltr501.c b/drivers/iio/light/ltr501.c | ||
637 | index 414fe857fa9d7..5e3cbb694a753 100644 | ||
638 | --- a/drivers/iio/light/ltr501.c | ||
639 | +++ b/drivers/iio/light/ltr501.c | ||
640 | @@ -1248,7 +1248,7 @@ static irqreturn_t ltr501_trigger_handler(int irq, void *p) | ||
641 | ret = regmap_bulk_read(data->regmap, LTR501_ALS_DATA1, | ||
642 | (u8 *)als_buf, sizeof(als_buf)); | ||
643 | if (ret < 0) | ||
644 | - return ret; | ||
645 | + goto done; | ||
646 | if (test_bit(0, indio_dev->active_scan_mask)) | ||
647 | scan.channels[j++] = le16_to_cpu(als_buf[1]); | ||
648 | if (test_bit(1, indio_dev->active_scan_mask)) | ||
649 | diff --git a/drivers/iio/light/stk3310.c b/drivers/iio/light/stk3310.c | ||
650 | index 45cf8b0a43637..ed9cf1ffec7bc 100644 | ||
651 | --- a/drivers/iio/light/stk3310.c | ||
652 | +++ b/drivers/iio/light/stk3310.c | ||
653 | @@ -546,9 +546,8 @@ static irqreturn_t stk3310_irq_event_handler(int irq, void *private) | ||
654 | mutex_lock(&data->lock); | ||
655 | ret = regmap_field_read(data->reg_flag_nf, &dir); | ||
656 | if (ret < 0) { | ||
657 | - dev_err(&data->client->dev, "register read failed\n"); | ||
658 | - mutex_unlock(&data->lock); | ||
659 | - return ret; | ||
660 | + dev_err(&data->client->dev, "register read failed: %d\n", ret); | ||
661 | + goto out; | ||
662 | } | ||
663 | event = IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, 1, | ||
664 | IIO_EV_TYPE_THRESH, | ||
665 | @@ -560,6 +559,7 @@ static irqreturn_t stk3310_irq_event_handler(int irq, void *private) | ||
666 | ret = regmap_field_write(data->reg_flag_psint, 0); | ||
667 | if (ret < 0) | ||
668 | dev_err(&data->client->dev, "failed to reset interrupts\n"); | ||
669 | +out: | ||
670 | mutex_unlock(&data->lock); | ||
671 | |||
672 | return IRQ_HANDLED; | ||
673 | diff --git a/drivers/infiniband/hw/hfi1/init.c b/drivers/infiniband/hw/hfi1/init.c | ||
674 | index 9dc8cf096e2ea..93ace2609bdd1 100644 | ||
675 | --- a/drivers/infiniband/hw/hfi1/init.c | ||
676 | +++ b/drivers/infiniband/hw/hfi1/init.c | ||
677 | @@ -955,7 +955,7 @@ void hfi1_free_ctxtdata(struct hfi1_devdata *dd, struct hfi1_ctxtdata *rcd) | ||
678 | kfree(rcd->egrbufs.rcvtids); | ||
679 | |||
680 | for (e = 0; e < rcd->egrbufs.alloced; e++) { | ||
681 | - if (rcd->egrbufs.buffers[e].dma) | ||
682 | + if (rcd->egrbufs.buffers[e].addr) | ||
683 | dma_free_coherent(&dd->pcidev->dev, | ||
684 | rcd->egrbufs.buffers[e].len, | ||
685 | rcd->egrbufs.buffers[e].addr, | ||
686 | diff --git a/drivers/irqchip/irq-armada-370-xp.c b/drivers/irqchip/irq-armada-370-xp.c | ||
687 | index 8bcee65a0b8c9..ace01a626b098 100644 | ||
688 | --- a/drivers/irqchip/irq-armada-370-xp.c | ||
689 | +++ b/drivers/irqchip/irq-armada-370-xp.c | ||
690 | @@ -153,16 +153,12 @@ static int armada_370_xp_msi_alloc(struct irq_domain *domain, unsigned int virq, | ||
691 | int hwirq, i; | ||
692 | |||
693 | mutex_lock(&msi_used_lock); | ||
694 | + hwirq = bitmap_find_free_region(msi_used, PCI_MSI_DOORBELL_NR, | ||
695 | + order_base_2(nr_irqs)); | ||
696 | + mutex_unlock(&msi_used_lock); | ||
697 | |||
698 | - hwirq = bitmap_find_next_zero_area(msi_used, PCI_MSI_DOORBELL_NR, | ||
699 | - 0, nr_irqs, 0); | ||
700 | - if (hwirq >= PCI_MSI_DOORBELL_NR) { | ||
701 | - mutex_unlock(&msi_used_lock); | ||
702 | + if (hwirq < 0) | ||
703 | return -ENOSPC; | ||
704 | - } | ||
705 | - | ||
706 | - bitmap_set(msi_used, hwirq, nr_irqs); | ||
707 | - mutex_unlock(&msi_used_lock); | ||
708 | |||
709 | for (i = 0; i < nr_irqs; i++) { | ||
710 | irq_domain_set_info(domain, virq + i, hwirq + i, | ||
711 | @@ -171,7 +167,7 @@ static int armada_370_xp_msi_alloc(struct irq_domain *domain, unsigned int virq, | ||
712 | NULL, NULL); | ||
713 | } | ||
714 | |||
715 | - return hwirq; | ||
716 | + return 0; | ||
717 | } | ||
718 | |||
719 | static void armada_370_xp_msi_free(struct irq_domain *domain, | ||
720 | @@ -180,7 +176,7 @@ static void armada_370_xp_msi_free(struct irq_domain *domain, | ||
721 | struct irq_data *d = irq_domain_get_irq_data(domain, virq); | ||
722 | |||
723 | mutex_lock(&msi_used_lock); | ||
724 | - bitmap_clear(msi_used, d->hwirq, nr_irqs); | ||
725 | + bitmap_release_region(msi_used, d->hwirq, order_base_2(nr_irqs)); | ||
726 | mutex_unlock(&msi_used_lock); | ||
727 | } | ||
728 | |||
729 | diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c | ||
730 | index d1efbb8dadc53..a964e381cbb81 100644 | ||
731 | --- a/drivers/irqchip/irq-gic-v3-its.c | ||
732 | +++ b/drivers/irqchip/irq-gic-v3-its.c | ||
733 | @@ -369,7 +369,7 @@ static struct its_collection *its_build_invall_cmd(struct its_cmd_block *cmd, | ||
734 | |||
735 | its_fixup_cmd(cmd); | ||
736 | |||
737 | - return NULL; | ||
738 | + return desc->its_invall_cmd.col; | ||
739 | } | ||
740 | |||
741 | static u64 its_cmd_ptr_to_offset(struct its_node *its, | ||
742 | diff --git a/drivers/irqchip/irq-nvic.c b/drivers/irqchip/irq-nvic.c | ||
743 | index b1777104fd9fe..9694529b709de 100644 | ||
744 | --- a/drivers/irqchip/irq-nvic.c | ||
745 | +++ b/drivers/irqchip/irq-nvic.c | ||
746 | @@ -29,7 +29,7 @@ | ||
747 | |||
748 | #define NVIC_ISER 0x000 | ||
749 | #define NVIC_ICER 0x080 | ||
750 | -#define NVIC_IPR 0x300 | ||
751 | +#define NVIC_IPR 0x400 | ||
752 | |||
753 | #define NVIC_MAX_BANKS 16 | ||
754 | /* | ||
755 | diff --git a/drivers/net/can/pch_can.c b/drivers/net/can/pch_can.c | ||
756 | index c1317889d3d8d..ced11ea892698 100644 | ||
757 | --- a/drivers/net/can/pch_can.c | ||
758 | +++ b/drivers/net/can/pch_can.c | ||
759 | @@ -703,11 +703,11 @@ static int pch_can_rx_normal(struct net_device *ndev, u32 obj_num, int quota) | ||
760 | cf->data[i + 1] = data_reg >> 8; | ||
761 | } | ||
762 | |||
763 | - netif_receive_skb(skb); | ||
764 | rcv_pkts++; | ||
765 | stats->rx_packets++; | ||
766 | quota--; | ||
767 | stats->rx_bytes += cf->can_dlc; | ||
768 | + netif_receive_skb(skb); | ||
769 | |||
770 | pch_fifo_thresh(priv, obj_num); | ||
771 | obj_num++; | ||
772 | diff --git a/drivers/net/can/sja1000/ems_pcmcia.c b/drivers/net/can/sja1000/ems_pcmcia.c | ||
773 | index 381de998d2f16..fef5c59c0f4ca 100644 | ||
774 | --- a/drivers/net/can/sja1000/ems_pcmcia.c | ||
775 | +++ b/drivers/net/can/sja1000/ems_pcmcia.c | ||
776 | @@ -243,7 +243,12 @@ static int ems_pcmcia_add_card(struct pcmcia_device *pdev, unsigned long base) | ||
777 | free_sja1000dev(dev); | ||
778 | } | ||
779 | |||
780 | - err = request_irq(dev->irq, &ems_pcmcia_interrupt, IRQF_SHARED, | ||
781 | + if (!card->channels) { | ||
782 | + err = -ENODEV; | ||
783 | + goto failure_cleanup; | ||
784 | + } | ||
785 | + | ||
786 | + err = request_irq(pdev->irq, &ems_pcmcia_interrupt, IRQF_SHARED, | ||
787 | DRV_NAME, card); | ||
788 | if (!err) | ||
789 | return 0; | ||
790 | diff --git a/drivers/net/ethernet/altera/altera_tse_main.c b/drivers/net/ethernet/altera/altera_tse_main.c | ||
791 | index e306342506f1f..e02b99f77b1ca 100644 | ||
792 | --- a/drivers/net/ethernet/altera/altera_tse_main.c | ||
793 | +++ b/drivers/net/ethernet/altera/altera_tse_main.c | ||
794 | @@ -1361,16 +1361,19 @@ static int altera_tse_probe(struct platform_device *pdev) | ||
795 | priv->rxdescmem_busaddr = dma_res->start; | ||
796 | |||
797 | } else { | ||
798 | + ret = -ENODEV; | ||
799 | goto err_free_netdev; | ||
800 | } | ||
801 | |||
802 | - if (!dma_set_mask(priv->device, DMA_BIT_MASK(priv->dmaops->dmamask))) | ||
803 | + if (!dma_set_mask(priv->device, DMA_BIT_MASK(priv->dmaops->dmamask))) { | ||
804 | dma_set_coherent_mask(priv->device, | ||
805 | DMA_BIT_MASK(priv->dmaops->dmamask)); | ||
806 | - else if (!dma_set_mask(priv->device, DMA_BIT_MASK(32))) | ||
807 | + } else if (!dma_set_mask(priv->device, DMA_BIT_MASK(32))) { | ||
808 | dma_set_coherent_mask(priv->device, DMA_BIT_MASK(32)); | ||
809 | - else | ||
810 | + } else { | ||
811 | + ret = -EIO; | ||
812 | goto err_free_netdev; | ||
813 | + } | ||
814 | |||
815 | /* MAC address space */ | ||
816 | ret = request_and_map(pdev, "control_port", &control_port, | ||
817 | diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h | ||
818 | index 5ea740b4cf14c..b4e23ab108527 100644 | ||
819 | --- a/drivers/net/ethernet/freescale/fec.h | ||
820 | +++ b/drivers/net/ethernet/freescale/fec.h | ||
821 | @@ -371,6 +371,9 @@ struct bufdesc_ex { | ||
822 | #define FEC_ENET_WAKEUP ((uint)0x00020000) /* Wakeup request */ | ||
823 | #define FEC_ENET_TXF (FEC_ENET_TXF_0 | FEC_ENET_TXF_1 | FEC_ENET_TXF_2) | ||
824 | #define FEC_ENET_RXF (FEC_ENET_RXF_0 | FEC_ENET_RXF_1 | FEC_ENET_RXF_2) | ||
825 | +#define FEC_ENET_RXF_GET(X) (((X) == 0) ? FEC_ENET_RXF_0 : \ | ||
826 | + (((X) == 1) ? FEC_ENET_RXF_1 : \ | ||
827 | + FEC_ENET_RXF_2)) | ||
828 | #define FEC_ENET_TS_AVAIL ((uint)0x00010000) | ||
829 | #define FEC_ENET_TS_TIMER ((uint)0x00008000) | ||
830 | |||
831 | diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c | ||
832 | index 5fc40f025d214..c06ac5f66a17c 100644 | ||
833 | --- a/drivers/net/ethernet/freescale/fec_main.c | ||
834 | +++ b/drivers/net/ethernet/freescale/fec_main.c | ||
835 | @@ -1380,7 +1380,7 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id) | ||
836 | break; | ||
837 | pkt_received++; | ||
838 | |||
839 | - writel(FEC_ENET_RXF, fep->hwp + FEC_IEVENT); | ||
840 | + writel(FEC_ENET_RXF_GET(queue_id), fep->hwp + FEC_IEVENT); | ||
841 | |||
842 | /* Check for errors. */ | ||
843 | status ^= BD_ENET_RX_LAST; | ||
844 | diff --git a/drivers/net/ethernet/qlogic/qla3xxx.c b/drivers/net/ethernet/qlogic/qla3xxx.c | ||
845 | index cb9d43c871c4c..147effc16316f 100644 | ||
846 | --- a/drivers/net/ethernet/qlogic/qla3xxx.c | ||
847 | +++ b/drivers/net/ethernet/qlogic/qla3xxx.c | ||
848 | @@ -3491,20 +3491,19 @@ static int ql_adapter_up(struct ql3_adapter *qdev) | ||
849 | |||
850 | spin_lock_irqsave(&qdev->hw_lock, hw_flags); | ||
851 | |||
852 | - err = ql_wait_for_drvr_lock(qdev); | ||
853 | - if (err) { | ||
854 | - err = ql_adapter_initialize(qdev); | ||
855 | - if (err) { | ||
856 | - netdev_err(ndev, "Unable to initialize adapter\n"); | ||
857 | - goto err_init; | ||
858 | - } | ||
859 | - netdev_err(ndev, "Releasing driver lock\n"); | ||
860 | - ql_sem_unlock(qdev, QL_DRVR_SEM_MASK); | ||
861 | - } else { | ||
862 | + if (!ql_wait_for_drvr_lock(qdev)) { | ||
863 | netdev_err(ndev, "Could not acquire driver lock\n"); | ||
864 | + err = -ENODEV; | ||
865 | goto err_lock; | ||
866 | } | ||
867 | |||
868 | + err = ql_adapter_initialize(qdev); | ||
869 | + if (err) { | ||
870 | + netdev_err(ndev, "Unable to initialize adapter\n"); | ||
871 | + goto err_init; | ||
872 | + } | ||
873 | + ql_sem_unlock(qdev, QL_DRVR_SEM_MASK); | ||
874 | + | ||
875 | spin_unlock_irqrestore(&qdev->hw_lock, hw_flags); | ||
876 | |||
877 | set_bit(QL_ADAPTER_UP, &qdev->flags); | ||
878 | diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c | ||
879 | index 5a5db2f09f788..8ed525a063cfb 100644 | ||
880 | --- a/drivers/net/usb/cdc_ncm.c | ||
881 | +++ b/drivers/net/usb/cdc_ncm.c | ||
882 | @@ -175,6 +175,8 @@ static u32 cdc_ncm_check_tx_max(struct usbnet *dev, u32 new_tx) | ||
883 | /* clamp new_tx to sane values */ | ||
884 | min = ctx->max_datagram_size + ctx->max_ndp_size + sizeof(struct usb_cdc_ncm_nth16); | ||
885 | max = min_t(u32, CDC_NCM_NTB_MAX_SIZE_TX, le32_to_cpu(ctx->ncm_parm.dwNtbOutMaxSize)); | ||
886 | + if (max == 0) | ||
887 | + max = CDC_NCM_NTB_MAX_SIZE_TX; /* dwNtbOutMaxSize not set */ | ||
888 | |||
889 | /* some devices set dwNtbOutMaxSize too low for the above default */ | ||
890 | min = min(min, max); | ||
891 | diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c | ||
892 | index 34081f03b1f56..fc55f7e31c4b2 100644 | ||
893 | --- a/drivers/usb/core/config.c | ||
894 | +++ b/drivers/usb/core/config.c | ||
895 | @@ -404,7 +404,7 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno, | ||
896 | * the USB-2 spec requires such endpoints to have wMaxPacketSize = 0 | ||
897 | * (see the end of section 5.6.3), so don't warn about them. | ||
898 | */ | ||
899 | - maxp = usb_endpoint_maxp(&endpoint->desc); | ||
900 | + maxp = le16_to_cpu(endpoint->desc.wMaxPacketSize); | ||
901 | if (maxp == 0 && !(usb_endpoint_xfer_isoc(d) && asnum == 0)) { | ||
902 | dev_warn(ddev, "config %d interface %d altsetting %d endpoint 0x%X has invalid wMaxPacketSize 0\n", | ||
903 | cfgno, inum, asnum, d->bEndpointAddress); | ||
904 | @@ -420,9 +420,9 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno, | ||
905 | maxpacket_maxes = full_speed_maxpacket_maxes; | ||
906 | break; | ||
907 | case USB_SPEED_HIGH: | ||
908 | - /* Bits 12..11 are allowed only for HS periodic endpoints */ | ||
909 | + /* Multiple-transactions bits are allowed only for HS periodic endpoints */ | ||
910 | if (usb_endpoint_xfer_int(d) || usb_endpoint_xfer_isoc(d)) { | ||
911 | - i = maxp & (BIT(12) | BIT(11)); | ||
912 | + i = maxp & USB_EP_MAXP_MULT_MASK; | ||
913 | maxp &= ~i; | ||
914 | } | ||
915 | /* fallthrough */ | ||
916 | diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c | ||
917 | index 438efa36552c8..3d14a316830a6 100644 | ||
918 | --- a/drivers/usb/gadget/composite.c | ||
919 | +++ b/drivers/usb/gadget/composite.c | ||
920 | @@ -1631,6 +1631,18 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) | ||
921 | struct usb_function *f = NULL; | ||
922 | u8 endp; | ||
923 | |||
924 | + if (w_length > USB_COMP_EP0_BUFSIZ) { | ||
925 | + if (ctrl->bRequestType == USB_DIR_OUT) { | ||
926 | + goto done; | ||
927 | + } else { | ||
928 | + /* Cast away the const, we are going to overwrite on purpose. */ | ||
929 | + __le16 *temp = (__le16 *)&ctrl->wLength; | ||
930 | + | ||
931 | + *temp = cpu_to_le16(USB_COMP_EP0_BUFSIZ); | ||
932 | + w_length = USB_COMP_EP0_BUFSIZ; | ||
933 | + } | ||
934 | + } | ||
935 | + | ||
936 | /* partial re-init of the response message; the function or the | ||
937 | * gadget might need to intercept e.g. a control-OUT completion | ||
938 | * when we delegate to it. | ||
939 | @@ -2171,7 +2183,7 @@ int composite_dev_prepare(struct usb_composite_driver *composite, | ||
940 | if (!cdev->req) | ||
941 | return -ENOMEM; | ||
942 | |||
943 | - cdev->req->buf = kmalloc(USB_COMP_EP0_BUFSIZ, GFP_KERNEL); | ||
944 | + cdev->req->buf = kzalloc(USB_COMP_EP0_BUFSIZ, GFP_KERNEL); | ||
945 | if (!cdev->req->buf) | ||
946 | goto fail; | ||
947 | |||
948 | diff --git a/drivers/usb/gadget/legacy/dbgp.c b/drivers/usb/gadget/legacy/dbgp.c | ||
949 | index 99ca3dabc4f34..f1c5a22704b28 100644 | ||
950 | --- a/drivers/usb/gadget/legacy/dbgp.c | ||
951 | +++ b/drivers/usb/gadget/legacy/dbgp.c | ||
952 | @@ -136,7 +136,7 @@ static int dbgp_enable_ep_req(struct usb_ep *ep) | ||
953 | goto fail_1; | ||
954 | } | ||
955 | |||
956 | - req->buf = kmalloc(DBGP_REQ_LEN, GFP_KERNEL); | ||
957 | + req->buf = kzalloc(DBGP_REQ_LEN, GFP_KERNEL); | ||
958 | if (!req->buf) { | ||
959 | err = -ENOMEM; | ||
960 | stp = 2; | ||
961 | @@ -344,6 +344,19 @@ static int dbgp_setup(struct usb_gadget *gadget, | ||
962 | void *data = NULL; | ||
963 | u16 len = 0; | ||
964 | |||
965 | + if (length > DBGP_REQ_LEN) { | ||
966 | + if (ctrl->bRequestType == USB_DIR_OUT) { | ||
967 | + return err; | ||
968 | + } else { | ||
969 | + /* Cast away the const, we are going to overwrite on purpose. */ | ||
970 | + __le16 *temp = (__le16 *)&ctrl->wLength; | ||
971 | + | ||
972 | + *temp = cpu_to_le16(DBGP_REQ_LEN); | ||
973 | + length = DBGP_REQ_LEN; | ||
974 | + } | ||
975 | + } | ||
976 | + | ||
977 | + | ||
978 | if (request == USB_REQ_GET_DESCRIPTOR) { | ||
979 | switch (value>>8) { | ||
980 | case USB_DT_DEVICE: | ||
981 | diff --git a/drivers/usb/gadget/legacy/inode.c b/drivers/usb/gadget/legacy/inode.c | ||
982 | index de0f3c2c9f6f3..d39bd1a1ab8fc 100644 | ||
983 | --- a/drivers/usb/gadget/legacy/inode.c | ||
984 | +++ b/drivers/usb/gadget/legacy/inode.c | ||
985 | @@ -113,6 +113,8 @@ enum ep0_state { | ||
986 | /* enough for the whole queue: most events invalidate others */ | ||
987 | #define N_EVENT 5 | ||
988 | |||
989 | +#define RBUF_SIZE 256 | ||
990 | + | ||
991 | struct dev_data { | ||
992 | spinlock_t lock; | ||
993 | atomic_t count; | ||
994 | @@ -147,7 +149,7 @@ struct dev_data { | ||
995 | struct dentry *dentry; | ||
996 | |||
997 | /* except this scratch i/o buffer for ep0 */ | ||
998 | - u8 rbuf [256]; | ||
999 | + u8 rbuf[RBUF_SIZE]; | ||
1000 | }; | ||
1001 | |||
1002 | static inline void get_dev (struct dev_data *data) | ||
1003 | @@ -1336,6 +1338,18 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) | ||
1004 | u16 w_value = le16_to_cpu(ctrl->wValue); | ||
1005 | u16 w_length = le16_to_cpu(ctrl->wLength); | ||
1006 | |||
1007 | + if (w_length > RBUF_SIZE) { | ||
1008 | + if (ctrl->bRequestType == USB_DIR_OUT) { | ||
1009 | + return value; | ||
1010 | + } else { | ||
1011 | + /* Cast away the const, we are going to overwrite on purpose. */ | ||
1012 | + __le16 *temp = (__le16 *)&ctrl->wLength; | ||
1013 | + | ||
1014 | + *temp = cpu_to_le16(RBUF_SIZE); | ||
1015 | + w_length = RBUF_SIZE; | ||
1016 | + } | ||
1017 | + } | ||
1018 | + | ||
1019 | spin_lock (&dev->lock); | ||
1020 | dev->setup_abort = 0; | ||
1021 | if (dev->state == STATE_DEV_UNCONNECTED) { | ||
1022 | diff --git a/fs/signalfd.c b/fs/signalfd.c | ||
1023 | index 270221fcef42c..9c5fa0ab5e0fe 100644 | ||
1024 | --- a/fs/signalfd.c | ||
1025 | +++ b/fs/signalfd.c | ||
1026 | @@ -34,17 +34,7 @@ | ||
1027 | |||
1028 | void signalfd_cleanup(struct sighand_struct *sighand) | ||
1029 | { | ||
1030 | - wait_queue_head_t *wqh = &sighand->signalfd_wqh; | ||
1031 | - /* | ||
1032 | - * The lockless check can race with remove_wait_queue() in progress, | ||
1033 | - * but in this case its caller should run under rcu_read_lock() and | ||
1034 | - * sighand_cachep is SLAB_DESTROY_BY_RCU, we can safely return. | ||
1035 | - */ | ||
1036 | - if (likely(!waitqueue_active(wqh))) | ||
1037 | - return; | ||
1038 | - | ||
1039 | - /* wait_queue_t->func(POLLFREE) should do remove_wait_queue() */ | ||
1040 | - wake_up_poll(wqh, POLLHUP | POLLFREE); | ||
1041 | + wake_up_pollfree(&sighand->signalfd_wqh); | ||
1042 | } | ||
1043 | |||
1044 | struct signalfd_ctx { | ||
1045 | diff --git a/fs/tracefs/inode.c b/fs/tracefs/inode.c | ||
1046 | index 985cccfcedad9..e00594ad99724 100644 | ||
1047 | --- a/fs/tracefs/inode.c | ||
1048 | +++ b/fs/tracefs/inode.c | ||
1049 | @@ -162,6 +162,77 @@ struct tracefs_fs_info { | ||
1050 | struct tracefs_mount_opts mount_opts; | ||
1051 | }; | ||
1052 | |||
1053 | +static void change_gid(struct dentry *dentry, kgid_t gid) | ||
1054 | +{ | ||
1055 | + if (!dentry->d_inode) | ||
1056 | + return; | ||
1057 | + dentry->d_inode->i_gid = gid; | ||
1058 | +} | ||
1059 | + | ||
1060 | +/* | ||
1061 | + * Taken from d_walk, but without he need for handling renames. | ||
1062 | + * Nothing can be renamed while walking the list, as tracefs | ||
1063 | + * does not support renames. This is only called when mounting | ||
1064 | + * or remounting the file system, to set all the files to | ||
1065 | + * the given gid. | ||
1066 | + */ | ||
1067 | +static void set_gid(struct dentry *parent, kgid_t gid) | ||
1068 | +{ | ||
1069 | + struct dentry *this_parent; | ||
1070 | + struct list_head *next; | ||
1071 | + | ||
1072 | + this_parent = parent; | ||
1073 | + spin_lock(&this_parent->d_lock); | ||
1074 | + | ||
1075 | + change_gid(this_parent, gid); | ||
1076 | +repeat: | ||
1077 | + next = this_parent->d_subdirs.next; | ||
1078 | +resume: | ||
1079 | + while (next != &this_parent->d_subdirs) { | ||
1080 | + struct list_head *tmp = next; | ||
1081 | + struct dentry *dentry = list_entry(tmp, struct dentry, d_child); | ||
1082 | + next = tmp->next; | ||
1083 | + | ||
1084 | + spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED); | ||
1085 | + | ||
1086 | + change_gid(dentry, gid); | ||
1087 | + | ||
1088 | + if (!list_empty(&dentry->d_subdirs)) { | ||
1089 | + spin_unlock(&this_parent->d_lock); | ||
1090 | + spin_release(&dentry->d_lock.dep_map, 1, _RET_IP_); | ||
1091 | + this_parent = dentry; | ||
1092 | + spin_acquire(&this_parent->d_lock.dep_map, 0, 1, _RET_IP_); | ||
1093 | + goto repeat; | ||
1094 | + } | ||
1095 | + spin_unlock(&dentry->d_lock); | ||
1096 | + } | ||
1097 | + /* | ||
1098 | + * All done at this level ... ascend and resume the search. | ||
1099 | + */ | ||
1100 | + rcu_read_lock(); | ||
1101 | +ascend: | ||
1102 | + if (this_parent != parent) { | ||
1103 | + struct dentry *child = this_parent; | ||
1104 | + this_parent = child->d_parent; | ||
1105 | + | ||
1106 | + spin_unlock(&child->d_lock); | ||
1107 | + spin_lock(&this_parent->d_lock); | ||
1108 | + | ||
1109 | + /* go into the first sibling still alive */ | ||
1110 | + do { | ||
1111 | + next = child->d_child.next; | ||
1112 | + if (next == &this_parent->d_subdirs) | ||
1113 | + goto ascend; | ||
1114 | + child = list_entry(next, struct dentry, d_child); | ||
1115 | + } while (unlikely(child->d_flags & DCACHE_DENTRY_KILLED)); | ||
1116 | + rcu_read_unlock(); | ||
1117 | + goto resume; | ||
1118 | + } | ||
1119 | + rcu_read_unlock(); | ||
1120 | + spin_unlock(&this_parent->d_lock); | ||
1121 | + return; | ||
1122 | +} | ||
1123 | + | ||
1124 | static int tracefs_parse_options(char *data, struct tracefs_mount_opts *opts) | ||
1125 | { | ||
1126 | substring_t args[MAX_OPT_ARGS]; | ||
1127 | @@ -194,6 +265,7 @@ static int tracefs_parse_options(char *data, struct tracefs_mount_opts *opts) | ||
1128 | if (!gid_valid(gid)) | ||
1129 | return -EINVAL; | ||
1130 | opts->gid = gid; | ||
1131 | + set_gid(tracefs_mount->mnt_root, gid); | ||
1132 | break; | ||
1133 | case Opt_mode: | ||
1134 | if (match_octal(&args[0], &option)) | ||
1135 | @@ -411,6 +483,8 @@ struct dentry *tracefs_create_file(const char *name, umode_t mode, | ||
1136 | inode->i_mode = mode; | ||
1137 | inode->i_fop = fops ? fops : &tracefs_file_operations; | ||
1138 | inode->i_private = data; | ||
1139 | + inode->i_uid = d_inode(dentry->d_parent)->i_uid; | ||
1140 | + inode->i_gid = d_inode(dentry->d_parent)->i_gid; | ||
1141 | d_instantiate(dentry, inode); | ||
1142 | fsnotify_create(dentry->d_parent->d_inode, dentry); | ||
1143 | return end_creating(dentry); | ||
1144 | @@ -433,6 +507,8 @@ static struct dentry *__create_dir(const char *name, struct dentry *parent, | ||
1145 | inode->i_mode = S_IFDIR | S_IRWXU | S_IRUSR| S_IRGRP | S_IXUSR | S_IXGRP; | ||
1146 | inode->i_op = ops; | ||
1147 | inode->i_fop = &simple_dir_operations; | ||
1148 | + inode->i_uid = d_inode(dentry->d_parent)->i_uid; | ||
1149 | + inode->i_gid = d_inode(dentry->d_parent)->i_gid; | ||
1150 | |||
1151 | /* directory inodes start off with i_nlink == 2 (for "." entry) */ | ||
1152 | inc_nlink(inode); | ||
1153 | diff --git a/include/linux/hid.h b/include/linux/hid.h | ||
1154 | index 2ed6850356ead..a07fa623fd0c2 100644 | ||
1155 | --- a/include/linux/hid.h | ||
1156 | +++ b/include/linux/hid.h | ||
1157 | @@ -762,6 +762,22 @@ struct hid_ll_driver { | ||
1158 | int (*idle)(struct hid_device *hdev, int report, int idle, int reqtype); | ||
1159 | }; | ||
1160 | |||
1161 | +extern struct hid_ll_driver i2c_hid_ll_driver; | ||
1162 | +extern struct hid_ll_driver hidp_hid_driver; | ||
1163 | +extern struct hid_ll_driver uhid_hid_driver; | ||
1164 | +extern struct hid_ll_driver usb_hid_driver; | ||
1165 | + | ||
1166 | +static inline bool hid_is_using_ll_driver(struct hid_device *hdev, | ||
1167 | + struct hid_ll_driver *driver) | ||
1168 | +{ | ||
1169 | + return hdev->ll_driver == driver; | ||
1170 | +} | ||
1171 | + | ||
1172 | +static inline bool hid_is_usb(struct hid_device *hdev) | ||
1173 | +{ | ||
1174 | + return hid_is_using_ll_driver(hdev, &usb_hid_driver); | ||
1175 | +} | ||
1176 | + | ||
1177 | #define PM_HINT_FULLON 1<<5 | ||
1178 | #define PM_HINT_NORMAL 1<<1 | ||
1179 | |||
1180 | diff --git a/include/linux/wait.h b/include/linux/wait.h | ||
1181 | index 2408e8d5c05cc..e022ee95bd45c 100644 | ||
1182 | --- a/include/linux/wait.h | ||
1183 | +++ b/include/linux/wait.h | ||
1184 | @@ -202,6 +202,7 @@ void __wake_up_locked_key(wait_queue_head_t *q, unsigned int mode, void *key); | ||
1185 | void __wake_up_sync_key(wait_queue_head_t *q, unsigned int mode, int nr, void *key); | ||
1186 | void __wake_up_locked(wait_queue_head_t *q, unsigned int mode, int nr); | ||
1187 | void __wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr); | ||
1188 | +void __wake_up_pollfree(wait_queue_head_t *wq_head); | ||
1189 | void __wake_up_bit(wait_queue_head_t *, void *, int); | ||
1190 | int __wait_on_bit(wait_queue_head_t *, struct wait_bit_queue *, wait_bit_action_f *, unsigned); | ||
1191 | int __wait_on_bit_lock(wait_queue_head_t *, struct wait_bit_queue *, wait_bit_action_f *, unsigned); | ||
1192 | @@ -236,6 +237,31 @@ wait_queue_head_t *bit_waitqueue(void *, int); | ||
1193 | #define wake_up_interruptible_sync_poll(x, m) \ | ||
1194 | __wake_up_sync_key((x), TASK_INTERRUPTIBLE, 1, (void *) (m)) | ||
1195 | |||
1196 | +/** | ||
1197 | + * wake_up_pollfree - signal that a polled waitqueue is going away | ||
1198 | + * @wq_head: the wait queue head | ||
1199 | + * | ||
1200 | + * In the very rare cases where a ->poll() implementation uses a waitqueue whose | ||
1201 | + * lifetime is tied to a task rather than to the 'struct file' being polled, | ||
1202 | + * this function must be called before the waitqueue is freed so that | ||
1203 | + * non-blocking polls (e.g. epoll) are notified that the queue is going away. | ||
1204 | + * | ||
1205 | + * The caller must also RCU-delay the freeing of the wait_queue_head, e.g. via | ||
1206 | + * an explicit synchronize_rcu() or call_rcu(), or via SLAB_DESTROY_BY_RCU. | ||
1207 | + */ | ||
1208 | +static inline void wake_up_pollfree(wait_queue_head_t *wq_head) | ||
1209 | +{ | ||
1210 | + /* | ||
1211 | + * For performance reasons, we don't always take the queue lock here. | ||
1212 | + * Therefore, we might race with someone removing the last entry from | ||
1213 | + * the queue, and proceed while they still hold the queue lock. | ||
1214 | + * However, rcu_read_lock() is required to be held in such cases, so we | ||
1215 | + * can safely proceed with an RCU-delayed free. | ||
1216 | + */ | ||
1217 | + if (waitqueue_active(wq_head)) | ||
1218 | + __wake_up_pollfree(wq_head); | ||
1219 | +} | ||
1220 | + | ||
1221 | #define ___wait_cond_timeout(condition) \ | ||
1222 | ({ \ | ||
1223 | bool __cond = (condition); \ | ||
1224 | diff --git a/kernel/sched/wait.c b/kernel/sched/wait.c | ||
1225 | index 9453efe9b25a6..133afaf05c3f4 100644 | ||
1226 | --- a/kernel/sched/wait.c | ||
1227 | +++ b/kernel/sched/wait.c | ||
1228 | @@ -10,6 +10,7 @@ | ||
1229 | #include <linux/wait.h> | ||
1230 | #include <linux/hash.h> | ||
1231 | #include <linux/kthread.h> | ||
1232 | +#include <linux/poll.h> | ||
1233 | |||
1234 | void __init_waitqueue_head(wait_queue_head_t *q, const char *name, struct lock_class_key *key) | ||
1235 | { | ||
1236 | @@ -156,6 +157,13 @@ void __wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr_exclusive) | ||
1237 | } | ||
1238 | EXPORT_SYMBOL_GPL(__wake_up_sync); /* For internal use only */ | ||
1239 | |||
1240 | +void __wake_up_pollfree(wait_queue_head_t *wq_head) | ||
1241 | +{ | ||
1242 | + __wake_up(wq_head, TASK_NORMAL, 0, (void *)(POLLHUP | POLLFREE)); | ||
1243 | + /* POLLFREE must have cleared the queue. */ | ||
1244 | + WARN_ON_ONCE(waitqueue_active(wq_head)); | ||
1245 | +} | ||
1246 | + | ||
1247 | /* | ||
1248 | * Note: we use "set_current_state()" _after_ the wait-queue add, | ||
1249 | * because we need a memory barrier there on SMP, so that any | ||
1250 | diff --git a/mm/backing-dev.c b/mm/backing-dev.c | ||
1251 | index aad61d0175a1c..09f123b3e7eb6 100644 | ||
1252 | --- a/mm/backing-dev.c | ||
1253 | +++ b/mm/backing-dev.c | ||
1254 | @@ -865,6 +865,13 @@ void bdi_unregister(struct backing_dev_info *bdi) | ||
1255 | wb_shutdown(&bdi->wb); | ||
1256 | cgwb_bdi_destroy(bdi); | ||
1257 | |||
1258 | + /* | ||
1259 | + * If this BDI's min ratio has been set, use bdi_set_min_ratio() to | ||
1260 | + * update the global bdi_min_ratio. | ||
1261 | + */ | ||
1262 | + if (bdi->min_ratio) | ||
1263 | + bdi_set_min_ratio(bdi, 0); | ||
1264 | + | ||
1265 | if (bdi->dev) { | ||
1266 | bdi_debug_unregister(bdi); | ||
1267 | device_unregister(bdi->dev); | ||
1268 | diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c | ||
1269 | index 9ec37c6c8c4aa..00f25e54119cf 100644 | ||
1270 | --- a/net/bluetooth/hidp/core.c | ||
1271 | +++ b/net/bluetooth/hidp/core.c | ||
1272 | @@ -734,7 +734,7 @@ static void hidp_stop(struct hid_device *hid) | ||
1273 | hid->claimed = 0; | ||
1274 | } | ||
1275 | |||
1276 | -static struct hid_ll_driver hidp_hid_driver = { | ||
1277 | +struct hid_ll_driver hidp_hid_driver = { | ||
1278 | .parse = hidp_parse, | ||
1279 | .start = hidp_start, | ||
1280 | .stop = hidp_stop, | ||
1281 | @@ -743,6 +743,7 @@ static struct hid_ll_driver hidp_hid_driver = { | ||
1282 | .raw_request = hidp_raw_request, | ||
1283 | .output_report = hidp_output_report, | ||
1284 | }; | ||
1285 | +EXPORT_SYMBOL_GPL(hidp_hid_driver); | ||
1286 | |||
1287 | /* This function sets up the hid device. It does not add it | ||
1288 | to the HID system. That is done in hidp_add_connection(). */ | ||
1289 | diff --git a/net/core/neighbour.c b/net/core/neighbour.c | ||
1290 | index 2aa5c231560d2..19e6049058d18 100644 | ||
1291 | --- a/net/core/neighbour.c | ||
1292 | +++ b/net/core/neighbour.c | ||
1293 | @@ -597,7 +597,7 @@ struct pneigh_entry * pneigh_lookup(struct neigh_table *tbl, | ||
1294 | |||
1295 | ASSERT_RTNL(); | ||
1296 | |||
1297 | - n = kmalloc(sizeof(*n) + key_len, GFP_KERNEL); | ||
1298 | + n = kzalloc(sizeof(*n) + key_len, GFP_KERNEL); | ||
1299 | if (!n) | ||
1300 | goto out; | ||
1301 | |||
1302 | diff --git a/net/nfc/netlink.c b/net/nfc/netlink.c | ||
1303 | index f326a6ea35fc7..27ad73861a33f 100644 | ||
1304 | --- a/net/nfc/netlink.c | ||
1305 | +++ b/net/nfc/netlink.c | ||
1306 | @@ -1403,8 +1403,10 @@ static int nfc_genl_dump_ses_done(struct netlink_callback *cb) | ||
1307 | { | ||
1308 | struct class_dev_iter *iter = (struct class_dev_iter *) cb->args[0]; | ||
1309 | |||
1310 | - nfc_device_iter_exit(iter); | ||
1311 | - kfree(iter); | ||
1312 | + if (iter) { | ||
1313 | + nfc_device_iter_exit(iter); | ||
1314 | + kfree(iter); | ||
1315 | + } | ||
1316 | |||
1317 | return 0; | ||
1318 | } | ||
1319 | diff --git a/sound/core/control_compat.c b/sound/core/control_compat.c | ||
1320 | index 84ee29c3b1a0b..be5ca6f58e55a 100644 | ||
1321 | --- a/sound/core/control_compat.c | ||
1322 | +++ b/sound/core/control_compat.c | ||
1323 | @@ -281,6 +281,7 @@ static int copy_ctl_value_to_user(void __user *userdata, | ||
1324 | struct snd_ctl_elem_value *data, | ||
1325 | int type, int count) | ||
1326 | { | ||
1327 | + struct snd_ctl_elem_value32 __user *data32 = userdata; | ||
1328 | int i, size; | ||
1329 | |||
1330 | if (type == SNDRV_CTL_ELEM_TYPE_BOOLEAN || | ||
1331 | @@ -297,6 +298,8 @@ static int copy_ctl_value_to_user(void __user *userdata, | ||
1332 | if (copy_to_user(valuep, data->value.bytes.data, size)) | ||
1333 | return -EFAULT; | ||
1334 | } | ||
1335 | + if (copy_to_user(&data32->id, &data->id, sizeof(data32->id))) | ||
1336 | + return -EFAULT; | ||
1337 | return 0; | ||
1338 | } | ||
1339 | |||
1340 | diff --git a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c | ||
1341 | index c2fb5198d5d56..0ce3f42721c4d 100644 | ||
1342 | --- a/sound/core/oss/pcm_oss.c | ||
1343 | +++ b/sound/core/oss/pcm_oss.c | ||
1344 | @@ -173,7 +173,7 @@ snd_pcm_hw_param_value_min(const struct snd_pcm_hw_params *params, | ||
1345 | * | ||
1346 | * Return the maximum value for field PAR. | ||
1347 | */ | ||
1348 | -static unsigned int | ||
1349 | +static int | ||
1350 | snd_pcm_hw_param_value_max(const struct snd_pcm_hw_params *params, | ||
1351 | snd_pcm_hw_param_t var, int *dir) | ||
1352 | { | ||
1353 | @@ -708,18 +708,24 @@ static int snd_pcm_oss_period_size(struct snd_pcm_substream *substream, | ||
1354 | struct snd_pcm_hw_params *oss_params, | ||
1355 | struct snd_pcm_hw_params *slave_params) | ||
1356 | { | ||
1357 | - size_t s; | ||
1358 | - size_t oss_buffer_size, oss_period_size, oss_periods; | ||
1359 | - size_t min_period_size, max_period_size; | ||
1360 | + ssize_t s; | ||
1361 | + ssize_t oss_buffer_size; | ||
1362 | + ssize_t oss_period_size, oss_periods; | ||
1363 | + ssize_t min_period_size, max_period_size; | ||
1364 | struct snd_pcm_runtime *runtime = substream->runtime; | ||
1365 | size_t oss_frame_size; | ||
1366 | |||
1367 | oss_frame_size = snd_pcm_format_physical_width(params_format(oss_params)) * | ||
1368 | params_channels(oss_params) / 8; | ||
1369 | |||
1370 | + oss_buffer_size = snd_pcm_hw_param_value_max(slave_params, | ||
1371 | + SNDRV_PCM_HW_PARAM_BUFFER_SIZE, | ||
1372 | + NULL); | ||
1373 | + if (oss_buffer_size <= 0) | ||
1374 | + return -EINVAL; | ||
1375 | oss_buffer_size = snd_pcm_plug_client_size(substream, | ||
1376 | - snd_pcm_hw_param_value_max(slave_params, SNDRV_PCM_HW_PARAM_BUFFER_SIZE, NULL)) * oss_frame_size; | ||
1377 | - if (!oss_buffer_size) | ||
1378 | + oss_buffer_size * oss_frame_size); | ||
1379 | + if (oss_buffer_size <= 0) | ||
1380 | return -EINVAL; | ||
1381 | oss_buffer_size = rounddown_pow_of_two(oss_buffer_size); | ||
1382 | if (atomic_read(&substream->mmap_count)) { | ||
1383 | @@ -756,7 +762,7 @@ static int snd_pcm_oss_period_size(struct snd_pcm_substream *substream, | ||
1384 | |||
1385 | min_period_size = snd_pcm_plug_client_size(substream, | ||
1386 | snd_pcm_hw_param_value_min(slave_params, SNDRV_PCM_HW_PARAM_PERIOD_SIZE, NULL)); | ||
1387 | - if (min_period_size) { | ||
1388 | + if (min_period_size > 0) { | ||
1389 | min_period_size *= oss_frame_size; | ||
1390 | min_period_size = roundup_pow_of_two(min_period_size); | ||
1391 | if (oss_period_size < min_period_size) | ||
1392 | @@ -765,7 +771,7 @@ static int snd_pcm_oss_period_size(struct snd_pcm_substream *substream, | ||
1393 | |||
1394 | max_period_size = snd_pcm_plug_client_size(substream, | ||
1395 | snd_pcm_hw_param_value_max(slave_params, SNDRV_PCM_HW_PARAM_PERIOD_SIZE, NULL)); | ||
1396 | - if (max_period_size) { | ||
1397 | + if (max_period_size > 0) { | ||
1398 | max_period_size *= oss_frame_size; | ||
1399 | max_period_size = rounddown_pow_of_two(max_period_size); | ||
1400 | if (oss_period_size > max_period_size) | ||
1401 | @@ -778,7 +784,7 @@ static int snd_pcm_oss_period_size(struct snd_pcm_substream *substream, | ||
1402 | oss_periods = substream->oss.setup.periods; | ||
1403 | |||
1404 | s = snd_pcm_hw_param_value_max(slave_params, SNDRV_PCM_HW_PARAM_PERIODS, NULL); | ||
1405 | - if (runtime->oss.maxfrags && s > runtime->oss.maxfrags) | ||
1406 | + if (s > 0 && runtime->oss.maxfrags && s > runtime->oss.maxfrags) | ||
1407 | s = runtime->oss.maxfrags; | ||
1408 | if (oss_periods > s) | ||
1409 | oss_periods = s; | ||
1410 | @@ -904,8 +910,15 @@ static int snd_pcm_oss_change_params_locked(struct snd_pcm_substream *substream) | ||
1411 | err = -EINVAL; | ||
1412 | goto failure; | ||
1413 | } | ||
1414 | - choose_rate(substream, sparams, runtime->oss.rate); | ||
1415 | - snd_pcm_hw_param_near(substream, sparams, SNDRV_PCM_HW_PARAM_CHANNELS, runtime->oss.channels, NULL); | ||
1416 | + | ||
1417 | + err = choose_rate(substream, sparams, runtime->oss.rate); | ||
1418 | + if (err < 0) | ||
1419 | + goto failure; | ||
1420 | + err = snd_pcm_hw_param_near(substream, sparams, | ||
1421 | + SNDRV_PCM_HW_PARAM_CHANNELS, | ||
1422 | + runtime->oss.channels, NULL); | ||
1423 | + if (err < 0) | ||
1424 | + goto failure; | ||
1425 | |||
1426 | format = snd_pcm_oss_format_from(runtime->oss.format); | ||
1427 | |||
1428 | @@ -2013,7 +2026,7 @@ static int snd_pcm_oss_set_fragment1(struct snd_pcm_substream *substream, unsign | ||
1429 | if (runtime->oss.subdivision || runtime->oss.fragshift) | ||
1430 | return -EINVAL; | ||
1431 | fragshift = val & 0xffff; | ||
1432 | - if (fragshift >= 31) | ||
1433 | + if (fragshift >= 25) /* should be large enough */ | ||
1434 | return -EINVAL; | ||
1435 | runtime->oss.fragshift = fragshift; | ||
1436 | runtime->oss.maxfrags = (val >> 16) & 0xffff; |