Annotation of /trunk/kernel26-magellan/patches-2.6.25-r5/0107-2.6.25.8-all-fixes.patch
Parent Directory | Revision Log
Revision 677 -
(hide annotations)
(download)
Wed Sep 10 21:27:27 2008 UTC (16 years ago) by niro
File size: 16462 byte(s)
Wed Sep 10 21:27:27 2008 UTC (16 years ago) by niro
File size: 16462 byte(s)
2.6.25-magellan-r5: - updated to linux-2.6.25.17
1 | niro | 677 | diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c |
2 | index c8890b8..39b1b7e 100644 | ||
3 | --- a/arch/x86/kernel/process_32.c | ||
4 | +++ b/arch/x86/kernel/process_32.c | ||
5 | @@ -259,12 +259,31 @@ static void mwait_idle(void) | ||
6 | mwait_idle_with_hints(0, 0); | ||
7 | } | ||
8 | |||
9 | +/* | ||
10 | + * mwait selection logic: | ||
11 | + * | ||
12 | + * It depends on the CPU. For AMD CPUs that support MWAIT this is | ||
13 | + * wrong. Family 0x10 and 0x11 CPUs will enter C1 on HLT. Powersavings | ||
14 | + * then depend on a clock divisor and current Pstate of the core. If | ||
15 | + * all cores of a processor are in halt state (C1) the processor can | ||
16 | + * enter the C1E (C1 enhanced) state. If mwait is used this will never | ||
17 | + * happen. | ||
18 | + * | ||
19 | + * idle=mwait overrides this decision and forces the usage of mwait. | ||
20 | + */ | ||
21 | static int __cpuinit mwait_usable(const struct cpuinfo_x86 *c) | ||
22 | { | ||
23 | if (force_mwait) | ||
24 | return 1; | ||
25 | - /* Any C1 states supported? */ | ||
26 | - return c->cpuid_level >= 5 && ((cpuid_edx(5) >> 4) & 0xf) > 0; | ||
27 | + | ||
28 | + if (c->x86_vendor == X86_VENDOR_AMD) { | ||
29 | + switch(c->x86) { | ||
30 | + case 0x10: | ||
31 | + case 0x11: | ||
32 | + return 0; | ||
33 | + } | ||
34 | + } | ||
35 | + return 1; | ||
36 | } | ||
37 | |||
38 | void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c) | ||
39 | diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c | ||
40 | index 1316f1c..53b9c4c 100644 | ||
41 | --- a/arch/x86/kernel/process_64.c | ||
42 | +++ b/arch/x86/kernel/process_64.c | ||
43 | @@ -254,13 +254,31 @@ static void mwait_idle(void) | ||
44 | } | ||
45 | } | ||
46 | |||
47 | - | ||
48 | +/* | ||
49 | + * mwait selection logic: | ||
50 | + * | ||
51 | + * It depends on the CPU. For AMD CPUs that support MWAIT this is | ||
52 | + * wrong. Family 0x10 and 0x11 CPUs will enter C1 on HLT. Powersavings | ||
53 | + * then depend on a clock divisor and current Pstate of the core. If | ||
54 | + * all cores of a processor are in halt state (C1) the processor can | ||
55 | + * enter the C1E (C1 enhanced) state. If mwait is used this will never | ||
56 | + * happen. | ||
57 | + * | ||
58 | + * idle=mwait overrides this decision and forces the usage of mwait. | ||
59 | + */ | ||
60 | static int __cpuinit mwait_usable(const struct cpuinfo_x86 *c) | ||
61 | { | ||
62 | if (force_mwait) | ||
63 | return 1; | ||
64 | - /* Any C1 states supported? */ | ||
65 | - return c->cpuid_level >= 5 && ((cpuid_edx(5) >> 4) & 0xf) > 0; | ||
66 | + | ||
67 | + if (c->x86_vendor == X86_VENDOR_AMD) { | ||
68 | + switch(c->x86) { | ||
69 | + case 0x10: | ||
70 | + case 0x11: | ||
71 | + return 0; | ||
72 | + } | ||
73 | + } | ||
74 | + return 1; | ||
75 | } | ||
76 | |||
77 | void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c) | ||
78 | diff --git a/arch/x86/lib/copy_user_64.S b/arch/x86/lib/copy_user_64.S | ||
79 | index 70bebd3..ee1c3f6 100644 | ||
80 | --- a/arch/x86/lib/copy_user_64.S | ||
81 | +++ b/arch/x86/lib/copy_user_64.S | ||
82 | @@ -217,19 +217,19 @@ ENTRY(copy_user_generic_unrolled) | ||
83 | /* table sorted by exception address */ | ||
84 | .section __ex_table,"a" | ||
85 | .align 8 | ||
86 | - .quad .Ls1,.Ls1e | ||
87 | - .quad .Ls2,.Ls2e | ||
88 | - .quad .Ls3,.Ls3e | ||
89 | - .quad .Ls4,.Ls4e | ||
90 | - .quad .Ld1,.Ls1e | ||
91 | + .quad .Ls1,.Ls1e /* Ls1-Ls4 have copied zero bytes */ | ||
92 | + .quad .Ls2,.Ls1e | ||
93 | + .quad .Ls3,.Ls1e | ||
94 | + .quad .Ls4,.Ls1e | ||
95 | + .quad .Ld1,.Ls1e /* Ld1-Ld4 have copied 0-24 bytes */ | ||
96 | .quad .Ld2,.Ls2e | ||
97 | .quad .Ld3,.Ls3e | ||
98 | .quad .Ld4,.Ls4e | ||
99 | - .quad .Ls5,.Ls5e | ||
100 | - .quad .Ls6,.Ls6e | ||
101 | - .quad .Ls7,.Ls7e | ||
102 | - .quad .Ls8,.Ls8e | ||
103 | - .quad .Ld5,.Ls5e | ||
104 | + .quad .Ls5,.Ls5e /* Ls5-Ls8 have copied 32 bytes */ | ||
105 | + .quad .Ls6,.Ls5e | ||
106 | + .quad .Ls7,.Ls5e | ||
107 | + .quad .Ls8,.Ls5e | ||
108 | + .quad .Ld5,.Ls5e /* Ld5-Ld8 have copied 32-56 bytes */ | ||
109 | .quad .Ld6,.Ls6e | ||
110 | .quad .Ld7,.Ls7e | ||
111 | .quad .Ld8,.Ls8e | ||
112 | @@ -244,11 +244,8 @@ ENTRY(copy_user_generic_unrolled) | ||
113 | .quad .Le5,.Le_zero | ||
114 | .previous | ||
115 | |||
116 | - /* compute 64-offset for main loop. 8 bytes accuracy with error on the | ||
117 | - pessimistic side. this is gross. it would be better to fix the | ||
118 | - interface. */ | ||
119 | /* eax: zero, ebx: 64 */ | ||
120 | -.Ls1e: addl $8,%eax | ||
121 | +.Ls1e: addl $8,%eax /* eax is bytes left uncopied within the loop (Ls1e: 64 .. Ls8e: 8) */ | ||
122 | .Ls2e: addl $8,%eax | ||
123 | .Ls3e: addl $8,%eax | ||
124 | .Ls4e: addl $8,%eax | ||
125 | diff --git a/arch/x86/lib/copy_user_nocache_64.S b/arch/x86/lib/copy_user_nocache_64.S | ||
126 | index 5196762..9d3d1ab 100644 | ||
127 | --- a/arch/x86/lib/copy_user_nocache_64.S | ||
128 | +++ b/arch/x86/lib/copy_user_nocache_64.S | ||
129 | @@ -145,19 +145,19 @@ ENTRY(__copy_user_nocache) | ||
130 | /* table sorted by exception address */ | ||
131 | .section __ex_table,"a" | ||
132 | .align 8 | ||
133 | - .quad .Ls1,.Ls1e | ||
134 | - .quad .Ls2,.Ls2e | ||
135 | - .quad .Ls3,.Ls3e | ||
136 | - .quad .Ls4,.Ls4e | ||
137 | - .quad .Ld1,.Ls1e | ||
138 | + .quad .Ls1,.Ls1e /* .Ls[1-4] - 0 bytes copied */ | ||
139 | + .quad .Ls2,.Ls1e | ||
140 | + .quad .Ls3,.Ls1e | ||
141 | + .quad .Ls4,.Ls1e | ||
142 | + .quad .Ld1,.Ls1e /* .Ld[1-4] - 0..24 bytes coped */ | ||
143 | .quad .Ld2,.Ls2e | ||
144 | .quad .Ld3,.Ls3e | ||
145 | .quad .Ld4,.Ls4e | ||
146 | - .quad .Ls5,.Ls5e | ||
147 | - .quad .Ls6,.Ls6e | ||
148 | - .quad .Ls7,.Ls7e | ||
149 | - .quad .Ls8,.Ls8e | ||
150 | - .quad .Ld5,.Ls5e | ||
151 | + .quad .Ls5,.Ls5e /* .Ls[5-8] - 32 bytes copied */ | ||
152 | + .quad .Ls6,.Ls5e | ||
153 | + .quad .Ls7,.Ls5e | ||
154 | + .quad .Ls8,.Ls5e | ||
155 | + .quad .Ld5,.Ls5e /* .Ld[5-8] - 32..56 bytes copied */ | ||
156 | .quad .Ld6,.Ls6e | ||
157 | .quad .Ld7,.Ls7e | ||
158 | .quad .Ld8,.Ls8e | ||
159 | @@ -172,11 +172,8 @@ ENTRY(__copy_user_nocache) | ||
160 | .quad .Le5,.Le_zero | ||
161 | .previous | ||
162 | |||
163 | - /* compute 64-offset for main loop. 8 bytes accuracy with error on the | ||
164 | - pessimistic side. this is gross. it would be better to fix the | ||
165 | - interface. */ | ||
166 | /* eax: zero, ebx: 64 */ | ||
167 | -.Ls1e: addl $8,%eax | ||
168 | +.Ls1e: addl $8,%eax /* eax: bytes left uncopied: Ls1e: 64 .. Ls8e: 8 */ | ||
169 | .Ls2e: addl $8,%eax | ||
170 | .Ls3e: addl $8,%eax | ||
171 | .Ls4e: addl $8,%eax | ||
172 | diff --git a/drivers/acpi/tables/tbinstal.c b/drivers/acpi/tables/tbinstal.c | ||
173 | index 3bc0c67..225e88c 100644 | ||
174 | --- a/drivers/acpi/tables/tbinstal.c | ||
175 | +++ b/drivers/acpi/tables/tbinstal.c | ||
176 | @@ -123,17 +123,13 @@ acpi_tb_add_table(struct acpi_table_desc *table_desc, | ||
177 | } | ||
178 | } | ||
179 | |||
180 | - /* The table must be either an SSDT or a PSDT or an OEMx */ | ||
181 | - | ||
182 | - if ((!ACPI_COMPARE_NAME(table_desc->pointer->signature, ACPI_SIG_PSDT)) | ||
183 | - && | ||
184 | - (!ACPI_COMPARE_NAME(table_desc->pointer->signature, ACPI_SIG_SSDT)) | ||
185 | - && (strncmp(table_desc->pointer->signature, "OEM", 3))) { | ||
186 | - ACPI_ERROR((AE_INFO, | ||
187 | - "Table has invalid signature [%4.4s], must be SSDT, PSDT or OEMx", | ||
188 | - table_desc->pointer->signature)); | ||
189 | - return_ACPI_STATUS(AE_BAD_SIGNATURE); | ||
190 | - } | ||
191 | + /* | ||
192 | + * Originally, we checked the table signature for "SSDT" or "PSDT" here. | ||
193 | + * Next, we added support for OEMx tables, signature "OEM". | ||
194 | + * Valid tables were encountered with a null signature, so we've just | ||
195 | + * given up on validating the signature, since it seems to be a waste | ||
196 | + * of code. The original code was removed (05/2008). | ||
197 | + */ | ||
198 | |||
199 | (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); | ||
200 | |||
201 | diff --git a/drivers/ide/pci/opti621.c b/drivers/ide/pci/opti621.c | ||
202 | index 46e8748..3eecbd4 100644 | ||
203 | --- a/drivers/ide/pci/opti621.c | ||
204 | +++ b/drivers/ide/pci/opti621.c | ||
205 | @@ -103,18 +103,6 @@ | ||
206 | * address: 50 ns, data: 50 ns, recovery: 100 ns. | ||
207 | */ | ||
208 | |||
209 | -/* #define READ_PREFETCH 0 */ | ||
210 | -/* Uncomment for disable read prefetch. | ||
211 | - * There is some readprefetch capatibility in hdparm, | ||
212 | - * but when I type hdparm -P 1 /dev/hda, I got errors | ||
213 | - * and till reset drive is inaccessible. | ||
214 | - * This (hw) read prefetch is safe on my drive. | ||
215 | - */ | ||
216 | - | ||
217 | -#ifndef READ_PREFETCH | ||
218 | -#define READ_PREFETCH 0x40 /* read prefetch is enabled */ | ||
219 | -#endif /* else read prefetch is disabled */ | ||
220 | - | ||
221 | #define READ_REG 0 /* index of Read cycle timing register */ | ||
222 | #define WRITE_REG 1 /* index of Write cycle timing register */ | ||
223 | #define CNTRL_REG 3 /* index of Control register */ | ||
224 | @@ -260,7 +248,8 @@ static void opti621_set_pio_mode(ide_drive_t *drive, const u8 pio) | ||
225 | |||
226 | cycle1 = ((first.data_time-1)<<4) | (first.recovery_time-2); | ||
227 | cycle2 = ((second.data_time-1)<<4) | (second.recovery_time-2); | ||
228 | - misc = READ_PREFETCH | ((ax-1)<<4) | ((drdy-2)<<1); | ||
229 | + | ||
230 | + misc = ((ax - 1) << 4) | ((drdy - 2) << 1); | ||
231 | |||
232 | #ifdef OPTI621_DEBUG | ||
233 | printk("%s: master: address: %d, data: %d, " | ||
234 | @@ -335,20 +324,16 @@ static const struct ide_port_info opti621_chipsets[] __devinitdata = { | ||
235 | .name = "OPTI621", | ||
236 | .init_hwif = init_hwif_opti621, | ||
237 | .enablebits = {{0x45,0x80,0x00}, {0x40,0x08,0x00}}, | ||
238 | - .host_flags = IDE_HFLAG_TRUST_BIOS_FOR_DMA | | ||
239 | + .host_flags = IDE_HFLAG_NO_DMA | | ||
240 | IDE_HFLAG_BOOTABLE, | ||
241 | .pio_mask = ATA_PIO3, | ||
242 | - .swdma_mask = ATA_SWDMA2, | ||
243 | - .mwdma_mask = ATA_MWDMA2, | ||
244 | },{ /* 1 */ | ||
245 | .name = "OPTI621X", | ||
246 | .init_hwif = init_hwif_opti621, | ||
247 | .enablebits = {{0x45,0x80,0x00}, {0x40,0x08,0x00}}, | ||
248 | - .host_flags = IDE_HFLAG_TRUST_BIOS_FOR_DMA | | ||
249 | + .host_flags = IDE_HFLAG_NO_DMA | | ||
250 | IDE_HFLAG_BOOTABLE, | ||
251 | .pio_mask = ATA_PIO3, | ||
252 | - .swdma_mask = ATA_SWDMA2, | ||
253 | - .mwdma_mask = ATA_MWDMA2, | ||
254 | } | ||
255 | }; | ||
256 | |||
257 | diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c | ||
258 | index 555b70c..2d31587 100644 | ||
259 | --- a/drivers/net/virtio_net.c | ||
260 | +++ b/drivers/net/virtio_net.c | ||
261 | @@ -83,9 +83,7 @@ static void receive_skb(struct net_device *dev, struct sk_buff *skb, | ||
262 | BUG_ON(len > MAX_PACKET_LEN); | ||
263 | |||
264 | skb_trim(skb, len); | ||
265 | - skb->protocol = eth_type_trans(skb, dev); | ||
266 | - pr_debug("Receiving skb proto 0x%04x len %i type %i\n", | ||
267 | - ntohs(skb->protocol), skb->len, skb->pkt_type); | ||
268 | + | ||
269 | dev->stats.rx_bytes += skb->len; | ||
270 | dev->stats.rx_packets++; | ||
271 | |||
272 | @@ -95,6 +93,10 @@ static void receive_skb(struct net_device *dev, struct sk_buff *skb, | ||
273 | goto frame_err; | ||
274 | } | ||
275 | |||
276 | + skb->protocol = eth_type_trans(skb, dev); | ||
277 | + pr_debug("Receiving skb proto 0x%04x len %i type %i\n", | ||
278 | + ntohs(skb->protocol), skb->len, skb->pkt_type); | ||
279 | + | ||
280 | if (hdr->gso_type != VIRTIO_NET_HDR_GSO_NONE) { | ||
281 | pr_debug("GSO!\n"); | ||
282 | switch (hdr->gso_type & ~VIRTIO_NET_HDR_GSO_ECN) { | ||
283 | diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h | ||
284 | index 44ebdea..b14087b 100644 | ||
285 | --- a/drivers/net/wireless/b43/b43.h | ||
286 | +++ b/drivers/net/wireless/b43/b43.h | ||
287 | @@ -596,7 +596,6 @@ struct b43_dma { | ||
288 | |||
289 | /* Context information for a noise calculation (Link Quality). */ | ||
290 | struct b43_noise_calculation { | ||
291 | - u8 channel_at_start; | ||
292 | bool calculation_running; | ||
293 | u8 nr_samples; | ||
294 | s8 samples[8][4]; | ||
295 | diff --git a/drivers/net/wireless/b43/dma.c b/drivers/net/wireless/b43/dma.c | ||
296 | index 4ec1915..f74dba2 100644 | ||
297 | --- a/drivers/net/wireless/b43/dma.c | ||
298 | +++ b/drivers/net/wireless/b43/dma.c | ||
299 | @@ -850,6 +850,7 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev, | ||
300 | if (!ring) | ||
301 | goto out; | ||
302 | ring->type = type; | ||
303 | + ring->dev = dev; | ||
304 | |||
305 | nr_slots = B43_RXRING_SLOTS; | ||
306 | if (for_tx) | ||
307 | @@ -901,7 +902,6 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev, | ||
308 | DMA_TO_DEVICE); | ||
309 | } | ||
310 | |||
311 | - ring->dev = dev; | ||
312 | ring->nr_slots = nr_slots; | ||
313 | ring->mmio_base = b43_dmacontroller_base(type, controller_index); | ||
314 | ring->index = controller_index; | ||
315 | diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c | ||
316 | index 6966eec..b4a2042 100644 | ||
317 | --- a/drivers/net/wireless/b43/main.c | ||
318 | +++ b/drivers/net/wireless/b43/main.c | ||
319 | @@ -1027,7 +1027,6 @@ static void b43_generate_noise_sample(struct b43_wldev *dev) | ||
320 | b43_jssi_write(dev, 0x7F7F7F7F); | ||
321 | b43_write32(dev, B43_MMIO_MACCMD, | ||
322 | b43_read32(dev, B43_MMIO_MACCMD) | B43_MACCMD_BGNOISE); | ||
323 | - B43_WARN_ON(dev->noisecalc.channel_at_start != dev->phy.channel); | ||
324 | } | ||
325 | |||
326 | static void b43_calculate_link_quality(struct b43_wldev *dev) | ||
327 | @@ -1036,7 +1035,6 @@ static void b43_calculate_link_quality(struct b43_wldev *dev) | ||
328 | |||
329 | if (dev->noisecalc.calculation_running) | ||
330 | return; | ||
331 | - dev->noisecalc.channel_at_start = dev->phy.channel; | ||
332 | dev->noisecalc.calculation_running = 1; | ||
333 | dev->noisecalc.nr_samples = 0; | ||
334 | |||
335 | @@ -1053,9 +1051,16 @@ static void handle_irq_noise(struct b43_wldev *dev) | ||
336 | |||
337 | /* Bottom half of Link Quality calculation. */ | ||
338 | |||
339 | + /* Possible race condition: It might be possible that the user | ||
340 | + * changed to a different channel in the meantime since we | ||
341 | + * started the calculation. We ignore that fact, since it's | ||
342 | + * not really that much of a problem. The background noise is | ||
343 | + * an estimation only anyway. Slightly wrong results will get damped | ||
344 | + * by the averaging of the 8 sample rounds. Additionally the | ||
345 | + * value is shortlived. So it will be replaced by the next noise | ||
346 | + * calculation round soon. */ | ||
347 | + | ||
348 | B43_WARN_ON(!dev->noisecalc.calculation_running); | ||
349 | - if (dev->noisecalc.channel_at_start != phy->channel) | ||
350 | - goto drop_calculation; | ||
351 | *((__le32 *)noise) = cpu_to_le32(b43_jssi_read(dev)); | ||
352 | if (noise[0] == 0x7F || noise[1] == 0x7F || | ||
353 | noise[2] == 0x7F || noise[3] == 0x7F) | ||
354 | @@ -1096,11 +1101,10 @@ static void handle_irq_noise(struct b43_wldev *dev) | ||
355 | average -= 48; | ||
356 | |||
357 | dev->stats.link_noise = average; | ||
358 | - drop_calculation: | ||
359 | dev->noisecalc.calculation_running = 0; | ||
360 | return; | ||
361 | } | ||
362 | - generate_new: | ||
363 | +generate_new: | ||
364 | b43_generate_noise_sample(dev); | ||
365 | } | ||
366 | |||
367 | diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c | ||
368 | index ed7e0a1..079c733 100644 | ||
369 | --- a/drivers/scsi/hosts.c | ||
370 | +++ b/drivers/scsi/hosts.c | ||
371 | @@ -455,9 +455,10 @@ struct Scsi_Host *scsi_host_lookup(unsigned short hostnum) | ||
372 | struct Scsi_Host *shost = ERR_PTR(-ENXIO); | ||
373 | |||
374 | cdev = class_find_child(&shost_class, &hostnum, __scsi_host_match); | ||
375 | - if (cdev) | ||
376 | + if (cdev) { | ||
377 | shost = scsi_host_get(class_to_shost(cdev)); | ||
378 | - | ||
379 | + class_device_put(cdev); | ||
380 | + } | ||
381 | return shost; | ||
382 | } | ||
383 | EXPORT_SYMBOL(scsi_host_lookup); | ||
384 | diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c | ||
385 | index 7ee86d4..c82df8b 100644 | ||
386 | --- a/drivers/scsi/sr.c | ||
387 | +++ b/drivers/scsi/sr.c | ||
388 | @@ -178,6 +178,9 @@ int sr_test_unit_ready(struct scsi_device *sdev, struct scsi_sense_hdr *sshdr) | ||
389 | the_result = scsi_execute_req(sdev, cmd, DMA_NONE, NULL, | ||
390 | 0, sshdr, SR_TIMEOUT, | ||
391 | retries--); | ||
392 | + if (scsi_sense_valid(sshdr) && | ||
393 | + sshdr->sense_key == UNIT_ATTENTION) | ||
394 | + sdev->changed = 1; | ||
395 | |||
396 | } while (retries > 0 && | ||
397 | (!scsi_status_is_good(the_result) || | ||
398 | diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c | ||
399 | index 77f7a7f..d60705e 100644 | ||
400 | --- a/drivers/serial/8250.c | ||
401 | +++ b/drivers/serial/8250.c | ||
402 | @@ -2174,7 +2174,9 @@ serial8250_set_termios(struct uart_port *port, struct ktermios *termios, | ||
403 | } | ||
404 | serial8250_set_mctrl(&up->port, up->port.mctrl); | ||
405 | spin_unlock_irqrestore(&up->port.lock, flags); | ||
406 | - tty_termios_encode_baud_rate(termios, baud, baud); | ||
407 | + /* Don't rewrite B0 */ | ||
408 | + if (tty_termios_baud_rate(termios)) | ||
409 | + tty_termios_encode_baud_rate(termios, baud, baud); | ||
410 | } | ||
411 | |||
412 | static void | ||
413 | diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c | ||
414 | index 4147de6..8785784 100644 | ||
415 | --- a/net/netfilter/nf_conntrack_core.c | ||
416 | +++ b/net/netfilter/nf_conntrack_core.c | ||
417 | @@ -199,8 +199,6 @@ destroy_conntrack(struct nf_conntrack *nfct) | ||
418 | if (l4proto && l4proto->destroy) | ||
419 | l4proto->destroy(ct); | ||
420 | |||
421 | - nf_ct_ext_destroy(ct); | ||
422 | - | ||
423 | rcu_read_unlock(); | ||
424 | |||
425 | spin_lock_bh(&nf_conntrack_lock); | ||
426 | @@ -523,6 +521,7 @@ static void nf_conntrack_free_rcu(struct rcu_head *head) | ||
427 | |||
428 | void nf_conntrack_free(struct nf_conn *ct) | ||
429 | { | ||
430 | + nf_ct_ext_destroy(ct); | ||
431 | call_rcu(&ct->rcu, nf_conntrack_free_rcu); | ||
432 | } | ||
433 | EXPORT_SYMBOL_GPL(nf_conntrack_free); | ||
434 | diff --git a/net/netfilter/nf_conntrack_h323_main.c b/net/netfilter/nf_conntrack_h323_main.c | ||
435 | index 898f192..7407dd3 100644 | ||
436 | --- a/net/netfilter/nf_conntrack_h323_main.c | ||
437 | +++ b/net/netfilter/nf_conntrack_h323_main.c | ||
438 | @@ -617,6 +617,7 @@ static struct nf_conntrack_helper nf_conntrack_helper_h245 __read_mostly = { | ||
439 | .me = THIS_MODULE, | ||
440 | .max_expected = H323_RTP_CHANNEL_MAX * 4 + 2 /* T.120 */, | ||
441 | .timeout = 240, | ||
442 | + .tuple.src.l3num = AF_UNSPEC, | ||
443 | .tuple.dst.protonum = IPPROTO_UDP, | ||
444 | .help = h245_help | ||
445 | }; | ||
446 | @@ -1758,6 +1759,7 @@ static void __exit nf_conntrack_h323_fini(void) | ||
447 | nf_conntrack_helper_unregister(&nf_conntrack_helper_ras[0]); | ||
448 | nf_conntrack_helper_unregister(&nf_conntrack_helper_q931[1]); | ||
449 | nf_conntrack_helper_unregister(&nf_conntrack_helper_q931[0]); | ||
450 | + nf_conntrack_helper_unregister(&nf_conntrack_helper_h245); | ||
451 | kfree(h323_buffer); | ||
452 | pr_debug("nf_ct_h323: fini\n"); | ||
453 | } | ||
454 | @@ -1770,28 +1772,34 @@ static int __init nf_conntrack_h323_init(void) | ||
455 | h323_buffer = kmalloc(65536, GFP_KERNEL); | ||
456 | if (!h323_buffer) | ||
457 | return -ENOMEM; | ||
458 | - ret = nf_conntrack_helper_register(&nf_conntrack_helper_q931[0]); | ||
459 | + ret = nf_conntrack_helper_register(&nf_conntrack_helper_h245); | ||
460 | if (ret < 0) | ||
461 | goto err1; | ||
462 | - ret = nf_conntrack_helper_register(&nf_conntrack_helper_q931[1]); | ||
463 | + ret = nf_conntrack_helper_register(&nf_conntrack_helper_q931[0]); | ||
464 | if (ret < 0) | ||
465 | goto err2; | ||
466 | - ret = nf_conntrack_helper_register(&nf_conntrack_helper_ras[0]); | ||
467 | + ret = nf_conntrack_helper_register(&nf_conntrack_helper_q931[1]); | ||
468 | if (ret < 0) | ||
469 | goto err3; | ||
470 | - ret = nf_conntrack_helper_register(&nf_conntrack_helper_ras[1]); | ||
471 | + ret = nf_conntrack_helper_register(&nf_conntrack_helper_ras[0]); | ||
472 | if (ret < 0) | ||
473 | goto err4; | ||
474 | + ret = nf_conntrack_helper_register(&nf_conntrack_helper_ras[1]); | ||
475 | + if (ret < 0) | ||
476 | + goto err5; | ||
477 | pr_debug("nf_ct_h323: init success\n"); | ||
478 | return 0; | ||
479 | |||
480 | -err4: | ||
481 | +err5: | ||
482 | nf_conntrack_helper_unregister(&nf_conntrack_helper_ras[0]); | ||
483 | -err3: | ||
484 | +err4: | ||
485 | nf_conntrack_helper_unregister(&nf_conntrack_helper_q931[1]); | ||
486 | -err2: | ||
487 | +err3: | ||
488 | nf_conntrack_helper_unregister(&nf_conntrack_helper_q931[0]); | ||
489 | +err2: | ||
490 | + nf_conntrack_helper_unregister(&nf_conntrack_helper_h245); | ||
491 | err1: | ||
492 | + kfree(h323_buffer); | ||
493 | return ret; | ||
494 | } | ||
495 |