Contents of /trunk/kernel26-alx/patches-2.6.20-r6/0105-2.6.20.5-all-fixes.patch
Parent Directory | Revision Log
Revision 1175 -
(show annotations)
(download)
Thu Oct 14 12:15:46 2010 UTC (13 years, 11 months ago) by niro
File size: 60110 byte(s)
Thu Oct 14 12:15:46 2010 UTC (13 years, 11 months ago) by niro
File size: 60110 byte(s)
-2.6.20-alx-r6 new magellan 0.5.2 kernel
1 | diff --git a/arch/um/include/sysdep-x86_64/ptrace.h b/arch/um/include/sysdep-x86_64/ptrace.h |
2 | index 66cb400..62403bd 100644 |
3 | --- a/arch/um/include/sysdep-x86_64/ptrace.h |
4 | +++ b/arch/um/include/sysdep-x86_64/ptrace.h |
5 | @@ -104,10 +104,6 @@ union uml_pt_regs { |
6 | #endif |
7 | #ifdef UML_CONFIG_MODE_SKAS |
8 | struct skas_regs { |
9 | - /* x86_64 ptrace uses sizeof(user_regs_struct) as its register |
10 | - * file size, while i386 uses FRAME_SIZE. Therefore, we need |
11 | - * to use UM_FRAME_SIZE here instead of HOST_FRAME_SIZE. |
12 | - */ |
13 | unsigned long regs[MAX_REG_NR]; |
14 | unsigned long fp[HOST_FP_SIZE]; |
15 | struct faultinfo faultinfo; |
16 | diff --git a/arch/um/os-Linux/elf_aux.c b/arch/um/os-Linux/elf_aux.c |
17 | index 5a99dd3..13c6cb5 100644 |
18 | --- a/arch/um/os-Linux/elf_aux.c |
19 | +++ b/arch/um/os-Linux/elf_aux.c |
20 | @@ -40,6 +40,9 @@ __init void scan_elf_aux( char **envp) |
21 | switch ( auxv->a_type ) { |
22 | case AT_SYSINFO: |
23 | __kernel_vsyscall = auxv->a_un.a_val; |
24 | + /* See if the page is under TASK_SIZE */ |
25 | + if (__kernel_vsyscall < (unsigned long) envp) |
26 | + __kernel_vsyscall = 0; |
27 | break; |
28 | case AT_SYSINFO_EHDR: |
29 | vsyscall_ehdr = auxv->a_un.a_val; |
30 | diff --git a/arch/um/os-Linux/skas/mem.c b/arch/um/os-Linux/skas/mem.c |
31 | index b3c11cf..9383e87 100644 |
32 | --- a/arch/um/os-Linux/skas/mem.c |
33 | +++ b/arch/um/os-Linux/skas/mem.c |
34 | @@ -48,7 +48,7 @@ int multi_op_count = 0; |
35 | static inline long do_syscall_stub(struct mm_id * mm_idp, void **addr) |
36 | { |
37 | unsigned long regs[MAX_REG_NR]; |
38 | - int n; |
39 | + int n, i; |
40 | long ret, offset; |
41 | unsigned long * data; |
42 | unsigned long * syscall; |
43 | @@ -66,9 +66,13 @@ static inline long do_syscall_stub(struct mm_id * mm_idp, void **addr) |
44 | (unsigned long) &__syscall_stub_start); |
45 | |
46 | n = ptrace_setregs(pid, regs); |
47 | - if(n < 0) |
48 | + if(n < 0){ |
49 | + printk("Registers - \n"); |
50 | + for(i = 0; i < MAX_REG_NR; i++) |
51 | + printk("\t%d\t0x%lx\n", i, regs[i]); |
52 | panic("do_syscall_stub : PTRACE_SETREGS failed, errno = %d\n", |
53 | - n); |
54 | + -n); |
55 | + } |
56 | |
57 | wait_stub_done(pid, 0, "do_syscall_stub"); |
58 | |
59 | diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c |
60 | index 9b34fe6..c4998cf 100644 |
61 | --- a/arch/um/os-Linux/skas/process.c |
62 | +++ b/arch/um/os-Linux/skas/process.c |
63 | @@ -67,7 +67,7 @@ void wait_stub_done(int pid, int sig, char * fname) |
64 | |
65 | if((n < 0) || !WIFSTOPPED(status) || |
66 | (WSTOPSIG(status) != SIGUSR1 && WSTOPSIG(status) != SIGTRAP)){ |
67 | - unsigned long regs[HOST_FRAME_SIZE]; |
68 | + unsigned long regs[MAX_REG_NR]; |
69 | |
70 | if(ptrace(PTRACE_GETREGS, pid, 0, regs) < 0) |
71 | printk("Failed to get registers from stub, " |
72 | @@ -76,7 +76,7 @@ void wait_stub_done(int pid, int sig, char * fname) |
73 | int i; |
74 | |
75 | printk("Stub registers -\n"); |
76 | - for(i = 0; i < HOST_FRAME_SIZE; i++) |
77 | + for(i = 0; i < ARRAY_SIZE(regs); i++) |
78 | printk("\t%d - %lx\n", i, regs[i]); |
79 | } |
80 | panic("%s : failed to wait for SIGUSR1/SIGTRAP, " |
81 | @@ -328,7 +328,7 @@ void userspace(union uml_pt_regs *regs) |
82 | int copy_context_skas0(unsigned long new_stack, int pid) |
83 | { |
84 | int err; |
85 | - unsigned long regs[HOST_FRAME_SIZE]; |
86 | + unsigned long regs[MAX_REG_NR]; |
87 | unsigned long fp_regs[HOST_FP_SIZE]; |
88 | unsigned long current_stack = current_stub_stack(); |
89 | struct stub_data *data = (struct stub_data *) current_stack; |
90 | diff --git a/arch/um/os-Linux/sys-i386/registers.c b/arch/um/os-Linux/sys-i386/registers.c |
91 | index 7cd0369..ecd21e0 100644 |
92 | --- a/arch/um/os-Linux/sys-i386/registers.c |
93 | +++ b/arch/um/os-Linux/sys-i386/registers.c |
94 | @@ -15,7 +15,7 @@ |
95 | |
96 | /* These are set once at boot time and not changed thereafter */ |
97 | |
98 | -static unsigned long exec_regs[HOST_FRAME_SIZE]; |
99 | +static unsigned long exec_regs[MAX_REG_NR]; |
100 | static unsigned long exec_fp_regs[HOST_FP_SIZE]; |
101 | static unsigned long exec_fpx_regs[HOST_XFP_SIZE]; |
102 | static int have_fpx_regs = 1; |
103 | @@ -101,6 +101,7 @@ void init_registers(int pid) |
104 | { |
105 | int err; |
106 | |
107 | + memset(exec_regs, 0, sizeof(exec_regs)); |
108 | err = ptrace(PTRACE_GETREGS, pid, 0, exec_regs); |
109 | if(err) |
110 | panic("check_ptrace : PTRACE_GETREGS failed, errno = %d", |
111 | @@ -124,7 +125,7 @@ void init_registers(int pid) |
112 | |
113 | void get_safe_registers(unsigned long *regs, unsigned long *fp_regs) |
114 | { |
115 | - memcpy(regs, exec_regs, HOST_FRAME_SIZE * sizeof(unsigned long)); |
116 | + memcpy(regs, exec_regs, sizeof(exec_regs)); |
117 | if(fp_regs != NULL) |
118 | memcpy(fp_regs, exec_fp_regs, |
119 | HOST_FP_SIZE * sizeof(unsigned long)); |
120 | diff --git a/arch/um/os-Linux/sys-x86_64/registers.c b/arch/um/os-Linux/sys-x86_64/registers.c |
121 | index cb8e8a2..019f6c4 100644 |
122 | --- a/arch/um/os-Linux/sys-x86_64/registers.c |
123 | +++ b/arch/um/os-Linux/sys-x86_64/registers.c |
124 | @@ -14,7 +14,7 @@ |
125 | |
126 | /* These are set once at boot time and not changed thereafter */ |
127 | |
128 | -static unsigned long exec_regs[HOST_FRAME_SIZE]; |
129 | +static unsigned long exec_regs[MAX_REG_NR]; |
130 | static unsigned long exec_fp_regs[HOST_FP_SIZE]; |
131 | |
132 | void init_thread_registers(union uml_pt_regs *to) |
133 | @@ -72,7 +72,7 @@ void init_registers(int pid) |
134 | |
135 | void get_safe_registers(unsigned long *regs, unsigned long *fp_regs) |
136 | { |
137 | - memcpy(regs, exec_regs, HOST_FRAME_SIZE * sizeof(unsigned long)); |
138 | + memcpy(regs, exec_regs, sizeof(exec_regs)); |
139 | if(fp_regs != NULL) |
140 | memcpy(fp_regs, exec_fp_regs, |
141 | HOST_FP_SIZE * sizeof(unsigned long)); |
142 | diff --git a/arch/um/sys-i386/delay.c b/arch/um/sys-i386/delay.c |
143 | index 2c11b97..d623e07 100644 |
144 | --- a/arch/um/sys-i386/delay.c |
145 | +++ b/arch/um/sys-i386/delay.c |
146 | @@ -27,14 +27,3 @@ void __udelay(unsigned long usecs) |
147 | } |
148 | |
149 | EXPORT_SYMBOL(__udelay); |
150 | - |
151 | -void __const_udelay(unsigned long usecs) |
152 | -{ |
153 | - int i, n; |
154 | - |
155 | - n = (loops_per_jiffy * HZ * usecs) / MILLION; |
156 | - for(i=0;i<n;i++) |
157 | - cpu_relax(); |
158 | -} |
159 | - |
160 | -EXPORT_SYMBOL(__const_udelay); |
161 | diff --git a/arch/um/sys-x86_64/delay.c b/arch/um/sys-x86_64/delay.c |
162 | index 137f444..dee5be6 100644 |
163 | --- a/arch/um/sys-x86_64/delay.c |
164 | +++ b/arch/um/sys-x86_64/delay.c |
165 | @@ -28,14 +28,3 @@ void __udelay(unsigned long usecs) |
166 | } |
167 | |
168 | EXPORT_SYMBOL(__udelay); |
169 | - |
170 | -void __const_udelay(unsigned long usecs) |
171 | -{ |
172 | - unsigned long i, n; |
173 | - |
174 | - n = (loops_per_jiffy * HZ * usecs) / MILLION; |
175 | - for(i=0;i<n;i++) |
176 | - cpu_relax(); |
177 | -} |
178 | - |
179 | -EXPORT_SYMBOL(__const_udelay); |
180 | diff --git a/crypto/scatterwalk.c b/crypto/scatterwalk.c |
181 | index 35172d3..a664231 100644 |
182 | --- a/crypto/scatterwalk.c |
183 | +++ b/crypto/scatterwalk.c |
184 | @@ -91,6 +91,8 @@ void scatterwalk_copychunks(void *buf, struct scatter_walk *walk, |
185 | memcpy_dir(buf, vaddr, len_this_page, out); |
186 | scatterwalk_unmap(vaddr, out); |
187 | |
188 | + scatterwalk_advance(walk, nbytes); |
189 | + |
190 | if (nbytes == len_this_page) |
191 | break; |
192 | |
193 | @@ -99,7 +101,5 @@ void scatterwalk_copychunks(void *buf, struct scatter_walk *walk, |
194 | |
195 | scatterwalk_pagedone(walk, out, 1); |
196 | } |
197 | - |
198 | - scatterwalk_advance(walk, nbytes); |
199 | } |
200 | EXPORT_SYMBOL_GPL(scatterwalk_copychunks); |
201 | diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c |
202 | index 667acd2..d6fcf0a 100644 |
203 | --- a/drivers/ata/libata-core.c |
204 | +++ b/drivers/ata/libata-core.c |
205 | @@ -1478,7 +1478,16 @@ int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class, |
206 | } |
207 | |
208 | tf.protocol = ATA_PROT_PIO; |
209 | - tf.flags |= ATA_TFLAG_POLLING; /* for polling presence detection */ |
210 | + |
211 | + /* Some devices choke if TF registers contain garbage. Make |
212 | + * sure those are properly initialized. |
213 | + */ |
214 | + tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE; |
215 | + |
216 | + /* Device presence detection is unreliable on some |
217 | + * controllers. Always poll IDENTIFY if available. |
218 | + */ |
219 | + tf.flags |= ATA_TFLAG_POLLING; |
220 | |
221 | err_mask = ata_exec_internal(dev, &tf, NULL, DMA_FROM_DEVICE, |
222 | id, sizeof(id[0]) * ATA_ID_WORDS); |
223 | diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c |
224 | index 73902d3..1790542 100644 |
225 | --- a/drivers/ata/libata-scsi.c |
226 | +++ b/drivers/ata/libata-scsi.c |
227 | @@ -295,6 +295,7 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg) |
228 | scsi_cmd[8] = args[3]; |
229 | scsi_cmd[10] = args[4]; |
230 | scsi_cmd[12] = args[5]; |
231 | + scsi_cmd[13] = args[6] & 0x0f; |
232 | scsi_cmd[14] = args[0]; |
233 | |
234 | /* Good values for timeout and retries? Values below |
235 | diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c |
236 | index aae0b52..4054cdb 100644 |
237 | --- a/drivers/ata/sata_mv.c |
238 | +++ b/drivers/ata/sata_mv.c |
239 | @@ -139,14 +139,19 @@ enum { |
240 | PCI_ERR = (1 << 18), |
241 | TRAN_LO_DONE = (1 << 19), /* 6xxx: IRQ coalescing */ |
242 | TRAN_HI_DONE = (1 << 20), /* 6xxx: IRQ coalescing */ |
243 | + PORTS_0_3_COAL_DONE = (1 << 8), |
244 | + PORTS_4_7_COAL_DONE = (1 << 17), |
245 | PORTS_0_7_COAL_DONE = (1 << 21), /* 6xxx: IRQ coalescing */ |
246 | GPIO_INT = (1 << 22), |
247 | SELF_INT = (1 << 23), |
248 | TWSI_INT = (1 << 24), |
249 | HC_MAIN_RSVD = (0x7f << 25), /* bits 31-25 */ |
250 | + HC_MAIN_RSVD_5 = (0x1fff << 19), /* bits 31-19 */ |
251 | HC_MAIN_MASKED_IRQS = (TRAN_LO_DONE | TRAN_HI_DONE | |
252 | PORTS_0_7_COAL_DONE | GPIO_INT | TWSI_INT | |
253 | HC_MAIN_RSVD), |
254 | + HC_MAIN_MASKED_IRQS_5 = (PORTS_0_3_COAL_DONE | PORTS_4_7_COAL_DONE | |
255 | + HC_MAIN_RSVD_5), |
256 | |
257 | /* SATAHC registers */ |
258 | HC_CFG_OFS = 0, |
259 | @@ -843,23 +848,27 @@ static void mv_edma_cfg(struct mv_host_priv *hpriv, void __iomem *port_mmio) |
260 | u32 cfg = readl(port_mmio + EDMA_CFG_OFS); |
261 | |
262 | /* set up non-NCQ EDMA configuration */ |
263 | - cfg &= ~0x1f; /* clear queue depth */ |
264 | - cfg &= ~EDMA_CFG_NCQ; /* clear NCQ mode */ |
265 | cfg &= ~(1 << 9); /* disable equeue */ |
266 | |
267 | - if (IS_GEN_I(hpriv)) |
268 | + if (IS_GEN_I(hpriv)) { |
269 | + cfg &= ~0x1f; /* clear queue depth */ |
270 | cfg |= (1 << 8); /* enab config burst size mask */ |
271 | + } |
272 | |
273 | - else if (IS_GEN_II(hpriv)) |
274 | + else if (IS_GEN_II(hpriv)) { |
275 | + cfg &= ~0x1f; /* clear queue depth */ |
276 | cfg |= EDMA_CFG_RD_BRST_EXT | EDMA_CFG_WR_BUFF_LEN; |
277 | + cfg &= ~(EDMA_CFG_NCQ | EDMA_CFG_NCQ_GO_ON_ERR); /* clear NCQ */ |
278 | + } |
279 | |
280 | else if (IS_GEN_IIE(hpriv)) { |
281 | - cfg |= (1 << 23); /* dis RX PM port mask */ |
282 | - cfg &= ~(1 << 16); /* dis FIS-based switching (for now) */ |
283 | + cfg |= (1 << 23); /* do not mask PM field in rx'd FIS */ |
284 | + cfg |= (1 << 22); /* enab 4-entry host queue cache */ |
285 | cfg &= ~(1 << 19); /* dis 128-entry queue (for now?) */ |
286 | cfg |= (1 << 18); /* enab early completion */ |
287 | - cfg |= (1 << 17); /* enab host q cache */ |
288 | - cfg |= (1 << 22); /* enab cutthrough */ |
289 | + cfg |= (1 << 17); /* enab cut-through (dis stor&forwrd) */ |
290 | + cfg &= ~(1 << 16); /* dis FIS-based switching (for now) */ |
291 | + cfg &= ~(EDMA_CFG_NCQ | EDMA_CFG_NCQ_GO_ON_ERR); /* clear NCQ */ |
292 | } |
293 | |
294 | writelfl(cfg, port_mmio + EDMA_CFG_OFS); |
295 | @@ -2283,7 +2292,11 @@ static int mv_init_host(struct pci_dev *pdev, struct ata_probe_ent *probe_ent, |
296 | |
297 | /* and unmask interrupt generation for host regs */ |
298 | writelfl(PCI_UNMASK_ALL_IRQS, mmio + PCI_IRQ_MASK_OFS); |
299 | - writelfl(~HC_MAIN_MASKED_IRQS, mmio + HC_MAIN_IRQ_MASK_OFS); |
300 | + |
301 | + if (IS_50XX(hpriv)) |
302 | + writelfl(~HC_MAIN_MASKED_IRQS_5, mmio + HC_MAIN_IRQ_MASK_OFS); |
303 | + else |
304 | + writelfl(~HC_MAIN_MASKED_IRQS, mmio + HC_MAIN_IRQ_MASK_OFS); |
305 | |
306 | VPRINTK("HC MAIN IRQ cause/mask=0x%08x/0x%08x " |
307 | "PCI int cause/mask=0x%08x/0x%08x\n", |
308 | diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c |
309 | index f7a963e..91f24b1 100644 |
310 | --- a/drivers/ata/sata_nv.c |
311 | +++ b/drivers/ata/sata_nv.c |
312 | @@ -214,6 +214,7 @@ struct nv_adma_port_priv { |
313 | struct nv_adma_prd *aprd; |
314 | dma_addr_t aprd_dma; |
315 | u8 flags; |
316 | + int last_issue_ncq; |
317 | }; |
318 | |
319 | #define NV_ADMA_CHECK_INTR(GCTL, PORT) ((GCTL) & ( 1 << (19 + (12 * (PORT))))) |
320 | @@ -1151,6 +1152,7 @@ static unsigned int nv_adma_qc_issue(struct ata_queued_cmd *qc) |
321 | { |
322 | struct nv_adma_port_priv *pp = qc->ap->private_data; |
323 | void __iomem *mmio = nv_adma_ctl_block(qc->ap); |
324 | + int curr_ncq = (qc->tf.protocol == ATA_PROT_NCQ); |
325 | |
326 | VPRINTK("ENTER\n"); |
327 | |
328 | @@ -1166,6 +1168,14 @@ static unsigned int nv_adma_qc_issue(struct ata_queued_cmd *qc) |
329 | /* write append register, command tag in lower 8 bits |
330 | and (number of cpbs to append -1) in top 8 bits */ |
331 | wmb(); |
332 | + |
333 | + if(curr_ncq != pp->last_issue_ncq) { |
334 | + /* Seems to need some delay before switching between NCQ and non-NCQ |
335 | + commands, else we get command timeouts and such. */ |
336 | + udelay(20); |
337 | + pp->last_issue_ncq = curr_ncq; |
338 | + } |
339 | + |
340 | writew(qc->tag, mmio + NV_ADMA_APPEND); |
341 | |
342 | DPRINTK("Issued tag %u\n",qc->tag); |
343 | diff --git a/drivers/char/generic_serial.c b/drivers/char/generic_serial.c |
344 | index e769811..e2a0b6f 100644 |
345 | --- a/drivers/char/generic_serial.c |
346 | +++ b/drivers/char/generic_serial.c |
347 | @@ -711,12 +711,6 @@ void gs_close(struct tty_struct * tty, struct file * filp) |
348 | } |
349 | |
350 | |
351 | -static unsigned int gs_baudrates[] = { |
352 | - 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, |
353 | - 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600 |
354 | -}; |
355 | - |
356 | - |
357 | void gs_set_termios (struct tty_struct * tty, |
358 | struct ktermios * old_termios) |
359 | { |
360 | @@ -772,7 +766,6 @@ void gs_set_termios (struct tty_struct * tty, |
361 | |
362 | baudrate = tty_get_baud_rate(tty); |
363 | |
364 | - baudrate = gs_baudrates[baudrate]; |
365 | if ((tiosp->c_cflag & CBAUD) == B38400) { |
366 | if ( (port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI) |
367 | baudrate = 57600; |
368 | diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c |
369 | index 5969cec..a2bde80 100644 |
370 | --- a/drivers/ide/ide-cd.c |
371 | +++ b/drivers/ide/ide-cd.c |
372 | @@ -687,15 +687,8 @@ static void ide_dump_status_no_sense(ide_drive_t *drive, const char *msg, u8 sta |
373 | static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret) |
374 | { |
375 | struct request *rq = HWGROUP(drive)->rq; |
376 | - ide_hwif_t *hwif = HWIF(drive); |
377 | int stat, err, sense_key; |
378 | |
379 | - /* We may have bogus DMA interrupts in PIO state here */ |
380 | - if (HWIF(drive)->dma_status && hwif->atapi_irq_bogon) { |
381 | - stat = hwif->INB(hwif->dma_status); |
382 | - /* Should we force the bit as well ? */ |
383 | - hwif->OUTB(stat, hwif->dma_status); |
384 | - } |
385 | /* Check for errors. */ |
386 | stat = HWIF(drive)->INB(IDE_STATUS_REG); |
387 | if (stat_ret) |
388 | @@ -930,6 +923,10 @@ static ide_startstop_t cdrom_start_packet_command(ide_drive_t *drive, |
389 | HWIF(drive)->OUTB(drive->ctl, IDE_CONTROL_REG); |
390 | |
391 | if (CDROM_CONFIG_FLAGS (drive)->drq_interrupt) { |
392 | + /* waiting for CDB interrupt, not DMA yet. */ |
393 | + if (info->dma) |
394 | + drive->waiting_for_dma = 0; |
395 | + |
396 | /* packet command */ |
397 | ide_execute_command(drive, WIN_PACKETCMD, handler, ATAPI_WAIT_PC, cdrom_timer_expiry); |
398 | return ide_started; |
399 | @@ -972,6 +969,10 @@ static ide_startstop_t cdrom_transfer_packet_command (ide_drive_t *drive, |
400 | /* Check for errors. */ |
401 | if (cdrom_decode_status(drive, DRQ_STAT, NULL)) |
402 | return ide_stopped; |
403 | + |
404 | + /* Ok, next interrupt will be DMA interrupt. */ |
405 | + if (info->dma) |
406 | + drive->waiting_for_dma = 1; |
407 | } else { |
408 | /* Otherwise, we must wait for DRQ to get set. */ |
409 | if (ide_wait_stat(&startstop, drive, DRQ_STAT, |
410 | diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c |
411 | index 2614f41..99d1c43 100644 |
412 | --- a/drivers/ide/ide-io.c |
413 | +++ b/drivers/ide/ide-io.c |
414 | @@ -1646,6 +1646,17 @@ irqreturn_t ide_intr (int irq, void *dev_id) |
415 | del_timer(&hwgroup->timer); |
416 | spin_unlock(&ide_lock); |
417 | |
418 | + /* Some controllers might set DMA INTR no matter DMA or PIO; |
419 | + * bmdma status might need to be cleared even for |
420 | + * PIO interrupts to prevent spurious/lost irq. |
421 | + */ |
422 | + if (hwif->ide_dma_clear_irq && !(drive->waiting_for_dma)) |
423 | + /* ide_dma_end() needs bmdma status for error checking. |
424 | + * So, skip clearing bmdma status here and leave it |
425 | + * to ide_dma_end() if this is dma interrupt. |
426 | + */ |
427 | + hwif->ide_dma_clear_irq(drive); |
428 | + |
429 | if (drive->unmask) |
430 | local_irq_enable_in_hardirq(); |
431 | /* service this interrupt, may set handler for next interrupt */ |
432 | diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c |
433 | index 6558055..59b10a0 100644 |
434 | --- a/drivers/ide/ide-iops.c |
435 | +++ b/drivers/ide/ide-iops.c |
436 | @@ -598,6 +598,9 @@ u8 eighty_ninty_three (ide_drive_t *drive) |
437 | if(HWIF(drive)->udma_four == 0) |
438 | return 0; |
439 | |
440 | + printk(KERN_INFO "%s: hw_config=%04x\n", |
441 | + drive->name, drive->id->hw_config); |
442 | + |
443 | /* Check for SATA but only if we are ATA5 or higher */ |
444 | if (drive->id->hw_config == 0 && (drive->id->major_rev_num & 0x7FE0)) |
445 | return 1; |
446 | @@ -607,8 +610,14 @@ u8 eighty_ninty_three (ide_drive_t *drive) |
447 | if(!(drive->id->hw_config & 0x4000)) |
448 | return 0; |
449 | #endif /* CONFIG_IDEDMA_IVB */ |
450 | +/* |
451 | + * FIXME: enable this after fixing master/slave IDENTIFY order, |
452 | + * also ignore the result if the slave device is pre-ATA3 one |
453 | + */ |
454 | +#if 0 |
455 | if (!(drive->id->hw_config & 0x2000)) |
456 | return 0; |
457 | +#endif |
458 | return 1; |
459 | } |
460 | |
461 | diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c |
462 | index 6c9bd51..8e73fe5 100644 |
463 | --- a/drivers/ide/ide.c |
464 | +++ b/drivers/ide/ide.c |
465 | @@ -503,6 +503,7 @@ static void ide_hwif_restore(ide_hwif_t *hwif, ide_hwif_t *tmp_hwif) |
466 | hwif->ide_dma_on = tmp_hwif->ide_dma_on; |
467 | hwif->ide_dma_off_quietly = tmp_hwif->ide_dma_off_quietly; |
468 | hwif->ide_dma_test_irq = tmp_hwif->ide_dma_test_irq; |
469 | + hwif->ide_dma_clear_irq = tmp_hwif->ide_dma_clear_irq; |
470 | hwif->ide_dma_host_on = tmp_hwif->ide_dma_host_on; |
471 | hwif->ide_dma_host_off = tmp_hwif->ide_dma_host_off; |
472 | hwif->ide_dma_lostirq = tmp_hwif->ide_dma_lostirq; |
473 | diff --git a/drivers/ide/pci/jmicron.c b/drivers/ide/pci/jmicron.c |
474 | index f07bbbe..84fb87b 100644 |
475 | --- a/drivers/ide/pci/jmicron.c |
476 | +++ b/drivers/ide/pci/jmicron.c |
477 | @@ -240,12 +240,31 @@ static int __devinit jmicron_init_one(struct pci_dev *dev, const struct pci_devi |
478 | return 0; |
479 | } |
480 | |
481 | +/* If libata is configured, jmicron PCI quirk will configure it such |
482 | + * that the SATA ports are in AHCI function while the PATA ports are |
483 | + * in a separate IDE function. In such cases, match device class and |
484 | + * attach only to IDE. If libata isn't configured, keep the old |
485 | + * behavior for backward compatibility. |
486 | + */ |
487 | +#if defined(CONFIG_ATA) || defined(CONFIG_ATA_MODULE) |
488 | +#define JMB_CLASS PCI_CLASS_STORAGE_IDE << 8 |
489 | +#define JMB_CLASS_MASK 0xffff00 |
490 | +#else |
491 | +#define JMB_CLASS 0 |
492 | +#define JMB_CLASS_MASK 0 |
493 | +#endif |
494 | + |
495 | static struct pci_device_id jmicron_pci_tbl[] = { |
496 | - { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB361, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, |
497 | - { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB363, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1}, |
498 | - { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB365, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2}, |
499 | - { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB366, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3}, |
500 | - { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB368, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4}, |
501 | + { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB361, |
502 | + PCI_ANY_ID, PCI_ANY_ID, JMB_CLASS, JMB_CLASS_MASK, 0}, |
503 | + { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB363, |
504 | + PCI_ANY_ID, PCI_ANY_ID, JMB_CLASS, JMB_CLASS_MASK, 1}, |
505 | + { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB365, |
506 | + PCI_ANY_ID, PCI_ANY_ID, JMB_CLASS, JMB_CLASS_MASK, 2}, |
507 | + { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB366, |
508 | + PCI_ANY_ID, PCI_ANY_ID, JMB_CLASS, JMB_CLASS_MASK, 3}, |
509 | + { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB368, |
510 | + PCI_ANY_ID, PCI_ANY_ID, JMB_CLASS, JMB_CLASS_MASK, 4}, |
511 | { 0, }, |
512 | }; |
513 | |
514 | diff --git a/drivers/ide/pci/piix.c b/drivers/ide/pci/piix.c |
515 | index edb37f3..c5ec6f1 100644 |
516 | --- a/drivers/ide/pci/piix.c |
517 | +++ b/drivers/ide/pci/piix.c |
518 | @@ -411,17 +411,14 @@ fast_ata_pio: |
519 | } |
520 | |
521 | /** |
522 | - * init_chipset_piix - set up the PIIX chipset |
523 | - * @dev: PCI device to set up |
524 | - * @name: Name of the device |
525 | + * piix_is_ichx - check if ICHx |
526 | + * @dev: PCI device to check |
527 | * |
528 | - * Initialize the PCI device as required. For the PIIX this turns |
529 | - * out to be nice and simple |
530 | + * returns 1 if ICHx, 0 otherwise. |
531 | */ |
532 | - |
533 | -static unsigned int __devinit init_chipset_piix (struct pci_dev *dev, const char *name) |
534 | +static int piix_is_ichx(struct pci_dev *dev) |
535 | { |
536 | - switch(dev->device) { |
537 | + switch (dev->device) { |
538 | case PCI_DEVICE_ID_INTEL_82801EB_1: |
539 | case PCI_DEVICE_ID_INTEL_82801AA_1: |
540 | case PCI_DEVICE_ID_INTEL_82801AB_1: |
541 | @@ -439,19 +436,51 @@ static unsigned int __devinit init_chipset_piix (struct pci_dev *dev, const char |
542 | case PCI_DEVICE_ID_INTEL_ICH7_21: |
543 | case PCI_DEVICE_ID_INTEL_ESB2_18: |
544 | case PCI_DEVICE_ID_INTEL_ICH8_6: |
545 | - { |
546 | - unsigned int extra = 0; |
547 | - pci_read_config_dword(dev, 0x54, &extra); |
548 | - pci_write_config_dword(dev, 0x54, extra|0x400); |
549 | - } |
550 | - default: |
551 | - break; |
552 | + return 1; |
553 | } |
554 | |
555 | return 0; |
556 | } |
557 | |
558 | /** |
559 | + * init_chipset_piix - set up the PIIX chipset |
560 | + * @dev: PCI device to set up |
561 | + * @name: Name of the device |
562 | + * |
563 | + * Initialize the PCI device as required. For the PIIX this turns |
564 | + * out to be nice and simple |
565 | + */ |
566 | + |
567 | +static unsigned int __devinit init_chipset_piix (struct pci_dev *dev, const char *name) |
568 | +{ |
569 | + if (piix_is_ichx(dev)) { |
570 | + unsigned int extra = 0; |
571 | + pci_read_config_dword(dev, 0x54, &extra); |
572 | + pci_write_config_dword(dev, 0x54, extra|0x400); |
573 | + } |
574 | + |
575 | + return 0; |
576 | +} |
577 | + |
578 | +/** |
579 | + * piix_dma_clear_irq - clear BMDMA status |
580 | + * @drive: IDE drive to clear |
581 | + * |
582 | + * Called from ide_intr() for PIO interrupts |
583 | + * to clear BMDMA status as needed by ICHx |
584 | + */ |
585 | +static void piix_dma_clear_irq(ide_drive_t *drive) |
586 | +{ |
587 | + ide_hwif_t *hwif = HWIF(drive); |
588 | + u8 dma_stat; |
589 | + |
590 | + /* clear the INTR & ERROR bits */ |
591 | + dma_stat = hwif->INB(hwif->dma_status); |
592 | + /* Should we force the bit as well ? */ |
593 | + hwif->OUTB(dma_stat, hwif->dma_status); |
594 | +} |
595 | + |
596 | +/** |
597 | * init_hwif_piix - fill in the hwif for the PIIX |
598 | * @hwif: IDE interface |
599 | * |
600 | @@ -473,10 +502,6 @@ static void __devinit init_hwif_piix(ide_hwif_t *hwif) |
601 | /* This is a painful system best to let it self tune for now */ |
602 | return; |
603 | } |
604 | - /* ESB2 appears to generate spurious DMA interrupts in PIO mode |
605 | - when in native mode */ |
606 | - if (hwif->pci_dev->device == PCI_DEVICE_ID_INTEL_ESB2_18) |
607 | - hwif->atapi_irq_bogon = 1; |
608 | |
609 | hwif->autodma = 0; |
610 | hwif->tuneproc = &piix_tune_drive; |
611 | @@ -487,6 +512,10 @@ static void __devinit init_hwif_piix(ide_hwif_t *hwif) |
612 | if (!hwif->dma_base) |
613 | return; |
614 | |
615 | + /* ICHx need to clear the bmdma status for all interrupts */ |
616 | + if (piix_is_ichx(hwif->pci_dev)) |
617 | + hwif->ide_dma_clear_irq = &piix_dma_clear_irq; |
618 | + |
619 | hwif->atapi_dma = 1; |
620 | hwif->ultra_mask = 0x3f; |
621 | hwif->mwdma_mask = 0x06; |
622 | diff --git a/drivers/ieee1394/dv1394.c b/drivers/ieee1394/dv1394.c |
623 | index 1084da4..59e383c 100644 |
624 | --- a/drivers/ieee1394/dv1394.c |
625 | +++ b/drivers/ieee1394/dv1394.c |
626 | @@ -2267,11 +2267,7 @@ static void dv1394_remove_host (struct hpsb_host *host) |
627 | { |
628 | struct video_card *video; |
629 | unsigned long flags; |
630 | - int id = host->id; |
631 | - |
632 | - /* We only work with the OHCI-1394 driver */ |
633 | - if (strcmp(host->driver->name, OHCI1394_DRIVER_NAME)) |
634 | - return; |
635 | + int id = host->id, found_ohci_card = 0; |
636 | |
637 | /* find the corresponding video_cards */ |
638 | do { |
639 | @@ -2284,6 +2280,7 @@ static void dv1394_remove_host (struct hpsb_host *host) |
640 | if ((tmp_vid->id >> 2) == id) { |
641 | list_del(&tmp_vid->list); |
642 | video = tmp_vid; |
643 | + found_ohci_card = 1; |
644 | break; |
645 | } |
646 | } |
647 | @@ -2293,8 +2290,9 @@ static void dv1394_remove_host (struct hpsb_host *host) |
648 | dv1394_un_init(video); |
649 | } while (video != NULL); |
650 | |
651 | - class_device_destroy(hpsb_protocol_class, |
652 | - MKDEV(IEEE1394_MAJOR, IEEE1394_MINOR_BLOCK_DV1394 * 16 + (id<<2))); |
653 | + if (found_ohci_card) |
654 | + class_device_destroy(hpsb_protocol_class, MKDEV(IEEE1394_MAJOR, |
655 | + IEEE1394_MINOR_BLOCK_DV1394 * 16 + (id << 2))); |
656 | } |
657 | |
658 | static void dv1394_add_host (struct hpsb_host *host) |
659 | diff --git a/drivers/media/dvb/dvb-core/dmxdev.c b/drivers/media/dvb/dvb-core/dmxdev.c |
660 | index 988499d..ec473eb 100644 |
661 | --- a/drivers/media/dvb/dvb-core/dmxdev.c |
662 | +++ b/drivers/media/dvb/dvb-core/dmxdev.c |
663 | @@ -181,8 +181,7 @@ static int dvb_dvr_release(struct inode *inode, struct file *file) |
664 | struct dvb_device *dvbdev = file->private_data; |
665 | struct dmxdev *dmxdev = dvbdev->priv; |
666 | |
667 | - if (mutex_lock_interruptible(&dmxdev->mutex)) |
668 | - return -ERESTARTSYS; |
669 | + mutex_lock(&dmxdev->mutex); |
670 | |
671 | if ((file->f_flags & O_ACCMODE) == O_WRONLY) { |
672 | dmxdev->demux->disconnect_frontend(dmxdev->demux); |
673 | @@ -674,13 +673,8 @@ static int dvb_demux_open(struct inode *inode, struct file *file) |
674 | static int dvb_dmxdev_filter_free(struct dmxdev *dmxdev, |
675 | struct dmxdev_filter *dmxdevfilter) |
676 | { |
677 | - if (mutex_lock_interruptible(&dmxdev->mutex)) |
678 | - return -ERESTARTSYS; |
679 | - |
680 | - if (mutex_lock_interruptible(&dmxdevfilter->mutex)) { |
681 | - mutex_unlock(&dmxdev->mutex); |
682 | - return -ERESTARTSYS; |
683 | - } |
684 | + mutex_lock(&dmxdev->mutex); |
685 | + mutex_lock(&dmxdevfilter->mutex); |
686 | |
687 | dvb_dmxdev_filter_stop(dmxdevfilter); |
688 | dvb_dmxdev_filter_reset(dmxdevfilter); |
689 | diff --git a/drivers/media/dvb/dvb-core/dvb_demux.c b/drivers/media/dvb/dvb-core/dvb_demux.c |
690 | index fcff5ea..6d8d1c3 100644 |
691 | --- a/drivers/media/dvb/dvb-core/dvb_demux.c |
692 | +++ b/drivers/media/dvb/dvb-core/dvb_demux.c |
693 | @@ -673,8 +673,7 @@ static int dmx_ts_feed_stop_filtering(struct dmx_ts_feed *ts_feed) |
694 | struct dvb_demux *demux = feed->demux; |
695 | int ret; |
696 | |
697 | - if (mutex_lock_interruptible(&demux->mutex)) |
698 | - return -ERESTARTSYS; |
699 | + mutex_lock(&demux->mutex); |
700 | |
701 | if (feed->state < DMX_STATE_GO) { |
702 | mutex_unlock(&demux->mutex); |
703 | @@ -748,8 +747,7 @@ static int dvbdmx_release_ts_feed(struct dmx_demux *dmx, |
704 | struct dvb_demux *demux = (struct dvb_demux *)dmx; |
705 | struct dvb_demux_feed *feed = (struct dvb_demux_feed *)ts_feed; |
706 | |
707 | - if (mutex_lock_interruptible(&demux->mutex)) |
708 | - return -ERESTARTSYS; |
709 | + mutex_lock(&demux->mutex); |
710 | |
711 | if (feed->state == DMX_STATE_FREE) { |
712 | mutex_unlock(&demux->mutex); |
713 | @@ -916,8 +914,7 @@ static int dmx_section_feed_stop_filtering(struct dmx_section_feed *feed) |
714 | struct dvb_demux *dvbdmx = dvbdmxfeed->demux; |
715 | int ret; |
716 | |
717 | - if (mutex_lock_interruptible(&dvbdmx->mutex)) |
718 | - return -ERESTARTSYS; |
719 | + mutex_lock(&dvbdmx->mutex); |
720 | |
721 | if (!dvbdmx->stop_feed) { |
722 | mutex_unlock(&dvbdmx->mutex); |
723 | @@ -942,8 +939,7 @@ static int dmx_section_feed_release_filter(struct dmx_section_feed *feed, |
724 | struct dvb_demux_feed *dvbdmxfeed = (struct dvb_demux_feed *)feed; |
725 | struct dvb_demux *dvbdmx = dvbdmxfeed->demux; |
726 | |
727 | - if (mutex_lock_interruptible(&dvbdmx->mutex)) |
728 | - return -ERESTARTSYS; |
729 | + mutex_lock(&dvbdmx->mutex); |
730 | |
731 | if (dvbdmxfilter->feed != dvbdmxfeed) { |
732 | mutex_unlock(&dvbdmx->mutex); |
733 | @@ -1016,8 +1012,7 @@ static int dvbdmx_release_section_feed(struct dmx_demux *demux, |
734 | struct dvb_demux_feed *dvbdmxfeed = (struct dvb_demux_feed *)feed; |
735 | struct dvb_demux *dvbdmx = (struct dvb_demux *)demux; |
736 | |
737 | - if (mutex_lock_interruptible(&dvbdmx->mutex)) |
738 | - return -ERESTARTSYS; |
739 | + mutex_lock(&dvbdmx->mutex); |
740 | |
741 | if (dvbdmxfeed->state == DMX_STATE_FREE) { |
742 | mutex_unlock(&dvbdmx->mutex); |
743 | @@ -1126,8 +1121,7 @@ static int dvbdmx_connect_frontend(struct dmx_demux *demux, |
744 | if (demux->frontend) |
745 | return -EINVAL; |
746 | |
747 | - if (mutex_lock_interruptible(&dvbdemux->mutex)) |
748 | - return -ERESTARTSYS; |
749 | + mutex_lock(&dvbdemux->mutex); |
750 | |
751 | demux->frontend = frontend; |
752 | mutex_unlock(&dvbdemux->mutex); |
753 | @@ -1138,8 +1132,7 @@ static int dvbdmx_disconnect_frontend(struct dmx_demux *demux) |
754 | { |
755 | struct dvb_demux *dvbdemux = (struct dvb_demux *)demux; |
756 | |
757 | - if (mutex_lock_interruptible(&dvbdemux->mutex)) |
758 | - return -ERESTARTSYS; |
759 | + mutex_lock(&dvbdemux->mutex); |
760 | |
761 | demux->frontend = NULL; |
762 | mutex_unlock(&dvbdemux->mutex); |
763 | diff --git a/drivers/media/dvb/dvb-core/dvbdev.c b/drivers/media/dvb/dvb-core/dvbdev.c |
764 | index af35f30..b3a8cbb 100644 |
765 | --- a/drivers/media/dvb/dvb-core/dvbdev.c |
766 | +++ b/drivers/media/dvb/dvb-core/dvbdev.c |
767 | @@ -204,8 +204,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, |
768 | |
769 | int id; |
770 | |
771 | - if (mutex_lock_interruptible(&dvbdev_register_lock)) |
772 | - return -ERESTARTSYS; |
773 | + mutex_lock(&dvbdev_register_lock); |
774 | |
775 | if ((id = dvbdev_get_free_id (adap, type)) < 0) { |
776 | mutex_unlock(&dvbdev_register_lock); |
777 | @@ -295,8 +294,7 @@ int dvb_register_adapter(struct dvb_adapter *adap, const char *name, struct modu |
778 | { |
779 | int num; |
780 | |
781 | - if (mutex_lock_interruptible(&dvbdev_register_lock)) |
782 | - return -ERESTARTSYS; |
783 | + mutex_lock(&dvbdev_register_lock); |
784 | |
785 | if ((num = dvbdev_get_free_adapter_num ()) < 0) { |
786 | mutex_unlock(&dvbdev_register_lock); |
787 | @@ -324,8 +322,7 @@ EXPORT_SYMBOL(dvb_register_adapter); |
788 | |
789 | int dvb_unregister_adapter(struct dvb_adapter *adap) |
790 | { |
791 | - if (mutex_lock_interruptible(&dvbdev_register_lock)) |
792 | - return -ERESTARTSYS; |
793 | + mutex_lock(&dvbdev_register_lock); |
794 | list_del (&adap->list_head); |
795 | mutex_unlock(&dvbdev_register_lock); |
796 | return 0; |
797 | diff --git a/drivers/media/dvb/frontends/isl6421.c b/drivers/media/dvb/frontends/isl6421.c |
798 | index ef31936..c967148 100644 |
799 | --- a/drivers/media/dvb/frontends/isl6421.c |
800 | +++ b/drivers/media/dvb/frontends/isl6421.c |
801 | @@ -122,6 +122,7 @@ struct dvb_frontend *isl6421_attach(struct dvb_frontend *fe, struct i2c_adapter |
802 | /* detect if it is present or not */ |
803 | if (isl6421_set_voltage(fe, SEC_VOLTAGE_OFF)) { |
804 | kfree(isl6421); |
805 | + fe->sec_priv = NULL; |
806 | return NULL; |
807 | } |
808 | |
809 | diff --git a/drivers/media/dvb/frontends/nxt200x.c b/drivers/media/dvb/frontends/nxt200x.c |
810 | index 87c286e..b809f83 100644 |
811 | --- a/drivers/media/dvb/frontends/nxt200x.c |
812 | +++ b/drivers/media/dvb/frontends/nxt200x.c |
813 | @@ -562,7 +562,7 @@ static int nxt200x_setup_frontend_parameters (struct dvb_frontend* fe, |
814 | |
815 | /* set input */ |
816 | if (state->config->set_pll_input) |
817 | - state->config->set_pll_input(buf, 1); |
818 | + state->config->set_pll_input(buf+1, 1); |
819 | break; |
820 | case VSB_8: |
821 | /* Set non-punctured clock for VSB */ |
822 | @@ -571,7 +571,7 @@ static int nxt200x_setup_frontend_parameters (struct dvb_frontend* fe, |
823 | |
824 | /* set input */ |
825 | if (state->config->set_pll_input) |
826 | - state->config->set_pll_input(buf, 0); |
827 | + state->config->set_pll_input(buf+1, 0); |
828 | break; |
829 | default: |
830 | return -EINVAL; |
831 | diff --git a/drivers/media/radio/Kconfig b/drivers/media/radio/Kconfig |
832 | index 920b63f..af66a5d 100644 |
833 | --- a/drivers/media/radio/Kconfig |
834 | +++ b/drivers/media/radio/Kconfig |
835 | @@ -3,7 +3,7 @@ |
836 | # |
837 | |
838 | menu "Radio Adapters" |
839 | - depends on VIDEO_DEV!=n |
840 | + depends on VIDEO_DEV |
841 | |
842 | config RADIO_CADET |
843 | tristate "ADS Cadet AM/FM Tuner" |
844 | diff --git a/drivers/media/video/msp3400-driver.c b/drivers/media/video/msp3400-driver.c |
845 | index 2fb9fe6..91078c0 100644 |
846 | --- a/drivers/media/video/msp3400-driver.c |
847 | +++ b/drivers/media/video/msp3400-driver.c |
848 | @@ -825,7 +825,7 @@ static int msp_attach(struct i2c_adapter *adapter, int address, int kind) |
849 | if (msp_reset(client) == -1) { |
850 | v4l_dbg(1, msp_debug, client, "msp3400 not found\n"); |
851 | kfree(client); |
852 | - return -1; |
853 | + return 0; |
854 | } |
855 | |
856 | state = kmalloc(sizeof(*state), GFP_KERNEL); |
857 | @@ -859,7 +859,7 @@ static int msp_attach(struct i2c_adapter *adapter, int address, int kind) |
858 | v4l_dbg(1, msp_debug, client, "not an msp3400 (cannot read chip version)\n"); |
859 | kfree(state); |
860 | kfree(client); |
861 | - return -1; |
862 | + return 0; |
863 | } |
864 | |
865 | msp_set_audio(client); |
866 | diff --git a/drivers/media/video/saa7115.c b/drivers/media/video/saa7115.c |
867 | index c2374ed..7e494c5 100644 |
868 | --- a/drivers/media/video/saa7115.c |
869 | +++ b/drivers/media/video/saa7115.c |
870 | @@ -960,7 +960,7 @@ static void saa711x_set_v4lstd(struct i2c_client *client, v4l2_std_id std) |
871 | reg |= 0x10; |
872 | } else if (std == V4L2_STD_NTSC_M_JP) { |
873 | reg |= 0x40; |
874 | - } else if (std == V4L2_STD_SECAM) { |
875 | + } else if (std & V4L2_STD_SECAM) { |
876 | reg |= 0x50; |
877 | } |
878 | saa711x_write(client, R_0E_CHROMA_CNTL_1, reg); |
879 | diff --git a/drivers/message/i2o/i2o_block.c b/drivers/message/i2o/i2o_block.c |
880 | index da9859f..b17c4b2 100644 |
881 | --- a/drivers/message/i2o/i2o_block.c |
882 | +++ b/drivers/message/i2o/i2o_block.c |
883 | @@ -390,13 +390,6 @@ static int i2o_block_prep_req_fn(struct request_queue *q, struct request *req) |
884 | return BLKPREP_KILL; |
885 | } |
886 | |
887 | - /* request is already processed by us, so return */ |
888 | - if (blk_special_request(req)) { |
889 | - osm_debug("REQ_SPECIAL already set!\n"); |
890 | - req->cmd_flags |= REQ_DONTPREP; |
891 | - return BLKPREP_OK; |
892 | - } |
893 | - |
894 | /* connect the i2o_block_request to the request */ |
895 | if (!req->special) { |
896 | ireq = i2o_block_request_alloc(); |
897 | @@ -408,11 +401,8 @@ static int i2o_block_prep_req_fn(struct request_queue *q, struct request *req) |
898 | ireq->i2o_blk_dev = i2o_blk_dev; |
899 | req->special = ireq; |
900 | ireq->req = req; |
901 | - } else |
902 | - ireq = req->special; |
903 | - |
904 | + } |
905 | /* do not come back here */ |
906 | - req->cmd_type = REQ_TYPE_SPECIAL; |
907 | req->cmd_flags |= REQ_DONTPREP; |
908 | |
909 | return BLKPREP_OK; |
910 | diff --git a/drivers/net/ppp_generic.c b/drivers/net/ppp_generic.c |
911 | index c6de566..ddf94ea 100644 |
912 | --- a/drivers/net/ppp_generic.c |
913 | +++ b/drivers/net/ppp_generic.c |
914 | @@ -2544,6 +2544,9 @@ static void ppp_destroy_interface(struct ppp *ppp) |
915 | ppp->active_filter = NULL; |
916 | #endif /* CONFIG_PPP_FILTER */ |
917 | |
918 | + if (ppp->xmit_pending) |
919 | + kfree_skb(ppp->xmit_pending); |
920 | + |
921 | kfree(ppp); |
922 | } |
923 | |
924 | diff --git a/drivers/video/ffb.c b/drivers/video/ffb.c |
925 | index 15854ae..1d4e835 100644 |
926 | --- a/drivers/video/ffb.c |
927 | +++ b/drivers/video/ffb.c |
928 | @@ -336,14 +336,30 @@ struct ffb_dac { |
929 | u32 value2; |
930 | }; |
931 | |
932 | +#define FFB_DAC_UCTRL 0x1001 /* User Control */ |
933 | +#define FFB_DAC_UCTRL_MANREV 0x00000f00 /* 4-bit Manufacturing Revision */ |
934 | +#define FFB_DAC_UCTRL_MANREV_SHIFT 8 |
935 | +#define FFB_DAC_TGEN 0x6000 /* Timing Generator */ |
936 | +#define FFB_DAC_TGEN_VIDE 0x00000001 /* Video Enable */ |
937 | +#define FFB_DAC_DID 0x8000 /* Device Identification */ |
938 | +#define FFB_DAC_DID_PNUM 0x0ffff000 /* Device Part Number */ |
939 | +#define FFB_DAC_DID_PNUM_SHIFT 12 |
940 | +#define FFB_DAC_DID_REV 0xf0000000 /* Device Revision */ |
941 | +#define FFB_DAC_DID_REV_SHIFT 28 |
942 | + |
943 | +#define FFB_DAC_CUR_CTRL 0x100 |
944 | +#define FFB_DAC_CUR_CTRL_P0 0x00000001 |
945 | +#define FFB_DAC_CUR_CTRL_P1 0x00000002 |
946 | + |
947 | struct ffb_par { |
948 | spinlock_t lock; |
949 | struct ffb_fbc __iomem *fbc; |
950 | struct ffb_dac __iomem *dac; |
951 | |
952 | u32 flags; |
953 | -#define FFB_FLAG_AFB 0x00000001 |
954 | -#define FFB_FLAG_BLANKED 0x00000002 |
955 | +#define FFB_FLAG_AFB 0x00000001 /* AFB m3 or m6 */ |
956 | +#define FFB_FLAG_BLANKED 0x00000002 /* screen is blanked */ |
957 | +#define FFB_FLAG_INVCURSOR 0x00000004 /* DAC has inverted cursor logic */ |
958 | |
959 | u32 fg_cache __attribute__((aligned (8))); |
960 | u32 bg_cache; |
961 | @@ -354,7 +370,6 @@ struct ffb_par { |
962 | unsigned long physbase; |
963 | unsigned long fbsize; |
964 | |
965 | - int dac_rev; |
966 | int board_type; |
967 | }; |
968 | |
969 | @@ -426,11 +441,12 @@ static void ffb_switch_from_graph(struct ffb_par *par) |
970 | FFBWait(par); |
971 | |
972 | /* Disable cursor. */ |
973 | - upa_writel(0x100, &dac->type2); |
974 | - if (par->dac_rev <= 2) |
975 | + upa_writel(FFB_DAC_CUR_CTRL, &dac->type2); |
976 | + if (par->flags & FFB_FLAG_INVCURSOR) |
977 | upa_writel(0, &dac->value2); |
978 | else |
979 | - upa_writel(3, &dac->value2); |
980 | + upa_writel((FFB_DAC_CUR_CTRL_P0 | |
981 | + FFB_DAC_CUR_CTRL_P1), &dac->value2); |
982 | |
983 | spin_unlock_irqrestore(&par->lock, flags); |
984 | } |
985 | @@ -664,18 +680,18 @@ ffb_blank(int blank, struct fb_info *info) |
986 | struct ffb_par *par = (struct ffb_par *) info->par; |
987 | struct ffb_dac __iomem *dac = par->dac; |
988 | unsigned long flags; |
989 | - u32 tmp; |
990 | + u32 val; |
991 | + int i; |
992 | |
993 | spin_lock_irqsave(&par->lock, flags); |
994 | |
995 | FFBWait(par); |
996 | |
997 | + upa_writel(FFB_DAC_TGEN, &dac->type); |
998 | + val = upa_readl(&dac->value); |
999 | switch (blank) { |
1000 | case FB_BLANK_UNBLANK: /* Unblanking */ |
1001 | - upa_writel(0x6000, &dac->type); |
1002 | - tmp = (upa_readl(&dac->value) | 0x1); |
1003 | - upa_writel(0x6000, &dac->type); |
1004 | - upa_writel(tmp, &dac->value); |
1005 | + val |= FFB_DAC_TGEN_VIDE; |
1006 | par->flags &= ~FFB_FLAG_BLANKED; |
1007 | break; |
1008 | |
1009 | @@ -683,13 +699,16 @@ ffb_blank(int blank, struct fb_info *info) |
1010 | case FB_BLANK_VSYNC_SUSPEND: /* VESA blank (vsync off) */ |
1011 | case FB_BLANK_HSYNC_SUSPEND: /* VESA blank (hsync off) */ |
1012 | case FB_BLANK_POWERDOWN: /* Poweroff */ |
1013 | - upa_writel(0x6000, &dac->type); |
1014 | - tmp = (upa_readl(&dac->value) & ~0x1); |
1015 | - upa_writel(0x6000, &dac->type); |
1016 | - upa_writel(tmp, &dac->value); |
1017 | + val &= ~FFB_DAC_TGEN_VIDE; |
1018 | par->flags |= FFB_FLAG_BLANKED; |
1019 | break; |
1020 | } |
1021 | + upa_writel(FFB_DAC_TGEN, &dac->type); |
1022 | + upa_writel(val, &dac->value); |
1023 | + for (i = 0; i < 10; i++) { |
1024 | + upa_writel(FFB_DAC_TGEN, &dac->type); |
1025 | + upa_readl(&dac->value); |
1026 | + } |
1027 | |
1028 | spin_unlock_irqrestore(&par->lock, flags); |
1029 | |
1030 | @@ -894,6 +913,7 @@ static int ffb_init_one(struct of_device *op) |
1031 | struct ffb_dac __iomem *dac; |
1032 | struct all_info *all; |
1033 | int err; |
1034 | + u32 dac_pnum, dac_rev, dac_mrev; |
1035 | |
1036 | all = kzalloc(sizeof(*all), GFP_KERNEL); |
1037 | if (!all) |
1038 | @@ -948,17 +968,31 @@ static int ffb_init_one(struct of_device *op) |
1039 | if ((upa_readl(&fbc->ucsr) & FFB_UCSR_ALL_ERRORS) != 0) |
1040 | upa_writel(FFB_UCSR_ALL_ERRORS, &fbc->ucsr); |
1041 | |
1042 | - ffb_switch_from_graph(&all->par); |
1043 | - |
1044 | dac = all->par.dac; |
1045 | - upa_writel(0x8000, &dac->type); |
1046 | - all->par.dac_rev = upa_readl(&dac->value) >> 0x1c; |
1047 | + upa_writel(FFB_DAC_DID, &dac->type); |
1048 | + dac_pnum = upa_readl(&dac->value); |
1049 | + dac_rev = (dac_pnum & FFB_DAC_DID_REV) >> FFB_DAC_DID_REV_SHIFT; |
1050 | + dac_pnum = (dac_pnum & FFB_DAC_DID_PNUM) >> FFB_DAC_DID_PNUM_SHIFT; |
1051 | + |
1052 | + upa_writel(FFB_DAC_UCTRL, &dac->type); |
1053 | + dac_mrev = upa_readl(&dac->value); |
1054 | + dac_mrev = (dac_mrev & FFB_DAC_UCTRL_MANREV) >> |
1055 | + FFB_DAC_UCTRL_MANREV_SHIFT; |
1056 | |
1057 | /* Elite3D has different DAC revision numbering, and no DAC revisions |
1058 | - * have the reversed meaning of cursor enable. |
1059 | + * have the reversed meaning of cursor enable. Otherwise, Pacifica 1 |
1060 | + * ramdacs with manufacturing revision less than 3 have inverted |
1061 | + * cursor logic. We identify Pacifica 1 as not Pacifica 2, the |
1062 | + * latter having a part number value of 0x236e. |
1063 | */ |
1064 | - if (all->par.flags & FFB_FLAG_AFB) |
1065 | - all->par.dac_rev = 10; |
1066 | + if ((all->par.flags & FFB_FLAG_AFB) || dac_pnum == 0x236e) { |
1067 | + all->par.flags &= ~FFB_FLAG_INVCURSOR; |
1068 | + } else { |
1069 | + if (dac_mrev < 3) |
1070 | + all->par.flags |= FFB_FLAG_INVCURSOR; |
1071 | + } |
1072 | + |
1073 | + ffb_switch_from_graph(&all->par); |
1074 | |
1075 | /* Unblank it just to be sure. When there are multiple |
1076 | * FFB/AFB cards in the system, or it is not the OBP |
1077 | @@ -993,10 +1027,12 @@ static int ffb_init_one(struct of_device *op) |
1078 | |
1079 | dev_set_drvdata(&op->dev, all); |
1080 | |
1081 | - printk("%s: %s at %016lx, type %d, DAC revision %d\n", |
1082 | + printk("%s: %s at %016lx, type %d, " |
1083 | + "DAC pnum[%x] rev[%d] manuf_rev[%d]\n", |
1084 | dp->full_name, |
1085 | ((all->par.flags & FFB_FLAG_AFB) ? "AFB" : "FFB"), |
1086 | - all->par.physbase, all->par.board_type, all->par.dac_rev); |
1087 | + all->par.physbase, all->par.board_type, |
1088 | + dac_pnum, dac_rev, dac_mrev); |
1089 | |
1090 | return 0; |
1091 | } |
1092 | diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c |
1093 | index c4fa91b..a894e6d 100644 |
1094 | --- a/fs/cifs/inode.c |
1095 | +++ b/fs/cifs/inode.c |
1096 | @@ -488,6 +488,12 @@ int cifs_get_inode_info(struct inode **pinode, |
1097 | mode e.g. 555 */ |
1098 | if (cifsInfo->cifsAttrs & ATTR_READONLY) |
1099 | inode->i_mode &= ~(S_IWUGO); |
1100 | + else if ((inode->i_mode & S_IWUGO) == 0) |
1101 | + /* the ATTR_READONLY flag may have been */ |
1102 | + /* changed on server -- set any w bits */ |
1103 | + /* allowed by mnt_file_mode */ |
1104 | + inode->i_mode |= (S_IWUGO & |
1105 | + cifs_sb->mnt_file_mode); |
1106 | /* BB add code here - |
1107 | validate if device or weird share or device type? */ |
1108 | } |
1109 | @@ -1133,6 +1139,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs) |
1110 | struct cifsFileInfo *open_file = NULL; |
1111 | FILE_BASIC_INFO time_buf; |
1112 | int set_time = FALSE; |
1113 | + int set_dosattr = FALSE; |
1114 | __u64 mode = 0xFFFFFFFFFFFFFFFFULL; |
1115 | __u64 uid = 0xFFFFFFFFFFFFFFFFULL; |
1116 | __u64 gid = 0xFFFFFFFFFFFFFFFFULL; |
1117 | @@ -1269,15 +1276,23 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs) |
1118 | else if (attrs->ia_valid & ATTR_MODE) { |
1119 | rc = 0; |
1120 | if ((mode & S_IWUGO) == 0) /* not writeable */ { |
1121 | - if ((cifsInode->cifsAttrs & ATTR_READONLY) == 0) |
1122 | + if ((cifsInode->cifsAttrs & ATTR_READONLY) == 0) { |
1123 | + set_dosattr = TRUE; |
1124 | time_buf.Attributes = |
1125 | cpu_to_le32(cifsInode->cifsAttrs | |
1126 | ATTR_READONLY); |
1127 | + } |
1128 | } else if ((mode & S_IWUGO) == S_IWUGO) { |
1129 | - if (cifsInode->cifsAttrs & ATTR_READONLY) |
1130 | + if (cifsInode->cifsAttrs & ATTR_READONLY) { |
1131 | + set_dosattr = TRUE; |
1132 | time_buf.Attributes = |
1133 | cpu_to_le32(cifsInode->cifsAttrs & |
1134 | (~ATTR_READONLY)); |
1135 | + /* Windows ignores set to zero */ |
1136 | + if(time_buf.Attributes == 0) |
1137 | + time_buf.Attributes |= |
1138 | + cpu_to_le32(ATTR_NORMAL); |
1139 | + } |
1140 | } |
1141 | /* BB to be implemented - |
1142 | via Windows security descriptors or streams */ |
1143 | @@ -1315,7 +1330,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs) |
1144 | } else |
1145 | time_buf.ChangeTime = 0; |
1146 | |
1147 | - if (set_time || time_buf.Attributes) { |
1148 | + if (set_time || set_dosattr) { |
1149 | time_buf.CreationTime = 0; /* do not change */ |
1150 | /* In the future we should experiment - try setting timestamps |
1151 | via Handle (SetFileInfo) instead of by path */ |
1152 | diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c |
1153 | index 99dfb53..d1d79fe 100644 |
1154 | --- a/fs/cifs/readdir.c |
1155 | +++ b/fs/cifs/readdir.c |
1156 | @@ -215,6 +215,10 @@ static void fill_in_inode(struct inode *tmp_inode, int new_buf_type, |
1157 | tmp_inode->i_mode |= S_IFREG; |
1158 | if (attr & ATTR_READONLY) |
1159 | tmp_inode->i_mode &= ~(S_IWUGO); |
1160 | + else if ((tmp_inode->i_mode & S_IWUGO) == 0) |
1161 | + /* the ATTR_READONLY flag may have been changed on */ |
1162 | + /* server -- set any w bits allowed by mnt_file_mode */ |
1163 | + tmp_inode->i_mode |= (S_IWUGO & cifs_sb->mnt_file_mode); |
1164 | } /* could add code here - to validate if device or weird share type? */ |
1165 | |
1166 | /* can not fill in nlink here as in qpathinfo version and Unx search */ |
1167 | diff --git a/include/asm-sparc/mostek.h b/include/asm-sparc/mostek.h |
1168 | index bd92a78..958d051 100644 |
1169 | --- a/include/asm-sparc/mostek.h |
1170 | +++ b/include/asm-sparc/mostek.h |
1171 | @@ -87,7 +87,7 @@ extern void __iomem *mstk48t02_regs; |
1172 | #define MSTK_DOW_MASK 0x07 |
1173 | #define MSTK_DOM_MASK 0x3f |
1174 | #define MSTK_MONTH_MASK 0x1f |
1175 | -#define MSTK_YEAR_MASK 0xff |
1176 | +#define MSTK_YEAR_MASK 0xffU |
1177 | |
1178 | /* Binary coded decimal conversion macros. */ |
1179 | #define MSTK_REGVAL_TO_DECIMAL(x) (((x) & 0x0F) + 0x0A * ((x) >> 0x04)) |
1180 | diff --git a/include/asm-sparc64/mostek.h b/include/asm-sparc64/mostek.h |
1181 | index 09b5aba..d14dd89 100644 |
1182 | --- a/include/asm-sparc64/mostek.h |
1183 | +++ b/include/asm-sparc64/mostek.h |
1184 | @@ -89,7 +89,7 @@ extern void __iomem *mstk48t02_regs; |
1185 | #define MSTK_DOW_MASK 0x07 |
1186 | #define MSTK_DOM_MASK 0x3f |
1187 | #define MSTK_MONTH_MASK 0x1f |
1188 | -#define MSTK_YEAR_MASK 0xff |
1189 | +#define MSTK_YEAR_MASK 0xffU |
1190 | |
1191 | /* Binary coded decimal conversion macros. */ |
1192 | #define MSTK_REGVAL_TO_DECIMAL(x) (((x) & 0x0F) + 0x0A * ((x) >> 0x04)) |
1193 | diff --git a/include/asm-um/common.lds.S b/include/asm-um/common.lds.S |
1194 | index f045451..b16222b 100644 |
1195 | --- a/include/asm-um/common.lds.S |
1196 | +++ b/include/asm-um/common.lds.S |
1197 | @@ -15,6 +15,7 @@ |
1198 | PROVIDE (_unprotected_end = .); |
1199 | |
1200 | . = ALIGN(4096); |
1201 | + .note : { *(note.*) } |
1202 | __start___ex_table = .; |
1203 | __ex_table : { *(__ex_table) } |
1204 | __stop___ex_table = .; |
1205 | diff --git a/include/asm-um/delay.h b/include/asm-um/delay.h |
1206 | index 0985bda..c71e32b 100644 |
1207 | --- a/include/asm-um/delay.h |
1208 | +++ b/include/asm-um/delay.h |
1209 | @@ -1,9 +1,20 @@ |
1210 | #ifndef __UM_DELAY_H |
1211 | #define __UM_DELAY_H |
1212 | |
1213 | -#include "asm/arch/delay.h" |
1214 | -#include "asm/archparam.h" |
1215 | - |
1216 | #define MILLION 1000000 |
1217 | |
1218 | +/* Undefined on purpose */ |
1219 | +extern void __bad_udelay(void); |
1220 | + |
1221 | +extern void __udelay(unsigned long usecs); |
1222 | +extern void __delay(unsigned long loops); |
1223 | + |
1224 | +#define udelay(n) ((__builtin_constant_p(n) && (n) > 20000) ? \ |
1225 | + __bad_udelay() : __udelay(n)) |
1226 | + |
1227 | +/* It appears that ndelay is not used at all for UML, and has never been |
1228 | + * implemented. */ |
1229 | +extern void __unimplemented_ndelay(void); |
1230 | +#define ndelay(n) __unimplemented_ndelay() |
1231 | + |
1232 | #endif |
1233 | diff --git a/include/linux/eventpoll.h b/include/linux/eventpoll.h |
1234 | index 84cfa8b..d2a96cb 100644 |
1235 | --- a/include/linux/eventpoll.h |
1236 | +++ b/include/linux/eventpoll.h |
1237 | @@ -31,12 +31,19 @@ |
1238 | /* |
1239 | * On x86-64 make the 64bit structure have the same alignment as the |
1240 | * 32bit structure. This makes 32bit emulation easier. |
1241 | + * |
1242 | + * UML/x86_64 needs the same packing as x86_64 - UML + UML_X86 + |
1243 | + * 64_BIT adds up to UML/x86_64. |
1244 | */ |
1245 | #ifdef __x86_64__ |
1246 | #define EPOLL_PACKED __attribute__((packed)) |
1247 | #else |
1248 | +#if defined(CONFIG_UML) && defined(CONFIG_UML_X86) && defined(CONFIG_64BIT) |
1249 | +#define EPOLL_PACKED __attribute__((packed)) |
1250 | +#else |
1251 | #define EPOLL_PACKED |
1252 | #endif |
1253 | +#endif |
1254 | |
1255 | struct epoll_event { |
1256 | __u32 events; |
1257 | diff --git a/include/linux/ide.h b/include/linux/ide.h |
1258 | index e26a039..3808698 100644 |
1259 | --- a/include/linux/ide.h |
1260 | +++ b/include/linux/ide.h |
1261 | @@ -727,6 +727,7 @@ typedef struct hwif_s { |
1262 | int (*ide_dma_on)(ide_drive_t *drive); |
1263 | int (*ide_dma_off_quietly)(ide_drive_t *drive); |
1264 | int (*ide_dma_test_irq)(ide_drive_t *drive); |
1265 | + void (*ide_dma_clear_irq)(ide_drive_t *drive); |
1266 | int (*ide_dma_host_on)(ide_drive_t *drive); |
1267 | int (*ide_dma_host_off)(ide_drive_t *drive); |
1268 | int (*ide_dma_lostirq)(ide_drive_t *drive); |
1269 | @@ -796,7 +797,6 @@ typedef struct hwif_s { |
1270 | unsigned sg_mapped : 1; /* sg_table and sg_nents are ready */ |
1271 | unsigned no_io_32bit : 1; /* 1 = can not do 32-bit IO ops */ |
1272 | unsigned err_stops_fifo : 1; /* 1=data FIFO is cleared by an error */ |
1273 | - unsigned atapi_irq_bogon : 1; /* Generates spurious DMA interrupts in PIO mode */ |
1274 | |
1275 | struct device gendev; |
1276 | struct completion gendev_rel_comp; /* To deal with device release() */ |
1277 | diff --git a/include/media/saa7146_vv.h b/include/media/saa7146_vv.h |
1278 | index 83fe2e3..50e33b0 100644 |
1279 | --- a/include/media/saa7146_vv.h |
1280 | +++ b/include/media/saa7146_vv.h |
1281 | @@ -239,7 +239,8 @@ void saa7146_res_free(struct saa7146_fh *fh, unsigned int bits); |
1282 | #define SAA7146_HPS_SYNC_PORT_B 0x01 |
1283 | |
1284 | /* some memory sizes */ |
1285 | -#define SAA7146_CLIPPING_MEM (14*PAGE_SIZE) |
1286 | +/* max. 16 clipping rectangles */ |
1287 | +#define SAA7146_CLIPPING_MEM (16 * 4 * sizeof(u32)) |
1288 | |
1289 | /* some defines for the various clipping-modes */ |
1290 | #define SAA7146_CLIPPING_RECT 0x4 |
1291 | diff --git a/include/net/fib_rules.h b/include/net/fib_rules.h |
1292 | index bc3c264..d585ea9 100644 |
1293 | --- a/include/net/fib_rules.h |
1294 | +++ b/include/net/fib_rules.h |
1295 | @@ -34,6 +34,7 @@ struct fib_rules_ops |
1296 | int family; |
1297 | struct list_head list; |
1298 | int rule_size; |
1299 | + int addr_size; |
1300 | |
1301 | int (*action)(struct fib_rule *, |
1302 | struct flowi *, int, |
1303 | diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h |
1304 | index 7be4f4e..1d2037c 100644 |
1305 | --- a/include/net/ip6_fib.h |
1306 | +++ b/include/net/ip6_fib.h |
1307 | @@ -58,6 +58,7 @@ struct fib6_node |
1308 | __u16 fn_bit; /* bit key */ |
1309 | __u16 fn_flags; |
1310 | __u32 fn_sernum; |
1311 | + struct rt6_info *rr_ptr; |
1312 | }; |
1313 | |
1314 | #ifndef CONFIG_IPV6_SUBTREES |
1315 | diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c |
1316 | index 3a70522..7c69506 100644 |
1317 | --- a/net/appletalk/ddp.c |
1318 | +++ b/net/appletalk/ddp.c |
1319 | @@ -1417,10 +1417,13 @@ static int atalk_rcv(struct sk_buff *skb, struct net_device *dev, |
1320 | /* |
1321 | * Size check to see if ddp->deh_len was crap |
1322 | * (Otherwise we'll detonate most spectacularly |
1323 | - * in the middle of recvmsg()). |
1324 | + * in the middle of atalk_checksum() or recvmsg()). |
1325 | */ |
1326 | - if (skb->len < sizeof(*ddp)) |
1327 | + if (skb->len < sizeof(*ddp) || skb->len < (len_hops & 1023)) { |
1328 | + pr_debug("AppleTalk: dropping corrupted frame (deh_len=%u, " |
1329 | + "skb->len=%u)\n", len_hops & 1023, skb->len); |
1330 | goto freeit; |
1331 | + } |
1332 | |
1333 | /* |
1334 | * Any checksums. Note we don't do htons() on this == is assumed to be |
1335 | diff --git a/net/core/dev.c b/net/core/dev.c |
1336 | index e660cb5..295f8f9 100644 |
1337 | --- a/net/core/dev.c |
1338 | +++ b/net/core/dev.c |
1339 | @@ -1750,10 +1750,10 @@ static int ing_filter(struct sk_buff *skb) |
1340 | |
1341 | skb->tc_verd = SET_TC_AT(skb->tc_verd,AT_INGRESS); |
1342 | |
1343 | - spin_lock(&dev->ingress_lock); |
1344 | + spin_lock(&dev->queue_lock); |
1345 | if ((q = dev->qdisc_ingress) != NULL) |
1346 | result = q->enqueue(skb, q); |
1347 | - spin_unlock(&dev->ingress_lock); |
1348 | + spin_unlock(&dev->queue_lock); |
1349 | |
1350 | } |
1351 | |
1352 | diff --git a/net/core/fib_rules.c b/net/core/fib_rules.c |
1353 | index 1df6cd4..bdbb479 100644 |
1354 | --- a/net/core/fib_rules.c |
1355 | +++ b/net/core/fib_rules.c |
1356 | @@ -152,6 +152,28 @@ out: |
1357 | |
1358 | EXPORT_SYMBOL_GPL(fib_rules_lookup); |
1359 | |
1360 | +static int validate_rulemsg(struct fib_rule_hdr *frh, struct nlattr **tb, |
1361 | + struct fib_rules_ops *ops) |
1362 | +{ |
1363 | + int err = -EINVAL; |
1364 | + |
1365 | + if (frh->src_len) |
1366 | + if (tb[FRA_SRC] == NULL || |
1367 | + frh->src_len > (ops->addr_size * 8) || |
1368 | + nla_len(tb[FRA_SRC]) != ops->addr_size) |
1369 | + goto errout; |
1370 | + |
1371 | + if (frh->dst_len) |
1372 | + if (tb[FRA_DST] == NULL || |
1373 | + frh->dst_len > (ops->addr_size * 8) || |
1374 | + nla_len(tb[FRA_DST]) != ops->addr_size) |
1375 | + goto errout; |
1376 | + |
1377 | + err = 0; |
1378 | +errout: |
1379 | + return err; |
1380 | +} |
1381 | + |
1382 | int fib_nl_newrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) |
1383 | { |
1384 | struct fib_rule_hdr *frh = nlmsg_data(nlh); |
1385 | @@ -173,6 +195,10 @@ int fib_nl_newrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) |
1386 | if (err < 0) |
1387 | goto errout; |
1388 | |
1389 | + err = validate_rulemsg(frh, tb, ops); |
1390 | + if (err < 0) |
1391 | + goto errout; |
1392 | + |
1393 | rule = kzalloc(ops->rule_size, GFP_KERNEL); |
1394 | if (rule == NULL) { |
1395 | err = -ENOMEM; |
1396 | @@ -260,6 +286,10 @@ int fib_nl_delrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) |
1397 | if (err < 0) |
1398 | goto errout; |
1399 | |
1400 | + err = validate_rulemsg(frh, tb, ops); |
1401 | + if (err < 0) |
1402 | + goto errout; |
1403 | + |
1404 | list_for_each_entry(rule, ops->rules_list, list) { |
1405 | if (frh->action && (frh->action != rule->action)) |
1406 | continue; |
1407 | diff --git a/net/dccp/proto.c b/net/dccp/proto.c |
1408 | index 63b3fa2..88ed359 100644 |
1409 | --- a/net/dccp/proto.c |
1410 | +++ b/net/dccp/proto.c |
1411 | @@ -575,7 +575,7 @@ static int do_dccp_getsockopt(struct sock *sk, int level, int optname, |
1412 | if (get_user(len, optlen)) |
1413 | return -EFAULT; |
1414 | |
1415 | - if (len < sizeof(int)) |
1416 | + if (len < (int)sizeof(int)) |
1417 | return -EINVAL; |
1418 | |
1419 | dp = dccp_sk(sk); |
1420 | @@ -589,9 +589,11 @@ static int do_dccp_getsockopt(struct sock *sk, int level, int optname, |
1421 | (__be32 __user *)optval, optlen); |
1422 | case DCCP_SOCKOPT_SEND_CSCOV: |
1423 | val = dp->dccps_pcslen; |
1424 | + len = sizeof(val); |
1425 | break; |
1426 | case DCCP_SOCKOPT_RECV_CSCOV: |
1427 | val = dp->dccps_pcrlen; |
1428 | + len = sizeof(val); |
1429 | break; |
1430 | case 128 ... 191: |
1431 | return ccid_hc_rx_getsockopt(dp->dccps_hc_rx_ccid, sk, optname, |
1432 | diff --git a/net/decnet/dn_rules.c b/net/decnet/dn_rules.c |
1433 | index e32d0c3..5e86dd5 100644 |
1434 | --- a/net/decnet/dn_rules.c |
1435 | +++ b/net/decnet/dn_rules.c |
1436 | @@ -109,8 +109,6 @@ errout: |
1437 | |
1438 | static struct nla_policy dn_fib_rule_policy[FRA_MAX+1] __read_mostly = { |
1439 | FRA_GENERIC_POLICY, |
1440 | - [FRA_SRC] = { .type = NLA_U16 }, |
1441 | - [FRA_DST] = { .type = NLA_U16 }, |
1442 | }; |
1443 | |
1444 | static int dn_fib_rule_match(struct fib_rule *rule, struct flowi *fl, int flags) |
1445 | @@ -133,7 +131,7 @@ static int dn_fib_rule_configure(struct fib_rule *rule, struct sk_buff *skb, |
1446 | int err = -EINVAL; |
1447 | struct dn_fib_rule *r = (struct dn_fib_rule *)rule; |
1448 | |
1449 | - if (frh->src_len > 16 || frh->dst_len > 16 || frh->tos) |
1450 | + if (frh->tos) |
1451 | goto errout; |
1452 | |
1453 | if (rule->table == RT_TABLE_UNSPEC) { |
1454 | @@ -150,11 +148,11 @@ static int dn_fib_rule_configure(struct fib_rule *rule, struct sk_buff *skb, |
1455 | } |
1456 | } |
1457 | |
1458 | - if (tb[FRA_SRC]) |
1459 | - r->src = nla_get_u16(tb[FRA_SRC]); |
1460 | + if (frh->src_len) |
1461 | + r->src = nla_get_le16(tb[FRA_SRC]); |
1462 | |
1463 | - if (tb[FRA_DST]) |
1464 | - r->dst = nla_get_u16(tb[FRA_DST]); |
1465 | + if (frh->dst_len) |
1466 | + r->dst = nla_get_le16(tb[FRA_DST]); |
1467 | |
1468 | r->src_len = frh->src_len; |
1469 | r->srcmask = dnet_make_mask(r->src_len); |
1470 | @@ -176,10 +174,10 @@ static int dn_fib_rule_compare(struct fib_rule *rule, struct fib_rule_hdr *frh, |
1471 | if (frh->dst_len && (r->dst_len != frh->dst_len)) |
1472 | return 0; |
1473 | |
1474 | - if (tb[FRA_SRC] && (r->src != nla_get_u16(tb[FRA_SRC]))) |
1475 | + if (frh->src_len && (r->src != nla_get_le16(tb[FRA_SRC]))) |
1476 | return 0; |
1477 | |
1478 | - if (tb[FRA_DST] && (r->dst != nla_get_u16(tb[FRA_DST]))) |
1479 | + if (frh->dst_len && (r->dst != nla_get_le16(tb[FRA_DST]))) |
1480 | return 0; |
1481 | |
1482 | return 1; |
1483 | @@ -214,9 +212,9 @@ static int dn_fib_rule_fill(struct fib_rule *rule, struct sk_buff *skb, |
1484 | frh->tos = 0; |
1485 | |
1486 | if (r->dst_len) |
1487 | - NLA_PUT_U16(skb, FRA_DST, r->dst); |
1488 | + NLA_PUT_LE16(skb, FRA_DST, r->dst); |
1489 | if (r->src_len) |
1490 | - NLA_PUT_U16(skb, FRA_SRC, r->src); |
1491 | + NLA_PUT_LE16(skb, FRA_SRC, r->src); |
1492 | |
1493 | return 0; |
1494 | |
1495 | @@ -249,6 +247,7 @@ int dn_fib_dump_rules(struct sk_buff *skb, struct netlink_callback *cb) |
1496 | static struct fib_rules_ops dn_fib_rules_ops = { |
1497 | .family = AF_DECnet, |
1498 | .rule_size = sizeof(struct dn_fib_rule), |
1499 | + .addr_size = sizeof(u16), |
1500 | .action = dn_fib_rule_action, |
1501 | .match = dn_fib_rule_match, |
1502 | .configure = dn_fib_rule_configure, |
1503 | diff --git a/net/ipv4/fib_rules.c b/net/ipv4/fib_rules.c |
1504 | index b837c33..c660c07 100644 |
1505 | --- a/net/ipv4/fib_rules.c |
1506 | +++ b/net/ipv4/fib_rules.c |
1507 | @@ -171,8 +171,6 @@ static struct fib_table *fib_empty_table(void) |
1508 | |
1509 | static struct nla_policy fib4_rule_policy[FRA_MAX+1] __read_mostly = { |
1510 | FRA_GENERIC_POLICY, |
1511 | - [FRA_SRC] = { .type = NLA_U32 }, |
1512 | - [FRA_DST] = { .type = NLA_U32 }, |
1513 | [FRA_FLOW] = { .type = NLA_U32 }, |
1514 | }; |
1515 | |
1516 | @@ -183,8 +181,7 @@ static int fib4_rule_configure(struct fib_rule *rule, struct sk_buff *skb, |
1517 | int err = -EINVAL; |
1518 | struct fib4_rule *rule4 = (struct fib4_rule *) rule; |
1519 | |
1520 | - if (frh->src_len > 32 || frh->dst_len > 32 || |
1521 | - (frh->tos & ~IPTOS_TOS_MASK)) |
1522 | + if (frh->tos & ~IPTOS_TOS_MASK) |
1523 | goto errout; |
1524 | |
1525 | if (rule->table == RT_TABLE_UNSPEC) { |
1526 | @@ -201,10 +198,10 @@ static int fib4_rule_configure(struct fib_rule *rule, struct sk_buff *skb, |
1527 | } |
1528 | } |
1529 | |
1530 | - if (tb[FRA_SRC]) |
1531 | + if (frh->src_len) |
1532 | rule4->src = nla_get_be32(tb[FRA_SRC]); |
1533 | |
1534 | - if (tb[FRA_DST]) |
1535 | + if (frh->dst_len) |
1536 | rule4->dst = nla_get_be32(tb[FRA_DST]); |
1537 | |
1538 | #ifdef CONFIG_NET_CLS_ROUTE |
1539 | @@ -242,10 +239,10 @@ static int fib4_rule_compare(struct fib_rule *rule, struct fib_rule_hdr *frh, |
1540 | return 0; |
1541 | #endif |
1542 | |
1543 | - if (tb[FRA_SRC] && (rule4->src != nla_get_be32(tb[FRA_SRC]))) |
1544 | + if (frh->src_len && (rule4->src != nla_get_be32(tb[FRA_SRC]))) |
1545 | return 0; |
1546 | |
1547 | - if (tb[FRA_DST] && (rule4->dst != nla_get_be32(tb[FRA_DST]))) |
1548 | + if (frh->dst_len && (rule4->dst != nla_get_be32(tb[FRA_DST]))) |
1549 | return 0; |
1550 | |
1551 | return 1; |
1552 | @@ -309,6 +306,7 @@ static size_t fib4_rule_nlmsg_payload(struct fib_rule *rule) |
1553 | static struct fib_rules_ops fib4_rules_ops = { |
1554 | .family = AF_INET, |
1555 | .rule_size = sizeof(struct fib4_rule), |
1556 | + .addr_size = sizeof(u32), |
1557 | .action = fib4_rule_action, |
1558 | .match = fib4_rule_match, |
1559 | .configure = fib4_rule_configure, |
1560 | diff --git a/net/ipv6/fib6_rules.c b/net/ipv6/fib6_rules.c |
1561 | index 0862809..ea3035b 100644 |
1562 | --- a/net/ipv6/fib6_rules.c |
1563 | +++ b/net/ipv6/fib6_rules.c |
1564 | @@ -131,8 +131,6 @@ static int fib6_rule_match(struct fib_rule *rule, struct flowi *fl, int flags) |
1565 | |
1566 | static struct nla_policy fib6_rule_policy[FRA_MAX+1] __read_mostly = { |
1567 | FRA_GENERIC_POLICY, |
1568 | - [FRA_SRC] = { .len = sizeof(struct in6_addr) }, |
1569 | - [FRA_DST] = { .len = sizeof(struct in6_addr) }, |
1570 | }; |
1571 | |
1572 | static int fib6_rule_configure(struct fib_rule *rule, struct sk_buff *skb, |
1573 | @@ -142,9 +140,6 @@ static int fib6_rule_configure(struct fib_rule *rule, struct sk_buff *skb, |
1574 | int err = -EINVAL; |
1575 | struct fib6_rule *rule6 = (struct fib6_rule *) rule; |
1576 | |
1577 | - if (frh->src_len > 128 || frh->dst_len > 128) |
1578 | - goto errout; |
1579 | - |
1580 | if (rule->action == FR_ACT_TO_TBL) { |
1581 | if (rule->table == RT6_TABLE_UNSPEC) |
1582 | goto errout; |
1583 | @@ -155,11 +150,11 @@ static int fib6_rule_configure(struct fib_rule *rule, struct sk_buff *skb, |
1584 | } |
1585 | } |
1586 | |
1587 | - if (tb[FRA_SRC]) |
1588 | + if (frh->src_len) |
1589 | nla_memcpy(&rule6->src.addr, tb[FRA_SRC], |
1590 | sizeof(struct in6_addr)); |
1591 | |
1592 | - if (tb[FRA_DST]) |
1593 | + if (frh->dst_len) |
1594 | nla_memcpy(&rule6->dst.addr, tb[FRA_DST], |
1595 | sizeof(struct in6_addr)); |
1596 | |
1597 | @@ -186,11 +181,11 @@ static int fib6_rule_compare(struct fib_rule *rule, struct fib_rule_hdr *frh, |
1598 | if (frh->tos && (rule6->tclass != frh->tos)) |
1599 | return 0; |
1600 | |
1601 | - if (tb[FRA_SRC] && |
1602 | + if (frh->src_len && |
1603 | nla_memcmp(tb[FRA_SRC], &rule6->src.addr, sizeof(struct in6_addr))) |
1604 | return 0; |
1605 | |
1606 | - if (tb[FRA_DST] && |
1607 | + if (frh->dst_len && |
1608 | nla_memcmp(tb[FRA_DST], &rule6->dst.addr, sizeof(struct in6_addr))) |
1609 | return 0; |
1610 | |
1611 | @@ -240,6 +235,7 @@ static size_t fib6_rule_nlmsg_payload(struct fib_rule *rule) |
1612 | static struct fib_rules_ops fib6_rules_ops = { |
1613 | .family = AF_INET6, |
1614 | .rule_size = sizeof(struct fib6_rule), |
1615 | + .addr_size = sizeof(struct in6_addr), |
1616 | .action = fib6_rule_action, |
1617 | .match = fib6_rule_match, |
1618 | .configure = fib6_rule_configure, |
1619 | diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c |
1620 | index 96d8310..2d9c425 100644 |
1621 | --- a/net/ipv6/ip6_fib.c |
1622 | +++ b/net/ipv6/ip6_fib.c |
1623 | @@ -659,6 +659,10 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt, |
1624 | ins = &iter->u.next; |
1625 | } |
1626 | |
1627 | + /* Reset round-robin state, if necessary */ |
1628 | + if (ins == &fn->leaf) |
1629 | + fn->rr_ptr = NULL; |
1630 | + |
1631 | /* |
1632 | * insert node |
1633 | */ |
1634 | @@ -1110,6 +1114,10 @@ static void fib6_del_route(struct fib6_node *fn, struct rt6_info **rtp, |
1635 | rt6_stats.fib_rt_entries--; |
1636 | rt6_stats.fib_discarded_routes++; |
1637 | |
1638 | + /* Reset round-robin state, if necessary */ |
1639 | + if (fn->rr_ptr == rt) |
1640 | + fn->rr_ptr = NULL; |
1641 | + |
1642 | /* Adjust walkers */ |
1643 | read_lock(&fib6_walker_lock); |
1644 | FOR_WALKERS(w) { |
1645 | diff --git a/net/ipv6/route.c b/net/ipv6/route.c |
1646 | index 5f0043c..01bcf4a 100644 |
1647 | --- a/net/ipv6/route.c |
1648 | +++ b/net/ipv6/route.c |
1649 | @@ -354,55 +354,76 @@ static int rt6_score_route(struct rt6_info *rt, int oif, |
1650 | return m; |
1651 | } |
1652 | |
1653 | -static struct rt6_info *rt6_select(struct rt6_info **head, int oif, |
1654 | - int strict) |
1655 | +static struct rt6_info *find_match(struct rt6_info *rt, int oif, int strict, |
1656 | + int *mpri, struct rt6_info *match) |
1657 | { |
1658 | - struct rt6_info *match = NULL, *last = NULL; |
1659 | - struct rt6_info *rt, *rt0 = *head; |
1660 | - u32 metric; |
1661 | + int m; |
1662 | + |
1663 | + if (rt6_check_expired(rt)) |
1664 | + goto out; |
1665 | + |
1666 | + m = rt6_score_route(rt, oif, strict); |
1667 | + if (m < 0) |
1668 | + goto out; |
1669 | + |
1670 | + if (m > *mpri) { |
1671 | + if (strict & RT6_LOOKUP_F_REACHABLE) |
1672 | + rt6_probe(match); |
1673 | + *mpri = m; |
1674 | + match = rt; |
1675 | + } else if (strict & RT6_LOOKUP_F_REACHABLE) { |
1676 | + rt6_probe(rt); |
1677 | + } |
1678 | + |
1679 | +out: |
1680 | + return match; |
1681 | +} |
1682 | + |
1683 | +static struct rt6_info *find_rr_leaf(struct fib6_node *fn, |
1684 | + struct rt6_info *rr_head, |
1685 | + u32 metric, int oif, int strict) |
1686 | +{ |
1687 | + struct rt6_info *rt, *match; |
1688 | int mpri = -1; |
1689 | |
1690 | - RT6_TRACE("%s(head=%p(*head=%p), oif=%d)\n", |
1691 | - __FUNCTION__, head, head ? *head : NULL, oif); |
1692 | + match = NULL; |
1693 | + for (rt = rr_head; rt && rt->rt6i_metric == metric; |
1694 | + rt = rt->u.next) |
1695 | + match = find_match(rt, oif, strict, &mpri, match); |
1696 | + for (rt = fn->leaf; rt && rt != rr_head && rt->rt6i_metric == metric; |
1697 | + rt = rt->u.next) |
1698 | + match = find_match(rt, oif, strict, &mpri, match); |
1699 | |
1700 | - for (rt = rt0, metric = rt0->rt6i_metric; |
1701 | - rt && rt->rt6i_metric == metric && (!last || rt != rt0); |
1702 | - rt = rt->u.next) { |
1703 | - int m; |
1704 | + return match; |
1705 | +} |
1706 | |
1707 | - if (rt6_check_expired(rt)) |
1708 | - continue; |
1709 | +static struct rt6_info *rt6_select(struct fib6_node *fn, int oif, int strict) |
1710 | +{ |
1711 | + struct rt6_info *match, *rt0; |
1712 | |
1713 | - last = rt; |
1714 | + RT6_TRACE("%s(fn->leaf=%p, oif=%d)\n", |
1715 | + __FUNCTION__, fn->leaf, oif); |
1716 | |
1717 | - m = rt6_score_route(rt, oif, strict); |
1718 | - if (m < 0) |
1719 | - continue; |
1720 | + rt0 = fn->rr_ptr; |
1721 | + if (!rt0) |
1722 | + fn->rr_ptr = rt0 = fn->leaf; |
1723 | |
1724 | - if (m > mpri) { |
1725 | - if (strict & RT6_LOOKUP_F_REACHABLE) |
1726 | - rt6_probe(match); |
1727 | - match = rt; |
1728 | - mpri = m; |
1729 | - } else if (strict & RT6_LOOKUP_F_REACHABLE) { |
1730 | - rt6_probe(rt); |
1731 | - } |
1732 | - } |
1733 | + match = find_rr_leaf(fn, rt0, rt0->rt6i_metric, oif, strict); |
1734 | |
1735 | if (!match && |
1736 | - (strict & RT6_LOOKUP_F_REACHABLE) && |
1737 | - last && last != rt0) { |
1738 | + (strict & RT6_LOOKUP_F_REACHABLE)) { |
1739 | + struct rt6_info *next = rt0->u.next; |
1740 | + |
1741 | /* no entries matched; do round-robin */ |
1742 | - static DEFINE_SPINLOCK(lock); |
1743 | - spin_lock(&lock); |
1744 | - *head = rt0->u.next; |
1745 | - rt0->u.next = last->u.next; |
1746 | - last->u.next = rt0; |
1747 | - spin_unlock(&lock); |
1748 | + if (!next || next->rt6i_metric != rt0->rt6i_metric) |
1749 | + next = fn->leaf; |
1750 | + |
1751 | + if (next != rt0) |
1752 | + fn->rr_ptr = next; |
1753 | } |
1754 | |
1755 | - RT6_TRACE("%s() => %p, score=%d\n", |
1756 | - __FUNCTION__, match, mpri); |
1757 | + RT6_TRACE("%s() => %p\n", |
1758 | + __FUNCTION__, match); |
1759 | |
1760 | return (match ? match : &ip6_null_entry); |
1761 | } |
1762 | @@ -648,7 +669,7 @@ restart_2: |
1763 | fn = fib6_lookup(&table->tb6_root, &fl->fl6_dst, &fl->fl6_src); |
1764 | |
1765 | restart: |
1766 | - rt = rt6_select(&fn->leaf, fl->iif, strict | reachable); |
1767 | + rt = rt6_select(fn, fl->iif, strict | reachable); |
1768 | BACKTRACK(&fl->fl6_src); |
1769 | if (rt == &ip6_null_entry || |
1770 | rt->rt6i_flags & RTF_CACHE) |
1771 | @@ -743,7 +764,7 @@ restart_2: |
1772 | fn = fib6_lookup(&table->tb6_root, &fl->fl6_dst, &fl->fl6_src); |
1773 | |
1774 | restart: |
1775 | - rt = rt6_select(&fn->leaf, fl->oif, strict | reachable); |
1776 | + rt = rt6_select(fn, fl->oif, strict | reachable); |
1777 | BACKTRACK(&fl->fl6_src); |
1778 | if (rt == &ip6_null_entry || |
1779 | rt->rt6i_flags & RTF_CACHE) |
1780 | diff --git a/net/sched/cls_basic.c b/net/sched/cls_basic.c |
1781 | index 09fda68..23e4459 100644 |
1782 | --- a/net/sched/cls_basic.c |
1783 | +++ b/net/sched/cls_basic.c |
1784 | @@ -82,6 +82,13 @@ static void basic_put(struct tcf_proto *tp, unsigned long f) |
1785 | |
1786 | static int basic_init(struct tcf_proto *tp) |
1787 | { |
1788 | + struct basic_head *head; |
1789 | + |
1790 | + head = kzalloc(sizeof(*head), GFP_KERNEL); |
1791 | + if (head == NULL) |
1792 | + return -ENOBUFS; |
1793 | + INIT_LIST_HEAD(&head->flist); |
1794 | + tp->root = head; |
1795 | return 0; |
1796 | } |
1797 | |
1798 | @@ -177,15 +184,6 @@ static int basic_change(struct tcf_proto *tp, unsigned long base, u32 handle, |
1799 | } |
1800 | |
1801 | err = -ENOBUFS; |
1802 | - if (head == NULL) { |
1803 | - head = kzalloc(sizeof(*head), GFP_KERNEL); |
1804 | - if (head == NULL) |
1805 | - goto errout; |
1806 | - |
1807 | - INIT_LIST_HEAD(&head->flist); |
1808 | - tp->root = head; |
1809 | - } |
1810 | - |
1811 | f = kzalloc(sizeof(*f), GFP_KERNEL); |
1812 | if (f == NULL) |
1813 | goto errout; |
1814 | diff --git a/net/socket.c b/net/socket.c |
1815 | index 4e39631..afb6085 100644 |
1816 | --- a/net/socket.c |
1817 | +++ b/net/socket.c |
1818 | @@ -1368,7 +1368,7 @@ asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr, |
1819 | |
1820 | err = sock_attach_fd(newsock, newfile); |
1821 | if (err < 0) |
1822 | - goto out_fd; |
1823 | + goto out_fd_simple; |
1824 | |
1825 | err = security_socket_accept(sock, newsock); |
1826 | if (err) |
1827 | @@ -1401,6 +1401,11 @@ out_put: |
1828 | fput_light(sock->file, fput_needed); |
1829 | out: |
1830 | return err; |
1831 | +out_fd_simple: |
1832 | + sock_release(newsock); |
1833 | + put_filp(newfile); |
1834 | + put_unused_fd(newfd); |
1835 | + goto out_put; |
1836 | out_fd: |
1837 | fput(newfile); |
1838 | put_unused_fd(newfd); |