Annotation of /trunk/kernel-lts/patches-3.4/0155-3.4.56-all-fixes.patch
Parent Directory | Revision Log
Revision 2260 -
(hide annotations)
(download)
Mon Aug 19 09:25:36 2013 UTC (11 years, 1 month ago) by niro
File size: 51606 byte(s)
Mon Aug 19 09:25:36 2013 UTC (11 years, 1 month ago) by niro
File size: 51606 byte(s)
-linux-3.4.56
1 | niro | 2260 | diff --git a/Makefile b/Makefile |
2 | index c11116f..2fe1f6d 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,6 +1,6 @@ | ||
6 | VERSION = 3 | ||
7 | PATCHLEVEL = 4 | ||
8 | -SUBLEVEL = 55 | ||
9 | +SUBLEVEL = 56 | ||
10 | EXTRAVERSION = | ||
11 | NAME = Saber-toothed Squirrel | ||
12 | |||
13 | diff --git a/arch/powerpc/include/asm/module.h b/arch/powerpc/include/asm/module.h | ||
14 | index 0192a4e..80de64b 100644 | ||
15 | --- a/arch/powerpc/include/asm/module.h | ||
16 | +++ b/arch/powerpc/include/asm/module.h | ||
17 | @@ -87,10 +87,9 @@ struct exception_table_entry; | ||
18 | void sort_ex_table(struct exception_table_entry *start, | ||
19 | struct exception_table_entry *finish); | ||
20 | |||
21 | -#ifdef CONFIG_MODVERSIONS | ||
22 | +#if defined(CONFIG_MODVERSIONS) && defined(CONFIG_PPC64) | ||
23 | #define ARCH_RELOCATES_KCRCTAB | ||
24 | - | ||
25 | -extern const unsigned long reloc_start[]; | ||
26 | +#define reloc_start PHYSICAL_START | ||
27 | #endif | ||
28 | #endif /* __KERNEL__ */ | ||
29 | #endif /* _ASM_POWERPC_MODULE_H */ | ||
30 | diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S | ||
31 | index 65d1c08..7703569 100644 | ||
32 | --- a/arch/powerpc/kernel/vmlinux.lds.S | ||
33 | +++ b/arch/powerpc/kernel/vmlinux.lds.S | ||
34 | @@ -38,9 +38,6 @@ jiffies = jiffies_64 + 4; | ||
35 | #endif | ||
36 | SECTIONS | ||
37 | { | ||
38 | - . = 0; | ||
39 | - reloc_start = .; | ||
40 | - | ||
41 | . = KERNELBASE; | ||
42 | |||
43 | /* | ||
44 | diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h | ||
45 | index 011358c..2f36a66 100644 | ||
46 | --- a/arch/s390/include/asm/pgtable.h | ||
47 | +++ b/arch/s390/include/asm/pgtable.h | ||
48 | @@ -67,6 +67,10 @@ static inline int is_zero_pfn(unsigned long pfn) | ||
49 | |||
50 | #define my_zero_pfn(addr) page_to_pfn(ZERO_PAGE(addr)) | ||
51 | |||
52 | +/* TODO: s390 cannot support io_remap_pfn_range... */ | ||
53 | +#define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ | ||
54 | + remap_pfn_range(vma, vaddr, pfn, size, prot) | ||
55 | + | ||
56 | #endif /* !__ASSEMBLY__ */ | ||
57 | |||
58 | /* | ||
59 | diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c | ||
60 | index d985713..f81597f 100644 | ||
61 | --- a/drivers/acpi/acpi_memhotplug.c | ||
62 | +++ b/drivers/acpi/acpi_memhotplug.c | ||
63 | @@ -421,6 +421,7 @@ static int acpi_memory_device_add(struct acpi_device *device) | ||
64 | /* Get the range from the _CRS */ | ||
65 | result = acpi_memory_get_device_resources(mem_device); | ||
66 | if (result) { | ||
67 | + device->driver_data = NULL; | ||
68 | kfree(mem_device); | ||
69 | return result; | ||
70 | } | ||
71 | diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig | ||
72 | index 6bdedd7..1ad34ed 100644 | ||
73 | --- a/drivers/ata/Kconfig | ||
74 | +++ b/drivers/ata/Kconfig | ||
75 | @@ -93,7 +93,7 @@ config SATA_FSL | ||
76 | If unsure, say N. | ||
77 | |||
78 | config SATA_INIC162X | ||
79 | - tristate "Initio 162x SATA support" | ||
80 | + tristate "Initio 162x SATA support (Very Experimental)" | ||
81 | depends on PCI | ||
82 | help | ||
83 | This option enables support for Initio 162x Serial ATA. | ||
84 | diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c | ||
85 | index 45cc02b..9dbd3ae 100644 | ||
86 | --- a/drivers/ata/ata_piix.c | ||
87 | +++ b/drivers/ata/ata_piix.c | ||
88 | @@ -344,7 +344,7 @@ static const struct pci_device_id piix_pci_tbl[] = { | ||
89 | /* SATA Controller IDE (Wellsburg) */ | ||
90 | { 0x8086, 0x8d00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, | ||
91 | /* SATA Controller IDE (Wellsburg) */ | ||
92 | - { 0x8086, 0x8d08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | ||
93 | + { 0x8086, 0x8d08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_snb }, | ||
94 | /* SATA Controller IDE (Wellsburg) */ | ||
95 | { 0x8086, 0x8d60, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, | ||
96 | /* SATA Controller IDE (Wellsburg) */ | ||
97 | diff --git a/drivers/ata/sata_inic162x.c b/drivers/ata/sata_inic162x.c | ||
98 | index 5c7d70c..3a8b55e 100644 | ||
99 | --- a/drivers/ata/sata_inic162x.c | ||
100 | +++ b/drivers/ata/sata_inic162x.c | ||
101 | @@ -6,6 +6,18 @@ | ||
102 | * | ||
103 | * This file is released under GPL v2. | ||
104 | * | ||
105 | + * **** WARNING **** | ||
106 | + * | ||
107 | + * This driver never worked properly and unfortunately data corruption is | ||
108 | + * relatively common. There isn't anyone working on the driver and there's | ||
109 | + * no support from the vendor. Do not use this driver in any production | ||
110 | + * environment. | ||
111 | + * | ||
112 | + * http://thread.gmane.org/gmane.linux.debian.devel.bugs.rc/378525/focus=54491 | ||
113 | + * https://bugzilla.kernel.org/show_bug.cgi?id=60565 | ||
114 | + * | ||
115 | + * ***************** | ||
116 | + * | ||
117 | * This controller is eccentric and easily locks up if something isn't | ||
118 | * right. Documentation is available at initio's website but it only | ||
119 | * documents registers (not programming model). | ||
120 | @@ -809,6 +821,8 @@ static int inic_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
121 | |||
122 | ata_print_version_once(&pdev->dev, DRV_VERSION); | ||
123 | |||
124 | + dev_alert(&pdev->dev, "inic162x support is broken with common data corruption issues and will be disabled by default, contact linux-ide@vger.kernel.org if in production use\n"); | ||
125 | + | ||
126 | /* alloc host */ | ||
127 | host = ata_host_alloc_pinfo(&pdev->dev, ppi, NR_PORTS); | ||
128 | hpriv = devm_kzalloc(&pdev->dev, sizeof(*hpriv), GFP_KERNEL); | ||
129 | diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c | ||
130 | index 4fd1dea..4ed7bf9 100644 | ||
131 | --- a/drivers/block/xen-blkback/blkback.c | ||
132 | +++ b/drivers/block/xen-blkback/blkback.c | ||
133 | @@ -399,7 +399,18 @@ static int dispatch_discard_io(struct xen_blkif *blkif, | ||
134 | int status = BLKIF_RSP_OKAY; | ||
135 | struct block_device *bdev = blkif->vbd.bdev; | ||
136 | unsigned long secure; | ||
137 | + struct phys_req preq; | ||
138 | + | ||
139 | + preq.sector_number = req->u.discard.sector_number; | ||
140 | + preq.nr_sects = req->u.discard.nr_sectors; | ||
141 | |||
142 | + err = xen_vbd_translate(&preq, blkif, WRITE); | ||
143 | + if (err) { | ||
144 | + pr_warn(DRV_PFX "access denied: DISCARD [%llu->%llu] on dev=%04x\n", | ||
145 | + preq.sector_number, | ||
146 | + preq.sector_number + preq.nr_sects, blkif->vbd.pdevice); | ||
147 | + goto fail_response; | ||
148 | + } | ||
149 | blkif->st_ds_req++; | ||
150 | |||
151 | xen_blkif_get(blkif); | ||
152 | @@ -410,7 +421,7 @@ static int dispatch_discard_io(struct xen_blkif *blkif, | ||
153 | err = blkdev_issue_discard(bdev, req->u.discard.sector_number, | ||
154 | req->u.discard.nr_sectors, | ||
155 | GFP_KERNEL, secure); | ||
156 | - | ||
157 | +fail_response: | ||
158 | if (err == -EOPNOTSUPP) { | ||
159 | pr_debug(DRV_PFX "discard op failed, not supported\n"); | ||
160 | status = BLKIF_RSP_EOPNOTSUPP; | ||
161 | diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c | ||
162 | index b8e4809..b558810 100644 | ||
163 | --- a/drivers/firewire/core-cdev.c | ||
164 | +++ b/drivers/firewire/core-cdev.c | ||
165 | @@ -53,6 +53,7 @@ | ||
166 | #define FW_CDEV_KERNEL_VERSION 5 | ||
167 | #define FW_CDEV_VERSION_EVENT_REQUEST2 4 | ||
168 | #define FW_CDEV_VERSION_ALLOCATE_REGION_END 4 | ||
169 | +#define FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW 5 | ||
170 | |||
171 | struct client { | ||
172 | u32 version; | ||
173 | @@ -998,6 +999,8 @@ static int ioctl_create_iso_context(struct client *client, union ioctl_arg *arg) | ||
174 | a->channel, a->speed, a->header_size, cb, client); | ||
175 | if (IS_ERR(context)) | ||
176 | return PTR_ERR(context); | ||
177 | + if (client->version < FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW) | ||
178 | + context->drop_overflow_headers = true; | ||
179 | |||
180 | /* We only support one context at this time. */ | ||
181 | spin_lock_irq(&client->lock); | ||
182 | diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c | ||
183 | index 2b54600..c1de4c3 100644 | ||
184 | --- a/drivers/firewire/ohci.c | ||
185 | +++ b/drivers/firewire/ohci.c | ||
186 | @@ -2694,8 +2694,11 @@ static void copy_iso_headers(struct iso_context *ctx, const u32 *dma_hdr) | ||
187 | { | ||
188 | u32 *ctx_hdr; | ||
189 | |||
190 | - if (ctx->header_length + ctx->base.header_size > PAGE_SIZE) | ||
191 | + if (ctx->header_length + ctx->base.header_size > PAGE_SIZE) { | ||
192 | + if (ctx->base.drop_overflow_headers) | ||
193 | + return; | ||
194 | flush_iso_completions(ctx); | ||
195 | + } | ||
196 | |||
197 | ctx_hdr = ctx->header + ctx->header_length; | ||
198 | ctx->last_timestamp = (u16)le32_to_cpu((__force __le32)dma_hdr[0]); | ||
199 | @@ -2855,8 +2858,11 @@ static int handle_it_packet(struct context *context, | ||
200 | |||
201 | sync_it_packet_for_cpu(context, d); | ||
202 | |||
203 | - if (ctx->header_length + 4 > PAGE_SIZE) | ||
204 | + if (ctx->header_length + 4 > PAGE_SIZE) { | ||
205 | + if (ctx->base.drop_overflow_headers) | ||
206 | + return 1; | ||
207 | flush_iso_completions(ctx); | ||
208 | + } | ||
209 | |||
210 | ctx_hdr = ctx->header + ctx->header_length; | ||
211 | ctx->last_timestamp = le16_to_cpu(last->res_count); | ||
212 | diff --git a/drivers/gpu/drm/radeon/atom.c b/drivers/gpu/drm/radeon/atom.c | ||
213 | index 43672b6..daa1e34 100644 | ||
214 | --- a/drivers/gpu/drm/radeon/atom.c | ||
215 | +++ b/drivers/gpu/drm/radeon/atom.c | ||
216 | @@ -1222,12 +1222,17 @@ int atom_execute_table(struct atom_context *ctx, int index, uint32_t * params) | ||
217 | int r; | ||
218 | |||
219 | mutex_lock(&ctx->mutex); | ||
220 | + /* reset data block */ | ||
221 | + ctx->data_block = 0; | ||
222 | /* reset reg block */ | ||
223 | ctx->reg_block = 0; | ||
224 | /* reset fb window */ | ||
225 | ctx->fb_base = 0; | ||
226 | /* reset io mode */ | ||
227 | ctx->io_mode = ATOM_IO_MM; | ||
228 | + /* reset divmul */ | ||
229 | + ctx->divmul[0] = 0; | ||
230 | + ctx->divmul[1] = 0; | ||
231 | r = atom_execute_table_locked(ctx, index, params); | ||
232 | mutex_unlock(&ctx->mutex); | ||
233 | return r; | ||
234 | diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c | ||
235 | index 886b41f..505f27e 100644 | ||
236 | --- a/drivers/gpu/drm/radeon/atombios_dp.c | ||
237 | +++ b/drivers/gpu/drm/radeon/atombios_dp.c | ||
238 | @@ -45,6 +45,41 @@ static char *pre_emph_names[] = { | ||
239 | }; | ||
240 | |||
241 | /***** radeon AUX functions *****/ | ||
242 | + | ||
243 | +/* Atom needs data in little endian format | ||
244 | + * so swap as appropriate when copying data to | ||
245 | + * or from atom. Note that atom operates on | ||
246 | + * dw units. | ||
247 | + */ | ||
248 | +static void radeon_copy_swap(u8 *dst, u8 *src, u8 num_bytes, bool to_le) | ||
249 | +{ | ||
250 | +#ifdef __BIG_ENDIAN | ||
251 | + u8 src_tmp[20], dst_tmp[20]; /* used for byteswapping */ | ||
252 | + u32 *dst32, *src32; | ||
253 | + int i; | ||
254 | + | ||
255 | + memcpy(src_tmp, src, num_bytes); | ||
256 | + src32 = (u32 *)src_tmp; | ||
257 | + dst32 = (u32 *)dst_tmp; | ||
258 | + if (to_le) { | ||
259 | + for (i = 0; i < ((num_bytes + 3) / 4); i++) | ||
260 | + dst32[i] = cpu_to_le32(src32[i]); | ||
261 | + memcpy(dst, dst_tmp, num_bytes); | ||
262 | + } else { | ||
263 | + u8 dws = num_bytes & ~3; | ||
264 | + for (i = 0; i < ((num_bytes + 3) / 4); i++) | ||
265 | + dst32[i] = le32_to_cpu(src32[i]); | ||
266 | + memcpy(dst, dst_tmp, dws); | ||
267 | + if (num_bytes % 4) { | ||
268 | + for (i = 0; i < (num_bytes % 4); i++) | ||
269 | + dst[dws+i] = dst_tmp[dws+i]; | ||
270 | + } | ||
271 | + } | ||
272 | +#else | ||
273 | + memcpy(dst, src, num_bytes); | ||
274 | +#endif | ||
275 | +} | ||
276 | + | ||
277 | union aux_channel_transaction { | ||
278 | PROCESS_AUX_CHANNEL_TRANSACTION_PS_ALLOCATION v1; | ||
279 | PROCESS_AUX_CHANNEL_TRANSACTION_PARAMETERS_V2 v2; | ||
280 | @@ -66,10 +101,10 @@ static int radeon_process_aux_ch(struct radeon_i2c_chan *chan, | ||
281 | |||
282 | base = (unsigned char *)(rdev->mode_info.atom_context->scratch + 1); | ||
283 | |||
284 | - memcpy(base, send, send_bytes); | ||
285 | + radeon_copy_swap(base, send, send_bytes, true); | ||
286 | |||
287 | - args.v1.lpAuxRequest = 0 + 4; | ||
288 | - args.v1.lpDataOut = 16 + 4; | ||
289 | + args.v1.lpAuxRequest = cpu_to_le16((u16)(0 + 4)); | ||
290 | + args.v1.lpDataOut = cpu_to_le16((u16)(16 + 4)); | ||
291 | args.v1.ucDataOutLen = 0; | ||
292 | args.v1.ucChannelID = chan->rec.i2c_id; | ||
293 | args.v1.ucDelay = delay / 10; | ||
294 | @@ -103,7 +138,7 @@ static int radeon_process_aux_ch(struct radeon_i2c_chan *chan, | ||
295 | recv_bytes = recv_size; | ||
296 | |||
297 | if (recv && recv_size) | ||
298 | - memcpy(recv, base + 16, recv_bytes); | ||
299 | + radeon_copy_swap(recv, base + 16, recv_bytes, false); | ||
300 | |||
301 | return recv_bytes; | ||
302 | } | ||
303 | diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c | ||
304 | index 2b2c557..07d0bcd 100644 | ||
305 | --- a/drivers/gpu/drm/radeon/radeon_combios.c | ||
306 | +++ b/drivers/gpu/drm/radeon/radeon_combios.c | ||
307 | @@ -147,7 +147,7 @@ static uint16_t combios_get_table_offset(struct drm_device *dev, | ||
308 | enum radeon_combios_table_offset table) | ||
309 | { | ||
310 | struct radeon_device *rdev = dev->dev_private; | ||
311 | - int rev; | ||
312 | + int rev, size; | ||
313 | uint16_t offset = 0, check_offset; | ||
314 | |||
315 | if (!rdev->bios) | ||
316 | @@ -156,174 +156,106 @@ static uint16_t combios_get_table_offset(struct drm_device *dev, | ||
317 | switch (table) { | ||
318 | /* absolute offset tables */ | ||
319 | case COMBIOS_ASIC_INIT_1_TABLE: | ||
320 | - check_offset = RBIOS16(rdev->bios_header_start + 0xc); | ||
321 | - if (check_offset) | ||
322 | - offset = check_offset; | ||
323 | + check_offset = 0xc; | ||
324 | break; | ||
325 | case COMBIOS_BIOS_SUPPORT_TABLE: | ||
326 | - check_offset = RBIOS16(rdev->bios_header_start + 0x14); | ||
327 | - if (check_offset) | ||
328 | - offset = check_offset; | ||
329 | + check_offset = 0x14; | ||
330 | break; | ||
331 | case COMBIOS_DAC_PROGRAMMING_TABLE: | ||
332 | - check_offset = RBIOS16(rdev->bios_header_start + 0x2a); | ||
333 | - if (check_offset) | ||
334 | - offset = check_offset; | ||
335 | + check_offset = 0x2a; | ||
336 | break; | ||
337 | case COMBIOS_MAX_COLOR_DEPTH_TABLE: | ||
338 | - check_offset = RBIOS16(rdev->bios_header_start + 0x2c); | ||
339 | - if (check_offset) | ||
340 | - offset = check_offset; | ||
341 | + check_offset = 0x2c; | ||
342 | break; | ||
343 | case COMBIOS_CRTC_INFO_TABLE: | ||
344 | - check_offset = RBIOS16(rdev->bios_header_start + 0x2e); | ||
345 | - if (check_offset) | ||
346 | - offset = check_offset; | ||
347 | + check_offset = 0x2e; | ||
348 | break; | ||
349 | case COMBIOS_PLL_INFO_TABLE: | ||
350 | - check_offset = RBIOS16(rdev->bios_header_start + 0x30); | ||
351 | - if (check_offset) | ||
352 | - offset = check_offset; | ||
353 | + check_offset = 0x30; | ||
354 | break; | ||
355 | case COMBIOS_TV_INFO_TABLE: | ||
356 | - check_offset = RBIOS16(rdev->bios_header_start + 0x32); | ||
357 | - if (check_offset) | ||
358 | - offset = check_offset; | ||
359 | + check_offset = 0x32; | ||
360 | break; | ||
361 | case COMBIOS_DFP_INFO_TABLE: | ||
362 | - check_offset = RBIOS16(rdev->bios_header_start + 0x34); | ||
363 | - if (check_offset) | ||
364 | - offset = check_offset; | ||
365 | + check_offset = 0x34; | ||
366 | break; | ||
367 | case COMBIOS_HW_CONFIG_INFO_TABLE: | ||
368 | - check_offset = RBIOS16(rdev->bios_header_start + 0x36); | ||
369 | - if (check_offset) | ||
370 | - offset = check_offset; | ||
371 | + check_offset = 0x36; | ||
372 | break; | ||
373 | case COMBIOS_MULTIMEDIA_INFO_TABLE: | ||
374 | - check_offset = RBIOS16(rdev->bios_header_start + 0x38); | ||
375 | - if (check_offset) | ||
376 | - offset = check_offset; | ||
377 | + check_offset = 0x38; | ||
378 | break; | ||
379 | case COMBIOS_TV_STD_PATCH_TABLE: | ||
380 | - check_offset = RBIOS16(rdev->bios_header_start + 0x3e); | ||
381 | - if (check_offset) | ||
382 | - offset = check_offset; | ||
383 | + check_offset = 0x3e; | ||
384 | break; | ||
385 | case COMBIOS_LCD_INFO_TABLE: | ||
386 | - check_offset = RBIOS16(rdev->bios_header_start + 0x40); | ||
387 | - if (check_offset) | ||
388 | - offset = check_offset; | ||
389 | + check_offset = 0x40; | ||
390 | break; | ||
391 | case COMBIOS_MOBILE_INFO_TABLE: | ||
392 | - check_offset = RBIOS16(rdev->bios_header_start + 0x42); | ||
393 | - if (check_offset) | ||
394 | - offset = check_offset; | ||
395 | + check_offset = 0x42; | ||
396 | break; | ||
397 | case COMBIOS_PLL_INIT_TABLE: | ||
398 | - check_offset = RBIOS16(rdev->bios_header_start + 0x46); | ||
399 | - if (check_offset) | ||
400 | - offset = check_offset; | ||
401 | + check_offset = 0x46; | ||
402 | break; | ||
403 | case COMBIOS_MEM_CONFIG_TABLE: | ||
404 | - check_offset = RBIOS16(rdev->bios_header_start + 0x48); | ||
405 | - if (check_offset) | ||
406 | - offset = check_offset; | ||
407 | + check_offset = 0x48; | ||
408 | break; | ||
409 | case COMBIOS_SAVE_MASK_TABLE: | ||
410 | - check_offset = RBIOS16(rdev->bios_header_start + 0x4a); | ||
411 | - if (check_offset) | ||
412 | - offset = check_offset; | ||
413 | + check_offset = 0x4a; | ||
414 | break; | ||
415 | case COMBIOS_HARDCODED_EDID_TABLE: | ||
416 | - check_offset = RBIOS16(rdev->bios_header_start + 0x4c); | ||
417 | - if (check_offset) | ||
418 | - offset = check_offset; | ||
419 | + check_offset = 0x4c; | ||
420 | break; | ||
421 | case COMBIOS_ASIC_INIT_2_TABLE: | ||
422 | - check_offset = RBIOS16(rdev->bios_header_start + 0x4e); | ||
423 | - if (check_offset) | ||
424 | - offset = check_offset; | ||
425 | + check_offset = 0x4e; | ||
426 | break; | ||
427 | case COMBIOS_CONNECTOR_INFO_TABLE: | ||
428 | - check_offset = RBIOS16(rdev->bios_header_start + 0x50); | ||
429 | - if (check_offset) | ||
430 | - offset = check_offset; | ||
431 | + check_offset = 0x50; | ||
432 | break; | ||
433 | case COMBIOS_DYN_CLK_1_TABLE: | ||
434 | - check_offset = RBIOS16(rdev->bios_header_start + 0x52); | ||
435 | - if (check_offset) | ||
436 | - offset = check_offset; | ||
437 | + check_offset = 0x52; | ||
438 | break; | ||
439 | case COMBIOS_RESERVED_MEM_TABLE: | ||
440 | - check_offset = RBIOS16(rdev->bios_header_start + 0x54); | ||
441 | - if (check_offset) | ||
442 | - offset = check_offset; | ||
443 | + check_offset = 0x54; | ||
444 | break; | ||
445 | case COMBIOS_EXT_TMDS_INFO_TABLE: | ||
446 | - check_offset = RBIOS16(rdev->bios_header_start + 0x58); | ||
447 | - if (check_offset) | ||
448 | - offset = check_offset; | ||
449 | + check_offset = 0x58; | ||
450 | break; | ||
451 | case COMBIOS_MEM_CLK_INFO_TABLE: | ||
452 | - check_offset = RBIOS16(rdev->bios_header_start + 0x5a); | ||
453 | - if (check_offset) | ||
454 | - offset = check_offset; | ||
455 | + check_offset = 0x5a; | ||
456 | break; | ||
457 | case COMBIOS_EXT_DAC_INFO_TABLE: | ||
458 | - check_offset = RBIOS16(rdev->bios_header_start + 0x5c); | ||
459 | - if (check_offset) | ||
460 | - offset = check_offset; | ||
461 | + check_offset = 0x5c; | ||
462 | break; | ||
463 | case COMBIOS_MISC_INFO_TABLE: | ||
464 | - check_offset = RBIOS16(rdev->bios_header_start + 0x5e); | ||
465 | - if (check_offset) | ||
466 | - offset = check_offset; | ||
467 | + check_offset = 0x5e; | ||
468 | break; | ||
469 | case COMBIOS_CRT_INFO_TABLE: | ||
470 | - check_offset = RBIOS16(rdev->bios_header_start + 0x60); | ||
471 | - if (check_offset) | ||
472 | - offset = check_offset; | ||
473 | + check_offset = 0x60; | ||
474 | break; | ||
475 | case COMBIOS_INTEGRATED_SYSTEM_INFO_TABLE: | ||
476 | - check_offset = RBIOS16(rdev->bios_header_start + 0x62); | ||
477 | - if (check_offset) | ||
478 | - offset = check_offset; | ||
479 | + check_offset = 0x62; | ||
480 | break; | ||
481 | case COMBIOS_COMPONENT_VIDEO_INFO_TABLE: | ||
482 | - check_offset = RBIOS16(rdev->bios_header_start + 0x64); | ||
483 | - if (check_offset) | ||
484 | - offset = check_offset; | ||
485 | + check_offset = 0x64; | ||
486 | break; | ||
487 | case COMBIOS_FAN_SPEED_INFO_TABLE: | ||
488 | - check_offset = RBIOS16(rdev->bios_header_start + 0x66); | ||
489 | - if (check_offset) | ||
490 | - offset = check_offset; | ||
491 | + check_offset = 0x66; | ||
492 | break; | ||
493 | case COMBIOS_OVERDRIVE_INFO_TABLE: | ||
494 | - check_offset = RBIOS16(rdev->bios_header_start + 0x68); | ||
495 | - if (check_offset) | ||
496 | - offset = check_offset; | ||
497 | + check_offset = 0x68; | ||
498 | break; | ||
499 | case COMBIOS_OEM_INFO_TABLE: | ||
500 | - check_offset = RBIOS16(rdev->bios_header_start + 0x6a); | ||
501 | - if (check_offset) | ||
502 | - offset = check_offset; | ||
503 | + check_offset = 0x6a; | ||
504 | break; | ||
505 | case COMBIOS_DYN_CLK_2_TABLE: | ||
506 | - check_offset = RBIOS16(rdev->bios_header_start + 0x6c); | ||
507 | - if (check_offset) | ||
508 | - offset = check_offset; | ||
509 | + check_offset = 0x6c; | ||
510 | break; | ||
511 | case COMBIOS_POWER_CONNECTOR_INFO_TABLE: | ||
512 | - check_offset = RBIOS16(rdev->bios_header_start + 0x6e); | ||
513 | - if (check_offset) | ||
514 | - offset = check_offset; | ||
515 | + check_offset = 0x6e; | ||
516 | break; | ||
517 | case COMBIOS_I2C_INFO_TABLE: | ||
518 | - check_offset = RBIOS16(rdev->bios_header_start + 0x70); | ||
519 | - if (check_offset) | ||
520 | - offset = check_offset; | ||
521 | + check_offset = 0x70; | ||
522 | break; | ||
523 | /* relative offset tables */ | ||
524 | case COMBIOS_ASIC_INIT_3_TABLE: /* offset from misc info */ | ||
525 | @@ -439,11 +371,16 @@ static uint16_t combios_get_table_offset(struct drm_device *dev, | ||
526 | } | ||
527 | break; | ||
528 | default: | ||
529 | + check_offset = 0; | ||
530 | break; | ||
531 | } | ||
532 | |||
533 | - return offset; | ||
534 | + size = RBIOS8(rdev->bios_header_start + 0x6); | ||
535 | + /* check absolute offset tables */ | ||
536 | + if (table < COMBIOS_ASIC_INIT_3_TABLE && check_offset && check_offset < size) | ||
537 | + offset = RBIOS16(rdev->bios_header_start + check_offset); | ||
538 | |||
539 | + return offset; | ||
540 | } | ||
541 | |||
542 | bool radeon_combios_check_hardcoded_edid(struct radeon_device *rdev) | ||
543 | @@ -953,8 +890,10 @@ struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct | ||
544 | dac = RBIOS8(dac_info + 0x3) & 0xf; | ||
545 | p_dac->ps2_pdac_adj = (bg << 8) | (dac); | ||
546 | } | ||
547 | - /* if the values are all zeros, use the table */ | ||
548 | - if (p_dac->ps2_pdac_adj) | ||
549 | + /* if the values are zeros, use the table */ | ||
550 | + if ((dac == 0) || (bg == 0)) | ||
551 | + found = 0; | ||
552 | + else | ||
553 | found = 1; | ||
554 | } | ||
555 | |||
556 | diff --git a/drivers/md/dm-verity.c b/drivers/md/dm-verity.c | ||
557 | index 68bf5c3..9ab2a6a 100644 | ||
558 | --- a/drivers/md/dm-verity.c | ||
559 | +++ b/drivers/md/dm-verity.c | ||
560 | @@ -813,9 +813,8 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv) | ||
561 | for (i = v->levels - 1; i >= 0; i--) { | ||
562 | sector_t s; | ||
563 | v->hash_level_block[i] = hash_position; | ||
564 | - s = verity_position_at_level(v, v->data_blocks, i); | ||
565 | - s = (s >> v->hash_per_block_bits) + | ||
566 | - !!(s & ((1 << v->hash_per_block_bits) - 1)); | ||
567 | + s = (v->data_blocks + ((sector_t)1 << ((i + 1) * v->hash_per_block_bits)) - 1) | ||
568 | + >> ((i + 1) * v->hash_per_block_bits); | ||
569 | if (hash_position + s < hash_position) { | ||
570 | ti->error = "Hash device offset overflow"; | ||
571 | r = -E2BIG; | ||
572 | diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c | ||
573 | index 0cc7985..54ba531 100644 | ||
574 | --- a/drivers/md/raid10.c | ||
575 | +++ b/drivers/md/raid10.c | ||
576 | @@ -2029,12 +2029,18 @@ static void recovery_request_write(struct mddev *mddev, struct r10bio *r10_bio) | ||
577 | d = r10_bio->devs[1].devnum; | ||
578 | wbio = r10_bio->devs[1].bio; | ||
579 | wbio2 = r10_bio->devs[1].repl_bio; | ||
580 | + /* Need to test wbio2->bi_end_io before we call | ||
581 | + * generic_make_request as if the former is NULL, | ||
582 | + * the latter is free to free wbio2. | ||
583 | + */ | ||
584 | + if (wbio2 && !wbio2->bi_end_io) | ||
585 | + wbio2 = NULL; | ||
586 | if (wbio->bi_end_io) { | ||
587 | atomic_inc(&conf->mirrors[d].rdev->nr_pending); | ||
588 | md_sync_acct(conf->mirrors[d].rdev->bdev, wbio->bi_size >> 9); | ||
589 | generic_make_request(wbio); | ||
590 | } | ||
591 | - if (wbio2 && wbio2->bi_end_io) { | ||
592 | + if (wbio2) { | ||
593 | atomic_inc(&conf->mirrors[d].replacement->nr_pending); | ||
594 | md_sync_acct(conf->mirrors[d].replacement->bdev, | ||
595 | wbio2->bi_size >> 9); | ||
596 | diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c | ||
597 | index 0240576..6155c8b 100644 | ||
598 | --- a/drivers/md/raid5.c | ||
599 | +++ b/drivers/md/raid5.c | ||
600 | @@ -3326,6 +3326,7 @@ static void handle_stripe(struct stripe_head *sh) | ||
601 | if (test_and_clear_bit(STRIPE_SYNC_REQUESTED, &sh->state)) { | ||
602 | set_bit(STRIPE_SYNCING, &sh->state); | ||
603 | clear_bit(STRIPE_INSYNC, &sh->state); | ||
604 | + clear_bit(STRIPE_REPLACED, &sh->state); | ||
605 | } | ||
606 | clear_bit(STRIPE_DELAYED, &sh->state); | ||
607 | |||
608 | @@ -3465,19 +3466,23 @@ static void handle_stripe(struct stripe_head *sh) | ||
609 | handle_parity_checks5(conf, sh, &s, disks); | ||
610 | } | ||
611 | |||
612 | - if (s.replacing && s.locked == 0 | ||
613 | - && !test_bit(STRIPE_INSYNC, &sh->state)) { | ||
614 | + if ((s.replacing || s.syncing) && s.locked == 0 | ||
615 | + && !test_bit(STRIPE_COMPUTE_RUN, &sh->state) | ||
616 | + && !test_bit(STRIPE_REPLACED, &sh->state)) { | ||
617 | /* Write out to replacement devices where possible */ | ||
618 | for (i = 0; i < conf->raid_disks; i++) | ||
619 | - if (test_bit(R5_UPTODATE, &sh->dev[i].flags) && | ||
620 | - test_bit(R5_NeedReplace, &sh->dev[i].flags)) { | ||
621 | + if (test_bit(R5_NeedReplace, &sh->dev[i].flags)) { | ||
622 | + WARN_ON(!test_bit(R5_UPTODATE, &sh->dev[i].flags)); | ||
623 | set_bit(R5_WantReplace, &sh->dev[i].flags); | ||
624 | set_bit(R5_LOCKED, &sh->dev[i].flags); | ||
625 | s.locked++; | ||
626 | } | ||
627 | - set_bit(STRIPE_INSYNC, &sh->state); | ||
628 | + if (s.replacing) | ||
629 | + set_bit(STRIPE_INSYNC, &sh->state); | ||
630 | + set_bit(STRIPE_REPLACED, &sh->state); | ||
631 | } | ||
632 | if ((s.syncing || s.replacing) && s.locked == 0 && | ||
633 | + !test_bit(STRIPE_COMPUTE_RUN, &sh->state) && | ||
634 | test_bit(STRIPE_INSYNC, &sh->state)) { | ||
635 | md_done_sync(conf->mddev, STRIPE_SECTORS, 1); | ||
636 | clear_bit(STRIPE_SYNCING, &sh->state); | ||
637 | diff --git a/drivers/md/raid5.h b/drivers/md/raid5.h | ||
638 | index 8d8e139..f1ed18e 100644 | ||
639 | --- a/drivers/md/raid5.h | ||
640 | +++ b/drivers/md/raid5.h | ||
641 | @@ -306,6 +306,7 @@ enum { | ||
642 | STRIPE_SYNC_REQUESTED, | ||
643 | STRIPE_SYNCING, | ||
644 | STRIPE_INSYNC, | ||
645 | + STRIPE_REPLACED, | ||
646 | STRIPE_PREREAD_ACTIVE, | ||
647 | STRIPE_DELAYED, | ||
648 | STRIPE_DEGRADED, | ||
649 | diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c | ||
650 | index cbefe67..bc177b9 100644 | ||
651 | --- a/drivers/net/virtio_net.c | ||
652 | +++ b/drivers/net/virtio_net.c | ||
653 | @@ -518,7 +518,7 @@ static int virtnet_poll(struct napi_struct *napi, int budget) | ||
654 | { | ||
655 | struct virtnet_info *vi = container_of(napi, struct virtnet_info, napi); | ||
656 | void *buf; | ||
657 | - unsigned int len, received = 0; | ||
658 | + unsigned int r, len, received = 0; | ||
659 | |||
660 | again: | ||
661 | while (received < budget && | ||
662 | @@ -535,8 +535,9 @@ again: | ||
663 | |||
664 | /* Out of packets? */ | ||
665 | if (received < budget) { | ||
666 | + r = virtqueue_enable_cb_prepare(vi->rvq); | ||
667 | napi_complete(napi); | ||
668 | - if (unlikely(!virtqueue_enable_cb(vi->rvq)) && | ||
669 | + if (unlikely(virtqueue_poll(vi->rvq, r)) && | ||
670 | napi_schedule_prep(napi)) { | ||
671 | virtqueue_disable_cb(vi->rvq); | ||
672 | __napi_schedule(napi); | ||
673 | diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c | ||
674 | index 4f1b10b..3743ac9 100644 | ||
675 | --- a/drivers/s390/scsi/zfcp_aux.c | ||
676 | +++ b/drivers/s390/scsi/zfcp_aux.c | ||
677 | @@ -3,7 +3,7 @@ | ||
678 | * | ||
679 | * Module interface and handling of zfcp data structures. | ||
680 | * | ||
681 | - * Copyright IBM Corporation 2002, 2010 | ||
682 | + * Copyright IBM Corp. 2002, 2013 | ||
683 | */ | ||
684 | |||
685 | /* | ||
686 | @@ -23,6 +23,7 @@ | ||
687 | * Christof Schmitt | ||
688 | * Martin Petermann | ||
689 | * Sven Schuetz | ||
690 | + * Steffen Maier | ||
691 | */ | ||
692 | |||
693 | #define KMSG_COMPONENT "zfcp" | ||
694 | @@ -415,6 +416,8 @@ struct zfcp_adapter *zfcp_adapter_enqueue(struct ccw_device *ccw_device) | ||
695 | adapter->dma_parms.max_segment_size = ZFCP_QDIO_SBALE_LEN; | ||
696 | adapter->ccw_device->dev.dma_parms = &adapter->dma_parms; | ||
697 | |||
698 | + adapter->stat_read_buf_num = FSF_STATUS_READS_RECOM; | ||
699 | + | ||
700 | if (!zfcp_scsi_adapter_register(adapter)) | ||
701 | return adapter; | ||
702 | |||
703 | diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c | ||
704 | index 5fdf70b..961e327 100644 | ||
705 | --- a/drivers/s390/scsi/zfcp_fsf.c | ||
706 | +++ b/drivers/s390/scsi/zfcp_fsf.c | ||
707 | @@ -3,7 +3,7 @@ | ||
708 | * | ||
709 | * Implementation of FSF commands. | ||
710 | * | ||
711 | - * Copyright IBM Corporation 2002, 2010 | ||
712 | + * Copyright IBM Corp. 2002, 2013 | ||
713 | */ | ||
714 | |||
715 | #define KMSG_COMPONENT "zfcp" | ||
716 | @@ -483,12 +483,8 @@ static int zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *req) | ||
717 | |||
718 | fc_host_port_name(shost) = nsp->fl_wwpn; | ||
719 | fc_host_node_name(shost) = nsp->fl_wwnn; | ||
720 | - fc_host_port_id(shost) = ntoh24(bottom->s_id); | ||
721 | - fc_host_speed(shost) = | ||
722 | - zfcp_fsf_convert_portspeed(bottom->fc_link_speed); | ||
723 | fc_host_supported_classes(shost) = FC_COS_CLASS2 | FC_COS_CLASS3; | ||
724 | |||
725 | - adapter->hydra_version = bottom->adapter_type; | ||
726 | adapter->timer_ticks = bottom->timer_interval & ZFCP_FSF_TIMER_INT_MASK; | ||
727 | adapter->stat_read_buf_num = max(bottom->status_read_buf_num, | ||
728 | (u16)FSF_STATUS_READS_RECOM); | ||
729 | @@ -496,6 +492,19 @@ static int zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *req) | ||
730 | if (fc_host_permanent_port_name(shost) == -1) | ||
731 | fc_host_permanent_port_name(shost) = fc_host_port_name(shost); | ||
732 | |||
733 | + zfcp_scsi_set_prot(adapter); | ||
734 | + | ||
735 | + /* no error return above here, otherwise must fix call chains */ | ||
736 | + /* do not evaluate invalid fields */ | ||
737 | + if (req->qtcb->header.fsf_status == FSF_EXCHANGE_CONFIG_DATA_INCOMPLETE) | ||
738 | + return 0; | ||
739 | + | ||
740 | + fc_host_port_id(shost) = ntoh24(bottom->s_id); | ||
741 | + fc_host_speed(shost) = | ||
742 | + zfcp_fsf_convert_portspeed(bottom->fc_link_speed); | ||
743 | + | ||
744 | + adapter->hydra_version = bottom->adapter_type; | ||
745 | + | ||
746 | switch (bottom->fc_topology) { | ||
747 | case FSF_TOPO_P2P: | ||
748 | adapter->peer_d_id = ntoh24(bottom->peer_d_id); | ||
749 | @@ -517,8 +526,6 @@ static int zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *req) | ||
750 | return -EIO; | ||
751 | } | ||
752 | |||
753 | - zfcp_scsi_set_prot(adapter); | ||
754 | - | ||
755 | return 0; | ||
756 | } | ||
757 | |||
758 | @@ -569,6 +576,8 @@ static void zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *req) | ||
759 | &adapter->status); | ||
760 | zfcp_fsf_link_down_info_eval(req, | ||
761 | &qtcb->header.fsf_status_qual.link_down_info); | ||
762 | + if (zfcp_fsf_exchange_config_evaluate(req)) | ||
763 | + return; | ||
764 | break; | ||
765 | default: | ||
766 | zfcp_erp_adapter_shutdown(adapter, 0, "fsecdh3"); | ||
767 | diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c | ||
768 | index eac9509..d99d4a0 100644 | ||
769 | --- a/drivers/scsi/qla2xxx/qla_iocb.c | ||
770 | +++ b/drivers/scsi/qla2xxx/qla_iocb.c | ||
771 | @@ -423,6 +423,8 @@ qla2x00_start_scsi(srb_t *sp) | ||
772 | __constant_cpu_to_le16(CF_SIMPLE_TAG); | ||
773 | break; | ||
774 | } | ||
775 | + } else { | ||
776 | + cmd_pkt->control_flags = __constant_cpu_to_le16(CF_SIMPLE_TAG); | ||
777 | } | ||
778 | |||
779 | /* Load SCSI command packet. */ | ||
780 | @@ -1331,11 +1333,11 @@ qla24xx_build_scsi_crc_2_iocbs(srb_t *sp, struct cmd_type_crc_2 *cmd_pkt, | ||
781 | fcp_cmnd->task_attribute = TSK_ORDERED; | ||
782 | break; | ||
783 | default: | ||
784 | - fcp_cmnd->task_attribute = 0; | ||
785 | + fcp_cmnd->task_attribute = TSK_SIMPLE; | ||
786 | break; | ||
787 | } | ||
788 | } else { | ||
789 | - fcp_cmnd->task_attribute = 0; | ||
790 | + fcp_cmnd->task_attribute = TSK_SIMPLE; | ||
791 | } | ||
792 | |||
793 | cmd_pkt->fcp_rsp_dseg_len = 0; /* Let response come in status iocb */ | ||
794 | @@ -1541,7 +1543,12 @@ qla24xx_start_scsi(srb_t *sp) | ||
795 | case ORDERED_QUEUE_TAG: | ||
796 | cmd_pkt->task = TSK_ORDERED; | ||
797 | break; | ||
798 | + default: | ||
799 | + cmd_pkt->task = TSK_SIMPLE; | ||
800 | + break; | ||
801 | } | ||
802 | + } else { | ||
803 | + cmd_pkt->task = TSK_SIMPLE; | ||
804 | } | ||
805 | |||
806 | /* Load SCSI command packet. */ | ||
807 | diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c | ||
808 | index 3141c1a..105fff2 100644 | ||
809 | --- a/drivers/scsi/sd.c | ||
810 | +++ b/drivers/scsi/sd.c | ||
811 | @@ -672,10 +672,17 @@ static int scsi_setup_flush_cmnd(struct scsi_device *sdp, struct request *rq) | ||
812 | |||
813 | static void sd_unprep_fn(struct request_queue *q, struct request *rq) | ||
814 | { | ||
815 | + struct scsi_cmnd *SCpnt = rq->special; | ||
816 | + | ||
817 | if (rq->cmd_flags & REQ_DISCARD) { | ||
818 | free_page((unsigned long)rq->buffer); | ||
819 | rq->buffer = NULL; | ||
820 | } | ||
821 | + if (SCpnt->cmnd != rq->cmd) { | ||
822 | + mempool_free(SCpnt->cmnd, sd_cdb_pool); | ||
823 | + SCpnt->cmnd = NULL; | ||
824 | + SCpnt->cmd_len = 0; | ||
825 | + } | ||
826 | } | ||
827 | |||
828 | /** | ||
829 | @@ -1539,21 +1546,6 @@ static int sd_done(struct scsi_cmnd *SCpnt) | ||
830 | if (rq_data_dir(SCpnt->request) == READ && scsi_prot_sg_count(SCpnt)) | ||
831 | sd_dif_complete(SCpnt, good_bytes); | ||
832 | |||
833 | - if (scsi_host_dif_capable(sdkp->device->host, sdkp->protection_type) | ||
834 | - == SD_DIF_TYPE2_PROTECTION && SCpnt->cmnd != SCpnt->request->cmd) { | ||
835 | - | ||
836 | - /* We have to print a failed command here as the | ||
837 | - * extended CDB gets freed before scsi_io_completion() | ||
838 | - * is called. | ||
839 | - */ | ||
840 | - if (result) | ||
841 | - scsi_print_command(SCpnt); | ||
842 | - | ||
843 | - mempool_free(SCpnt->cmnd, sd_cdb_pool); | ||
844 | - SCpnt->cmnd = NULL; | ||
845 | - SCpnt->cmd_len = 0; | ||
846 | - } | ||
847 | - | ||
848 | return good_bytes; | ||
849 | } | ||
850 | |||
851 | diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c | ||
852 | index 3799cf1..50dc93e 100644 | ||
853 | --- a/drivers/staging/comedi/comedi_fops.c | ||
854 | +++ b/drivers/staging/comedi/comedi_fops.c | ||
855 | @@ -1370,6 +1370,7 @@ static int do_cancel_ioctl(struct comedi_device *dev, unsigned int arg, | ||
856 | void *file) | ||
857 | { | ||
858 | struct comedi_subdevice *s; | ||
859 | + int ret; | ||
860 | |||
861 | if (arg >= dev->n_subdevices) | ||
862 | return -EINVAL; | ||
863 | @@ -1386,7 +1387,11 @@ static int do_cancel_ioctl(struct comedi_device *dev, unsigned int arg, | ||
864 | if (s->busy != file) | ||
865 | return -EBUSY; | ||
866 | |||
867 | - return do_cancel(dev, s); | ||
868 | + ret = do_cancel(dev, s); | ||
869 | + if (comedi_get_subdevice_runflags(s) & SRF_USER) | ||
870 | + wake_up_interruptible(&s->async->wait_head); | ||
871 | + | ||
872 | + return ret; | ||
873 | } | ||
874 | |||
875 | /* | ||
876 | diff --git a/drivers/target/iscsi/iscsi_target_configfs.c b/drivers/target/iscsi/iscsi_target_configfs.c | ||
877 | index 00c58cc..facb3ad 100644 | ||
878 | --- a/drivers/target/iscsi/iscsi_target_configfs.c | ||
879 | +++ b/drivers/target/iscsi/iscsi_target_configfs.c | ||
880 | @@ -415,7 +415,7 @@ static ssize_t __iscsi_##prefix##_store_##name( \ | ||
881 | if (!capable(CAP_SYS_ADMIN)) \ | ||
882 | return -EPERM; \ | ||
883 | \ | ||
884 | - snprintf(auth->name, PAGE_SIZE, "%s", page); \ | ||
885 | + snprintf(auth->name, sizeof(auth->name), "%s", page); \ | ||
886 | if (!strncmp("NULL", auth->name, 4)) \ | ||
887 | auth->naf_flags &= ~flags; \ | ||
888 | else \ | ||
889 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c | ||
890 | index 49b139c..a969ec1 100644 | ||
891 | --- a/drivers/usb/core/hub.c | ||
892 | +++ b/drivers/usb/core/hub.c | ||
893 | @@ -488,6 +488,15 @@ resubmit: | ||
894 | static inline int | ||
895 | hub_clear_tt_buffer (struct usb_device *hdev, u16 devinfo, u16 tt) | ||
896 | { | ||
897 | + /* Need to clear both directions for control ep */ | ||
898 | + if (((devinfo >> 11) & USB_ENDPOINT_XFERTYPE_MASK) == | ||
899 | + USB_ENDPOINT_XFER_CONTROL) { | ||
900 | + int status = usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0), | ||
901 | + HUB_CLEAR_TT_BUFFER, USB_RT_PORT, | ||
902 | + devinfo ^ 0x8000, tt, NULL, 0, 1000); | ||
903 | + if (status) | ||
904 | + return status; | ||
905 | + } | ||
906 | return usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0), | ||
907 | HUB_CLEAR_TT_BUFFER, USB_RT_PORT, devinfo, | ||
908 | tt, NULL, 0, 1000); | ||
909 | diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h | ||
910 | index 6c7945b..29a68f0a 100644 | ||
911 | --- a/drivers/usb/dwc3/core.h | ||
912 | +++ b/drivers/usb/dwc3/core.h | ||
913 | @@ -641,8 +641,8 @@ struct dwc3 { | ||
914 | |||
915 | struct dwc3_event_type { | ||
916 | u32 is_devspec:1; | ||
917 | - u32 type:6; | ||
918 | - u32 reserved8_31:25; | ||
919 | + u32 type:7; | ||
920 | + u32 reserved8_31:24; | ||
921 | } __packed; | ||
922 | |||
923 | #define DWC3_DEPEVT_XFERCOMPLETE 0x01 | ||
924 | diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c | ||
925 | index f62629b..6d6fb88 100644 | ||
926 | --- a/drivers/usb/dwc3/gadget.c | ||
927 | +++ b/drivers/usb/dwc3/gadget.c | ||
928 | @@ -1393,6 +1393,7 @@ err1: | ||
929 | __dwc3_gadget_ep_disable(dwc->eps[0]); | ||
930 | |||
931 | err0: | ||
932 | + dwc->gadget_driver = NULL; | ||
933 | spin_unlock_irqrestore(&dwc->lock, flags); | ||
934 | |||
935 | return ret; | ||
936 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c | ||
937 | index 84e82dc..8b1c27f 100644 | ||
938 | --- a/drivers/usb/host/xhci-pci.c | ||
939 | +++ b/drivers/usb/host/xhci-pci.c | ||
940 | @@ -89,7 +89,6 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | ||
941 | xhci->quirks |= XHCI_AMD_PLL_FIX; | ||
942 | if (pdev->vendor == PCI_VENDOR_ID_INTEL && | ||
943 | pdev->device == PCI_DEVICE_ID_INTEL_PANTHERPOINT_XHCI) { | ||
944 | - xhci->quirks |= XHCI_SPURIOUS_SUCCESS; | ||
945 | xhci->quirks |= XHCI_EP_LIMIT_QUIRK; | ||
946 | xhci->limit_active_eps = 64; | ||
947 | xhci->quirks |= XHCI_SW_BW_CHECKING; | ||
948 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c | ||
949 | index 843b3e8..1770ed5 100644 | ||
950 | --- a/drivers/usb/host/xhci-ring.c | ||
951 | +++ b/drivers/usb/host/xhci-ring.c | ||
952 | @@ -434,7 +434,7 @@ static void ring_doorbell_for_active_rings(struct xhci_hcd *xhci, | ||
953 | |||
954 | /* A ring has pending URBs if its TD list is not empty */ | ||
955 | if (!(ep->ep_state & EP_HAS_STREAMS)) { | ||
956 | - if (!(list_empty(&ep->ring->td_list))) | ||
957 | + if (ep->ring && !(list_empty(&ep->ring->td_list))) | ||
958 | xhci_ring_ep_doorbell(xhci, slot_id, ep_index, 0); | ||
959 | return; | ||
960 | } | ||
961 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c | ||
962 | index 0f928b3..8072a93 100644 | ||
963 | --- a/drivers/usb/host/xhci.c | ||
964 | +++ b/drivers/usb/host/xhci.c | ||
965 | @@ -1162,9 +1162,6 @@ static int xhci_check_args(struct usb_hcd *hcd, struct usb_device *udev, | ||
966 | } | ||
967 | |||
968 | xhci = hcd_to_xhci(hcd); | ||
969 | - if (xhci->xhc_state & XHCI_STATE_HALTED) | ||
970 | - return -ENODEV; | ||
971 | - | ||
972 | if (check_virt_dev) { | ||
973 | if (!udev->slot_id || !xhci->devs[udev->slot_id]) { | ||
974 | printk(KERN_DEBUG "xHCI %s called with unaddressed " | ||
975 | @@ -1180,6 +1177,9 @@ static int xhci_check_args(struct usb_hcd *hcd, struct usb_device *udev, | ||
976 | } | ||
977 | } | ||
978 | |||
979 | + if (xhci->xhc_state & XHCI_STATE_HALTED) | ||
980 | + return -ENODEV; | ||
981 | + | ||
982 | return 1; | ||
983 | } | ||
984 | |||
985 | @@ -4194,6 +4194,13 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks) | ||
986 | |||
987 | get_quirks(dev, xhci); | ||
988 | |||
989 | + /* In xhci controllers which follow xhci 1.0 spec gives a spurious | ||
990 | + * success event after a short transfer. This quirk will ignore such | ||
991 | + * spurious event. | ||
992 | + */ | ||
993 | + if (xhci->hci_version > 0x96) | ||
994 | + xhci->quirks |= XHCI_SPURIOUS_SUCCESS; | ||
995 | + | ||
996 | /* Make sure the HC is halted. */ | ||
997 | retval = xhci_halt(xhci); | ||
998 | if (retval) | ||
999 | diff --git a/drivers/usb/misc/sisusbvga/sisusb.c b/drivers/usb/misc/sisusbvga/sisusb.c | ||
1000 | index dd573ab..7af163d 100644 | ||
1001 | --- a/drivers/usb/misc/sisusbvga/sisusb.c | ||
1002 | +++ b/drivers/usb/misc/sisusbvga/sisusb.c | ||
1003 | @@ -3247,6 +3247,7 @@ static const struct usb_device_id sisusb_table[] = { | ||
1004 | { USB_DEVICE(0x0711, 0x0903) }, | ||
1005 | { USB_DEVICE(0x0711, 0x0918) }, | ||
1006 | { USB_DEVICE(0x0711, 0x0920) }, | ||
1007 | + { USB_DEVICE(0x0711, 0x0950) }, | ||
1008 | { USB_DEVICE(0x182d, 0x021c) }, | ||
1009 | { USB_DEVICE(0x182d, 0x0269) }, | ||
1010 | { } | ||
1011 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c | ||
1012 | index f8a9cd7..3e4c27d 100644 | ||
1013 | --- a/drivers/usb/serial/ftdi_sio.c | ||
1014 | +++ b/drivers/usb/serial/ftdi_sio.c | ||
1015 | @@ -745,9 +745,34 @@ static struct usb_device_id id_table_combined [] = { | ||
1016 | { USB_DEVICE(FTDI_VID, FTDI_NDI_AURORA_SCU_PID), | ||
1017 | .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk }, | ||
1018 | { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) }, | ||
1019 | - { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_SERIAL_VX7_PID) }, | ||
1020 | - { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_CT29B_PID) }, | ||
1021 | - { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_RTS01_PID) }, | ||
1022 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S03_PID) }, | ||
1023 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_59_PID) }, | ||
1024 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_57A_PID) }, | ||
1025 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_57B_PID) }, | ||
1026 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29A_PID) }, | ||
1027 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29B_PID) }, | ||
1028 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29F_PID) }, | ||
1029 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_62B_PID) }, | ||
1030 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S01_PID) }, | ||
1031 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_63_PID) }, | ||
1032 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29C_PID) }, | ||
1033 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_81B_PID) }, | ||
1034 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_82B_PID) }, | ||
1035 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K5D_PID) }, | ||
1036 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K4Y_PID) }, | ||
1037 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K5G_PID) }, | ||
1038 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S05_PID) }, | ||
1039 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_60_PID) }, | ||
1040 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_61_PID) }, | ||
1041 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_62_PID) }, | ||
1042 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_63B_PID) }, | ||
1043 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_64_PID) }, | ||
1044 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_65_PID) }, | ||
1045 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_92_PID) }, | ||
1046 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_92D_PID) }, | ||
1047 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_W5R_PID) }, | ||
1048 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_A5R_PID) }, | ||
1049 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_PW1_PID) }, | ||
1050 | { USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) }, | ||
1051 | { USB_DEVICE(FTDI_VID, FTDI_PHI_FISCO_PID) }, | ||
1052 | { USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) }, | ||
1053 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h | ||
1054 | index 6dd7925..1b8af46 100644 | ||
1055 | --- a/drivers/usb/serial/ftdi_sio_ids.h | ||
1056 | +++ b/drivers/usb/serial/ftdi_sio_ids.h | ||
1057 | @@ -815,11 +815,35 @@ | ||
1058 | /* | ||
1059 | * RT Systems programming cables for various ham radios | ||
1060 | */ | ||
1061 | -#define RTSYSTEMS_VID 0x2100 /* Vendor ID */ | ||
1062 | -#define RTSYSTEMS_SERIAL_VX7_PID 0x9e52 /* Serial converter for VX-7 Radios using FT232RL */ | ||
1063 | -#define RTSYSTEMS_CT29B_PID 0x9e54 /* CT29B Radio Cable */ | ||
1064 | -#define RTSYSTEMS_RTS01_PID 0x9e57 /* USB-RTS01 Radio Cable */ | ||
1065 | - | ||
1066 | +#define RTSYSTEMS_VID 0x2100 /* Vendor ID */ | ||
1067 | +#define RTSYSTEMS_USB_S03_PID 0x9001 /* RTS-03 USB to Serial Adapter */ | ||
1068 | +#define RTSYSTEMS_USB_59_PID 0x9e50 /* USB-59 USB to 8 pin plug */ | ||
1069 | +#define RTSYSTEMS_USB_57A_PID 0x9e51 /* USB-57A USB to 4pin 3.5mm plug */ | ||
1070 | +#define RTSYSTEMS_USB_57B_PID 0x9e52 /* USB-57B USB to extended 4pin 3.5mm plug */ | ||
1071 | +#define RTSYSTEMS_USB_29A_PID 0x9e53 /* USB-29A USB to 3.5mm stereo plug */ | ||
1072 | +#define RTSYSTEMS_USB_29B_PID 0x9e54 /* USB-29B USB to 6 pin mini din */ | ||
1073 | +#define RTSYSTEMS_USB_29F_PID 0x9e55 /* USB-29F USB to 6 pin modular plug */ | ||
1074 | +#define RTSYSTEMS_USB_62B_PID 0x9e56 /* USB-62B USB to 8 pin mini din plug*/ | ||
1075 | +#define RTSYSTEMS_USB_S01_PID 0x9e57 /* USB-RTS01 USB to 3.5 mm stereo plug*/ | ||
1076 | +#define RTSYSTEMS_USB_63_PID 0x9e58 /* USB-63 USB to 9 pin female*/ | ||
1077 | +#define RTSYSTEMS_USB_29C_PID 0x9e59 /* USB-29C USB to 4 pin modular plug*/ | ||
1078 | +#define RTSYSTEMS_USB_81B_PID 0x9e5A /* USB-81 USB to 8 pin mini din plug*/ | ||
1079 | +#define RTSYSTEMS_USB_82B_PID 0x9e5B /* USB-82 USB to 2.5 mm stereo plug*/ | ||
1080 | +#define RTSYSTEMS_USB_K5D_PID 0x9e5C /* USB-K5D USB to 8 pin modular plug*/ | ||
1081 | +#define RTSYSTEMS_USB_K4Y_PID 0x9e5D /* USB-K4Y USB to 2.5/3.5 mm plugs*/ | ||
1082 | +#define RTSYSTEMS_USB_K5G_PID 0x9e5E /* USB-K5G USB to 8 pin modular plug*/ | ||
1083 | +#define RTSYSTEMS_USB_S05_PID 0x9e5F /* USB-RTS05 USB to 2.5 mm stereo plug*/ | ||
1084 | +#define RTSYSTEMS_USB_60_PID 0x9e60 /* USB-60 USB to 6 pin din*/ | ||
1085 | +#define RTSYSTEMS_USB_61_PID 0x9e61 /* USB-61 USB to 6 pin mini din*/ | ||
1086 | +#define RTSYSTEMS_USB_62_PID 0x9e62 /* USB-62 USB to 8 pin mini din*/ | ||
1087 | +#define RTSYSTEMS_USB_63B_PID 0x9e63 /* USB-63 USB to 9 pin female*/ | ||
1088 | +#define RTSYSTEMS_USB_64_PID 0x9e64 /* USB-64 USB to 9 pin male*/ | ||
1089 | +#define RTSYSTEMS_USB_65_PID 0x9e65 /* USB-65 USB to 9 pin female null modem*/ | ||
1090 | +#define RTSYSTEMS_USB_92_PID 0x9e66 /* USB-92 USB to 12 pin plug*/ | ||
1091 | +#define RTSYSTEMS_USB_92D_PID 0x9e67 /* USB-92D USB to 12 pin plug data*/ | ||
1092 | +#define RTSYSTEMS_USB_W5R_PID 0x9e68 /* USB-W5R USB to 8 pin modular plug*/ | ||
1093 | +#define RTSYSTEMS_USB_A5R_PID 0x9e69 /* USB-A5R USB to 8 pin modular plug*/ | ||
1094 | +#define RTSYSTEMS_USB_PW1_PID 0x9e6A /* USB-PW1 USB to 8 pin modular plug*/ | ||
1095 | |||
1096 | /* | ||
1097 | * Physik Instrumente | ||
1098 | diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c | ||
1099 | index a39a08c..a7492ba 100644 | ||
1100 | --- a/drivers/usb/serial/ti_usb_3410_5052.c | ||
1101 | +++ b/drivers/usb/serial/ti_usb_3410_5052.c | ||
1102 | @@ -390,7 +390,7 @@ static int ti_startup(struct usb_serial *serial) | ||
1103 | usb_set_serial_data(serial, tdev); | ||
1104 | |||
1105 | /* determine device type */ | ||
1106 | - if (usb_match_id(serial->interface, ti_id_table_3410)) | ||
1107 | + if (serial->type == &ti_1port_device) | ||
1108 | tdev->td_is_3410 = 1; | ||
1109 | dbg("%s - device type is %s", __func__, | ||
1110 | tdev->td_is_3410 ? "3410" : "5052"); | ||
1111 | diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h | ||
1112 | index 8ee632c..cf442e0 100644 | ||
1113 | --- a/drivers/usb/storage/unusual_devs.h | ||
1114 | +++ b/drivers/usb/storage/unusual_devs.h | ||
1115 | @@ -657,6 +657,13 @@ UNUSUAL_DEV( 0x054c, 0x016a, 0x0000, 0x9999, | ||
1116 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
1117 | US_FL_FIX_INQUIRY ), | ||
1118 | |||
1119 | +/* Submitted by Ren Bigcren <bigcren.ren@sonymobile.com> */ | ||
1120 | +UNUSUAL_DEV( 0x054c, 0x02a5, 0x0100, 0x0100, | ||
1121 | + "Sony Corp.", | ||
1122 | + "MicroVault Flash Drive", | ||
1123 | + USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
1124 | + US_FL_NO_READ_CAPACITY_16 ), | ||
1125 | + | ||
1126 | /* floppy reports multiple luns */ | ||
1127 | UNUSUAL_DEV( 0x055d, 0x2020, 0x0000, 0x0210, | ||
1128 | "SAMSUNG", | ||
1129 | diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c | ||
1130 | index 52bfd07..c212de7 100644 | ||
1131 | --- a/drivers/virtio/virtio_ring.c | ||
1132 | +++ b/drivers/virtio/virtio_ring.c | ||
1133 | @@ -498,16 +498,18 @@ EXPORT_SYMBOL_GPL(virtqueue_disable_cb); | ||
1134 | * virtqueue_enable_cb - restart callbacks after disable_cb. | ||
1135 | * @vq: the struct virtqueue we're talking about. | ||
1136 | * | ||
1137 | - * This re-enables callbacks; it returns "false" if there are pending | ||
1138 | - * buffers in the queue, to detect a possible race between the driver | ||
1139 | - * checking for more work, and enabling callbacks. | ||
1140 | + * This re-enables callbacks; it returns current queue state | ||
1141 | + * in an opaque unsigned value. This value should be later tested by | ||
1142 | + * virtqueue_poll, to detect a possible race between the driver checking for | ||
1143 | + * more work, and enabling callbacks. | ||
1144 | * | ||
1145 | * Caller must ensure we don't call this with other virtqueue | ||
1146 | * operations at the same time (except where noted). | ||
1147 | */ | ||
1148 | -bool virtqueue_enable_cb(struct virtqueue *_vq) | ||
1149 | +unsigned virtqueue_enable_cb_prepare(struct virtqueue *_vq) | ||
1150 | { | ||
1151 | struct vring_virtqueue *vq = to_vvq(_vq); | ||
1152 | + u16 last_used_idx; | ||
1153 | |||
1154 | START_USE(vq); | ||
1155 | |||
1156 | @@ -517,15 +519,45 @@ bool virtqueue_enable_cb(struct virtqueue *_vq) | ||
1157 | * either clear the flags bit or point the event index at the next | ||
1158 | * entry. Always do both to keep code simple. */ | ||
1159 | vq->vring.avail->flags &= ~VRING_AVAIL_F_NO_INTERRUPT; | ||
1160 | - vring_used_event(&vq->vring) = vq->last_used_idx; | ||
1161 | + vring_used_event(&vq->vring) = last_used_idx = vq->last_used_idx; | ||
1162 | + END_USE(vq); | ||
1163 | + return last_used_idx; | ||
1164 | +} | ||
1165 | +EXPORT_SYMBOL_GPL(virtqueue_enable_cb_prepare); | ||
1166 | + | ||
1167 | +/** | ||
1168 | + * virtqueue_poll - query pending used buffers | ||
1169 | + * @vq: the struct virtqueue we're talking about. | ||
1170 | + * @last_used_idx: virtqueue state (from call to virtqueue_enable_cb_prepare). | ||
1171 | + * | ||
1172 | + * Returns "true" if there are pending used buffers in the queue. | ||
1173 | + * | ||
1174 | + * This does not need to be serialized. | ||
1175 | + */ | ||
1176 | +bool virtqueue_poll(struct virtqueue *_vq, unsigned last_used_idx) | ||
1177 | +{ | ||
1178 | + struct vring_virtqueue *vq = to_vvq(_vq); | ||
1179 | + | ||
1180 | virtio_mb(vq); | ||
1181 | - if (unlikely(more_used(vq))) { | ||
1182 | - END_USE(vq); | ||
1183 | - return false; | ||
1184 | - } | ||
1185 | + return (u16)last_used_idx != vq->vring.used->idx; | ||
1186 | +} | ||
1187 | +EXPORT_SYMBOL_GPL(virtqueue_poll); | ||
1188 | |||
1189 | - END_USE(vq); | ||
1190 | - return true; | ||
1191 | +/** | ||
1192 | + * virtqueue_enable_cb - restart callbacks after disable_cb. | ||
1193 | + * @vq: the struct virtqueue we're talking about. | ||
1194 | + * | ||
1195 | + * This re-enables callbacks; it returns "false" if there are pending | ||
1196 | + * buffers in the queue, to detect a possible race between the driver | ||
1197 | + * checking for more work, and enabling callbacks. | ||
1198 | + * | ||
1199 | + * Caller must ensure we don't call this with other virtqueue | ||
1200 | + * operations at the same time (except where noted). | ||
1201 | + */ | ||
1202 | +bool virtqueue_enable_cb(struct virtqueue *_vq) | ||
1203 | +{ | ||
1204 | + unsigned last_used_idx = virtqueue_enable_cb_prepare(_vq); | ||
1205 | + return !virtqueue_poll(_vq, last_used_idx); | ||
1206 | } | ||
1207 | EXPORT_SYMBOL_GPL(virtqueue_enable_cb); | ||
1208 | |||
1209 | diff --git a/drivers/xen/evtchn.c b/drivers/xen/evtchn.c | ||
1210 | index b2db77e..82b27d4 100644 | ||
1211 | --- a/drivers/xen/evtchn.c | ||
1212 | +++ b/drivers/xen/evtchn.c | ||
1213 | @@ -377,18 +377,12 @@ static long evtchn_ioctl(struct file *file, | ||
1214 | if (unbind.port >= NR_EVENT_CHANNELS) | ||
1215 | break; | ||
1216 | |||
1217 | - spin_lock_irq(&port_user_lock); | ||
1218 | - | ||
1219 | rc = -ENOTCONN; | ||
1220 | - if (get_port_user(unbind.port) != u) { | ||
1221 | - spin_unlock_irq(&port_user_lock); | ||
1222 | + if (get_port_user(unbind.port) != u) | ||
1223 | break; | ||
1224 | - } | ||
1225 | |||
1226 | disable_irq(irq_from_evtchn(unbind.port)); | ||
1227 | |||
1228 | - spin_unlock_irq(&port_user_lock); | ||
1229 | - | ||
1230 | evtchn_unbind_from_user(u, unbind.port); | ||
1231 | |||
1232 | rc = 0; | ||
1233 | @@ -488,26 +482,15 @@ static int evtchn_release(struct inode *inode, struct file *filp) | ||
1234 | int i; | ||
1235 | struct per_user_data *u = filp->private_data; | ||
1236 | |||
1237 | - spin_lock_irq(&port_user_lock); | ||
1238 | - | ||
1239 | - free_page((unsigned long)u->ring); | ||
1240 | - | ||
1241 | for (i = 0; i < NR_EVENT_CHANNELS; i++) { | ||
1242 | if (get_port_user(i) != u) | ||
1243 | continue; | ||
1244 | |||
1245 | disable_irq(irq_from_evtchn(i)); | ||
1246 | - } | ||
1247 | - | ||
1248 | - spin_unlock_irq(&port_user_lock); | ||
1249 | - | ||
1250 | - for (i = 0; i < NR_EVENT_CHANNELS; i++) { | ||
1251 | - if (get_port_user(i) != u) | ||
1252 | - continue; | ||
1253 | - | ||
1254 | evtchn_unbind_from_user(get_port_user(i), i); | ||
1255 | } | ||
1256 | |||
1257 | + free_page((unsigned long)u->ring); | ||
1258 | kfree(u->name); | ||
1259 | kfree(u); | ||
1260 | |||
1261 | diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c | ||
1262 | index fef1f21..c4f0a99 100644 | ||
1263 | --- a/fs/btrfs/extent-tree.c | ||
1264 | +++ b/fs/btrfs/extent-tree.c | ||
1265 | @@ -6846,6 +6846,7 @@ int btrfs_drop_snapshot(struct btrfs_root *root, | ||
1266 | int err = 0; | ||
1267 | int ret; | ||
1268 | int level; | ||
1269 | + bool root_dropped = false; | ||
1270 | |||
1271 | path = btrfs_alloc_path(); | ||
1272 | if (!path) { | ||
1273 | @@ -6903,6 +6904,7 @@ int btrfs_drop_snapshot(struct btrfs_root *root, | ||
1274 | while (1) { | ||
1275 | btrfs_tree_lock(path->nodes[level]); | ||
1276 | btrfs_set_lock_blocking(path->nodes[level]); | ||
1277 | + path->locks[level] = BTRFS_WRITE_LOCK_BLOCKING; | ||
1278 | |||
1279 | ret = btrfs_lookup_extent_info(trans, root, | ||
1280 | path->nodes[level]->start, | ||
1281 | @@ -6919,6 +6921,7 @@ int btrfs_drop_snapshot(struct btrfs_root *root, | ||
1282 | break; | ||
1283 | |||
1284 | btrfs_tree_unlock(path->nodes[level]); | ||
1285 | + path->locks[level] = 0; | ||
1286 | WARN_ON(wc->refs[level] != 1); | ||
1287 | level--; | ||
1288 | } | ||
1289 | @@ -7014,12 +7017,22 @@ int btrfs_drop_snapshot(struct btrfs_root *root, | ||
1290 | free_extent_buffer(root->commit_root); | ||
1291 | kfree(root); | ||
1292 | } | ||
1293 | + root_dropped = true; | ||
1294 | out_end_trans: | ||
1295 | btrfs_end_transaction_throttle(trans, tree_root); | ||
1296 | out_free: | ||
1297 | kfree(wc); | ||
1298 | btrfs_free_path(path); | ||
1299 | out: | ||
1300 | + /* | ||
1301 | + * So if we need to stop dropping the snapshot for whatever reason we | ||
1302 | + * need to make sure to add it back to the dead root list so that we | ||
1303 | + * keep trying to do the work later. This also cleans up roots if we | ||
1304 | + * don't have it in the radix (like when we recover after a power fail | ||
1305 | + * or unmount) so we don't leak memory. | ||
1306 | + */ | ||
1307 | + if (root_dropped == false) | ||
1308 | + btrfs_add_dead_root(root); | ||
1309 | if (err) | ||
1310 | btrfs_std_error(root->fs_info, err); | ||
1311 | return err; | ||
1312 | diff --git a/fs/super.c b/fs/super.c | ||
1313 | index cf00177..3c520a5 100644 | ||
1314 | --- a/fs/super.c | ||
1315 | +++ b/fs/super.c | ||
1316 | @@ -298,19 +298,19 @@ EXPORT_SYMBOL(deactivate_super); | ||
1317 | * and want to turn it into a full-blown active reference. grab_super() | ||
1318 | * is called with sb_lock held and drops it. Returns 1 in case of | ||
1319 | * success, 0 if we had failed (superblock contents was already dead or | ||
1320 | - * dying when grab_super() had been called). | ||
1321 | + * dying when grab_super() had been called). Note that this is only | ||
1322 | + * called for superblocks not in rundown mode (== ones still on ->fs_supers | ||
1323 | + * of their type), so increment of ->s_count is OK here. | ||
1324 | */ | ||
1325 | static int grab_super(struct super_block *s) __releases(sb_lock) | ||
1326 | { | ||
1327 | - if (atomic_inc_not_zero(&s->s_active)) { | ||
1328 | - spin_unlock(&sb_lock); | ||
1329 | - return 1; | ||
1330 | - } | ||
1331 | - /* it's going away */ | ||
1332 | s->s_count++; | ||
1333 | spin_unlock(&sb_lock); | ||
1334 | - /* wait for it to die */ | ||
1335 | down_write(&s->s_umount); | ||
1336 | + if ((s->s_flags & MS_BORN) && atomic_inc_not_zero(&s->s_active)) { | ||
1337 | + put_super(s); | ||
1338 | + return 1; | ||
1339 | + } | ||
1340 | up_write(&s->s_umount); | ||
1341 | put_super(s); | ||
1342 | return 0; | ||
1343 | @@ -440,11 +440,6 @@ retry: | ||
1344 | destroy_super(s); | ||
1345 | s = NULL; | ||
1346 | } | ||
1347 | - down_write(&old->s_umount); | ||
1348 | - if (unlikely(!(old->s_flags & MS_BORN))) { | ||
1349 | - deactivate_locked_super(old); | ||
1350 | - goto retry; | ||
1351 | - } | ||
1352 | return old; | ||
1353 | } | ||
1354 | } | ||
1355 | @@ -677,10 +672,10 @@ restart: | ||
1356 | if (hlist_unhashed(&sb->s_instances)) | ||
1357 | continue; | ||
1358 | if (sb->s_bdev == bdev) { | ||
1359 | - if (grab_super(sb)) /* drops sb_lock */ | ||
1360 | - return sb; | ||
1361 | - else | ||
1362 | + if (!grab_super(sb)) | ||
1363 | goto restart; | ||
1364 | + up_write(&sb->s_umount); | ||
1365 | + return sb; | ||
1366 | } | ||
1367 | } | ||
1368 | spin_unlock(&sb_lock); | ||
1369 | diff --git a/include/linux/firewire-cdev.h b/include/linux/firewire-cdev.h | ||
1370 | index d500369..1db453e 100644 | ||
1371 | --- a/include/linux/firewire-cdev.h | ||
1372 | +++ b/include/linux/firewire-cdev.h | ||
1373 | @@ -215,8 +215,8 @@ struct fw_cdev_event_request2 { | ||
1374 | * with the %FW_CDEV_ISO_INTERRUPT bit set, when explicitly requested with | ||
1375 | * %FW_CDEV_IOC_FLUSH_ISO, or when there have been so many completed packets | ||
1376 | * without the interrupt bit set that the kernel's internal buffer for @header | ||
1377 | - * is about to overflow. (In the last case, kernels with ABI version < 5 drop | ||
1378 | - * header data up to the next interrupt packet.) | ||
1379 | + * is about to overflow. (In the last case, ABI versions < 5 drop header data | ||
1380 | + * up to the next interrupt packet.) | ||
1381 | * | ||
1382 | * Isochronous transmit events (context type %FW_CDEV_ISO_CONTEXT_TRANSMIT): | ||
1383 | * | ||
1384 | diff --git a/include/linux/firewire.h b/include/linux/firewire.h | ||
1385 | index cdc9b71..4d259fc 100644 | ||
1386 | --- a/include/linux/firewire.h | ||
1387 | +++ b/include/linux/firewire.h | ||
1388 | @@ -409,6 +409,7 @@ struct fw_iso_context { | ||
1389 | int type; | ||
1390 | int channel; | ||
1391 | int speed; | ||
1392 | + bool drop_overflow_headers; | ||
1393 | size_t header_size; | ||
1394 | union { | ||
1395 | fw_iso_callback_t sc; | ||
1396 | diff --git a/include/linux/virtio.h b/include/linux/virtio.h | ||
1397 | index 8efd28a..2b779bf 100644 | ||
1398 | --- a/include/linux/virtio.h | ||
1399 | +++ b/include/linux/virtio.h | ||
1400 | @@ -44,6 +44,10 @@ void virtqueue_disable_cb(struct virtqueue *vq); | ||
1401 | |||
1402 | bool virtqueue_enable_cb(struct virtqueue *vq); | ||
1403 | |||
1404 | +unsigned virtqueue_enable_cb_prepare(struct virtqueue *vq); | ||
1405 | + | ||
1406 | +bool virtqueue_poll(struct virtqueue *vq, unsigned); | ||
1407 | + | ||
1408 | bool virtqueue_enable_cb_delayed(struct virtqueue *vq); | ||
1409 | |||
1410 | void *virtqueue_detach_unused_buf(struct virtqueue *vq); | ||
1411 | diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c | ||
1412 | index e675182..c9ce09a 100644 | ||
1413 | --- a/kernel/trace/trace_syscalls.c | ||
1414 | +++ b/kernel/trace/trace_syscalls.c | ||
1415 | @@ -358,6 +358,9 @@ void ftrace_syscall_exit(void *ignore, struct pt_regs *regs, long ret) | ||
1416 | if (!sys_data) | ||
1417 | return; | ||
1418 | |||
1419 | + local_save_flags(irq_flags); | ||
1420 | + pc = preempt_count(); | ||
1421 | + | ||
1422 | event = trace_current_buffer_lock_reserve(&buffer, | ||
1423 | sys_data->exit_event->event.type, sizeof(*entry), | ||
1424 | irq_flags, pc); | ||
1425 | diff --git a/mm/page_alloc.c b/mm/page_alloc.c | ||
1426 | index 533ea80..8090542 100644 | ||
1427 | --- a/mm/page_alloc.c | ||
1428 | +++ b/mm/page_alloc.c | ||
1429 | @@ -5592,6 +5592,10 @@ __offline_isolated_pages(unsigned long start_pfn, unsigned long end_pfn) | ||
1430 | zone->free_area[order].nr_free--; | ||
1431 | __mod_zone_page_state(zone, NR_FREE_PAGES, | ||
1432 | - (1UL << order)); | ||
1433 | +#ifdef CONFIG_HIGHMEM | ||
1434 | + if (PageHighMem(page)) | ||
1435 | + totalhigh_pages -= 1 << order; | ||
1436 | +#endif | ||
1437 | for (i = 0; i < (1 << order); i++) | ||
1438 | SetPageReserved((page+i)); | ||
1439 | pfn += (1 << order); | ||
1440 | diff --git a/sound/soc/codecs/max98088.c b/sound/soc/codecs/max98088.c | ||
1441 | index 4790568..8df4597 100644 | ||
1442 | --- a/sound/soc/codecs/max98088.c | ||
1443 | +++ b/sound/soc/codecs/max98088.c | ||
1444 | @@ -1594,7 +1594,7 @@ static int max98088_dai2_digital_mute(struct snd_soc_dai *codec_dai, int mute) | ||
1445 | |||
1446 | static void max98088_sync_cache(struct snd_soc_codec *codec) | ||
1447 | { | ||
1448 | - u16 *reg_cache = codec->reg_cache; | ||
1449 | + u8 *reg_cache = codec->reg_cache; | ||
1450 | int i; | ||
1451 | |||
1452 | if (!codec->cache_sync) | ||
1453 | diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c | ||
1454 | index 96f6f9f..e96c6ed 100644 | ||
1455 | --- a/sound/soc/codecs/wm8962.c | ||
1456 | +++ b/sound/soc/codecs/wm8962.c | ||
1457 | @@ -1599,7 +1599,6 @@ static int wm8962_put_hp_sw(struct snd_kcontrol *kcontrol, | ||
1458 | struct snd_ctl_elem_value *ucontrol) | ||
1459 | { | ||
1460 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); | ||
1461 | - u16 *reg_cache = codec->reg_cache; | ||
1462 | int ret; | ||
1463 | |||
1464 | /* Apply the update (if any) */ | ||
1465 | @@ -1608,16 +1607,19 @@ static int wm8962_put_hp_sw(struct snd_kcontrol *kcontrol, | ||
1466 | return 0; | ||
1467 | |||
1468 | /* If the left PGA is enabled hit that VU bit... */ | ||
1469 | - if (snd_soc_read(codec, WM8962_PWR_MGMT_2) & WM8962_HPOUTL_PGA_ENA) | ||
1470 | - return snd_soc_write(codec, WM8962_HPOUTL_VOLUME, | ||
1471 | - reg_cache[WM8962_HPOUTL_VOLUME]); | ||
1472 | + ret = snd_soc_read(codec, WM8962_PWR_MGMT_2); | ||
1473 | + if (ret & WM8962_HPOUTL_PGA_ENA) { | ||
1474 | + snd_soc_write(codec, WM8962_HPOUTL_VOLUME, | ||
1475 | + snd_soc_read(codec, WM8962_HPOUTL_VOLUME)); | ||
1476 | + return 1; | ||
1477 | + } | ||
1478 | |||
1479 | /* ...otherwise the right. The VU is stereo. */ | ||
1480 | - if (snd_soc_read(codec, WM8962_PWR_MGMT_2) & WM8962_HPOUTR_PGA_ENA) | ||
1481 | - return snd_soc_write(codec, WM8962_HPOUTR_VOLUME, | ||
1482 | - reg_cache[WM8962_HPOUTR_VOLUME]); | ||
1483 | + if (ret & WM8962_HPOUTR_PGA_ENA) | ||
1484 | + snd_soc_write(codec, WM8962_HPOUTR_VOLUME, | ||
1485 | + snd_soc_read(codec, WM8962_HPOUTR_VOLUME)); | ||
1486 | |||
1487 | - return 0; | ||
1488 | + return 1; | ||
1489 | } | ||
1490 | |||
1491 | /* The VU bits for the speakers are in a different register to the mute | ||
1492 | @@ -3363,7 +3365,6 @@ static int wm8962_probe(struct snd_soc_codec *codec) | ||
1493 | int ret; | ||
1494 | struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); | ||
1495 | struct wm8962_pdata *pdata = dev_get_platdata(codec->dev); | ||
1496 | - u16 *reg_cache = codec->reg_cache; | ||
1497 | int i, trigger, irq_pol; | ||
1498 | bool dmicclk, dmicdat; | ||
1499 | |||
1500 | @@ -3421,8 +3422,9 @@ static int wm8962_probe(struct snd_soc_codec *codec) | ||
1501 | |||
1502 | /* Put the speakers into mono mode? */ | ||
1503 | if (pdata->spk_mono) | ||
1504 | - reg_cache[WM8962_CLASS_D_CONTROL_2] | ||
1505 | - |= WM8962_SPK_MONO; | ||
1506 | + snd_soc_update_bits(codec, WM8962_CLASS_D_CONTROL_2, | ||
1507 | + WM8962_SPK_MONO_MASK, WM8962_SPK_MONO); | ||
1508 | + | ||
1509 | |||
1510 | /* Micbias setup, detection enable and detection | ||
1511 | * threasholds. */ |