Contents of /trunk/kernel26-magellan-server/patches-2.6.25-r5/0107-2.6.25.8-all-fixes.patch
Parent Directory | Revision Log
Revision 677 -
(show annotations)
(download)
Wed Sep 10 21:27:27 2008 UTC (16 years, 1 month ago) by niro
File size: 16462 byte(s)
Wed Sep 10 21:27:27 2008 UTC (16 years, 1 month ago) by niro
File size: 16462 byte(s)
2.6.25-magellan-r5: - updated to linux-2.6.25.17
1 | 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 |