Annotation of /trunk/kernel26-magellan-server/patches-2.6.27-r2/0109-2.6.27.10-all-fixes.patch
Parent Directory | Revision Log
Revision 728 -
(hide annotations)
(download)
Tue Dec 23 09:41:15 2008 UTC (15 years, 9 months ago) by niro
File size: 42680 byte(s)
Tue Dec 23 09:41:15 2008 UTC (15 years, 9 months ago) by niro
File size: 42680 byte(s)
-ver bump to 2.6.27-r2: - updated to linux-2.6.27.10 - using tuxonice current-20081025 - adjusted kernel-configs to use tuxonice and enabled ufs filesystem support
1 | niro | 728 | diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt |
2 | index 1150444..792be86 100644 | ||
3 | --- a/Documentation/kernel-parameters.txt | ||
4 | +++ b/Documentation/kernel-parameters.txt | ||
5 | @@ -283,7 +283,7 @@ and is between 256 and 4096 characters. It is defined in the file | ||
6 | Possible values are: | ||
7 | isolate - enable device isolation (each device, as far | ||
8 | as possible, will get its own protection | ||
9 | - domain) | ||
10 | + domain) [default] | ||
11 | amd_iommu_size= [HW,X86-64] | ||
12 | Define the size of the aperture for the AMD IOMMU | ||
13 | driver. Possible values are: | ||
14 | diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c | ||
15 | index bccd0ef..a1378c4 100644 | ||
16 | --- a/arch/x86/kernel/amd_iommu_init.c | ||
17 | +++ b/arch/x86/kernel/amd_iommu_init.c | ||
18 | @@ -120,7 +120,7 @@ u16 amd_iommu_last_bdf; /* largest PCI device id we have | ||
19 | LIST_HEAD(amd_iommu_unity_map); /* a list of required unity mappings | ||
20 | we find in ACPI */ | ||
21 | unsigned amd_iommu_aperture_order = 26; /* size of aperture in power of 2 */ | ||
22 | -int amd_iommu_isolate; /* if 1, device isolation is enabled */ | ||
23 | +int amd_iommu_isolate = 1; /* if 1, device isolation is enabled */ | ||
24 | |||
25 | LIST_HEAD(amd_iommu_list); /* list of all AMD IOMMUs in the | ||
26 | system */ | ||
27 | diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c | ||
28 | index 7667443..6d5a3c4 100644 | ||
29 | --- a/arch/x86/kernel/setup.c | ||
30 | +++ b/arch/x86/kernel/setup.c | ||
31 | @@ -634,6 +634,9 @@ void __init setup_arch(char **cmdline_p) | ||
32 | printk(KERN_INFO "Command line: %s\n", boot_command_line); | ||
33 | #endif | ||
34 | |||
35 | + /* VMI may relocate the fixmap; do this before touching ioremap area */ | ||
36 | + vmi_init(); | ||
37 | + | ||
38 | early_cpu_init(); | ||
39 | early_ioremap_init(); | ||
40 | |||
41 | @@ -707,13 +710,8 @@ void __init setup_arch(char **cmdline_p) | ||
42 | check_efer(); | ||
43 | #endif | ||
44 | |||
45 | -#if defined(CONFIG_VMI) && defined(CONFIG_X86_32) | ||
46 | - /* | ||
47 | - * Must be before kernel pagetables are setup | ||
48 | - * or fixmap area is touched. | ||
49 | - */ | ||
50 | - vmi_init(); | ||
51 | -#endif | ||
52 | + /* Must be before kernel pagetables are setup */ | ||
53 | + vmi_activate(); | ||
54 | |||
55 | /* after early param, so could get panic from serial */ | ||
56 | reserve_early_setup_data(); | ||
57 | diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c | ||
58 | index 7985c5b..259569f 100644 | ||
59 | --- a/arch/x86/kernel/smpboot.c | ||
60 | +++ b/arch/x86/kernel/smpboot.c | ||
61 | @@ -289,9 +289,7 @@ static void __cpuinit start_secondary(void *unused) | ||
62 | * fragile that we want to limit the things done here to the | ||
63 | * most necessary things. | ||
64 | */ | ||
65 | -#ifdef CONFIG_VMI | ||
66 | vmi_bringup(); | ||
67 | -#endif | ||
68 | cpu_init(); | ||
69 | preempt_disable(); | ||
70 | smp_callin(); | ||
71 | diff --git a/arch/x86/kernel/vmi_32.c b/arch/x86/kernel/vmi_32.c | ||
72 | index edfb09f..f370d38 100644 | ||
73 | --- a/arch/x86/kernel/vmi_32.c | ||
74 | +++ b/arch/x86/kernel/vmi_32.c | ||
75 | @@ -960,8 +960,6 @@ static inline int __init activate_vmi(void) | ||
76 | |||
77 | void __init vmi_init(void) | ||
78 | { | ||
79 | - unsigned long flags; | ||
80 | - | ||
81 | if (!vmi_rom) | ||
82 | probe_vmi_rom(); | ||
83 | else | ||
84 | @@ -973,13 +971,21 @@ void __init vmi_init(void) | ||
85 | |||
86 | reserve_top_address(-vmi_rom->virtual_top); | ||
87 | |||
88 | - local_irq_save(flags); | ||
89 | - activate_vmi(); | ||
90 | - | ||
91 | #ifdef CONFIG_X86_IO_APIC | ||
92 | /* This is virtual hardware; timer routing is wired correctly */ | ||
93 | no_timer_check = 1; | ||
94 | #endif | ||
95 | +} | ||
96 | + | ||
97 | +void vmi_activate(void) | ||
98 | +{ | ||
99 | + unsigned long flags; | ||
100 | + | ||
101 | + if (!vmi_rom) | ||
102 | + return; | ||
103 | + | ||
104 | + local_irq_save(flags); | ||
105 | + activate_vmi(); | ||
106 | local_irq_restore(flags & X86_EFLAGS_IF); | ||
107 | } | ||
108 | |||
109 | diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c | ||
110 | index b551cda..f38e2af 100644 | ||
111 | --- a/drivers/ata/libata-core.c | ||
112 | +++ b/drivers/ata/libata-core.c | ||
113 | @@ -3979,17 +3979,70 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | ||
114 | { "ST3160023AS", "3.42", ATA_HORKAGE_NONCQ }, | ||
115 | |||
116 | /* Seagate NCQ + FLUSH CACHE firmware bug */ | ||
117 | - { "ST31500341AS", "9JU138", ATA_HORKAGE_NONCQ | | ||
118 | + { "ST31500341AS", "SD15", ATA_HORKAGE_NONCQ | | ||
119 | ATA_HORKAGE_FIRMWARE_WARN }, | ||
120 | - { "ST31000333AS", "9FZ136", ATA_HORKAGE_NONCQ | | ||
121 | + { "ST31500341AS", "SD16", ATA_HORKAGE_NONCQ | | ||
122 | ATA_HORKAGE_FIRMWARE_WARN }, | ||
123 | - { "ST3640623AS", "9FZ164", ATA_HORKAGE_NONCQ | | ||
124 | + { "ST31500341AS", "SD17", ATA_HORKAGE_NONCQ | | ||
125 | ATA_HORKAGE_FIRMWARE_WARN }, | ||
126 | - { "ST3640323AS", "9FZ134", ATA_HORKAGE_NONCQ | | ||
127 | + { "ST31500341AS", "SD18", ATA_HORKAGE_NONCQ | | ||
128 | ATA_HORKAGE_FIRMWARE_WARN }, | ||
129 | - { "ST3320813AS", "9FZ182", ATA_HORKAGE_NONCQ | | ||
130 | + { "ST31500341AS", "SD19", ATA_HORKAGE_NONCQ | | ||
131 | ATA_HORKAGE_FIRMWARE_WARN }, | ||
132 | - { "ST3320613AS", "9FZ162", ATA_HORKAGE_NONCQ | | ||
133 | + | ||
134 | + { "ST31000333AS", "SD15", ATA_HORKAGE_NONCQ | | ||
135 | + ATA_HORKAGE_FIRMWARE_WARN }, | ||
136 | + { "ST31000333AS", "SD16", ATA_HORKAGE_NONCQ | | ||
137 | + ATA_HORKAGE_FIRMWARE_WARN }, | ||
138 | + { "ST31000333AS", "SD17", ATA_HORKAGE_NONCQ | | ||
139 | + ATA_HORKAGE_FIRMWARE_WARN }, | ||
140 | + { "ST31000333AS", "SD18", ATA_HORKAGE_NONCQ | | ||
141 | + ATA_HORKAGE_FIRMWARE_WARN }, | ||
142 | + { "ST31000333AS", "SD19", ATA_HORKAGE_NONCQ | | ||
143 | + ATA_HORKAGE_FIRMWARE_WARN }, | ||
144 | + | ||
145 | + { "ST3640623AS", "SD15", ATA_HORKAGE_NONCQ | | ||
146 | + ATA_HORKAGE_FIRMWARE_WARN }, | ||
147 | + { "ST3640623AS", "SD16", ATA_HORKAGE_NONCQ | | ||
148 | + ATA_HORKAGE_FIRMWARE_WARN }, | ||
149 | + { "ST3640623AS", "SD17", ATA_HORKAGE_NONCQ | | ||
150 | + ATA_HORKAGE_FIRMWARE_WARN }, | ||
151 | + { "ST3640623AS", "SD18", ATA_HORKAGE_NONCQ | | ||
152 | + ATA_HORKAGE_FIRMWARE_WARN }, | ||
153 | + { "ST3640623AS", "SD19", ATA_HORKAGE_NONCQ | | ||
154 | + ATA_HORKAGE_FIRMWARE_WARN }, | ||
155 | + | ||
156 | + { "ST3640323AS", "SD15", ATA_HORKAGE_NONCQ | | ||
157 | + ATA_HORKAGE_FIRMWARE_WARN }, | ||
158 | + { "ST3640323AS", "SD16", ATA_HORKAGE_NONCQ | | ||
159 | + ATA_HORKAGE_FIRMWARE_WARN }, | ||
160 | + { "ST3640323AS", "SD17", ATA_HORKAGE_NONCQ | | ||
161 | + ATA_HORKAGE_FIRMWARE_WARN }, | ||
162 | + { "ST3640323AS", "SD18", ATA_HORKAGE_NONCQ | | ||
163 | + ATA_HORKAGE_FIRMWARE_WARN }, | ||
164 | + { "ST3640323AS", "SD19", ATA_HORKAGE_NONCQ | | ||
165 | + ATA_HORKAGE_FIRMWARE_WARN }, | ||
166 | + | ||
167 | + { "ST3320813AS", "SD15", ATA_HORKAGE_NONCQ | | ||
168 | + ATA_HORKAGE_FIRMWARE_WARN }, | ||
169 | + { "ST3320813AS", "SD16", ATA_HORKAGE_NONCQ | | ||
170 | + ATA_HORKAGE_FIRMWARE_WARN }, | ||
171 | + { "ST3320813AS", "SD17", ATA_HORKAGE_NONCQ | | ||
172 | + ATA_HORKAGE_FIRMWARE_WARN }, | ||
173 | + { "ST3320813AS", "SD18", ATA_HORKAGE_NONCQ | | ||
174 | + ATA_HORKAGE_FIRMWARE_WARN }, | ||
175 | + { "ST3320813AS", "SD19", ATA_HORKAGE_NONCQ | | ||
176 | + ATA_HORKAGE_FIRMWARE_WARN }, | ||
177 | + | ||
178 | + { "ST3320613AS", "SD15", ATA_HORKAGE_NONCQ | | ||
179 | + ATA_HORKAGE_FIRMWARE_WARN }, | ||
180 | + { "ST3320613AS", "SD16", ATA_HORKAGE_NONCQ | | ||
181 | + ATA_HORKAGE_FIRMWARE_WARN }, | ||
182 | + { "ST3320613AS", "SD17", ATA_HORKAGE_NONCQ | | ||
183 | + ATA_HORKAGE_FIRMWARE_WARN }, | ||
184 | + { "ST3320613AS", "SD18", ATA_HORKAGE_NONCQ | | ||
185 | + ATA_HORKAGE_FIRMWARE_WARN }, | ||
186 | + { "ST3320613AS", "SD19", ATA_HORKAGE_NONCQ | | ||
187 | ATA_HORKAGE_FIRMWARE_WARN }, | ||
188 | |||
189 | /* Blacklist entries taken from Silicon Image 3124/3132 | ||
190 | diff --git a/drivers/char/cp437.uni b/drivers/char/cp437.uni | ||
191 | index 1f06889..bc61634 100644 | ||
192 | --- a/drivers/char/cp437.uni | ||
193 | +++ b/drivers/char/cp437.uni | ||
194 | @@ -27,7 +27,7 @@ | ||
195 | 0x0c U+2640 | ||
196 | 0x0d U+266a | ||
197 | 0x0e U+266b | ||
198 | -0x0f U+263c | ||
199 | +0x0f U+263c U+00a4 | ||
200 | 0x10 U+25b6 U+25ba | ||
201 | 0x11 U+25c0 U+25c4 | ||
202 | 0x12 U+2195 | ||
203 | @@ -55,7 +55,7 @@ | ||
204 | 0x24 U+0024 | ||
205 | 0x25 U+0025 | ||
206 | 0x26 U+0026 | ||
207 | -0x27 U+0027 | ||
208 | +0x27 U+0027 U+00b4 | ||
209 | 0x28 U+0028 | ||
210 | 0x29 U+0029 | ||
211 | 0x2a U+002a | ||
212 | @@ -84,7 +84,7 @@ | ||
213 | 0x41 U+0041 U+00c0 U+00c1 U+00c2 U+00c3 | ||
214 | 0x42 U+0042 | ||
215 | 0x43 U+0043 U+00a9 | ||
216 | -0x44 U+0044 | ||
217 | +0x44 U+0044 U+00d0 | ||
218 | 0x45 U+0045 U+00c8 U+00ca U+00cb | ||
219 | 0x46 U+0046 | ||
220 | 0x47 U+0047 | ||
221 | @@ -140,7 +140,7 @@ | ||
222 | 0x79 U+0079 U+00fd | ||
223 | 0x7a U+007a | ||
224 | 0x7b U+007b | ||
225 | -0x7c U+007c U+00a5 | ||
226 | +0x7c U+007c U+00a6 | ||
227 | 0x7d U+007d | ||
228 | 0x7e U+007e | ||
229 | # | ||
230 | @@ -263,10 +263,10 @@ | ||
231 | 0xe8 U+03a6 U+00d8 | ||
232 | 0xe9 U+0398 | ||
233 | 0xea U+03a9 U+2126 | ||
234 | -0xeb U+03b4 | ||
235 | +0xeb U+03b4 U+00f0 | ||
236 | 0xec U+221e | ||
237 | 0xed U+03c6 U+00f8 | ||
238 | -0xee U+03b5 | ||
239 | +0xee U+03b5 U+2208 | ||
240 | 0xef U+2229 | ||
241 | 0xf0 U+2261 | ||
242 | 0xf1 U+00b1 | ||
243 | diff --git a/drivers/char/vt.c b/drivers/char/vt.c | ||
244 | index 60359c3..d429499 100644 | ||
245 | --- a/drivers/char/vt.c | ||
246 | +++ b/drivers/char/vt.c | ||
247 | @@ -2287,7 +2287,7 @@ rescan_last_byte: | ||
248 | continue; /* nothing to display */ | ||
249 | } | ||
250 | /* Glyph not found */ | ||
251 | - if ((!(vc->vc_utf && !vc->vc_disp_ctrl) || c < 128) && !(c & ~charmask)) { | ||
252 | + if ((!(vc->vc_utf && !vc->vc_disp_ctrl) && c < 128) && !(c & ~charmask)) { | ||
253 | /* In legacy mode use the glyph we get by a 1:1 mapping. | ||
254 | This would make absolutely no sense with Unicode in mind, | ||
255 | but do this for ASCII characters since a font may lack | ||
256 | diff --git a/drivers/char/xilinx_hwicap/buffer_icap.c b/drivers/char/xilinx_hwicap/buffer_icap.c | ||
257 | index aa7f796..05d8977 100644 | ||
258 | --- a/drivers/char/xilinx_hwicap/buffer_icap.c | ||
259 | +++ b/drivers/char/xilinx_hwicap/buffer_icap.c | ||
260 | @@ -21,9 +21,6 @@ | ||
261 | * INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
262 | * FOR A PARTICULAR PURPOSE. | ||
263 | * | ||
264 | - * Xilinx products are not intended for use in life support appliances, | ||
265 | - * devices, or systems. Use in such applications is expressly prohibited. | ||
266 | - * | ||
267 | * (c) Copyright 2003-2008 Xilinx Inc. | ||
268 | * All rights reserved. | ||
269 | * | ||
270 | diff --git a/drivers/char/xilinx_hwicap/buffer_icap.h b/drivers/char/xilinx_hwicap/buffer_icap.h | ||
271 | index 8b0252b..d4f419e 100644 | ||
272 | --- a/drivers/char/xilinx_hwicap/buffer_icap.h | ||
273 | +++ b/drivers/char/xilinx_hwicap/buffer_icap.h | ||
274 | @@ -21,9 +21,6 @@ | ||
275 | * INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
276 | * FOR A PARTICULAR PURPOSE. | ||
277 | * | ||
278 | - * Xilinx products are not intended for use in life support appliances, | ||
279 | - * devices, or systems. Use in such applications is expressly prohibited. | ||
280 | - * | ||
281 | * (c) Copyright 2003-2008 Xilinx Inc. | ||
282 | * All rights reserved. | ||
283 | * | ||
284 | diff --git a/drivers/char/xilinx_hwicap/fifo_icap.c b/drivers/char/xilinx_hwicap/fifo_icap.c | ||
285 | index 776b505..02225eb 100644 | ||
286 | --- a/drivers/char/xilinx_hwicap/fifo_icap.c | ||
287 | +++ b/drivers/char/xilinx_hwicap/fifo_icap.c | ||
288 | @@ -21,9 +21,6 @@ | ||
289 | * INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
290 | * FOR A PARTICULAR PURPOSE. | ||
291 | * | ||
292 | - * Xilinx products are not intended for use in life support appliances, | ||
293 | - * devices, or systems. Use in such applications is expressly prohibited. | ||
294 | - * | ||
295 | * (c) Copyright 2007-2008 Xilinx Inc. | ||
296 | * All rights reserved. | ||
297 | * | ||
298 | diff --git a/drivers/char/xilinx_hwicap/fifo_icap.h b/drivers/char/xilinx_hwicap/fifo_icap.h | ||
299 | index 62bda45..4c9dd9a 100644 | ||
300 | --- a/drivers/char/xilinx_hwicap/fifo_icap.h | ||
301 | +++ b/drivers/char/xilinx_hwicap/fifo_icap.h | ||
302 | @@ -21,9 +21,6 @@ | ||
303 | * INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
304 | * FOR A PARTICULAR PURPOSE. | ||
305 | * | ||
306 | - * Xilinx products are not intended for use in life support appliances, | ||
307 | - * devices, or systems. Use in such applications is expressly prohibited. | ||
308 | - * | ||
309 | * (c) Copyright 2007-2008 Xilinx Inc. | ||
310 | * All rights reserved. | ||
311 | * | ||
312 | diff --git a/drivers/char/xilinx_hwicap/xilinx_hwicap.c b/drivers/char/xilinx_hwicap/xilinx_hwicap.c | ||
313 | index 278c985..15ead99 100644 | ||
314 | --- a/drivers/char/xilinx_hwicap/xilinx_hwicap.c | ||
315 | +++ b/drivers/char/xilinx_hwicap/xilinx_hwicap.c | ||
316 | @@ -21,9 +21,6 @@ | ||
317 | * INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
318 | * FOR A PARTICULAR PURPOSE. | ||
319 | * | ||
320 | - * Xilinx products are not intended for use in life support appliances, | ||
321 | - * devices, or systems. Use in such applications is expressly prohibited. | ||
322 | - * | ||
323 | * (c) Copyright 2002 Xilinx Inc., Systems Engineering Group | ||
324 | * (c) Copyright 2004 Xilinx Inc., Systems Engineering Group | ||
325 | * (c) Copyright 2007-2008 Xilinx Inc. | ||
326 | diff --git a/drivers/char/xilinx_hwicap/xilinx_hwicap.h b/drivers/char/xilinx_hwicap/xilinx_hwicap.h | ||
327 | index 24d0d9b..8cca119 100644 | ||
328 | --- a/drivers/char/xilinx_hwicap/xilinx_hwicap.h | ||
329 | +++ b/drivers/char/xilinx_hwicap/xilinx_hwicap.h | ||
330 | @@ -21,9 +21,6 @@ | ||
331 | * INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
332 | * FOR A PARTICULAR PURPOSE. | ||
333 | * | ||
334 | - * Xilinx products are not intended for use in life support appliances, | ||
335 | - * devices, or systems. Use in such applications is expressly prohibited. | ||
336 | - * | ||
337 | * (c) Copyright 2003-2007 Xilinx Inc. | ||
338 | * All rights reserved. | ||
339 | * | ||
340 | diff --git a/drivers/firewire/fw-ohci.c b/drivers/firewire/fw-ohci.c | ||
341 | index 251416f..595759c 100644 | ||
342 | --- a/drivers/firewire/fw-ohci.c | ||
343 | +++ b/drivers/firewire/fw-ohci.c | ||
344 | @@ -958,6 +958,7 @@ at_context_queue_packet(struct context *ctx, struct fw_packet *packet) | ||
345 | packet->ack = RCODE_SEND_ERROR; | ||
346 | return -1; | ||
347 | } | ||
348 | + packet->payload_bus = payload_bus; | ||
349 | |||
350 | d[2].req_count = cpu_to_le16(packet->payload_length); | ||
351 | d[2].data_address = cpu_to_le32(payload_bus); | ||
352 | @@ -1009,7 +1010,6 @@ static int handle_at_packet(struct context *context, | ||
353 | struct driver_data *driver_data; | ||
354 | struct fw_packet *packet; | ||
355 | struct fw_ohci *ohci = context->ohci; | ||
356 | - dma_addr_t payload_bus; | ||
357 | int evt; | ||
358 | |||
359 | if (last->transfer_status == 0) | ||
360 | @@ -1022,9 +1022,8 @@ static int handle_at_packet(struct context *context, | ||
361 | /* This packet was cancelled, just continue. */ | ||
362 | return 1; | ||
363 | |||
364 | - payload_bus = le32_to_cpu(last->data_address); | ||
365 | - if (payload_bus != 0) | ||
366 | - dma_unmap_single(ohci->card.device, payload_bus, | ||
367 | + if (packet->payload_bus) | ||
368 | + dma_unmap_single(ohci->card.device, packet->payload_bus, | ||
369 | packet->payload_length, DMA_TO_DEVICE); | ||
370 | |||
371 | evt = le16_to_cpu(last->transfer_status) & 0x1f; | ||
372 | @@ -1681,6 +1680,10 @@ static int ohci_cancel_packet(struct fw_card *card, struct fw_packet *packet) | ||
373 | if (packet->ack != 0) | ||
374 | goto out; | ||
375 | |||
376 | + if (packet->payload_bus) | ||
377 | + dma_unmap_single(ohci->card.device, packet->payload_bus, | ||
378 | + packet->payload_length, DMA_TO_DEVICE); | ||
379 | + | ||
380 | log_ar_at_event('T', packet->speed, packet->header, 0x20); | ||
381 | driver_data->packet = NULL; | ||
382 | packet->ack = RCODE_CANCELLED; | ||
383 | diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c | ||
384 | index e5d1a0b..27f7c7e 100644 | ||
385 | --- a/drivers/firewire/fw-transaction.c | ||
386 | +++ b/drivers/firewire/fw-transaction.c | ||
387 | @@ -207,6 +207,7 @@ fw_fill_request(struct fw_packet *packet, int tcode, int tlabel, | ||
388 | packet->speed = speed; | ||
389 | packet->generation = generation; | ||
390 | packet->ack = 0; | ||
391 | + packet->payload_bus = 0; | ||
392 | } | ||
393 | |||
394 | /** | ||
395 | @@ -541,6 +542,8 @@ fw_fill_response(struct fw_packet *response, u32 *request_header, | ||
396 | BUG(); | ||
397 | return; | ||
398 | } | ||
399 | + | ||
400 | + response->payload_bus = 0; | ||
401 | } | ||
402 | EXPORT_SYMBOL(fw_fill_response); | ||
403 | |||
404 | diff --git a/drivers/firewire/fw-transaction.h b/drivers/firewire/fw-transaction.h | ||
405 | index 81b15ba..04cc9b0 100644 | ||
406 | --- a/drivers/firewire/fw-transaction.h | ||
407 | +++ b/drivers/firewire/fw-transaction.h | ||
408 | @@ -27,6 +27,7 @@ | ||
409 | #include <linux/list.h> | ||
410 | #include <linux/spinlock_types.h> | ||
411 | #include <linux/timer.h> | ||
412 | +#include <linux/types.h> | ||
413 | #include <linux/workqueue.h> | ||
414 | |||
415 | #define TCODE_IS_READ_REQUEST(tcode) (((tcode) & ~1) == 4) | ||
416 | @@ -153,6 +154,7 @@ struct fw_packet { | ||
417 | size_t header_length; | ||
418 | void *payload; | ||
419 | size_t payload_length; | ||
420 | + dma_addr_t payload_bus; | ||
421 | u32 timestamp; | ||
422 | |||
423 | /* | ||
424 | diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c | ||
425 | index 16240a7..3d3c3bc 100644 | ||
426 | --- a/drivers/ieee1394/nodemgr.c | ||
427 | +++ b/drivers/ieee1394/nodemgr.c | ||
428 | @@ -115,8 +115,14 @@ static int nodemgr_bus_read(struct csr1212_csr *csr, u64 addr, u16 length, | ||
429 | return error; | ||
430 | } | ||
431 | |||
432 | +#define OUI_FREECOM_TECHNOLOGIES_GMBH 0x0001db | ||
433 | + | ||
434 | static int nodemgr_get_max_rom(quadlet_t *bus_info_data, void *__ci) | ||
435 | { | ||
436 | + /* Freecom FireWire Hard Drive firmware bug */ | ||
437 | + if (be32_to_cpu(bus_info_data[3]) >> 8 == OUI_FREECOM_TECHNOLOGIES_GMBH) | ||
438 | + return 0; | ||
439 | + | ||
440 | return (be32_to_cpu(bus_info_data[2]) >> 8) & 0x3; | ||
441 | } | ||
442 | |||
443 | diff --git a/drivers/isdn/hardware/avm/b1isa.c b/drivers/isdn/hardware/avm/b1isa.c | ||
444 | index 1e288ee..6461a32 100644 | ||
445 | --- a/drivers/isdn/hardware/avm/b1isa.c | ||
446 | +++ b/drivers/isdn/hardware/avm/b1isa.c | ||
447 | @@ -233,10 +233,8 @@ static void __exit b1isa_exit(void) | ||
448 | int i; | ||
449 | |||
450 | for (i = 0; i < MAX_CARDS; i++) { | ||
451 | - if (!io[i]) | ||
452 | - break; | ||
453 | - | ||
454 | - b1isa_remove(&isa_dev[i]); | ||
455 | + if (isa_dev[i].resource[0].start) | ||
456 | + b1isa_remove(&isa_dev[i]); | ||
457 | } | ||
458 | unregister_capi_driver(&capi_driver_b1isa); | ||
459 | } | ||
460 | diff --git a/drivers/media/video/tvaudio.c b/drivers/media/video/tvaudio.c | ||
461 | index d74df58..bec489e 100644 | ||
462 | --- a/drivers/media/video/tvaudio.c | ||
463 | +++ b/drivers/media/video/tvaudio.c | ||
464 | @@ -152,7 +152,7 @@ static int chip_write(struct CHIPSTATE *chip, int subaddr, int val) | ||
465 | { | ||
466 | unsigned char buffer[2]; | ||
467 | |||
468 | - if (-1 == subaddr) { | ||
469 | + if (subaddr < 0) { | ||
470 | v4l_dbg(1, debug, chip->c, "%s: chip_write: 0x%x\n", | ||
471 | chip->c->name, val); | ||
472 | chip->shadow.bytes[1] = val; | ||
473 | @@ -163,6 +163,13 @@ static int chip_write(struct CHIPSTATE *chip, int subaddr, int val) | ||
474 | return -1; | ||
475 | } | ||
476 | } else { | ||
477 | + if (subaddr + 1 >= ARRAY_SIZE(chip->shadow.bytes)) { | ||
478 | + v4l_info(chip->c, | ||
479 | + "Tried to access a non-existent register: %d\n", | ||
480 | + subaddr); | ||
481 | + return -EINVAL; | ||
482 | + } | ||
483 | + | ||
484 | v4l_dbg(1, debug, chip->c, "%s: chip_write: reg%d=0x%x\n", | ||
485 | chip->c->name, subaddr, val); | ||
486 | chip->shadow.bytes[subaddr+1] = val; | ||
487 | @@ -177,12 +184,20 @@ static int chip_write(struct CHIPSTATE *chip, int subaddr, int val) | ||
488 | return 0; | ||
489 | } | ||
490 | |||
491 | -static int chip_write_masked(struct CHIPSTATE *chip, int subaddr, int val, int mask) | ||
492 | +static int chip_write_masked(struct CHIPSTATE *chip, | ||
493 | + int subaddr, int val, int mask) | ||
494 | { | ||
495 | if (mask != 0) { | ||
496 | - if (-1 == subaddr) { | ||
497 | + if (subaddr < 0) { | ||
498 | val = (chip->shadow.bytes[1] & ~mask) | (val & mask); | ||
499 | } else { | ||
500 | + if (subaddr + 1 >= ARRAY_SIZE(chip->shadow.bytes)) { | ||
501 | + v4l_info(chip->c, | ||
502 | + "Tried to access a non-existent register: %d\n", | ||
503 | + subaddr); | ||
504 | + return -EINVAL; | ||
505 | + } | ||
506 | + | ||
507 | val = (chip->shadow.bytes[subaddr+1] & ~mask) | (val & mask); | ||
508 | } | ||
509 | } | ||
510 | @@ -228,6 +243,15 @@ static int chip_cmd(struct CHIPSTATE *chip, char *name, audiocmd *cmd) | ||
511 | if (0 == cmd->count) | ||
512 | return 0; | ||
513 | |||
514 | + if (cmd->count + cmd->bytes[0] - 1 >= ARRAY_SIZE(chip->shadow.bytes)) { | ||
515 | + v4l_info(chip->c, | ||
516 | + "Tried to access a non-existent register range: %d to %d\n", | ||
517 | + cmd->bytes[0] + 1, cmd->bytes[0] + cmd->count - 1); | ||
518 | + return -EINVAL; | ||
519 | + } | ||
520 | + | ||
521 | + /* FIXME: it seems that the shadow bytes are wrong bellow !*/ | ||
522 | + | ||
523 | /* update our shadow register set; print bytes if (debug > 0) */ | ||
524 | v4l_dbg(1, debug, chip->c, "%s: chip_cmd(%s): reg=%d, data:", | ||
525 | chip->c->name, name,cmd->bytes[0]); | ||
526 | diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c | ||
527 | index c792138..1b9c4dc 100644 | ||
528 | --- a/drivers/net/bonding/bond_main.c | ||
529 | +++ b/drivers/net/bonding/bond_main.c | ||
530 | @@ -2370,6 +2370,9 @@ static void bond_miimon_commit(struct bonding *bond) | ||
531 | continue; | ||
532 | |||
533 | case BOND_LINK_DOWN: | ||
534 | + if (slave->link_failure_count < UINT_MAX) | ||
535 | + slave->link_failure_count++; | ||
536 | + | ||
537 | slave->link = BOND_LINK_DOWN; | ||
538 | |||
539 | if (bond->params.mode == BOND_MODE_ACTIVEBACKUP || | ||
540 | diff --git a/drivers/net/e1000e/ich8lan.c b/drivers/net/e1000e/ich8lan.c | ||
541 | index bcd2bc4..79be768 100644 | ||
542 | --- a/drivers/net/e1000e/ich8lan.c | ||
543 | +++ b/drivers/net/e1000e/ich8lan.c | ||
544 | @@ -1791,12 +1791,17 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw) | ||
545 | ctrl |= E1000_CTRL_PHY_RST; | ||
546 | } | ||
547 | ret_val = e1000_acquire_swflag_ich8lan(hw); | ||
548 | + /* Whether or not the swflag was acquired, we need to reset the part */ | ||
549 | hw_dbg(hw, "Issuing a global reset to ich8lan"); | ||
550 | ew32(CTRL, (ctrl | E1000_CTRL_RST)); | ||
551 | msleep(20); | ||
552 | |||
553 | - /* release the swflag because it is not reset by hardware reset */ | ||
554 | - e1000_release_swflag_ich8lan(hw); | ||
555 | + if (!ret_val) { | ||
556 | + /* release the swflag because it is not reset by | ||
557 | + * hardware reset | ||
558 | + */ | ||
559 | + e1000_release_swflag_ich8lan(hw); | ||
560 | + } | ||
561 | |||
562 | ret_val = e1000e_get_auto_rd_done(hw); | ||
563 | if (ret_val) { | ||
564 | diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c | ||
565 | index cf7056e..79b7ae3 100644 | ||
566 | --- a/drivers/net/wireless/iwlwifi/iwl-agn.c | ||
567 | +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | ||
568 | @@ -1384,7 +1384,7 @@ void iwl_rx_handle(struct iwl_priv *priv) | ||
569 | |||
570 | rxq->queue[i] = NULL; | ||
571 | |||
572 | - pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->dma_addr, | ||
573 | + pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->aligned_dma_addr, | ||
574 | priv->hw_params.rx_buf_size, | ||
575 | PCI_DMA_FROMDEVICE); | ||
576 | pkt = (struct iwl_rx_packet *)rxb->skb->data; | ||
577 | @@ -1436,8 +1436,8 @@ void iwl_rx_handle(struct iwl_priv *priv) | ||
578 | rxb->skb = NULL; | ||
579 | } | ||
580 | |||
581 | - pci_unmap_single(priv->pci_dev, rxb->dma_addr, | ||
582 | - priv->hw_params.rx_buf_size, | ||
583 | + pci_unmap_single(priv->pci_dev, rxb->real_dma_addr, | ||
584 | + priv->hw_params.rx_buf_size + 256, | ||
585 | PCI_DMA_FROMDEVICE); | ||
586 | spin_lock_irqsave(&rxq->lock, flags); | ||
587 | list_add_tail(&rxb->list, &priv->rxq.rx_used); | ||
588 | diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c | ||
589 | index 1383fd1..b346268 100644 | ||
590 | --- a/drivers/net/wireless/iwlwifi/iwl-core.c | ||
591 | +++ b/drivers/net/wireless/iwlwifi/iwl-core.c | ||
592 | @@ -290,6 +290,9 @@ void iwl_clear_stations_table(struct iwl_priv *priv) | ||
593 | priv->num_stations = 0; | ||
594 | memset(priv->stations, 0, sizeof(priv->stations)); | ||
595 | |||
596 | + /* clean ucode key table bit map */ | ||
597 | + priv->ucode_key_table = 0; | ||
598 | + | ||
599 | spin_unlock_irqrestore(&priv->sta_lock, flags); | ||
600 | } | ||
601 | EXPORT_SYMBOL(iwl_clear_stations_table); | ||
602 | diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h | ||
603 | index 09bdf8e..cf7757f 100644 | ||
604 | --- a/drivers/net/wireless/iwlwifi/iwl-dev.h | ||
605 | +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h | ||
606 | @@ -89,7 +89,8 @@ extern struct iwl_cfg iwl5100_abg_cfg; | ||
607 | #define DEFAULT_LONG_RETRY_LIMIT 4U | ||
608 | |||
609 | struct iwl_rx_mem_buffer { | ||
610 | - dma_addr_t dma_addr; | ||
611 | + dma_addr_t real_dma_addr; | ||
612 | + dma_addr_t aligned_dma_addr; | ||
613 | struct sk_buff *skb; | ||
614 | struct list_head list; | ||
615 | }; | ||
616 | diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c | ||
617 | index e81bfc4..ce25379 100644 | ||
618 | --- a/drivers/net/wireless/iwlwifi/iwl-rx.c | ||
619 | +++ b/drivers/net/wireless/iwlwifi/iwl-rx.c | ||
620 | @@ -204,7 +204,7 @@ int iwl_rx_queue_restock(struct iwl_priv *priv) | ||
621 | list_del(element); | ||
622 | |||
623 | /* Point to Rx buffer via next RBD in circular buffer */ | ||
624 | - rxq->bd[rxq->write] = iwl_dma_addr2rbd_ptr(priv, rxb->dma_addr); | ||
625 | + rxq->bd[rxq->write] = iwl_dma_addr2rbd_ptr(priv, rxb->aligned_dma_addr); | ||
626 | rxq->queue[rxq->write] = rxb; | ||
627 | rxq->write = (rxq->write + 1) & RX_QUEUE_MASK; | ||
628 | rxq->free_count--; | ||
629 | @@ -251,7 +251,7 @@ void iwl_rx_allocate(struct iwl_priv *priv) | ||
630 | rxb = list_entry(element, struct iwl_rx_mem_buffer, list); | ||
631 | |||
632 | /* Alloc a new receive buffer */ | ||
633 | - rxb->skb = alloc_skb(priv->hw_params.rx_buf_size, | ||
634 | + rxb->skb = alloc_skb(priv->hw_params.rx_buf_size + 256, | ||
635 | __GFP_NOWARN | GFP_ATOMIC); | ||
636 | if (!rxb->skb) { | ||
637 | if (net_ratelimit()) | ||
638 | @@ -266,9 +266,17 @@ void iwl_rx_allocate(struct iwl_priv *priv) | ||
639 | list_del(element); | ||
640 | |||
641 | /* Get physical address of RB/SKB */ | ||
642 | - rxb->dma_addr = | ||
643 | - pci_map_single(priv->pci_dev, rxb->skb->data, | ||
644 | - priv->hw_params.rx_buf_size, PCI_DMA_FROMDEVICE); | ||
645 | + rxb->real_dma_addr = pci_map_single( | ||
646 | + priv->pci_dev, | ||
647 | + rxb->skb->data, | ||
648 | + priv->hw_params.rx_buf_size + 256, | ||
649 | + PCI_DMA_FROMDEVICE); | ||
650 | + /* dma address must be no more than 36 bits */ | ||
651 | + BUG_ON(rxb->real_dma_addr & ~DMA_BIT_MASK(36)); | ||
652 | + /* and also 256 byte aligned! */ | ||
653 | + rxb->aligned_dma_addr = ALIGN(rxb->real_dma_addr, 256); | ||
654 | + skb_reserve(rxb->skb, rxb->aligned_dma_addr - rxb->real_dma_addr); | ||
655 | + | ||
656 | list_add_tail(&rxb->list, &rxq->rx_free); | ||
657 | rxq->free_count++; | ||
658 | } | ||
659 | @@ -300,8 +308,8 @@ void iwl_rx_queue_free(struct iwl_priv *priv, struct iwl_rx_queue *rxq) | ||
660 | for (i = 0; i < RX_QUEUE_SIZE + RX_FREE_BUFFERS; i++) { | ||
661 | if (rxq->pool[i].skb != NULL) { | ||
662 | pci_unmap_single(priv->pci_dev, | ||
663 | - rxq->pool[i].dma_addr, | ||
664 | - priv->hw_params.rx_buf_size, | ||
665 | + rxq->pool[i].real_dma_addr, | ||
666 | + priv->hw_params.rx_buf_size + 256, | ||
667 | PCI_DMA_FROMDEVICE); | ||
668 | dev_kfree_skb(rxq->pool[i].skb); | ||
669 | } | ||
670 | @@ -354,8 +362,8 @@ void iwl_rx_queue_reset(struct iwl_priv *priv, struct iwl_rx_queue *rxq) | ||
671 | * to an SKB, so we need to unmap and free potential storage */ | ||
672 | if (rxq->pool[i].skb != NULL) { | ||
673 | pci_unmap_single(priv->pci_dev, | ||
674 | - rxq->pool[i].dma_addr, | ||
675 | - priv->hw_params.rx_buf_size, | ||
676 | + rxq->pool[i].real_dma_addr, | ||
677 | + priv->hw_params.rx_buf_size + 256, | ||
678 | PCI_DMA_FROMDEVICE); | ||
679 | priv->alloc_rxb_skb--; | ||
680 | dev_kfree_skb(rxq->pool[i].skb); | ||
681 | diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.c b/drivers/net/wireless/iwlwifi/iwl-sta.c | ||
682 | index 6283a3a..f2d473c 100644 | ||
683 | --- a/drivers/net/wireless/iwlwifi/iwl-sta.c | ||
684 | +++ b/drivers/net/wireless/iwlwifi/iwl-sta.c | ||
685 | @@ -475,7 +475,7 @@ static int iwl_get_free_ucode_key_index(struct iwl_priv *priv) | ||
686 | if (!test_and_set_bit(i, &priv->ucode_key_table)) | ||
687 | return i; | ||
688 | |||
689 | - return -1; | ||
690 | + return WEP_INVALID_OFFSET; | ||
691 | } | ||
692 | |||
693 | int iwl_send_static_wepkey_cmd(struct iwl_priv *priv, u8 send_if_empty) | ||
694 | @@ -620,6 +620,9 @@ static int iwl_set_wep_dynamic_key_info(struct iwl_priv *priv, | ||
695 | /* else, we are overriding an existing key => no need to allocated room | ||
696 | * in uCode. */ | ||
697 | |||
698 | + WARN(priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET, | ||
699 | + "no space for new kew"); | ||
700 | + | ||
701 | priv->stations[sta_id].sta.key.key_flags = key_flags; | ||
702 | priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK; | ||
703 | priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; | ||
704 | @@ -637,6 +640,7 @@ static int iwl_set_ccmp_dynamic_key_info(struct iwl_priv *priv, | ||
705 | { | ||
706 | unsigned long flags; | ||
707 | __le16 key_flags = 0; | ||
708 | + int ret; | ||
709 | |||
710 | key_flags |= (STA_KEY_FLG_CCMP | STA_KEY_FLG_MAP_KEY_MSK); | ||
711 | key_flags |= cpu_to_le16(keyconf->keyidx << STA_KEY_FLG_KEYID_POS); | ||
712 | @@ -664,14 +668,18 @@ static int iwl_set_ccmp_dynamic_key_info(struct iwl_priv *priv, | ||
713 | /* else, we are overriding an existing key => no need to allocated room | ||
714 | * in uCode. */ | ||
715 | |||
716 | + WARN(priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET, | ||
717 | + "no space for new kew"); | ||
718 | + | ||
719 | priv->stations[sta_id].sta.key.key_flags = key_flags; | ||
720 | priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK; | ||
721 | priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; | ||
722 | |||
723 | + ret = iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC); | ||
724 | + | ||
725 | spin_unlock_irqrestore(&priv->sta_lock, flags); | ||
726 | |||
727 | - IWL_DEBUG_INFO("hwcrypto: modify ucode station key info\n"); | ||
728 | - return iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC); | ||
729 | + return ret; | ||
730 | } | ||
731 | |||
732 | static int iwl_set_tkip_dynamic_key_info(struct iwl_priv *priv, | ||
733 | @@ -696,6 +704,9 @@ static int iwl_set_tkip_dynamic_key_info(struct iwl_priv *priv, | ||
734 | /* else, we are overriding an existing key => no need to allocated room | ||
735 | * in uCode. */ | ||
736 | |||
737 | + WARN(priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET, | ||
738 | + "no space for new kew"); | ||
739 | + | ||
740 | /* This copy is acutally not needed: we get the key with each TX */ | ||
741 | memcpy(priv->stations[sta_id].keyinfo.key, keyconf->key, 16); | ||
742 | |||
743 | @@ -734,6 +745,13 @@ int iwl_remove_dynamic_key(struct iwl_priv *priv, | ||
744 | return 0; | ||
745 | } | ||
746 | |||
747 | + if (priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET) { | ||
748 | + IWL_WARNING("Removing wrong key %d 0x%x\n", | ||
749 | + keyconf->keyidx, key_flags); | ||
750 | + spin_unlock_irqrestore(&priv->sta_lock, flags); | ||
751 | + return 0; | ||
752 | + } | ||
753 | + | ||
754 | if (!test_and_clear_bit(priv->stations[sta_id].sta.key.key_offset, | ||
755 | &priv->ucode_key_table)) | ||
756 | IWL_ERROR("index %d not used in uCode key table.\n", | ||
757 | diff --git a/drivers/video/macfb.c b/drivers/video/macfb.c | ||
758 | index b790ddf..ee380d5 100644 | ||
759 | --- a/drivers/video/macfb.c | ||
760 | +++ b/drivers/video/macfb.c | ||
761 | @@ -164,7 +164,6 @@ static struct fb_var_screeninfo macfb_defined = { | ||
762 | }; | ||
763 | |||
764 | static struct fb_fix_screeninfo macfb_fix = { | ||
765 | - .id = "Macintosh ", | ||
766 | .type = FB_TYPE_PACKED_PIXELS, | ||
767 | .accel = FB_ACCEL_NONE, | ||
768 | }; | ||
769 | @@ -760,22 +759,22 @@ static int __init macfb_init(void) | ||
770 | |||
771 | switch(ndev->dr_hw) { | ||
772 | case NUBUS_DRHW_APPLE_MDC: | ||
773 | - strcat( macfb_fix.id, "Display Card" ); | ||
774 | + strcpy(macfb_fix.id, "Mac Disp. Card"); | ||
775 | macfb_setpalette = mdc_setpalette; | ||
776 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
777 | break; | ||
778 | case NUBUS_DRHW_APPLE_TFB: | ||
779 | - strcat( macfb_fix.id, "Toby" ); | ||
780 | + strcpy(macfb_fix.id, "Toby"); | ||
781 | macfb_setpalette = toby_setpalette; | ||
782 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
783 | break; | ||
784 | case NUBUS_DRHW_APPLE_JET: | ||
785 | - strcat( macfb_fix.id, "Jet"); | ||
786 | + strcpy(macfb_fix.id, "Jet"); | ||
787 | macfb_setpalette = jet_setpalette; | ||
788 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
789 | break; | ||
790 | default: | ||
791 | - strcat( macfb_fix.id, "Generic NuBus" ); | ||
792 | + strcpy(macfb_fix.id, "Generic NuBus"); | ||
793 | break; | ||
794 | } | ||
795 | } | ||
796 | @@ -786,21 +785,11 @@ static int __init macfb_init(void) | ||
797 | if (!video_is_nubus) | ||
798 | switch( mac_bi_data.id ) | ||
799 | { | ||
800 | - /* These don't have onboard video. Eventually, we may | ||
801 | - be able to write separate framebuffer drivers for | ||
802 | - them (tobyfb.c, hiresfb.c, etc, etc) */ | ||
803 | - case MAC_MODEL_II: | ||
804 | - case MAC_MODEL_IIX: | ||
805 | - case MAC_MODEL_IICX: | ||
806 | - case MAC_MODEL_IIFX: | ||
807 | - strcat( macfb_fix.id, "Generic NuBus" ); | ||
808 | - break; | ||
809 | - | ||
810 | /* Valkyrie Quadras */ | ||
811 | case MAC_MODEL_Q630: | ||
812 | /* I'm not sure about this one */ | ||
813 | case MAC_MODEL_P588: | ||
814 | - strcat( macfb_fix.id, "Valkyrie built-in" ); | ||
815 | + strcpy(macfb_fix.id, "Valkyrie"); | ||
816 | macfb_setpalette = valkyrie_setpalette; | ||
817 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
818 | valkyrie_cmap_regs = ioremap(DAC_BASE, 0x1000); | ||
819 | @@ -823,7 +812,7 @@ static int __init macfb_init(void) | ||
820 | case MAC_MODEL_Q700: | ||
821 | case MAC_MODEL_Q900: | ||
822 | case MAC_MODEL_Q950: | ||
823 | - strcat( macfb_fix.id, "DAFB built-in" ); | ||
824 | + strcpy(macfb_fix.id, "DAFB"); | ||
825 | macfb_setpalette = dafb_setpalette; | ||
826 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
827 | dafb_cmap_regs = ioremap(DAFB_BASE, 0x1000); | ||
828 | @@ -831,7 +820,7 @@ static int __init macfb_init(void) | ||
829 | |||
830 | /* LC II uses the V8 framebuffer */ | ||
831 | case MAC_MODEL_LCII: | ||
832 | - strcat( macfb_fix.id, "V8 built-in" ); | ||
833 | + strcpy(macfb_fix.id, "V8"); | ||
834 | macfb_setpalette = v8_brazil_setpalette; | ||
835 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
836 | v8_brazil_cmap_regs = ioremap(DAC_BASE, 0x1000); | ||
837 | @@ -843,7 +832,7 @@ static int __init macfb_init(void) | ||
838 | case MAC_MODEL_IIVI: | ||
839 | case MAC_MODEL_IIVX: | ||
840 | case MAC_MODEL_P600: | ||
841 | - strcat( macfb_fix.id, "Brazil built-in" ); | ||
842 | + strcpy(macfb_fix.id, "Brazil"); | ||
843 | macfb_setpalette = v8_brazil_setpalette; | ||
844 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
845 | v8_brazil_cmap_regs = ioremap(DAC_BASE, 0x1000); | ||
846 | @@ -860,7 +849,7 @@ static int __init macfb_init(void) | ||
847 | case MAC_MODEL_P460: | ||
848 | macfb_setpalette = v8_brazil_setpalette; | ||
849 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
850 | - strcat( macfb_fix.id, "Sonora built-in" ); | ||
851 | + strcpy(macfb_fix.id, "Sonora"); | ||
852 | v8_brazil_cmap_regs = ioremap(DAC_BASE, 0x1000); | ||
853 | break; | ||
854 | |||
855 | @@ -871,7 +860,7 @@ static int __init macfb_init(void) | ||
856 | case MAC_MODEL_IISI: | ||
857 | macfb_setpalette = rbv_setpalette; | ||
858 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
859 | - strcat( macfb_fix.id, "RBV built-in" ); | ||
860 | + strcpy(macfb_fix.id, "RBV"); | ||
861 | rbv_cmap_regs = ioremap(DAC_BASE, 0x1000); | ||
862 | break; | ||
863 | |||
864 | @@ -880,7 +869,7 @@ static int __init macfb_init(void) | ||
865 | case MAC_MODEL_C660: | ||
866 | macfb_setpalette = civic_setpalette; | ||
867 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
868 | - strcat( macfb_fix.id, "Civic built-in" ); | ||
869 | + strcpy(macfb_fix.id, "Civic"); | ||
870 | civic_cmap_regs = ioremap(CIVIC_BASE, 0x1000); | ||
871 | break; | ||
872 | |||
873 | @@ -901,7 +890,7 @@ static int __init macfb_init(void) | ||
874 | v8_brazil_cmap_regs = | ||
875 | ioremap(DAC_BASE, 0x1000); | ||
876 | } | ||
877 | - strcat( macfb_fix.id, "LC built-in" ); | ||
878 | + strcpy(macfb_fix.id, "LC"); | ||
879 | break; | ||
880 | /* We think this may be like the LC II */ | ||
881 | case MAC_MODEL_CCL: | ||
882 | @@ -911,18 +900,18 @@ static int __init macfb_init(void) | ||
883 | v8_brazil_cmap_regs = | ||
884 | ioremap(DAC_BASE, 0x1000); | ||
885 | } | ||
886 | - strcat( macfb_fix.id, "Color Classic built-in" ); | ||
887 | + strcpy(macfb_fix.id, "Color Classic"); | ||
888 | break; | ||
889 | |||
890 | /* And we *do* mean "weirdos" */ | ||
891 | case MAC_MODEL_TV: | ||
892 | - strcat( macfb_fix.id, "Mac TV built-in" ); | ||
893 | + strcpy(macfb_fix.id, "Mac TV"); | ||
894 | break; | ||
895 | |||
896 | /* These don't have colour, so no need to worry */ | ||
897 | case MAC_MODEL_SE30: | ||
898 | case MAC_MODEL_CLII: | ||
899 | - strcat( macfb_fix.id, "Monochrome built-in" ); | ||
900 | + strcpy(macfb_fix.id, "Monochrome"); | ||
901 | break; | ||
902 | |||
903 | /* Powerbooks are particularly difficult. Many of | ||
904 | @@ -935,7 +924,7 @@ static int __init macfb_init(void) | ||
905 | case MAC_MODEL_PB140: | ||
906 | case MAC_MODEL_PB145: | ||
907 | case MAC_MODEL_PB170: | ||
908 | - strcat( macfb_fix.id, "DDC built-in" ); | ||
909 | + strcpy(macfb_fix.id, "DDC"); | ||
910 | break; | ||
911 | |||
912 | /* Internal is GSC, External (if present) is ViSC */ | ||
913 | @@ -945,13 +934,13 @@ static int __init macfb_init(void) | ||
914 | case MAC_MODEL_PB180: | ||
915 | case MAC_MODEL_PB210: | ||
916 | case MAC_MODEL_PB230: | ||
917 | - strcat( macfb_fix.id, "GSC built-in" ); | ||
918 | + strcpy(macfb_fix.id, "GSC"); | ||
919 | break; | ||
920 | |||
921 | /* Internal is TIM, External is ViSC */ | ||
922 | case MAC_MODEL_PB165C: | ||
923 | case MAC_MODEL_PB180C: | ||
924 | - strcat( macfb_fix.id, "TIM built-in" ); | ||
925 | + strcpy(macfb_fix.id, "TIM"); | ||
926 | break; | ||
927 | |||
928 | /* Internal is CSC, External is Keystone+Ariel. */ | ||
929 | @@ -963,12 +952,12 @@ static int __init macfb_init(void) | ||
930 | case MAC_MODEL_PB280C: | ||
931 | macfb_setpalette = csc_setpalette; | ||
932 | macfb_defined.activate = FB_ACTIVATE_NOW; | ||
933 | - strcat( macfb_fix.id, "CSC built-in" ); | ||
934 | + strcpy(macfb_fix.id, "CSC"); | ||
935 | csc_cmap_regs = ioremap(CSC_BASE, 0x1000); | ||
936 | break; | ||
937 | |||
938 | default: | ||
939 | - strcat( macfb_fix.id, "Unknown/Unsupported built-in" ); | ||
940 | + strcpy(macfb_fix.id, "Unknown"); | ||
941 | break; | ||
942 | } | ||
943 | |||
944 | @@ -978,16 +967,23 @@ static int __init macfb_init(void) | ||
945 | fb_info.pseudo_palette = pseudo_palette; | ||
946 | fb_info.flags = FBINFO_DEFAULT; | ||
947 | |||
948 | - fb_alloc_cmap(&fb_info.cmap, video_cmap_len, 0); | ||
949 | + err = fb_alloc_cmap(&fb_info.cmap, video_cmap_len, 0); | ||
950 | + if (err) | ||
951 | + goto fail_unmap; | ||
952 | |||
953 | err = register_framebuffer(&fb_info); | ||
954 | - if (!err) | ||
955 | - printk("fb%d: %s frame buffer device\n", | ||
956 | - fb_info.node, fb_info.fix.id); | ||
957 | - else { | ||
958 | - iounmap(fb_info.screen_base); | ||
959 | - iounmap_macfb(); | ||
960 | - } | ||
961 | + if (err) | ||
962 | + goto fail_dealloc; | ||
963 | + | ||
964 | + printk("fb%d: %s frame buffer device\n", | ||
965 | + fb_info.node, fb_info.fix.id); | ||
966 | + return 0; | ||
967 | + | ||
968 | +fail_dealloc: | ||
969 | + fb_dealloc_cmap(&fb_info.cmap); | ||
970 | +fail_unmap: | ||
971 | + iounmap(fb_info.screen_base); | ||
972 | + iounmap_macfb(); | ||
973 | return err; | ||
974 | } | ||
975 | |||
976 | diff --git a/include/asm-x86/vmi.h b/include/asm-x86/vmi.h | ||
977 | index b7c0dea..61e08c0 100644 | ||
978 | --- a/include/asm-x86/vmi.h | ||
979 | +++ b/include/asm-x86/vmi.h | ||
980 | @@ -223,9 +223,15 @@ struct pci_header { | ||
981 | } __attribute__((packed)); | ||
982 | |||
983 | /* Function prototypes for bootstrapping */ | ||
984 | +#ifdef CONFIG_VMI | ||
985 | extern void vmi_init(void); | ||
986 | +extern void vmi_activate(void); | ||
987 | extern void vmi_bringup(void); | ||
988 | -extern void vmi_apply_boot_page_allocations(void); | ||
989 | +#else | ||
990 | +static inline void vmi_init(void) {} | ||
991 | +static inline void vmi_activate(void) {} | ||
992 | +static inline void vmi_bringup(void) {} | ||
993 | +#endif | ||
994 | |||
995 | /* State needed to start an application processor in an SMP system. */ | ||
996 | struct vmi_ap_state { | ||
997 | diff --git a/include/linux/can/core.h b/include/linux/can/core.h | ||
998 | index e9ca210..f50785a 100644 | ||
999 | --- a/include/linux/can/core.h | ||
1000 | +++ b/include/linux/can/core.h | ||
1001 | @@ -19,7 +19,7 @@ | ||
1002 | #include <linux/skbuff.h> | ||
1003 | #include <linux/netdevice.h> | ||
1004 | |||
1005 | -#define CAN_VERSION "20071116" | ||
1006 | +#define CAN_VERSION "20081130" | ||
1007 | |||
1008 | /* increment this number each time you change some user-space interface */ | ||
1009 | #define CAN_ABI_VERSION "8" | ||
1010 | diff --git a/kernel/sched_clock.c b/kernel/sched_clock.c | ||
1011 | index 8178724..e8ab096 100644 | ||
1012 | --- a/kernel/sched_clock.c | ||
1013 | +++ b/kernel/sched_clock.c | ||
1014 | @@ -118,13 +118,13 @@ static u64 __update_sched_clock(struct sched_clock_data *scd, u64 now) | ||
1015 | |||
1016 | /* | ||
1017 | * scd->clock = clamp(scd->tick_gtod + delta, | ||
1018 | - * max(scd->tick_gtod, scd->clock), | ||
1019 | - * max(scd->clock, scd->tick_gtod + TICK_NSEC)); | ||
1020 | + * max(scd->tick_gtod, scd->clock), | ||
1021 | + * scd->tick_gtod + TICK_NSEC); | ||
1022 | */ | ||
1023 | |||
1024 | clock = scd->tick_gtod + delta; | ||
1025 | min_clock = wrap_max(scd->tick_gtod, scd->clock); | ||
1026 | - max_clock = wrap_max(scd->clock, scd->tick_gtod + TICK_NSEC); | ||
1027 | + max_clock = scd->tick_gtod + TICK_NSEC; | ||
1028 | |||
1029 | clock = wrap_max(clock, min_clock); | ||
1030 | clock = wrap_min(clock, max_clock); | ||
1031 | diff --git a/lib/idr.c b/lib/idr.c | ||
1032 | index 7a785a0..1c4f928 100644 | ||
1033 | --- a/lib/idr.c | ||
1034 | +++ b/lib/idr.c | ||
1035 | @@ -220,8 +220,14 @@ build_up: | ||
1036 | */ | ||
1037 | while ((layers < (MAX_LEVEL - 1)) && (id >= (1 << (layers*IDR_BITS)))) { | ||
1038 | layers++; | ||
1039 | - if (!p->count) | ||
1040 | + if (!p->count) { | ||
1041 | + /* special case: if the tree is currently empty, | ||
1042 | + * then we grow the tree by moving the top node | ||
1043 | + * upwards. | ||
1044 | + */ | ||
1045 | + p->layer++; | ||
1046 | continue; | ||
1047 | + } | ||
1048 | if (!(new = get_from_free_list(idp))) { | ||
1049 | /* | ||
1050 | * The allocation failed. If we built part of | ||
1051 | diff --git a/mm/page_alloc.c b/mm/page_alloc.c | ||
1052 | index ed5cdae..51daae5 100644 | ||
1053 | --- a/mm/page_alloc.c | ||
1054 | +++ b/mm/page_alloc.c | ||
1055 | @@ -4224,7 +4224,7 @@ void setup_per_zone_pages_min(void) | ||
1056 | for_each_zone(zone) { | ||
1057 | u64 tmp; | ||
1058 | |||
1059 | - spin_lock_irqsave(&zone->lru_lock, flags); | ||
1060 | + spin_lock_irqsave(&zone->lock, flags); | ||
1061 | tmp = (u64)pages_min * zone->present_pages; | ||
1062 | do_div(tmp, lowmem_pages); | ||
1063 | if (is_highmem(zone)) { | ||
1064 | @@ -4256,7 +4256,7 @@ void setup_per_zone_pages_min(void) | ||
1065 | zone->pages_low = zone->pages_min + (tmp >> 2); | ||
1066 | zone->pages_high = zone->pages_min + (tmp >> 1); | ||
1067 | setup_zone_migrate_reserve(zone); | ||
1068 | - spin_unlock_irqrestore(&zone->lru_lock, flags); | ||
1069 | + spin_unlock_irqrestore(&zone->lock, flags); | ||
1070 | } | ||
1071 | |||
1072 | /* update totalreserve_pages */ | ||
1073 | diff --git a/net/can/af_can.c b/net/can/af_can.c | ||
1074 | index 8035fbf..150f0b2 100644 | ||
1075 | --- a/net/can/af_can.c | ||
1076 | +++ b/net/can/af_can.c | ||
1077 | @@ -319,23 +319,52 @@ static struct dev_rcv_lists *find_dev_rcv_lists(struct net_device *dev) | ||
1078 | return n ? d : NULL; | ||
1079 | } | ||
1080 | |||
1081 | +/** | ||
1082 | + * find_rcv_list - determine optimal filterlist inside device filter struct | ||
1083 | + * @can_id: pointer to CAN identifier of a given can_filter | ||
1084 | + * @mask: pointer to CAN mask of a given can_filter | ||
1085 | + * @d: pointer to the device filter struct | ||
1086 | + * | ||
1087 | + * Description: | ||
1088 | + * Returns the optimal filterlist to reduce the filter handling in the | ||
1089 | + * receive path. This function is called by service functions that need | ||
1090 | + * to register or unregister a can_filter in the filter lists. | ||
1091 | + * | ||
1092 | + * A filter matches in general, when | ||
1093 | + * | ||
1094 | + * <received_can_id> & mask == can_id & mask | ||
1095 | + * | ||
1096 | + * so every bit set in the mask (even CAN_EFF_FLAG, CAN_RTR_FLAG) describe | ||
1097 | + * relevant bits for the filter. | ||
1098 | + * | ||
1099 | + * The filter can be inverted (CAN_INV_FILTER bit set in can_id) or it can | ||
1100 | + * filter for error frames (CAN_ERR_FLAG bit set in mask). For error frames | ||
1101 | + * there is a special filterlist and a special rx path filter handling. | ||
1102 | + * | ||
1103 | + * Return: | ||
1104 | + * Pointer to optimal filterlist for the given can_id/mask pair. | ||
1105 | + * Constistency checked mask. | ||
1106 | + * Reduced can_id to have a preprocessed filter compare value. | ||
1107 | + */ | ||
1108 | static struct hlist_head *find_rcv_list(canid_t *can_id, canid_t *mask, | ||
1109 | struct dev_rcv_lists *d) | ||
1110 | { | ||
1111 | canid_t inv = *can_id & CAN_INV_FILTER; /* save flag before masking */ | ||
1112 | |||
1113 | - /* filter error frames */ | ||
1114 | + /* filter for error frames in extra filterlist */ | ||
1115 | if (*mask & CAN_ERR_FLAG) { | ||
1116 | - /* clear CAN_ERR_FLAG in list entry */ | ||
1117 | + /* clear CAN_ERR_FLAG in filter entry */ | ||
1118 | *mask &= CAN_ERR_MASK; | ||
1119 | return &d->rx[RX_ERR]; | ||
1120 | } | ||
1121 | |||
1122 | - /* ensure valid values in can_mask */ | ||
1123 | - if (*mask & CAN_EFF_FLAG) | ||
1124 | - *mask &= (CAN_EFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG); | ||
1125 | - else | ||
1126 | - *mask &= (CAN_SFF_MASK | CAN_RTR_FLAG); | ||
1127 | + /* with cleared CAN_ERR_FLAG we have a simple mask/value filterpair */ | ||
1128 | + | ||
1129 | +#define CAN_EFF_RTR_FLAGS (CAN_EFF_FLAG | CAN_RTR_FLAG) | ||
1130 | + | ||
1131 | + /* ensure valid values in can_mask for 'SFF only' frame filtering */ | ||
1132 | + if ((*mask & CAN_EFF_FLAG) && !(*can_id & CAN_EFF_FLAG)) | ||
1133 | + *mask &= (CAN_SFF_MASK | CAN_EFF_RTR_FLAGS); | ||
1134 | |||
1135 | /* reduce condition testing at receive time */ | ||
1136 | *can_id &= *mask; | ||
1137 | @@ -348,15 +377,19 @@ static struct hlist_head *find_rcv_list(canid_t *can_id, canid_t *mask, | ||
1138 | if (!(*mask)) | ||
1139 | return &d->rx[RX_ALL]; | ||
1140 | |||
1141 | - /* use extra filterset for the subscription of exactly *ONE* can_id */ | ||
1142 | - if (*can_id & CAN_EFF_FLAG) { | ||
1143 | - if (*mask == (CAN_EFF_MASK | CAN_EFF_FLAG)) { | ||
1144 | - /* RFC: a use-case for hash-tables in the future? */ | ||
1145 | - return &d->rx[RX_EFF]; | ||
1146 | + /* extra filterlists for the subscription of a single non-RTR can_id */ | ||
1147 | + if (((*mask & CAN_EFF_RTR_FLAGS) == CAN_EFF_RTR_FLAGS) | ||
1148 | + && !(*can_id & CAN_RTR_FLAG)) { | ||
1149 | + | ||
1150 | + if (*can_id & CAN_EFF_FLAG) { | ||
1151 | + if (*mask == (CAN_EFF_MASK | CAN_EFF_RTR_FLAGS)) { | ||
1152 | + /* RFC: a future use-case for hash-tables? */ | ||
1153 | + return &d->rx[RX_EFF]; | ||
1154 | + } | ||
1155 | + } else { | ||
1156 | + if (*mask == (CAN_SFF_MASK | CAN_EFF_RTR_FLAGS)) | ||
1157 | + return &d->rx_sff[*can_id]; | ||
1158 | } | ||
1159 | - } else { | ||
1160 | - if (*mask == CAN_SFF_MASK) | ||
1161 | - return &d->rx_sff[*can_id]; | ||
1162 | } | ||
1163 | |||
1164 | /* default: filter via can_id/can_mask */ | ||
1165 | @@ -589,7 +622,10 @@ static int can_rcv_filter(struct dev_rcv_lists *d, struct sk_buff *skb) | ||
1166 | } | ||
1167 | } | ||
1168 | |||
1169 | - /* check CAN_ID specific entries */ | ||
1170 | + /* check filterlists for single non-RTR can_ids */ | ||
1171 | + if (can_id & CAN_RTR_FLAG) | ||
1172 | + return matches; | ||
1173 | + | ||
1174 | if (can_id & CAN_EFF_FLAG) { | ||
1175 | hlist_for_each_entry_rcu(r, n, &d->rx[RX_EFF], list) { | ||
1176 | if (r->can_id == can_id) { | ||
1177 | diff --git a/net/can/bcm.c b/net/can/bcm.c | ||
1178 | index d0dd382..da0d426 100644 | ||
1179 | --- a/net/can/bcm.c | ||
1180 | +++ b/net/can/bcm.c | ||
1181 | @@ -64,10 +64,11 @@ | ||
1182 | #define BCM_CAN_DLC_MASK 0x0F /* clean private flags in can_dlc by masking */ | ||
1183 | |||
1184 | /* get best masking value for can_rx_register() for a given single can_id */ | ||
1185 | -#define REGMASK(id) ((id & CAN_RTR_FLAG) | ((id & CAN_EFF_FLAG) ? \ | ||
1186 | - (CAN_EFF_MASK | CAN_EFF_FLAG) : CAN_SFF_MASK)) | ||
1187 | +#define REGMASK(id) ((id & CAN_EFF_FLAG) ? \ | ||
1188 | + (CAN_EFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG) : \ | ||
1189 | + (CAN_SFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG)) | ||
1190 | |||
1191 | -#define CAN_BCM_VERSION "20080415" | ||
1192 | +#define CAN_BCM_VERSION CAN_VERSION | ||
1193 | static __initdata const char banner[] = KERN_INFO | ||
1194 | "can: broadcast manager protocol (rev " CAN_BCM_VERSION ")\n"; | ||
1195 | |||
1196 | diff --git a/net/core/dev.c b/net/core/dev.c | ||
1197 | index 0ae08d3..5a25896 100644 | ||
1198 | --- a/net/core/dev.c | ||
1199 | +++ b/net/core/dev.c | ||
1200 | @@ -3990,7 +3990,7 @@ int register_netdevice(struct net_device *dev) | ||
1201 | dev->features &= ~NETIF_F_TSO; | ||
1202 | } | ||
1203 | if (dev->features & NETIF_F_UFO) { | ||
1204 | - if (!(dev->features & NETIF_F_HW_CSUM)) { | ||
1205 | + if (!(dev->features & NETIF_F_GEN_CSUM)) { | ||
1206 | printk(KERN_ERR "%s: Dropping NETIF_F_UFO since no " | ||
1207 | "NETIF_F_HW_CSUM feature.\n", | ||
1208 | dev->name); | ||
1209 | diff --git a/net/key/af_key.c b/net/key/af_key.c | ||
1210 | index b7f5a1c..ef3b4d5 100644 | ||
1211 | --- a/net/key/af_key.c | ||
1212 | +++ b/net/key/af_key.c | ||
1213 | @@ -2051,7 +2051,6 @@ static int pfkey_xfrm_policy2msg(struct sk_buff *skb, struct xfrm_policy *xp, in | ||
1214 | req_size += socklen * 2; | ||
1215 | } else { | ||
1216 | size -= 2*socklen; | ||
1217 | - socklen = 0; | ||
1218 | } | ||
1219 | rq = (void*)skb_put(skb, req_size); | ||
1220 | pol->sadb_x_policy_len += req_size/8; | ||
1221 | diff --git a/net/sunrpc/auth_generic.c b/net/sunrpc/auth_generic.c | ||
1222 | index 744b79f..4028502 100644 | ||
1223 | --- a/net/sunrpc/auth_generic.c | ||
1224 | +++ b/net/sunrpc/auth_generic.c | ||
1225 | @@ -133,13 +133,29 @@ static int | ||
1226 | generic_match(struct auth_cred *acred, struct rpc_cred *cred, int flags) | ||
1227 | { | ||
1228 | struct generic_cred *gcred = container_of(cred, struct generic_cred, gc_base); | ||
1229 | + int i; | ||
1230 | |||
1231 | if (gcred->acred.uid != acred->uid || | ||
1232 | gcred->acred.gid != acred->gid || | ||
1233 | - gcred->acred.group_info != acred->group_info || | ||
1234 | gcred->acred.machine_cred != acred->machine_cred) | ||
1235 | - return 0; | ||
1236 | + goto out_nomatch; | ||
1237 | + | ||
1238 | + /* Optimisation in the case where pointers are identical... */ | ||
1239 | + if (gcred->acred.group_info == acred->group_info) | ||
1240 | + goto out_match; | ||
1241 | + | ||
1242 | + /* Slow path... */ | ||
1243 | + if (gcred->acred.group_info->ngroups != acred->group_info->ngroups) | ||
1244 | + goto out_nomatch; | ||
1245 | + for (i = 0; i < gcred->acred.group_info->ngroups; i++) { | ||
1246 | + if (GROUP_AT(gcred->acred.group_info, i) != | ||
1247 | + GROUP_AT(acred->group_info, i)) | ||
1248 | + goto out_nomatch; | ||
1249 | + } | ||
1250 | +out_match: | ||
1251 | return 1; | ||
1252 | +out_nomatch: | ||
1253 | + return 0; | ||
1254 | } | ||
1255 | |||
1256 | void __init rpc_init_generic_auth(void) |