Annotation of /trunk/kernel26-alx/patches-2.6.20-r6/0114-2.6.20.14-all-fixes.patch
Parent Directory | Revision Log
Revision 1175 -
(hide annotations)
(download)
Thu Oct 14 12:15:46 2010 UTC (13 years, 8 months ago) by niro
File size: 46641 byte(s)
Thu Oct 14 12:15:46 2010 UTC (13 years, 8 months ago) by niro
File size: 46641 byte(s)
-2.6.20-alx-r6 new magellan 0.5.2 kernel
1 | niro | 1175 | diff --git a/arch/arm/mach-iop13xx/pci.c b/arch/arm/mach-iop13xx/pci.c |
2 | index 89ec70e..d907a2a 100644 | ||
3 | --- a/arch/arm/mach-iop13xx/pci.c | ||
4 | +++ b/arch/arm/mach-iop13xx/pci.c | ||
5 | @@ -1023,7 +1023,7 @@ int iop13xx_pci_setup(int nr, struct pci_sys_data *sys) | ||
6 | << IOP13XX_ATUX_PCIXSR_FUNC_NUM; | ||
7 | __raw_writel(pcixsr, IOP13XX_ATUX_PCIXSR); | ||
8 | |||
9 | - res[0].start = IOP13XX_PCIX_LOWER_IO_PA; | ||
10 | + res[0].start = IOP13XX_PCIX_LOWER_IO_PA + IOP13XX_PCIX_IO_BUS_OFFSET; | ||
11 | res[0].end = IOP13XX_PCIX_UPPER_IO_PA; | ||
12 | res[0].name = "IQ81340 ATUX PCI I/O Space"; | ||
13 | res[0].flags = IORESOURCE_IO; | ||
14 | @@ -1033,7 +1033,7 @@ int iop13xx_pci_setup(int nr, struct pci_sys_data *sys) | ||
15 | res[1].name = "IQ81340 ATUX PCI Memory Space"; | ||
16 | res[1].flags = IORESOURCE_MEM; | ||
17 | sys->mem_offset = IOP13XX_PCIX_MEM_OFFSET; | ||
18 | - sys->io_offset = IOP13XX_PCIX_IO_OFFSET; | ||
19 | + sys->io_offset = IOP13XX_PCIX_LOWER_IO_PA; | ||
20 | break; | ||
21 | case IOP13XX_INIT_ATU_ATUE: | ||
22 | /* Note: the function number field in the PCSR is ro */ | ||
23 | @@ -1044,7 +1044,7 @@ int iop13xx_pci_setup(int nr, struct pci_sys_data *sys) | ||
24 | |||
25 | __raw_writel(pcsr, IOP13XX_ATUE_PCSR); | ||
26 | |||
27 | - res[0].start = IOP13XX_PCIE_LOWER_IO_PA; | ||
28 | + res[0].start = IOP13XX_PCIE_LOWER_IO_PA + IOP13XX_PCIE_IO_BUS_OFFSET; | ||
29 | res[0].end = IOP13XX_PCIE_UPPER_IO_PA; | ||
30 | res[0].name = "IQ81340 ATUE PCI I/O Space"; | ||
31 | res[0].flags = IORESOURCE_IO; | ||
32 | @@ -1054,7 +1054,7 @@ int iop13xx_pci_setup(int nr, struct pci_sys_data *sys) | ||
33 | res[1].name = "IQ81340 ATUE PCI Memory Space"; | ||
34 | res[1].flags = IORESOURCE_MEM; | ||
35 | sys->mem_offset = IOP13XX_PCIE_MEM_OFFSET; | ||
36 | - sys->io_offset = IOP13XX_PCIE_IO_OFFSET; | ||
37 | + sys->io_offset = IOP13XX_PCIE_LOWER_IO_PA; | ||
38 | sys->map_irq = iop13xx_pcie_map_irq; | ||
39 | break; | ||
40 | default: | ||
41 | diff --git a/arch/sparc64/kernel/head.S b/arch/sparc64/kernel/head.S | ||
42 | index baea10a..06459ae 100644 | ||
43 | --- a/arch/sparc64/kernel/head.S | ||
44 | +++ b/arch/sparc64/kernel/head.S | ||
45 | @@ -653,33 +653,54 @@ setup_tba: | ||
46 | restore | ||
47 | sparc64_boot_end: | ||
48 | |||
49 | -#include "ktlb.S" | ||
50 | -#include "tsb.S" | ||
51 | #include "etrap.S" | ||
52 | #include "rtrap.S" | ||
53 | #include "winfixup.S" | ||
54 | #include "entry.S" | ||
55 | #include "sun4v_tlb_miss.S" | ||
56 | #include "sun4v_ivec.S" | ||
57 | +#include "ktlb.S" | ||
58 | +#include "tsb.S" | ||
59 | |||
60 | /* | ||
61 | * The following skip makes sure the trap table in ttable.S is aligned | ||
62 | * on a 32K boundary as required by the v9 specs for TBA register. | ||
63 | * | ||
64 | * We align to a 32K boundary, then we have the 32K kernel TSB, | ||
65 | - * then the 32K aligned trap table. | ||
66 | + * the 64K kernel 4MB TSB, and then the 32K aligned trap table. | ||
67 | */ | ||
68 | 1: | ||
69 | .skip 0x4000 + _start - 1b | ||
70 | |||
71 | +! 0x0000000000408000 | ||
72 | + | ||
73 | .globl swapper_tsb | ||
74 | swapper_tsb: | ||
75 | .skip (32 * 1024) | ||
76 | |||
77 | -! 0x0000000000408000 | ||
78 | + .globl swapper_4m_tsb | ||
79 | +swapper_4m_tsb: | ||
80 | + .skip (64 * 1024) | ||
81 | + | ||
82 | +! 0x0000000000420000 | ||
83 | |||
84 | + /* Some care needs to be exercised if you try to move the | ||
85 | + * location of the trap table relative to other things. For | ||
86 | + * one thing there are br* instructions in some of the | ||
87 | + * trap table entires which branch back to code in ktlb.S | ||
88 | + * Those instructions can only handle a signed 16-bit | ||
89 | + * displacement. | ||
90 | + * | ||
91 | + * There is a binutils bug (bugzilla #4558) which causes | ||
92 | + * the relocation overflow checks for such instructions to | ||
93 | + * not be done correctly. So bintuils will not notice the | ||
94 | + * error and will instead write junk into the relocation and | ||
95 | + * you'll have an unbootable kernel. | ||
96 | + */ | ||
97 | #include "ttable.S" | ||
98 | |||
99 | +! 0x0000000000428000 | ||
100 | + | ||
101 | #include "systbls.S" | ||
102 | |||
103 | .data | ||
104 | diff --git a/arch/sparc64/kernel/itlb_miss.S b/arch/sparc64/kernel/itlb_miss.S | ||
105 | index ad46e20..5a8377b 100644 | ||
106 | --- a/arch/sparc64/kernel/itlb_miss.S | ||
107 | +++ b/arch/sparc64/kernel/itlb_miss.S | ||
108 | @@ -11,12 +11,12 @@ | ||
109 | /* ITLB ** ICACHE line 2: TSB compare and TLB load */ | ||
110 | bne,pn %xcc, tsb_miss_itlb ! Miss | ||
111 | mov FAULT_CODE_ITLB, %g3 | ||
112 | - andcc %g5, _PAGE_EXEC_4U, %g0 ! Executable? | ||
113 | + sethi %hi(_PAGE_EXEC_4U), %g4 | ||
114 | + andcc %g5, %g4, %g0 ! Executable? | ||
115 | be,pn %xcc, tsb_do_fault | ||
116 | nop ! Delay slot, fill me | ||
117 | stxa %g5, [%g0] ASI_ITLB_DATA_IN ! Load TLB | ||
118 | retry ! Trap done | ||
119 | - nop | ||
120 | |||
121 | /* ITLB ** ICACHE line 3: */ | ||
122 | nop | ||
123 | diff --git a/arch/sparc64/kernel/pci_sun4v.c b/arch/sparc64/kernel/pci_sun4v.c | ||
124 | index 6b04794..1153f68 100644 | ||
125 | --- a/arch/sparc64/kernel/pci_sun4v.c | ||
126 | +++ b/arch/sparc64/kernel/pci_sun4v.c | ||
127 | @@ -10,6 +10,7 @@ | ||
128 | #include <linux/slab.h> | ||
129 | #include <linux/interrupt.h> | ||
130 | #include <linux/percpu.h> | ||
131 | +#include <linux/log2.h> | ||
132 | |||
133 | #include <asm/pbm.h> | ||
134 | #include <asm/iommu.h> | ||
135 | @@ -994,9 +995,8 @@ static void pci_sun4v_iommu_init(struct pci_pbm_info *pbm) | ||
136 | { | ||
137 | struct pci_iommu *iommu = pbm->iommu; | ||
138 | struct property *prop; | ||
139 | - unsigned long num_tsb_entries, sz; | ||
140 | + unsigned long num_tsb_entries, sz, tsbsize; | ||
141 | u32 vdma[2], dma_mask, dma_offset; | ||
142 | - int tsbsize; | ||
143 | |||
144 | prop = of_find_property(pbm->prom_node, "virtual-dma", NULL); | ||
145 | if (prop) { | ||
146 | @@ -1010,31 +1010,15 @@ static void pci_sun4v_iommu_init(struct pci_pbm_info *pbm) | ||
147 | vdma[1] = 0x80000000; | ||
148 | } | ||
149 | |||
150 | - dma_mask = vdma[0]; | ||
151 | - switch (vdma[1]) { | ||
152 | - case 0x20000000: | ||
153 | - dma_mask |= 0x1fffffff; | ||
154 | - tsbsize = 64; | ||
155 | - break; | ||
156 | - | ||
157 | - case 0x40000000: | ||
158 | - dma_mask |= 0x3fffffff; | ||
159 | - tsbsize = 128; | ||
160 | - break; | ||
161 | - | ||
162 | - case 0x80000000: | ||
163 | - dma_mask |= 0x7fffffff; | ||
164 | - tsbsize = 256; | ||
165 | - break; | ||
166 | - | ||
167 | - default: | ||
168 | - prom_printf("PCI-SUN4V: strange virtual-dma size.\n"); | ||
169 | - prom_halt(); | ||
170 | + if ((vdma[0] | vdma[1]) & ~IO_PAGE_MASK) { | ||
171 | + prom_printf("PCI-SUN4V: strange virtual-dma[%08x:%08x].\n", | ||
172 | + vdma[0], vdma[1]); | ||
173 | + prom_halt(); | ||
174 | }; | ||
175 | |||
176 | - tsbsize *= (8 * 1024); | ||
177 | - | ||
178 | - num_tsb_entries = tsbsize / sizeof(iopte_t); | ||
179 | + dma_mask = (roundup_pow_of_two(vdma[1]) - 1UL); | ||
180 | + num_tsb_entries = vdma[1] / IO_PAGE_SIZE; | ||
181 | + tsbsize = num_tsb_entries * sizeof(iopte_t); | ||
182 | |||
183 | dma_offset = vdma[0]; | ||
184 | |||
185 | @@ -1045,7 +1029,7 @@ static void pci_sun4v_iommu_init(struct pci_pbm_info *pbm) | ||
186 | iommu->dma_addr_mask = dma_mask; | ||
187 | |||
188 | /* Allocate and initialize the free area map. */ | ||
189 | - sz = num_tsb_entries / 8; | ||
190 | + sz = (num_tsb_entries + 7) / 8; | ||
191 | sz = (sz + 7UL) & ~7UL; | ||
192 | iommu->arena.map = kzalloc(sz, GFP_KERNEL); | ||
193 | if (!iommu->arena.map) { | ||
194 | diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c | ||
195 | index 5391cd5..88f5ff0 100644 | ||
196 | --- a/arch/sparc64/mm/init.c | ||
197 | +++ b/arch/sparc64/mm/init.c | ||
198 | @@ -60,8 +60,11 @@ unsigned long kern_linear_pte_xor[2] __read_mostly; | ||
199 | unsigned long kpte_linear_bitmap[KPTE_BITMAP_BYTES / sizeof(unsigned long)]; | ||
200 | |||
201 | #ifndef CONFIG_DEBUG_PAGEALLOC | ||
202 | -/* A special kernel TSB for 4MB and 256MB linear mappings. */ | ||
203 | -struct tsb swapper_4m_tsb[KERNEL_TSB4M_NENTRIES]; | ||
204 | +/* A special kernel TSB for 4MB and 256MB linear mappings. | ||
205 | + * Space is allocated for this right after the trap table | ||
206 | + * in arch/sparc64/kernel/head.S | ||
207 | + */ | ||
208 | +extern struct tsb swapper_4m_tsb[KERNEL_TSB4M_NENTRIES]; | ||
209 | #endif | ||
210 | |||
211 | #define MAX_BANKS 32 | ||
212 | diff --git a/arch/x86_64/mm/pageattr.c b/arch/x86_64/mm/pageattr.c | ||
213 | index ccb91dd..4df4bb5 100644 | ||
214 | --- a/arch/x86_64/mm/pageattr.c | ||
215 | +++ b/arch/x86_64/mm/pageattr.c | ||
216 | @@ -81,8 +81,8 @@ static void flush_kernel_map(void *arg) | ||
217 | void *adr = page_address(pg); | ||
218 | if (cpu_has_clflush) | ||
219 | cache_flush_page(adr); | ||
220 | - __flush_tlb_one(adr); | ||
221 | } | ||
222 | + __flush_tlb_all(); | ||
223 | } | ||
224 | |||
225 | static inline void flush_map(struct list_head *l) | ||
226 | diff --git a/crypto/api.c b/crypto/api.c | ||
227 | index 8c44687..005d874 100644 | ||
228 | --- a/crypto/api.c | ||
229 | +++ b/crypto/api.c | ||
230 | @@ -48,8 +48,10 @@ EXPORT_SYMBOL_GPL(crypto_mod_get); | ||
231 | |||
232 | void crypto_mod_put(struct crypto_alg *alg) | ||
233 | { | ||
234 | + struct module *module = alg->cra_module; | ||
235 | + | ||
236 | crypto_alg_put(alg); | ||
237 | - module_put(alg->cra_module); | ||
238 | + module_put(module); | ||
239 | } | ||
240 | EXPORT_SYMBOL_GPL(crypto_mod_put); | ||
241 | |||
242 | diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c | ||
243 | index 40ddb4d..324a1cb 100644 | ||
244 | --- a/drivers/acpi/thermal.c | ||
245 | +++ b/drivers/acpi/thermal.c | ||
246 | @@ -758,7 +758,8 @@ static void acpi_thermal_check(void *data) | ||
247 | del_timer(&(tz->timer)); | ||
248 | } else { | ||
249 | if (timer_pending(&(tz->timer))) | ||
250 | - mod_timer(&(tz->timer), (HZ * sleep_time) / 1000); | ||
251 | + mod_timer(&(tz->timer), | ||
252 | + jiffies + (HZ * sleep_time) / 1000); | ||
253 | else { | ||
254 | tz->timer.data = (unsigned long)tz; | ||
255 | tz->timer.function = acpi_thermal_run; | ||
256 | diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c | ||
257 | index d3d5c0d..f6ac2da 100644 | ||
258 | --- a/drivers/ata/sata_via.c | ||
259 | +++ b/drivers/ata/sata_via.c | ||
260 | @@ -90,6 +90,10 @@ static struct pci_driver svia_pci_driver = { | ||
261 | .name = DRV_NAME, | ||
262 | .id_table = svia_pci_tbl, | ||
263 | .probe = svia_init_one, | ||
264 | +#ifdef CONFIG_PM | ||
265 | + .suspend = ata_pci_device_suspend, | ||
266 | + .resume = ata_pci_device_resume, | ||
267 | +#endif | ||
268 | .remove = ata_pci_remove_one, | ||
269 | }; | ||
270 | |||
271 | @@ -109,6 +113,10 @@ static struct scsi_host_template svia_sht = { | ||
272 | .slave_configure = ata_scsi_slave_config, | ||
273 | .slave_destroy = ata_scsi_slave_destroy, | ||
274 | .bios_param = ata_std_bios_param, | ||
275 | +#ifdef CONFIG_PM | ||
276 | + .suspend = ata_scsi_device_suspend, | ||
277 | + .resume = ata_scsi_device_resume, | ||
278 | +#endif | ||
279 | }; | ||
280 | |||
281 | static const struct ata_port_operations vt6420_sata_ops = { | ||
282 | diff --git a/drivers/base/core.c b/drivers/base/core.c | ||
283 | index 67b79a7..7d10d67 100644 | ||
284 | --- a/drivers/base/core.c | ||
285 | +++ b/drivers/base/core.c | ||
286 | @@ -93,6 +93,9 @@ static void device_release(struct kobject * kobj) | ||
287 | { | ||
288 | struct device * dev = to_dev(kobj); | ||
289 | |||
290 | + kfree(dev->devt_attr); | ||
291 | + dev->devt_attr = NULL; | ||
292 | + | ||
293 | if (dev->release) | ||
294 | dev->release(dev); | ||
295 | else if (dev->class && dev->class->dev_release) | ||
296 | @@ -650,10 +653,8 @@ void device_del(struct device * dev) | ||
297 | |||
298 | if (parent) | ||
299 | klist_del(&dev->knode_parent); | ||
300 | - if (dev->devt_attr) { | ||
301 | + if (dev->devt_attr) | ||
302 | device_remove_file(dev, dev->devt_attr); | ||
303 | - kfree(dev->devt_attr); | ||
304 | - } | ||
305 | if (dev->class) { | ||
306 | sysfs_remove_link(&dev->kobj, "subsystem"); | ||
307 | /* If this is not a "fake" compatible device, remove the | ||
308 | diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c | ||
309 | index 3b12996..879b010 100644 | ||
310 | --- a/drivers/input/serio/i8042.c | ||
311 | +++ b/drivers/input/serio/i8042.c | ||
312 | @@ -533,6 +533,33 @@ static irqreturn_t __devinit i8042_aux_test_irq(int irq, void *dev_id) | ||
313 | return IRQ_HANDLED; | ||
314 | } | ||
315 | |||
316 | +/* | ||
317 | + * i8042_toggle_aux - enables or disables AUX port on i8042 via command and | ||
318 | + * verifies success by readinng CTR. Used when testing for presence of AUX | ||
319 | + * port. | ||
320 | + */ | ||
321 | +static int __devinit i8042_toggle_aux(int on) | ||
322 | +{ | ||
323 | + unsigned char param; | ||
324 | + int i; | ||
325 | + | ||
326 | + if (i8042_command(¶m, | ||
327 | + on ? I8042_CMD_AUX_ENABLE : I8042_CMD_AUX_DISABLE)) | ||
328 | + return -1; | ||
329 | + | ||
330 | + /* some chips need some time to set the I8042_CTR_AUXDIS bit */ | ||
331 | + for (i = 0; i < 100; i++) { | ||
332 | + udelay(50); | ||
333 | + | ||
334 | + if (i8042_command(¶m, I8042_CMD_CTL_RCTR)) | ||
335 | + return -1; | ||
336 | + | ||
337 | + if (!(param & I8042_CTR_AUXDIS) == on) | ||
338 | + return 0; | ||
339 | + } | ||
340 | + | ||
341 | + return -1; | ||
342 | +} | ||
343 | |||
344 | /* | ||
345 | * i8042_check_aux() applies as much paranoia as it can at detecting | ||
346 | @@ -587,16 +614,12 @@ static int __devinit i8042_check_aux(void) | ||
347 | * Bit assignment test - filters out PS/2 i8042's in AT mode | ||
348 | */ | ||
349 | |||
350 | - if (i8042_command(¶m, I8042_CMD_AUX_DISABLE)) | ||
351 | - return -1; | ||
352 | - if (i8042_command(¶m, I8042_CMD_CTL_RCTR) || (~param & I8042_CTR_AUXDIS)) { | ||
353 | + if (i8042_toggle_aux(0)) { | ||
354 | printk(KERN_WARNING "Failed to disable AUX port, but continuing anyway... Is this a SiS?\n"); | ||
355 | printk(KERN_WARNING "If AUX port is really absent please use the 'i8042.noaux' option.\n"); | ||
356 | } | ||
357 | |||
358 | - if (i8042_command(¶m, I8042_CMD_AUX_ENABLE)) | ||
359 | - return -1; | ||
360 | - if (i8042_command(¶m, I8042_CMD_CTL_RCTR) || (param & I8042_CTR_AUXDIS)) | ||
361 | + if (i8042_toggle_aux(1)) | ||
362 | return -1; | ||
363 | |||
364 | /* | ||
365 | diff --git a/drivers/media/dvb/ttpci/budget-ci.c b/drivers/media/dvb/ttpci/budget-ci.c | ||
366 | index f2066b4..ac0ca22 100644 | ||
367 | --- a/drivers/media/dvb/ttpci/budget-ci.c | ||
368 | +++ b/drivers/media/dvb/ttpci/budget-ci.c | ||
369 | @@ -892,7 +892,7 @@ static int dvbc_philips_tdm1316l_tuner_set_params(struct dvb_frontend *fe, struc | ||
370 | band = 1; | ||
371 | } else if (tuner_frequency < 200000000) { | ||
372 | cp = 6; | ||
373 | - band = 2; | ||
374 | + band = 1; | ||
375 | } else if (tuner_frequency < 290000000) { | ||
376 | cp = 3; | ||
377 | band = 2; | ||
378 | diff --git a/drivers/net/smc911x.c b/drivers/net/smc911x.c | ||
379 | index 43af614..5f1cdb2 100644 | ||
380 | --- a/drivers/net/smc911x.c | ||
381 | +++ b/drivers/net/smc911x.c | ||
382 | @@ -499,7 +499,7 @@ static inline void smc911x_rcv(struct net_device *dev) | ||
383 | SMC_SET_RX_CFG(RX_CFG_RX_END_ALGN4_ | ((2<<8) & RX_CFG_RXDOFF_)); | ||
384 | SMC_PULL_DATA(data, pkt_len+2+3); | ||
385 | |||
386 | - DBG(SMC_DEBUG_PKTS, "%s: Received packet\n", dev->name,); | ||
387 | + DBG(SMC_DEBUG_PKTS, "%s: Received packet\n", dev->name); | ||
388 | PRINT_PKT(data, ((pkt_len - 4) <= 64) ? pkt_len - 4 : 64); | ||
389 | dev->last_rx = jiffies; | ||
390 | skb->dev = dev; | ||
391 | diff --git a/drivers/serial/suncore.c b/drivers/serial/suncore.c | ||
392 | index e35d9ab..b45ba53 100644 | ||
393 | --- a/drivers/serial/suncore.c | ||
394 | +++ b/drivers/serial/suncore.c | ||
395 | @@ -30,9 +30,9 @@ void | ||
396 | sunserial_console_termios(struct console *con) | ||
397 | { | ||
398 | char mode[16], buf[16], *s; | ||
399 | - char *mode_prop = "ttyX-mode"; | ||
400 | - char *cd_prop = "ttyX-ignore-cd"; | ||
401 | - char *dtr_prop = "ttyX-rts-dtr-off"; | ||
402 | + char mode_prop[] = "ttyX-mode"; | ||
403 | + char cd_prop[] = "ttyX-ignore-cd"; | ||
404 | + char dtr_prop[] = "ttyX-rts-dtr-off"; | ||
405 | char *ssp_console_modes_prop = "ssp-console-modes"; | ||
406 | int baud, bits, stop, cflag; | ||
407 | char parity; | ||
408 | diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c | ||
409 | index 4008047..942069b 100644 | ||
410 | --- a/fs/fuse/dir.c | ||
411 | +++ b/fs/fuse/dir.c | ||
412 | @@ -484,7 +484,7 @@ static int fuse_mknod(struct inode *dir, struct dentry *entry, int mode, | ||
413 | static int fuse_create(struct inode *dir, struct dentry *entry, int mode, | ||
414 | struct nameidata *nd) | ||
415 | { | ||
416 | - if (nd && (nd->flags & LOOKUP_CREATE)) { | ||
417 | + if (nd && (nd->flags & LOOKUP_OPEN)) { | ||
418 | int err = fuse_create_open(dir, entry, mode, nd); | ||
419 | if (err != -ENOSYS) | ||
420 | return err; | ||
421 | diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c | ||
422 | index 5065baa..3760d02 100644 | ||
423 | --- a/fs/jfs/jfs_logmgr.c | ||
424 | +++ b/fs/jfs/jfs_logmgr.c | ||
425 | @@ -2354,12 +2354,13 @@ int jfsIOWait(void *arg) | ||
426 | lbmStartIO(bp); | ||
427 | spin_lock_irq(&log_redrive_lock); | ||
428 | } | ||
429 | - spin_unlock_irq(&log_redrive_lock); | ||
430 | |||
431 | if (freezing(current)) { | ||
432 | + spin_unlock_irq(&log_redrive_lock); | ||
433 | refrigerator(); | ||
434 | } else { | ||
435 | set_current_state(TASK_INTERRUPTIBLE); | ||
436 | + spin_unlock_irq(&log_redrive_lock); | ||
437 | schedule(); | ||
438 | current->state = TASK_RUNNING; | ||
439 | } | ||
440 | diff --git a/fs/ntfs/inode.c b/fs/ntfs/inode.c | ||
441 | index f8bf8da..461460d 100644 | ||
442 | --- a/fs/ntfs/inode.c | ||
443 | +++ b/fs/ntfs/inode.c | ||
444 | @@ -141,7 +141,7 @@ static int ntfs_init_locked_inode(struct inode *vi, ntfs_attr *na) | ||
445 | if (!ni->name) | ||
446 | return -ENOMEM; | ||
447 | memcpy(ni->name, na->name, i); | ||
448 | - ni->name[i] = 0; | ||
449 | + ni->name[na->name_len] = 0; | ||
450 | } | ||
451 | return 0; | ||
452 | } | ||
453 | diff --git a/include/asm-arm/arch-iop13xx/iop13xx.h b/include/asm-arm/arch-iop13xx/iop13xx.h | ||
454 | index a88522a..9a52479 100644 | ||
455 | --- a/include/asm-arm/arch-iop13xx/iop13xx.h | ||
456 | +++ b/include/asm-arm/arch-iop13xx/iop13xx.h | ||
457 | @@ -55,19 +55,24 @@ static inline int iop13xx_cpu_id(void) | ||
458 | #define IOP13XX_PCI_OFFSET IOP13XX_MAX_RAM_SIZE | ||
459 | |||
460 | /* PCI MAP | ||
461 | - * 0x0000.0000 - 0x8000.0000 1:1 mapping with Physical RAM | ||
462 | - * 0x8000.0000 - 0x8800.0000 PCIX/PCIE memory window (128MB) | ||
463 | -*/ | ||
464 | + * bus range cpu phys cpu virt note | ||
465 | + * 0x0000.0000 + 2GB (n/a) (n/a) inbound, 1:1 mapping with Physical RAM | ||
466 | + * 0x8000.0000 + 928M 0x1.8000.0000 (ioremap) PCIX outbound memory window | ||
467 | + * 0x8000.0000 + 928M 0x2.8000.0000 (ioremap) PCIE outbound memory window | ||
468 | + * | ||
469 | + * IO MAP | ||
470 | + * 0x1000 + 64K 0x0.fffb.1000 0xfec6.1000 PCIX outbound i/o window | ||
471 | + * 0x1000 + 64K 0x0.fffd.1000 0xfed7.1000 PCIE outbound i/o window | ||
472 | + */ | ||
473 | #define IOP13XX_PCIX_IO_WINDOW_SIZE 0x10000UL | ||
474 | #define IOP13XX_PCIX_LOWER_IO_PA 0xfffb0000UL | ||
475 | #define IOP13XX_PCIX_LOWER_IO_VA 0xfec60000UL | ||
476 | -#define IOP13XX_PCIX_LOWER_IO_BA 0x0fff0000UL | ||
477 | +#define IOP13XX_PCIX_LOWER_IO_BA 0x0UL /* OIOTVR */ | ||
478 | +#define IOP13XX_PCIX_IO_BUS_OFFSET 0x1000UL | ||
479 | #define IOP13XX_PCIX_UPPER_IO_PA (IOP13XX_PCIX_LOWER_IO_PA +\ | ||
480 | IOP13XX_PCIX_IO_WINDOW_SIZE - 1) | ||
481 | #define IOP13XX_PCIX_UPPER_IO_VA (IOP13XX_PCIX_LOWER_IO_VA +\ | ||
482 | IOP13XX_PCIX_IO_WINDOW_SIZE - 1) | ||
483 | -#define IOP13XX_PCIX_IO_OFFSET (IOP13XX_PCIX_LOWER_IO_VA -\ | ||
484 | - IOP13XX_PCIX_LOWER_IO_BA) | ||
485 | #define IOP13XX_PCIX_IO_PHYS_TO_VIRT(addr) (u32) ((u32) addr -\ | ||
486 | (IOP13XX_PCIX_LOWER_IO_PA\ | ||
487 | - IOP13XX_PCIX_LOWER_IO_VA)) | ||
488 | @@ -93,15 +98,14 @@ static inline int iop13xx_cpu_id(void) | ||
489 | #define IOP13XX_PCIE_IO_WINDOW_SIZE 0x10000UL | ||
490 | #define IOP13XX_PCIE_LOWER_IO_PA 0xfffd0000UL | ||
491 | #define IOP13XX_PCIE_LOWER_IO_VA 0xfed70000UL | ||
492 | -#define IOP13XX_PCIE_LOWER_IO_BA 0x0fff0000UL | ||
493 | +#define IOP13XX_PCIE_LOWER_IO_BA 0x0UL /* OIOTVR */ | ||
494 | +#define IOP13XX_PCIE_IO_BUS_OFFSET 0x1000UL | ||
495 | #define IOP13XX_PCIE_UPPER_IO_PA (IOP13XX_PCIE_LOWER_IO_PA +\ | ||
496 | IOP13XX_PCIE_IO_WINDOW_SIZE - 1) | ||
497 | #define IOP13XX_PCIE_UPPER_IO_VA (IOP13XX_PCIE_LOWER_IO_VA +\ | ||
498 | IOP13XX_PCIE_IO_WINDOW_SIZE - 1) | ||
499 | #define IOP13XX_PCIE_UPPER_IO_BA (IOP13XX_PCIE_LOWER_IO_BA +\ | ||
500 | IOP13XX_PCIE_IO_WINDOW_SIZE - 1) | ||
501 | -#define IOP13XX_PCIE_IO_OFFSET (IOP13XX_PCIE_LOWER_IO_VA -\ | ||
502 | - IOP13XX_PCIE_LOWER_IO_BA) | ||
503 | #define IOP13XX_PCIE_IO_PHYS_TO_VIRT(addr) (u32) ((u32) addr -\ | ||
504 | (IOP13XX_PCIE_LOWER_IO_PA\ | ||
505 | - IOP13XX_PCIE_LOWER_IO_VA)) | ||
506 | diff --git a/include/asm-s390/checksum.h b/include/asm-s390/checksum.h | ||
507 | index 0a3cd7e..d5a8e7c 100644 | ||
508 | --- a/include/asm-s390/checksum.h | ||
509 | +++ b/include/asm-s390/checksum.h | ||
510 | @@ -121,50 +121,21 @@ csum_tcpudp_nofold(__be32 saddr, __be32 daddr, | ||
511 | unsigned short len, unsigned short proto, | ||
512 | __wsum sum) | ||
513 | { | ||
514 | -#ifndef __s390x__ | ||
515 | - asm volatile( | ||
516 | - " alr %0,%1\n" /* sum += saddr */ | ||
517 | - " brc 12,0f\n" | ||
518 | - " ahi %0,1\n" /* add carry */ | ||
519 | - "0:" | ||
520 | - : "+&d" (sum) : "d" (saddr) : "cc"); | ||
521 | - asm volatile( | ||
522 | - " alr %0,%1\n" /* sum += daddr */ | ||
523 | - " brc 12,1f\n" | ||
524 | - " ahi %0,1\n" /* add carry */ | ||
525 | - "1:" | ||
526 | - : "+&d" (sum) : "d" (daddr) : "cc"); | ||
527 | - asm volatile( | ||
528 | - " alr %0,%1\n" /* sum += len + proto */ | ||
529 | - " brc 12,2f\n" | ||
530 | - " ahi %0,1\n" /* add carry */ | ||
531 | - "2:" | ||
532 | - : "+&d" (sum) | ||
533 | - : "d" (len + proto) | ||
534 | - : "cc"); | ||
535 | -#else /* __s390x__ */ | ||
536 | - asm volatile( | ||
537 | - " lgfr %0,%0\n" | ||
538 | - " algr %0,%1\n" /* sum += saddr */ | ||
539 | - " brc 12,0f\n" | ||
540 | - " aghi %0,1\n" /* add carry */ | ||
541 | - "0: algr %0,%2\n" /* sum += daddr */ | ||
542 | - " brc 12,1f\n" | ||
543 | - " aghi %0,1\n" /* add carry */ | ||
544 | - "1: algfr %0,%3\n" /* sum += len + proto */ | ||
545 | - " brc 12,2f\n" | ||
546 | - " aghi %0,1\n" /* add carry */ | ||
547 | - "2: srlg 0,%0,32\n" | ||
548 | - " alr %0,0\n" /* fold to 32 bits */ | ||
549 | - " brc 12,3f\n" | ||
550 | - " ahi %0,1\n" /* add carry */ | ||
551 | - "3: llgfr %0,%0" | ||
552 | - : "+&d" (sum) | ||
553 | - : "d" (saddr), "d" (daddr), | ||
554 | - "d" (len + proto) | ||
555 | - : "cc", "0"); | ||
556 | -#endif /* __s390x__ */ | ||
557 | - return sum; | ||
558 | + __u32 csum = (__force __u32)sum; | ||
559 | + | ||
560 | + csum += (__force __u32)saddr; | ||
561 | + if (csum < (__force __u32)saddr) | ||
562 | + csum++; | ||
563 | + | ||
564 | + csum += (__force __u32)daddr; | ||
565 | + if (csum < (__force __u32)daddr) | ||
566 | + csum++; | ||
567 | + | ||
568 | + csum += len + proto; | ||
569 | + if (csum < len + proto) | ||
570 | + csum++; | ||
571 | + | ||
572 | + return (__force __wsum)csum; | ||
573 | } | ||
574 | |||
575 | /* | ||
576 | diff --git a/include/asm-sparc64/tsb.h b/include/asm-sparc64/tsb.h | ||
577 | index ab55ffc..76e4299 100644 | ||
578 | --- a/include/asm-sparc64/tsb.h | ||
579 | +++ b/include/asm-sparc64/tsb.h | ||
580 | @@ -271,7 +271,7 @@ extern struct tsb_phys_patch_entry __tsb_phys_patch, __tsb_phys_patch_end; | ||
581 | #define KERN_TSB4M_LOOKUP_TL1(TAG, REG1, REG2, REG3, REG4, OK_LABEL) \ | ||
582 | sethi %hi(swapper_4m_tsb), REG1; \ | ||
583 | or REG1, %lo(swapper_4m_tsb), REG1; \ | ||
584 | - and TAG, (KERNEL_TSB_NENTRIES - 1), REG2; \ | ||
585 | + and TAG, (KERNEL_TSB4M_NENTRIES - 1), REG2; \ | ||
586 | sllx REG2, 4, REG2; \ | ||
587 | add REG1, REG2, REG2; \ | ||
588 | KTSB_LOAD_QUAD(REG2, REG3); \ | ||
589 | diff --git a/include/linux/mii.h b/include/linux/mii.h | ||
590 | index beddc6d..151b7e0 100644 | ||
591 | --- a/include/linux/mii.h | ||
592 | +++ b/include/linux/mii.h | ||
593 | @@ -56,8 +56,8 @@ | ||
594 | #define BMSR_ANEGCOMPLETE 0x0020 /* Auto-negotiation complete */ | ||
595 | #define BMSR_RESV 0x00c0 /* Unused... */ | ||
596 | #define BMSR_ESTATEN 0x0100 /* Extended Status in R15 */ | ||
597 | -#define BMSR_100FULL2 0x0200 /* Can do 100BASE-T2 HDX */ | ||
598 | -#define BMSR_100HALF2 0x0400 /* Can do 100BASE-T2 FDX */ | ||
599 | +#define BMSR_100HALF2 0x0200 /* Can do 100BASE-T2 HDX */ | ||
600 | +#define BMSR_100FULL2 0x0400 /* Can do 100BASE-T2 FDX */ | ||
601 | #define BMSR_10HALF 0x0800 /* Can do 10mbps, half-duplex */ | ||
602 | #define BMSR_10FULL 0x1000 /* Can do 10mbps, full-duplex */ | ||
603 | #define BMSR_100HALF 0x2000 /* Can do 100mbps, half-duplex */ | ||
604 | diff --git a/include/linux/netfilter/nf_conntrack_proto_gre.h b/include/linux/netfilter/nf_conntrack_proto_gre.h | ||
605 | index 4e6bbce..535e421 100644 | ||
606 | --- a/include/linux/netfilter/nf_conntrack_proto_gre.h | ||
607 | +++ b/include/linux/netfilter/nf_conntrack_proto_gre.h | ||
608 | @@ -87,24 +87,6 @@ int nf_ct_gre_keymap_add(struct nf_conn *ct, enum ip_conntrack_dir dir, | ||
609 | /* delete keymap entries */ | ||
610 | void nf_ct_gre_keymap_destroy(struct nf_conn *ct); | ||
611 | |||
612 | -/* get pointer to gre key, if present */ | ||
613 | -static inline __be32 *gre_key(struct gre_hdr *greh) | ||
614 | -{ | ||
615 | - if (!greh->key) | ||
616 | - return NULL; | ||
617 | - if (greh->csum || greh->routing) | ||
618 | - return (__be32 *)(greh+sizeof(*greh)+4); | ||
619 | - return (__be32 *)(greh+sizeof(*greh)); | ||
620 | -} | ||
621 | - | ||
622 | -/* get pointer ot gre csum, if present */ | ||
623 | -static inline __sum16 *gre_csum(struct gre_hdr *greh) | ||
624 | -{ | ||
625 | - if (!greh->csum) | ||
626 | - return NULL; | ||
627 | - return (__sum16 *)(greh+sizeof(*greh)); | ||
628 | -} | ||
629 | - | ||
630 | extern void nf_ct_gre_keymap_flush(void); | ||
631 | extern void nf_nat_need_gre(void); | ||
632 | |||
633 | diff --git a/include/linux/netfilter_ipv4/ip_conntrack_proto_gre.h b/include/linux/netfilter_ipv4/ip_conntrack_proto_gre.h | ||
634 | index e371e0f..d0f36f5 100644 | ||
635 | --- a/include/linux/netfilter_ipv4/ip_conntrack_proto_gre.h | ||
636 | +++ b/include/linux/netfilter_ipv4/ip_conntrack_proto_gre.h | ||
637 | @@ -90,25 +90,6 @@ int ip_ct_gre_keymap_add(struct ip_conntrack *ct, | ||
638 | /* delete keymap entries */ | ||
639 | void ip_ct_gre_keymap_destroy(struct ip_conntrack *ct); | ||
640 | |||
641 | - | ||
642 | -/* get pointer to gre key, if present */ | ||
643 | -static inline __be32 *gre_key(struct gre_hdr *greh) | ||
644 | -{ | ||
645 | - if (!greh->key) | ||
646 | - return NULL; | ||
647 | - if (greh->csum || greh->routing) | ||
648 | - return (__be32 *) (greh+sizeof(*greh)+4); | ||
649 | - return (__be32 *) (greh+sizeof(*greh)); | ||
650 | -} | ||
651 | - | ||
652 | -/* get pointer ot gre csum, if present */ | ||
653 | -static inline __sum16 *gre_csum(struct gre_hdr *greh) | ||
654 | -{ | ||
655 | - if (!greh->csum) | ||
656 | - return NULL; | ||
657 | - return (__sum16 *) (greh+sizeof(*greh)); | ||
658 | -} | ||
659 | - | ||
660 | #endif /* __KERNEL__ */ | ||
661 | |||
662 | #endif /* _CONNTRACK_PROTO_GRE_H */ | ||
663 | diff --git a/include/net/af_unix.h b/include/net/af_unix.h | ||
664 | index c0398f5..65f49fd 100644 | ||
665 | --- a/include/net/af_unix.h | ||
666 | +++ b/include/net/af_unix.h | ||
667 | @@ -62,13 +62,11 @@ struct unix_skb_parms { | ||
668 | #define UNIXCREDS(skb) (&UNIXCB((skb)).creds) | ||
669 | #define UNIXSID(skb) (&UNIXCB((skb)).secid) | ||
670 | |||
671 | -#define unix_state_rlock(s) spin_lock(&unix_sk(s)->lock) | ||
672 | -#define unix_state_runlock(s) spin_unlock(&unix_sk(s)->lock) | ||
673 | -#define unix_state_wlock(s) spin_lock(&unix_sk(s)->lock) | ||
674 | -#define unix_state_wlock_nested(s) \ | ||
675 | +#define unix_state_lock(s) spin_lock(&unix_sk(s)->lock) | ||
676 | +#define unix_state_unlock(s) spin_unlock(&unix_sk(s)->lock) | ||
677 | +#define unix_state_lock_nested(s) \ | ||
678 | spin_lock_nested(&unix_sk(s)->lock, \ | ||
679 | SINGLE_DEPTH_NESTING) | ||
680 | -#define unix_state_wunlock(s) spin_unlock(&unix_sk(s)->lock) | ||
681 | |||
682 | #ifdef __KERNEL__ | ||
683 | /* The AF_UNIX socket */ | ||
684 | diff --git a/mm/oom_kill.c b/mm/oom_kill.c | ||
685 | index 223add3..3791edf 100644 | ||
686 | --- a/mm/oom_kill.c | ||
687 | +++ b/mm/oom_kill.c | ||
688 | @@ -335,7 +335,7 @@ static int oom_kill_task(struct task_struct *p) | ||
689 | */ | ||
690 | do_each_thread(g, q) { | ||
691 | if (q->mm == mm && q->tgid != p->tgid) | ||
692 | - force_sig(SIGKILL, p); | ||
693 | + force_sig(SIGKILL, q); | ||
694 | } while_each_thread(g, q); | ||
695 | |||
696 | return 0; | ||
697 | diff --git a/mm/rmap.c b/mm/rmap.c | ||
698 | index 669acb2..7ce69c1 100644 | ||
699 | --- a/mm/rmap.c | ||
700 | +++ b/mm/rmap.c | ||
701 | @@ -490,9 +490,9 @@ int page_mkclean(struct page *page) | ||
702 | struct address_space *mapping = page_mapping(page); | ||
703 | if (mapping) | ||
704 | ret = page_mkclean_file(mapping, page); | ||
705 | + if (page_test_and_clear_dirty(page)) | ||
706 | + ret = 1; | ||
707 | } | ||
708 | - if (page_test_and_clear_dirty(page)) | ||
709 | - ret = 1; | ||
710 | |||
711 | return ret; | ||
712 | } | ||
713 | diff --git a/net/core/dev.c b/net/core/dev.c | ||
714 | index 2a587b8..3c3d383 100644 | ||
715 | --- a/net/core/dev.c | ||
716 | +++ b/net/core/dev.c | ||
717 | @@ -3138,7 +3138,6 @@ void netdev_run_todo(void) | ||
718 | continue; | ||
719 | } | ||
720 | |||
721 | - netdev_unregister_sysfs(dev); | ||
722 | dev->reg_state = NETREG_UNREGISTERED; | ||
723 | |||
724 | netdev_wait_allrefs(dev); | ||
725 | @@ -3149,11 +3148,11 @@ void netdev_run_todo(void) | ||
726 | BUG_TRAP(!dev->ip6_ptr); | ||
727 | BUG_TRAP(!dev->dn_ptr); | ||
728 | |||
729 | - /* It must be the very last action, | ||
730 | - * after this 'dev' may point to freed up memory. | ||
731 | - */ | ||
732 | if (dev->destructor) | ||
733 | dev->destructor(dev); | ||
734 | + | ||
735 | + /* Free network device */ | ||
736 | + kobject_put(&dev->class_dev.kobj); | ||
737 | } | ||
738 | |||
739 | out: | ||
740 | @@ -3310,6 +3309,9 @@ int unregister_netdevice(struct net_device *dev) | ||
741 | /* Notifier chain MUST detach us from master device. */ | ||
742 | BUG_TRAP(!dev->master); | ||
743 | |||
744 | + /* Remove entries from sysfs */ | ||
745 | + netdev_unregister_sysfs(dev); | ||
746 | + | ||
747 | /* Finish processing unregister after unlock */ | ||
748 | net_set_todo(dev); | ||
749 | |||
750 | diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c | ||
751 | index f47f319..c60fe3b 100644 | ||
752 | --- a/net/core/net-sysfs.c | ||
753 | +++ b/net/core/net-sysfs.c | ||
754 | @@ -440,9 +440,15 @@ static struct class net_class = { | ||
755 | #endif | ||
756 | }; | ||
757 | |||
758 | +/* Delete sysfs entries but hold kobject reference until after all | ||
759 | + * netdev references are gone. | ||
760 | + */ | ||
761 | void netdev_unregister_sysfs(struct net_device * net) | ||
762 | { | ||
763 | - class_device_del(&(net->class_dev)); | ||
764 | + struct class_device *dev = &(net->class_dev); | ||
765 | + | ||
766 | + kobject_get(&dev->kobj); | ||
767 | + class_device_del(dev); | ||
768 | } | ||
769 | |||
770 | /* Create sysfs entries for network device. */ | ||
771 | diff --git a/net/core/sock.c b/net/core/sock.c | ||
772 | index b69192b..c7d2de0 100644 | ||
773 | --- a/net/core/sock.c | ||
774 | +++ b/net/core/sock.c | ||
775 | @@ -204,7 +204,19 @@ static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen) | ||
776 | return -EINVAL; | ||
777 | if (copy_from_user(&tv, optval, sizeof(tv))) | ||
778 | return -EFAULT; | ||
779 | - | ||
780 | + if (tv.tv_usec < 0 || tv.tv_usec >= USEC_PER_SEC) | ||
781 | + return -EDOM; | ||
782 | + | ||
783 | + if (tv.tv_sec < 0) { | ||
784 | + static int warned = 0; | ||
785 | + *timeo_p = 0; | ||
786 | + if (warned < 10 && net_ratelimit()) | ||
787 | + warned++; | ||
788 | + printk(KERN_INFO "sock_set_timeout: `%s' (pid %d) " | ||
789 | + "tries to set negative timeout\n", | ||
790 | + current->comm, current->pid); | ||
791 | + return 0; | ||
792 | + } | ||
793 | *timeo_p = MAX_SCHEDULE_TIMEOUT; | ||
794 | if (tv.tv_sec == 0 && tv.tv_usec == 0) | ||
795 | return 0; | ||
796 | diff --git a/net/core/utils.c b/net/core/utils.c | ||
797 | index 6155606..a724b3b 100644 | ||
798 | --- a/net/core/utils.c | ||
799 | +++ b/net/core/utils.c | ||
800 | @@ -137,16 +137,16 @@ int in4_pton(const char *src, int srclen, | ||
801 | while(1) { | ||
802 | int c; | ||
803 | c = xdigit2bin(srclen > 0 ? *s : '\0', delim); | ||
804 | - if (!(c & (IN6PTON_DIGIT | IN6PTON_DOT | IN6PTON_DELIM))) { | ||
805 | + if (!(c & (IN6PTON_DIGIT | IN6PTON_DOT | IN6PTON_DELIM | IN6PTON_COLON_MASK))) { | ||
806 | goto out; | ||
807 | } | ||
808 | - if (c & (IN6PTON_DOT | IN6PTON_DELIM)) { | ||
809 | + if (c & (IN6PTON_DOT | IN6PTON_DELIM | IN6PTON_COLON_MASK)) { | ||
810 | if (w == 0) | ||
811 | goto out; | ||
812 | *d++ = w & 0xff; | ||
813 | w = 0; | ||
814 | i++; | ||
815 | - if (c & IN6PTON_DELIM) { | ||
816 | + if (c & (IN6PTON_DELIM | IN6PTON_COLON_MASK)) { | ||
817 | if (i != 4) | ||
818 | goto out; | ||
819 | break; | ||
820 | diff --git a/net/ipv4/Kconfig b/net/ipv4/Kconfig | ||
821 | index 503e705..75ad01a 100644 | ||
822 | --- a/net/ipv4/Kconfig | ||
823 | +++ b/net/ipv4/Kconfig | ||
824 | @@ -43,11 +43,11 @@ config IP_ADVANCED_ROUTER | ||
825 | asymmetric routing (packets from you to a host take a different path | ||
826 | than packets from that host to you) or if you operate a non-routing | ||
827 | host which has several IP addresses on different interfaces. To turn | ||
828 | - rp_filter off use: | ||
829 | + rp_filter on use: | ||
830 | |||
831 | - echo 0 > /proc/sys/net/ipv4/conf/<device>/rp_filter | ||
832 | + echo 1 > /proc/sys/net/ipv4/conf/<device>/rp_filter | ||
833 | or | ||
834 | - echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter | ||
835 | + echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter | ||
836 | |||
837 | If unsure, say N here. | ||
838 | |||
839 | diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c | ||
840 | index 40cf0d0..e523fcc 100644 | ||
841 | --- a/net/ipv4/icmp.c | ||
842 | +++ b/net/ipv4/icmp.c | ||
843 | @@ -513,9 +513,15 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info) | ||
844 | |||
845 | saddr = iph->daddr; | ||
846 | if (!(rt->rt_flags & RTCF_LOCAL)) { | ||
847 | - if (sysctl_icmp_errors_use_inbound_ifaddr) | ||
848 | - saddr = inet_select_addr(skb_in->dev, 0, RT_SCOPE_LINK); | ||
849 | - else | ||
850 | + struct net_device *dev = NULL; | ||
851 | + | ||
852 | + if (rt->fl.iif && sysctl_icmp_errors_use_inbound_ifaddr) | ||
853 | + dev = dev_get_by_index(rt->fl.iif); | ||
854 | + | ||
855 | + if (dev) { | ||
856 | + saddr = inet_select_addr(dev, 0, RT_SCOPE_LINK); | ||
857 | + dev_put(dev); | ||
858 | + } else | ||
859 | saddr = 0; | ||
860 | } | ||
861 | |||
862 | diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c | ||
863 | index 9d68837..3b42ddb 100644 | ||
864 | --- a/net/ipv4/inet_connection_sock.c | ||
865 | +++ b/net/ipv4/inet_connection_sock.c | ||
866 | @@ -31,10 +31,8 @@ EXPORT_SYMBOL(inet_csk_timer_bug_msg); | ||
867 | |||
868 | /* | ||
869 | * This array holds the first and last local port number. | ||
870 | - * For high-usage systems, use sysctl to change this to | ||
871 | - * 32768-61000 | ||
872 | */ | ||
873 | -int sysctl_local_port_range[2] = { 1024, 4999 }; | ||
874 | +int sysctl_local_port_range[2] = { 32768, 61000 }; | ||
875 | |||
876 | int inet_csk_bind_conflict(const struct sock *sk, | ||
877 | const struct inet_bind_bucket *tb) | ||
878 | diff --git a/net/ipv4/netfilter/ip_nat_proto_gre.c b/net/ipv4/netfilter/ip_nat_proto_gre.c | ||
879 | index 9581020..e3146a3 100644 | ||
880 | --- a/net/ipv4/netfilter/ip_nat_proto_gre.c | ||
881 | +++ b/net/ipv4/netfilter/ip_nat_proto_gre.c | ||
882 | @@ -70,6 +70,11 @@ gre_unique_tuple(struct ip_conntrack_tuple *tuple, | ||
883 | __be16 *keyptr; | ||
884 | unsigned int min, i, range_size; | ||
885 | |||
886 | + /* If there is no master conntrack we are not PPTP, | ||
887 | + do not change tuples */ | ||
888 | + if (!conntrack->master) | ||
889 | + return 0; | ||
890 | + | ||
891 | if (maniptype == IP_NAT_MANIP_SRC) | ||
892 | keyptr = &tuple->src.u.gre.key; | ||
893 | else | ||
894 | @@ -122,18 +127,9 @@ gre_manip_pkt(struct sk_buff **pskb, | ||
895 | if (maniptype == IP_NAT_MANIP_DST) { | ||
896 | /* key manipulation is always dest */ | ||
897 | switch (greh->version) { | ||
898 | - case 0: | ||
899 | - if (!greh->key) { | ||
900 | - DEBUGP("can't nat GRE w/o key\n"); | ||
901 | - break; | ||
902 | - } | ||
903 | - if (greh->csum) { | ||
904 | - /* FIXME: Never tested this code... */ | ||
905 | - nf_proto_csum_replace4(gre_csum(greh), *pskb, | ||
906 | - *(gre_key(greh)), | ||
907 | - tuple->dst.u.gre.key, 0); | ||
908 | - } | ||
909 | - *(gre_key(greh)) = tuple->dst.u.gre.key; | ||
910 | + case GRE_VERSION_1701: | ||
911 | + /* We do not currently NAT any GREv0 packets. | ||
912 | + * Try to behave like "ip_nat_proto_unknown" */ | ||
913 | break; | ||
914 | case GRE_VERSION_PPTP: | ||
915 | DEBUGP("call_id -> 0x%04x\n", | ||
916 | diff --git a/net/ipv4/netfilter/nf_nat_proto_gre.c b/net/ipv4/netfilter/nf_nat_proto_gre.c | ||
917 | index e5a34c1..ca3ff84 100644 | ||
918 | --- a/net/ipv4/netfilter/nf_nat_proto_gre.c | ||
919 | +++ b/net/ipv4/netfilter/nf_nat_proto_gre.c | ||
920 | @@ -72,6 +72,11 @@ gre_unique_tuple(struct nf_conntrack_tuple *tuple, | ||
921 | __be16 *keyptr; | ||
922 | unsigned int min, i, range_size; | ||
923 | |||
924 | + /* If there is no master conntrack we are not PPTP, | ||
925 | + do not change tuples */ | ||
926 | + if (!conntrack->master) | ||
927 | + return 0; | ||
928 | + | ||
929 | if (maniptype == IP_NAT_MANIP_SRC) | ||
930 | keyptr = &tuple->src.u.gre.key; | ||
931 | else | ||
932 | @@ -122,18 +127,9 @@ gre_manip_pkt(struct sk_buff **pskb, unsigned int iphdroff, | ||
933 | if (maniptype != IP_NAT_MANIP_DST) | ||
934 | return 1; | ||
935 | switch (greh->version) { | ||
936 | - case 0: | ||
937 | - if (!greh->key) { | ||
938 | - DEBUGP("can't nat GRE w/o key\n"); | ||
939 | - break; | ||
940 | - } | ||
941 | - if (greh->csum) { | ||
942 | - /* FIXME: Never tested this code... */ | ||
943 | - nf_proto_csum_replace4(gre_csum(greh), *pskb, | ||
944 | - *(gre_key(greh)), | ||
945 | - tuple->dst.u.gre.key, 0); | ||
946 | - } | ||
947 | - *(gre_key(greh)) = tuple->dst.u.gre.key; | ||
948 | + case GRE_VERSION_1701: | ||
949 | + /* We do not currently NAT any GREv0 packets. | ||
950 | + * Try to behave like "nf_nat_proto_unknown" */ | ||
951 | break; | ||
952 | case GRE_VERSION_PPTP: | ||
953 | DEBUGP("call_id -> 0x%04x\n", ntohs(tuple->dst.u.gre.key)); | ||
954 | diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c | ||
955 | index 4a71b31..6842474 100644 | ||
956 | --- a/net/ipv4/tcp.c | ||
957 | +++ b/net/ipv4/tcp.c | ||
958 | @@ -2445,13 +2445,10 @@ void __init tcp_init(void) | ||
959 | order++) | ||
960 | ; | ||
961 | if (order >= 4) { | ||
962 | - sysctl_local_port_range[0] = 32768; | ||
963 | - sysctl_local_port_range[1] = 61000; | ||
964 | tcp_death_row.sysctl_max_tw_buckets = 180000; | ||
965 | sysctl_tcp_max_orphans = 4096 << (order - 4); | ||
966 | sysctl_max_syn_backlog = 1024; | ||
967 | } else if (order < 3) { | ||
968 | - sysctl_local_port_range[0] = 1024 * (3 - order); | ||
969 | tcp_death_row.sysctl_max_tw_buckets >>= (3 - order); | ||
970 | sysctl_tcp_max_orphans >>= (3 - order); | ||
971 | sysctl_max_syn_backlog = 128; | ||
972 | diff --git a/net/ipv4/xfrm4_input.c b/net/ipv4/xfrm4_input.c | ||
973 | index 8655d03..ce69187 100644 | ||
974 | --- a/net/ipv4/xfrm4_input.c | ||
975 | +++ b/net/ipv4/xfrm4_input.c | ||
976 | @@ -136,10 +136,8 @@ int xfrm4_rcv_encap(struct sk_buff *skb, __u16 encap_type) | ||
977 | nf_reset(skb); | ||
978 | |||
979 | if (decaps) { | ||
980 | - if (!(skb->dev->flags&IFF_LOOPBACK)) { | ||
981 | - dst_release(skb->dst); | ||
982 | - skb->dst = NULL; | ||
983 | - } | ||
984 | + dst_release(skb->dst); | ||
985 | + skb->dst = NULL; | ||
986 | netif_rx(skb); | ||
987 | return 0; | ||
988 | } else { | ||
989 | diff --git a/net/ipv4/xfrm4_mode_tunnel.c b/net/ipv4/xfrm4_mode_tunnel.c | ||
990 | index 21ed667..f020d06 100644 | ||
991 | --- a/net/ipv4/xfrm4_mode_tunnel.c | ||
992 | +++ b/net/ipv4/xfrm4_mode_tunnel.c | ||
993 | @@ -66,6 +66,8 @@ static int xfrm4_tunnel_output(struct xfrm_state *x, struct sk_buff *skb) | ||
994 | top_iph->daddr = x->id.daddr.a4; | ||
995 | top_iph->protocol = IPPROTO_IPIP; | ||
996 | |||
997 | + skb->protocol = htons(ETH_P_IP); | ||
998 | + | ||
999 | memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); | ||
1000 | return 0; | ||
1001 | } | ||
1002 | diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c | ||
1003 | index f5af4ca..e383ac8 100644 | ||
1004 | --- a/net/ipv6/addrconf.c | ||
1005 | +++ b/net/ipv6/addrconf.c | ||
1006 | @@ -2338,8 +2338,9 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event, | ||
1007 | break; | ||
1008 | |||
1009 | case NETDEV_CHANGENAME: | ||
1010 | -#ifdef CONFIG_SYSCTL | ||
1011 | if (idev) { | ||
1012 | + snmp6_unregister_dev(idev); | ||
1013 | +#ifdef CONFIG_SYSCTL | ||
1014 | addrconf_sysctl_unregister(&idev->cnf); | ||
1015 | neigh_sysctl_unregister(idev->nd_parms); | ||
1016 | neigh_sysctl_register(dev, idev->nd_parms, | ||
1017 | @@ -2347,8 +2348,9 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event, | ||
1018 | &ndisc_ifinfo_sysctl_change, | ||
1019 | NULL); | ||
1020 | addrconf_sysctl_register(idev, &idev->cnf); | ||
1021 | - } | ||
1022 | #endif | ||
1023 | + snmp6_register_dev(idev); | ||
1024 | + } | ||
1025 | break; | ||
1026 | }; | ||
1027 | |||
1028 | diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c | ||
1029 | index 2d9c425..0c4aaac 100644 | ||
1030 | --- a/net/ipv6/ip6_fib.c | ||
1031 | +++ b/net/ipv6/ip6_fib.c | ||
1032 | @@ -620,14 +620,6 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt, | ||
1033 | |||
1034 | ins = &fn->leaf; | ||
1035 | |||
1036 | - if (fn->fn_flags&RTN_TL_ROOT && | ||
1037 | - fn->leaf == &ip6_null_entry && | ||
1038 | - !(rt->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF)) ){ | ||
1039 | - fn->leaf = rt; | ||
1040 | - rt->u.next = NULL; | ||
1041 | - goto out; | ||
1042 | - } | ||
1043 | - | ||
1044 | for (iter = fn->leaf; iter; iter=iter->u.next) { | ||
1045 | /* | ||
1046 | * Search for duplicates | ||
1047 | diff --git a/net/ipv6/proc.c b/net/ipv6/proc.c | ||
1048 | index 35249d8..a239e91 100644 | ||
1049 | --- a/net/ipv6/proc.c | ||
1050 | +++ b/net/ipv6/proc.c | ||
1051 | @@ -237,6 +237,7 @@ int snmp6_unregister_dev(struct inet6_dev *idev) | ||
1052 | return -EINVAL; | ||
1053 | remove_proc_entry(idev->stats.proc_dir_entry->name, | ||
1054 | proc_net_devsnmp6); | ||
1055 | + idev->stats.proc_dir_entry = NULL; | ||
1056 | return 0; | ||
1057 | } | ||
1058 | |||
1059 | diff --git a/net/ipv6/xfrm6_input.c b/net/ipv6/xfrm6_input.c | ||
1060 | index 5c8b7a5..8174dae 100644 | ||
1061 | --- a/net/ipv6/xfrm6_input.c | ||
1062 | +++ b/net/ipv6/xfrm6_input.c | ||
1063 | @@ -103,10 +103,8 @@ int xfrm6_rcv_spi(struct sk_buff *skb, __be32 spi) | ||
1064 | nf_reset(skb); | ||
1065 | |||
1066 | if (decaps) { | ||
1067 | - if (!(skb->dev->flags&IFF_LOOPBACK)) { | ||
1068 | - dst_release(skb->dst); | ||
1069 | - skb->dst = NULL; | ||
1070 | - } | ||
1071 | + dst_release(skb->dst); | ||
1072 | + skb->dst = NULL; | ||
1073 | netif_rx(skb); | ||
1074 | return -1; | ||
1075 | } else { | ||
1076 | diff --git a/net/ipv6/xfrm6_mode_tunnel.c b/net/ipv6/xfrm6_mode_tunnel.c | ||
1077 | index 5e7d8a7..a5a96da 100644 | ||
1078 | --- a/net/ipv6/xfrm6_mode_tunnel.c | ||
1079 | +++ b/net/ipv6/xfrm6_mode_tunnel.c | ||
1080 | @@ -65,6 +65,7 @@ static int xfrm6_tunnel_output(struct xfrm_state *x, struct sk_buff *skb) | ||
1081 | top_iph->hop_limit = dst_metric(dst->child, RTAX_HOPLIMIT); | ||
1082 | ipv6_addr_copy(&top_iph->saddr, (struct in6_addr *)&x->props.saddr); | ||
1083 | ipv6_addr_copy(&top_iph->daddr, (struct in6_addr *)&x->id.daddr); | ||
1084 | + skb->protocol = htons(ETH_P_IPV6); | ||
1085 | return 0; | ||
1086 | } | ||
1087 | |||
1088 | diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c | ||
1089 | index 2f208c7..20deb87 100644 | ||
1090 | --- a/net/unix/af_unix.c | ||
1091 | +++ b/net/unix/af_unix.c | ||
1092 | @@ -175,11 +175,11 @@ static struct sock *unix_peer_get(struct sock *s) | ||
1093 | { | ||
1094 | struct sock *peer; | ||
1095 | |||
1096 | - unix_state_rlock(s); | ||
1097 | + unix_state_lock(s); | ||
1098 | peer = unix_peer(s); | ||
1099 | if (peer) | ||
1100 | sock_hold(peer); | ||
1101 | - unix_state_runlock(s); | ||
1102 | + unix_state_unlock(s); | ||
1103 | return peer; | ||
1104 | } | ||
1105 | |||
1106 | @@ -370,7 +370,7 @@ static int unix_release_sock (struct sock *sk, int embrion) | ||
1107 | unix_remove_socket(sk); | ||
1108 | |||
1109 | /* Clear state */ | ||
1110 | - unix_state_wlock(sk); | ||
1111 | + unix_state_lock(sk); | ||
1112 | sock_orphan(sk); | ||
1113 | sk->sk_shutdown = SHUTDOWN_MASK; | ||
1114 | dentry = u->dentry; | ||
1115 | @@ -379,7 +379,7 @@ static int unix_release_sock (struct sock *sk, int embrion) | ||
1116 | u->mnt = NULL; | ||
1117 | state = sk->sk_state; | ||
1118 | sk->sk_state = TCP_CLOSE; | ||
1119 | - unix_state_wunlock(sk); | ||
1120 | + unix_state_unlock(sk); | ||
1121 | |||
1122 | wake_up_interruptible_all(&u->peer_wait); | ||
1123 | |||
1124 | @@ -387,12 +387,12 @@ static int unix_release_sock (struct sock *sk, int embrion) | ||
1125 | |||
1126 | if (skpair!=NULL) { | ||
1127 | if (sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET) { | ||
1128 | - unix_state_wlock(skpair); | ||
1129 | + unix_state_lock(skpair); | ||
1130 | /* No more writes */ | ||
1131 | skpair->sk_shutdown = SHUTDOWN_MASK; | ||
1132 | if (!skb_queue_empty(&sk->sk_receive_queue) || embrion) | ||
1133 | skpair->sk_err = ECONNRESET; | ||
1134 | - unix_state_wunlock(skpair); | ||
1135 | + unix_state_unlock(skpair); | ||
1136 | skpair->sk_state_change(skpair); | ||
1137 | read_lock(&skpair->sk_callback_lock); | ||
1138 | sk_wake_async(skpair,1,POLL_HUP); | ||
1139 | @@ -449,7 +449,7 @@ static int unix_listen(struct socket *sock, int backlog) | ||
1140 | err = -EINVAL; | ||
1141 | if (!u->addr) | ||
1142 | goto out; /* No listens on an unbound socket */ | ||
1143 | - unix_state_wlock(sk); | ||
1144 | + unix_state_lock(sk); | ||
1145 | if (sk->sk_state != TCP_CLOSE && sk->sk_state != TCP_LISTEN) | ||
1146 | goto out_unlock; | ||
1147 | if (backlog > sk->sk_max_ack_backlog) | ||
1148 | @@ -463,7 +463,7 @@ static int unix_listen(struct socket *sock, int backlog) | ||
1149 | err = 0; | ||
1150 | |||
1151 | out_unlock: | ||
1152 | - unix_state_wunlock(sk); | ||
1153 | + unix_state_unlock(sk); | ||
1154 | out: | ||
1155 | return err; | ||
1156 | } | ||
1157 | @@ -859,6 +859,31 @@ out_mknod_parent: | ||
1158 | goto out_up; | ||
1159 | } | ||
1160 | |||
1161 | +static void unix_state_double_lock(struct sock *sk1, struct sock *sk2) | ||
1162 | +{ | ||
1163 | + if (unlikely(sk1 == sk2) || !sk2) { | ||
1164 | + unix_state_lock(sk1); | ||
1165 | + return; | ||
1166 | + } | ||
1167 | + if (sk1 < sk2) { | ||
1168 | + unix_state_lock(sk1); | ||
1169 | + unix_state_lock_nested(sk2); | ||
1170 | + } else { | ||
1171 | + unix_state_lock(sk2); | ||
1172 | + unix_state_lock_nested(sk1); | ||
1173 | + } | ||
1174 | +} | ||
1175 | + | ||
1176 | +static void unix_state_double_unlock(struct sock *sk1, struct sock *sk2) | ||
1177 | +{ | ||
1178 | + if (unlikely(sk1 == sk2) || !sk2) { | ||
1179 | + unix_state_unlock(sk1); | ||
1180 | + return; | ||
1181 | + } | ||
1182 | + unix_state_unlock(sk1); | ||
1183 | + unix_state_unlock(sk2); | ||
1184 | +} | ||
1185 | + | ||
1186 | static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr, | ||
1187 | int alen, int flags) | ||
1188 | { | ||
1189 | @@ -878,11 +903,19 @@ static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr, | ||
1190 | !unix_sk(sk)->addr && (err = unix_autobind(sock)) != 0) | ||
1191 | goto out; | ||
1192 | |||
1193 | +restart: | ||
1194 | other=unix_find_other(sunaddr, alen, sock->type, hash, &err); | ||
1195 | if (!other) | ||
1196 | goto out; | ||
1197 | |||
1198 | - unix_state_wlock(sk); | ||
1199 | + unix_state_double_lock(sk, other); | ||
1200 | + | ||
1201 | + /* Apparently VFS overslept socket death. Retry. */ | ||
1202 | + if (sock_flag(other, SOCK_DEAD)) { | ||
1203 | + unix_state_double_unlock(sk, other); | ||
1204 | + sock_put(other); | ||
1205 | + goto restart; | ||
1206 | + } | ||
1207 | |||
1208 | err = -EPERM; | ||
1209 | if (!unix_may_send(sk, other)) | ||
1210 | @@ -897,7 +930,7 @@ static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr, | ||
1211 | * 1003.1g breaking connected state with AF_UNSPEC | ||
1212 | */ | ||
1213 | other = NULL; | ||
1214 | - unix_state_wlock(sk); | ||
1215 | + unix_state_double_lock(sk, other); | ||
1216 | } | ||
1217 | |||
1218 | /* | ||
1219 | @@ -906,19 +939,19 @@ static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr, | ||
1220 | if (unix_peer(sk)) { | ||
1221 | struct sock *old_peer = unix_peer(sk); | ||
1222 | unix_peer(sk)=other; | ||
1223 | - unix_state_wunlock(sk); | ||
1224 | + unix_state_double_unlock(sk, other); | ||
1225 | |||
1226 | if (other != old_peer) | ||
1227 | unix_dgram_disconnected(sk, old_peer); | ||
1228 | sock_put(old_peer); | ||
1229 | } else { | ||
1230 | unix_peer(sk)=other; | ||
1231 | - unix_state_wunlock(sk); | ||
1232 | + unix_state_double_unlock(sk, other); | ||
1233 | } | ||
1234 | return 0; | ||
1235 | |||
1236 | out_unlock: | ||
1237 | - unix_state_wunlock(sk); | ||
1238 | + unix_state_double_unlock(sk, other); | ||
1239 | sock_put(other); | ||
1240 | out: | ||
1241 | return err; | ||
1242 | @@ -937,7 +970,7 @@ static long unix_wait_for_peer(struct sock *other, long timeo) | ||
1243 | (skb_queue_len(&other->sk_receive_queue) > | ||
1244 | other->sk_max_ack_backlog); | ||
1245 | |||
1246 | - unix_state_runlock(other); | ||
1247 | + unix_state_unlock(other); | ||
1248 | |||
1249 | if (sched) | ||
1250 | timeo = schedule_timeout(timeo); | ||
1251 | @@ -995,11 +1028,11 @@ restart: | ||
1252 | goto out; | ||
1253 | |||
1254 | /* Latch state of peer */ | ||
1255 | - unix_state_rlock(other); | ||
1256 | + unix_state_lock(other); | ||
1257 | |||
1258 | /* Apparently VFS overslept socket death. Retry. */ | ||
1259 | if (sock_flag(other, SOCK_DEAD)) { | ||
1260 | - unix_state_runlock(other); | ||
1261 | + unix_state_unlock(other); | ||
1262 | sock_put(other); | ||
1263 | goto restart; | ||
1264 | } | ||
1265 | @@ -1049,18 +1082,18 @@ restart: | ||
1266 | goto out_unlock; | ||
1267 | } | ||
1268 | |||
1269 | - unix_state_wlock_nested(sk); | ||
1270 | + unix_state_lock_nested(sk); | ||
1271 | |||
1272 | if (sk->sk_state != st) { | ||
1273 | - unix_state_wunlock(sk); | ||
1274 | - unix_state_runlock(other); | ||
1275 | + unix_state_unlock(sk); | ||
1276 | + unix_state_unlock(other); | ||
1277 | sock_put(other); | ||
1278 | goto restart; | ||
1279 | } | ||
1280 | |||
1281 | err = security_unix_stream_connect(sock, other->sk_socket, newsk); | ||
1282 | if (err) { | ||
1283 | - unix_state_wunlock(sk); | ||
1284 | + unix_state_unlock(sk); | ||
1285 | goto out_unlock; | ||
1286 | } | ||
1287 | |||
1288 | @@ -1097,7 +1130,7 @@ restart: | ||
1289 | smp_mb__after_atomic_inc(); /* sock_hold() does an atomic_inc() */ | ||
1290 | unix_peer(sk) = newsk; | ||
1291 | |||
1292 | - unix_state_wunlock(sk); | ||
1293 | + unix_state_unlock(sk); | ||
1294 | |||
1295 | /* take ten and and send info to listening sock */ | ||
1296 | spin_lock(&other->sk_receive_queue.lock); | ||
1297 | @@ -1106,14 +1139,14 @@ restart: | ||
1298 | * is installed to listening socket. */ | ||
1299 | atomic_inc(&newu->inflight); | ||
1300 | spin_unlock(&other->sk_receive_queue.lock); | ||
1301 | - unix_state_runlock(other); | ||
1302 | + unix_state_unlock(other); | ||
1303 | other->sk_data_ready(other, 0); | ||
1304 | sock_put(other); | ||
1305 | return 0; | ||
1306 | |||
1307 | out_unlock: | ||
1308 | if (other) | ||
1309 | - unix_state_runlock(other); | ||
1310 | + unix_state_unlock(other); | ||
1311 | |||
1312 | out: | ||
1313 | if (skb) | ||
1314 | @@ -1179,10 +1212,10 @@ static int unix_accept(struct socket *sock, struct socket *newsock, int flags) | ||
1315 | wake_up_interruptible(&unix_sk(sk)->peer_wait); | ||
1316 | |||
1317 | /* attach accepted sock to socket */ | ||
1318 | - unix_state_wlock(tsk); | ||
1319 | + unix_state_lock(tsk); | ||
1320 | newsock->state = SS_CONNECTED; | ||
1321 | sock_graft(tsk, newsock); | ||
1322 | - unix_state_wunlock(tsk); | ||
1323 | + unix_state_unlock(tsk); | ||
1324 | return 0; | ||
1325 | |||
1326 | out: | ||
1327 | @@ -1209,7 +1242,7 @@ static int unix_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_ | ||
1328 | } | ||
1329 | |||
1330 | u = unix_sk(sk); | ||
1331 | - unix_state_rlock(sk); | ||
1332 | + unix_state_lock(sk); | ||
1333 | if (!u->addr) { | ||
1334 | sunaddr->sun_family = AF_UNIX; | ||
1335 | sunaddr->sun_path[0] = 0; | ||
1336 | @@ -1220,7 +1253,7 @@ static int unix_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_ | ||
1337 | *uaddr_len = addr->len; | ||
1338 | memcpy(sunaddr, addr->name, *uaddr_len); | ||
1339 | } | ||
1340 | - unix_state_runlock(sk); | ||
1341 | + unix_state_unlock(sk); | ||
1342 | sock_put(sk); | ||
1343 | out: | ||
1344 | return err; | ||
1345 | @@ -1338,7 +1371,7 @@ restart: | ||
1346 | goto out_free; | ||
1347 | } | ||
1348 | |||
1349 | - unix_state_rlock(other); | ||
1350 | + unix_state_lock(other); | ||
1351 | err = -EPERM; | ||
1352 | if (!unix_may_send(sk, other)) | ||
1353 | goto out_unlock; | ||
1354 | @@ -1348,20 +1381,20 @@ restart: | ||
1355 | * Check with 1003.1g - what should | ||
1356 | * datagram error | ||
1357 | */ | ||
1358 | - unix_state_runlock(other); | ||
1359 | + unix_state_unlock(other); | ||
1360 | sock_put(other); | ||
1361 | |||
1362 | err = 0; | ||
1363 | - unix_state_wlock(sk); | ||
1364 | + unix_state_lock(sk); | ||
1365 | if (unix_peer(sk) == other) { | ||
1366 | unix_peer(sk)=NULL; | ||
1367 | - unix_state_wunlock(sk); | ||
1368 | + unix_state_unlock(sk); | ||
1369 | |||
1370 | unix_dgram_disconnected(sk, other); | ||
1371 | sock_put(other); | ||
1372 | err = -ECONNREFUSED; | ||
1373 | } else { | ||
1374 | - unix_state_wunlock(sk); | ||
1375 | + unix_state_unlock(sk); | ||
1376 | } | ||
1377 | |||
1378 | other = NULL; | ||
1379 | @@ -1398,14 +1431,14 @@ restart: | ||
1380 | } | ||
1381 | |||
1382 | skb_queue_tail(&other->sk_receive_queue, skb); | ||
1383 | - unix_state_runlock(other); | ||
1384 | + unix_state_unlock(other); | ||
1385 | other->sk_data_ready(other, len); | ||
1386 | sock_put(other); | ||
1387 | scm_destroy(siocb->scm); | ||
1388 | return len; | ||
1389 | |||
1390 | out_unlock: | ||
1391 | - unix_state_runlock(other); | ||
1392 | + unix_state_unlock(other); | ||
1393 | out_free: | ||
1394 | kfree_skb(skb); | ||
1395 | out: | ||
1396 | @@ -1495,14 +1528,14 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock, | ||
1397 | goto out_err; | ||
1398 | } | ||
1399 | |||
1400 | - unix_state_rlock(other); | ||
1401 | + unix_state_lock(other); | ||
1402 | |||
1403 | if (sock_flag(other, SOCK_DEAD) || | ||
1404 | (other->sk_shutdown & RCV_SHUTDOWN)) | ||
1405 | goto pipe_err_free; | ||
1406 | |||
1407 | skb_queue_tail(&other->sk_receive_queue, skb); | ||
1408 | - unix_state_runlock(other); | ||
1409 | + unix_state_unlock(other); | ||
1410 | other->sk_data_ready(other, size); | ||
1411 | sent+=size; | ||
1412 | } | ||
1413 | @@ -1513,7 +1546,7 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock, | ||
1414 | return sent; | ||
1415 | |||
1416 | pipe_err_free: | ||
1417 | - unix_state_runlock(other); | ||
1418 | + unix_state_unlock(other); | ||
1419 | kfree_skb(skb); | ||
1420 | pipe_err: | ||
1421 | if (sent==0 && !(msg->msg_flags&MSG_NOSIGNAL)) | ||
1422 | @@ -1642,7 +1675,7 @@ static long unix_stream_data_wait(struct sock * sk, long timeo) | ||
1423 | { | ||
1424 | DEFINE_WAIT(wait); | ||
1425 | |||
1426 | - unix_state_rlock(sk); | ||
1427 | + unix_state_lock(sk); | ||
1428 | |||
1429 | for (;;) { | ||
1430 | prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); | ||
1431 | @@ -1655,14 +1688,14 @@ static long unix_stream_data_wait(struct sock * sk, long timeo) | ||
1432 | break; | ||
1433 | |||
1434 | set_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags); | ||
1435 | - unix_state_runlock(sk); | ||
1436 | + unix_state_unlock(sk); | ||
1437 | timeo = schedule_timeout(timeo); | ||
1438 | - unix_state_rlock(sk); | ||
1439 | + unix_state_lock(sk); | ||
1440 | clear_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags); | ||
1441 | } | ||
1442 | |||
1443 | finish_wait(sk->sk_sleep, &wait); | ||
1444 | - unix_state_runlock(sk); | ||
1445 | + unix_state_unlock(sk); | ||
1446 | return timeo; | ||
1447 | } | ||
1448 | |||
1449 | @@ -1817,12 +1850,12 @@ static int unix_shutdown(struct socket *sock, int mode) | ||
1450 | mode = (mode+1)&(RCV_SHUTDOWN|SEND_SHUTDOWN); | ||
1451 | |||
1452 | if (mode) { | ||
1453 | - unix_state_wlock(sk); | ||
1454 | + unix_state_lock(sk); | ||
1455 | sk->sk_shutdown |= mode; | ||
1456 | other=unix_peer(sk); | ||
1457 | if (other) | ||
1458 | sock_hold(other); | ||
1459 | - unix_state_wunlock(sk); | ||
1460 | + unix_state_unlock(sk); | ||
1461 | sk->sk_state_change(sk); | ||
1462 | |||
1463 | if (other && | ||
1464 | @@ -1834,9 +1867,9 @@ static int unix_shutdown(struct socket *sock, int mode) | ||
1465 | peer_mode |= SEND_SHUTDOWN; | ||
1466 | if (mode&SEND_SHUTDOWN) | ||
1467 | peer_mode |= RCV_SHUTDOWN; | ||
1468 | - unix_state_wlock(other); | ||
1469 | + unix_state_lock(other); | ||
1470 | other->sk_shutdown |= peer_mode; | ||
1471 | - unix_state_wunlock(other); | ||
1472 | + unix_state_unlock(other); | ||
1473 | other->sk_state_change(other); | ||
1474 | read_lock(&other->sk_callback_lock); | ||
1475 | if (peer_mode == SHUTDOWN_MASK) | ||
1476 | @@ -1974,7 +2007,7 @@ static int unix_seq_show(struct seq_file *seq, void *v) | ||
1477 | else { | ||
1478 | struct sock *s = v; | ||
1479 | struct unix_sock *u = unix_sk(s); | ||
1480 | - unix_state_rlock(s); | ||
1481 | + unix_state_lock(s); | ||
1482 | |||
1483 | seq_printf(seq, "%p: %08X %08X %08X %04X %02X %5lu", | ||
1484 | s, | ||
1485 | @@ -2002,7 +2035,7 @@ static int unix_seq_show(struct seq_file *seq, void *v) | ||
1486 | for ( ; i < len; i++) | ||
1487 | seq_putc(seq, u->addr->name->sun_path[i]); | ||
1488 | } | ||
1489 | - unix_state_runlock(s); | ||
1490 | + unix_state_unlock(s); | ||
1491 | seq_putc(seq, '\n'); | ||
1492 | } | ||
1493 | |||
1494 | diff --git a/scripts/basic/fixdep.c b/scripts/basic/fixdep.c | ||
1495 | index 6bc7e7c..8912c0f 100644 | ||
1496 | --- a/scripts/basic/fixdep.c | ||
1497 | +++ b/scripts/basic/fixdep.c | ||
1498 | @@ -249,6 +249,8 @@ void parse_config_file(char *map, size_t len) | ||
1499 | found: | ||
1500 | if (!memcmp(q - 7, "_MODULE", 7)) | ||
1501 | q -= 7; | ||
1502 | + if( (q-p-7) < 0 ) | ||
1503 | + continue; | ||
1504 | use_config(p+7, q-p-7); | ||
1505 | } | ||
1506 | } | ||
1507 | diff --git a/sound/usb/usbquirks.h b/sound/usb/usbquirks.h | ||
1508 | index a7e9563..9461d6e 100644 | ||
1509 | --- a/sound/usb/usbquirks.h | ||
1510 | +++ b/sound/usb/usbquirks.h | ||
1511 | @@ -40,6 +40,29 @@ | ||
1512 | .bInterfaceClass = USB_CLASS_VENDOR_SPEC | ||
1513 | |||
1514 | /* | ||
1515 | + * Logitech QuickCam: bDeviceClass is vendor-specific, so generic interface | ||
1516 | + * class matches do not take effect without an explicit ID match. | ||
1517 | + */ | ||
1518 | +{ | ||
1519 | + .match_flags = USB_DEVICE_ID_MATCH_DEVICE | | ||
1520 | + USB_DEVICE_ID_MATCH_INT_CLASS | | ||
1521 | + USB_DEVICE_ID_MATCH_INT_SUBCLASS, | ||
1522 | + .idVendor = 0x046d, | ||
1523 | + .idProduct = 0x08f0, | ||
1524 | + .bInterfaceClass = USB_CLASS_AUDIO, | ||
1525 | + .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL | ||
1526 | +}, | ||
1527 | +{ | ||
1528 | + .match_flags = USB_DEVICE_ID_MATCH_DEVICE | | ||
1529 | + USB_DEVICE_ID_MATCH_INT_CLASS | | ||
1530 | + USB_DEVICE_ID_MATCH_INT_SUBCLASS, | ||
1531 | + .idVendor = 0x046d, | ||
1532 | + .idProduct = 0x08f6, | ||
1533 | + .bInterfaceClass = USB_CLASS_AUDIO, | ||
1534 | + .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL | ||
1535 | +}, | ||
1536 | + | ||
1537 | +/* | ||
1538 | * Yamaha devices | ||
1539 | */ | ||
1540 |