Magellan Linux

Annotation of /trunk/kernel26-magellan/patches-2.6.25-r5/0107-2.6.25.8-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 677 - (hide annotations) (download)
Wed Sep 10 21:27:27 2008 UTC (15 years, 9 months 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