Annotation of /trunk/kernel26-alx/patches-2.6.27-r3/0141-2.6.27.42-all-fixes.patch
Parent Directory | Revision Log
Revision 1176 -
(hide annotations)
(download)
Thu Oct 14 15:11:06 2010 UTC (13 years, 11 months ago) by niro
File size: 21754 byte(s)
Thu Oct 14 15:11:06 2010 UTC (13 years, 11 months ago) by niro
File size: 21754 byte(s)
-2.6.27-alx-r3: new magellan 0.5.2 kernel
1 | niro | 1176 | diff --git a/arch/ia64/lib/ip_fast_csum.S b/arch/ia64/lib/ip_fast_csum.S |
2 | index 1f86aeb..620d9dc 100644 | ||
3 | --- a/arch/ia64/lib/ip_fast_csum.S | ||
4 | +++ b/arch/ia64/lib/ip_fast_csum.S | ||
5 | @@ -96,20 +96,22 @@ END(ip_fast_csum) | ||
6 | GLOBAL_ENTRY(csum_ipv6_magic) | ||
7 | ld4 r20=[in0],4 | ||
8 | ld4 r21=[in1],4 | ||
9 | - dep r15=in3,in2,32,16 | ||
10 | + zxt4 in2=in2 | ||
11 | ;; | ||
12 | ld4 r22=[in0],4 | ||
13 | ld4 r23=[in1],4 | ||
14 | - mux1 r15=r15,@rev | ||
15 | + dep r15=in3,in2,32,16 | ||
16 | ;; | ||
17 | ld4 r24=[in0],4 | ||
18 | ld4 r25=[in1],4 | ||
19 | - shr.u r15=r15,16 | ||
20 | + mux1 r15=r15,@rev | ||
21 | add r16=r20,r21 | ||
22 | add r17=r22,r23 | ||
23 | + zxt4 in4=in4 | ||
24 | ;; | ||
25 | ld4 r26=[in0],4 | ||
26 | ld4 r27=[in1],4 | ||
27 | + shr.u r15=r15,16 | ||
28 | add r18=r24,r25 | ||
29 | add r8=r16,r17 | ||
30 | ;; | ||
31 | diff --git a/arch/x86/kernel/cpu/perfctr-watchdog.c b/arch/x86/kernel/cpu/perfctr-watchdog.c | ||
32 | index 05cc22d..39040af 100644 | ||
33 | --- a/arch/x86/kernel/cpu/perfctr-watchdog.c | ||
34 | +++ b/arch/x86/kernel/cpu/perfctr-watchdog.c | ||
35 | @@ -646,7 +646,7 @@ static void probe_nmi_watchdog(void) | ||
36 | switch (boot_cpu_data.x86_vendor) { | ||
37 | case X86_VENDOR_AMD: | ||
38 | if (boot_cpu_data.x86 != 6 && boot_cpu_data.x86 != 15 && | ||
39 | - boot_cpu_data.x86 != 16) | ||
40 | + boot_cpu_data.x86 != 16 && boot_cpu_data.x86 != 17) | ||
41 | return; | ||
42 | wd_ops = &k7_wd_ops; | ||
43 | break; | ||
44 | diff --git a/arch/x86/kernel/pci-calgary_64.c b/arch/x86/kernel/pci-calgary_64.c | ||
45 | index dcdac6c..34bc987 100644 | ||
46 | --- a/arch/x86/kernel/pci-calgary_64.c | ||
47 | +++ b/arch/x86/kernel/pci-calgary_64.c | ||
48 | @@ -377,13 +377,15 @@ static inline struct iommu_table *find_iommu_table(struct device *dev) | ||
49 | |||
50 | pdev = to_pci_dev(dev); | ||
51 | |||
52 | + /* search up the device tree for an iommu */ | ||
53 | pbus = pdev->bus; | ||
54 | - | ||
55 | - /* is the device behind a bridge? Look for the root bus */ | ||
56 | - while (pbus->parent) | ||
57 | + do { | ||
58 | + tbl = pci_iommu(pbus); | ||
59 | + if (tbl && tbl->it_busno == pbus->number) | ||
60 | + break; | ||
61 | + tbl = NULL; | ||
62 | pbus = pbus->parent; | ||
63 | - | ||
64 | - tbl = pci_iommu(pbus); | ||
65 | + } while (pbus); | ||
66 | |||
67 | BUG_ON(tbl && (tbl->it_busno != pbus->number)); | ||
68 | |||
69 | diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c | ||
70 | index 87d4d69..4b85cba 100644 | ||
71 | --- a/arch/x86/kernel/pci-dma.c | ||
72 | +++ b/arch/x86/kernel/pci-dma.c | ||
73 | @@ -175,7 +175,7 @@ static __init int iommu_setup(char *p) | ||
74 | if (!strncmp(p, "allowdac", 8)) | ||
75 | forbid_dac = 0; | ||
76 | if (!strncmp(p, "nodac", 5)) | ||
77 | - forbid_dac = -1; | ||
78 | + forbid_dac = 1; | ||
79 | if (!strncmp(p, "usedac", 6)) { | ||
80 | forbid_dac = -1; | ||
81 | return 1; | ||
82 | diff --git a/arch/x86/kernel/pci-gart_64.c b/arch/x86/kernel/pci-gart_64.c | ||
83 | index eed133e..625ead6 100644 | ||
84 | --- a/arch/x86/kernel/pci-gart_64.c | ||
85 | +++ b/arch/x86/kernel/pci-gart_64.c | ||
86 | @@ -865,7 +865,7 @@ void __init gart_parse_options(char *p) | ||
87 | #endif | ||
88 | if (isdigit(*p) && get_option(&p, &arg)) | ||
89 | iommu_size = arg; | ||
90 | - if (!strncmp(p, "fullflush", 8)) | ||
91 | + if (!strncmp(p, "fullflush", 9)) | ||
92 | iommu_fullflush = 1; | ||
93 | if (!strncmp(p, "nofullflush", 11)) | ||
94 | iommu_fullflush = 0; | ||
95 | diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c | ||
96 | index 1177f10..f2e02b7 100644 | ||
97 | --- a/arch/x86/kernel/reboot.c | ||
98 | +++ b/arch/x86/kernel/reboot.c | ||
99 | @@ -219,6 +219,14 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = { | ||
100 | DMI_MATCH(DMI_PRODUCT_NAME, "Dell XPS710"), | ||
101 | }, | ||
102 | }, | ||
103 | + { /* Handle problems with rebooting on ASUS P4S800 */ | ||
104 | + .callback = set_bios_reboot, | ||
105 | + .ident = "ASUS P4S800", | ||
106 | + .matches = { | ||
107 | + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), | ||
108 | + DMI_MATCH(DMI_BOARD_NAME, "P4S800"), | ||
109 | + }, | ||
110 | + }, | ||
111 | { } | ||
112 | }; | ||
113 | |||
114 | diff --git a/drivers/ata/pata_hpt37x.c b/drivers/ata/pata_hpt37x.c | ||
115 | index 233a5fd..2496c2b 100644 | ||
116 | --- a/drivers/ata/pata_hpt37x.c | ||
117 | +++ b/drivers/ata/pata_hpt37x.c | ||
118 | @@ -24,7 +24,7 @@ | ||
119 | #include <linux/libata.h> | ||
120 | |||
121 | #define DRV_NAME "pata_hpt37x" | ||
122 | -#define DRV_VERSION "0.6.12" | ||
123 | +#define DRV_VERSION "0.6.14" | ||
124 | |||
125 | struct hpt_clock { | ||
126 | u8 xfer_speed; | ||
127 | @@ -404,9 +404,8 @@ static void hpt370_set_piomode(struct ata_port *ap, struct ata_device *adev) | ||
128 | |||
129 | pci_read_config_dword(pdev, addr1, ®); | ||
130 | mode = hpt37x_find_mode(ap, adev->pio_mode); | ||
131 | - mode &= ~0x8000000; /* No FIFO in PIO */ | ||
132 | - mode &= ~0x30070000; /* Leave config bits alone */ | ||
133 | - reg &= 0x30070000; /* Strip timing bits */ | ||
134 | + mode &= 0xCFC3FFFF; /* Leave DMA bits alone */ | ||
135 | + reg &= ~0xCFC3FFFF; /* Strip timing bits */ | ||
136 | pci_write_config_dword(pdev, addr1, reg | mode); | ||
137 | } | ||
138 | |||
139 | @@ -423,8 +422,7 @@ static void hpt370_set_dmamode(struct ata_port *ap, struct ata_device *adev) | ||
140 | { | ||
141 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | ||
142 | u32 addr1, addr2; | ||
143 | - u32 reg; | ||
144 | - u32 mode; | ||
145 | + u32 reg, mode, mask; | ||
146 | u8 fast; | ||
147 | |||
148 | addr1 = 0x40 + 4 * (adev->devno + 2 * ap->port_no); | ||
149 | @@ -436,11 +434,12 @@ static void hpt370_set_dmamode(struct ata_port *ap, struct ata_device *adev) | ||
150 | fast |= 0x01; | ||
151 | pci_write_config_byte(pdev, addr2, fast); | ||
152 | |||
153 | + mask = adev->dma_mode < XFER_UDMA_0 ? 0x31C001FF : 0x303C0000; | ||
154 | + | ||
155 | pci_read_config_dword(pdev, addr1, ®); | ||
156 | mode = hpt37x_find_mode(ap, adev->dma_mode); | ||
157 | - mode |= 0x8000000; /* FIFO in MWDMA or UDMA */ | ||
158 | - mode &= ~0xC0000000; /* Leave config bits alone */ | ||
159 | - reg &= 0xC0000000; /* Strip timing bits */ | ||
160 | + mode &= mask; | ||
161 | + reg &= ~mask; | ||
162 | pci_write_config_dword(pdev, addr1, reg | mode); | ||
163 | } | ||
164 | |||
165 | @@ -508,9 +507,8 @@ static void hpt372_set_piomode(struct ata_port *ap, struct ata_device *adev) | ||
166 | mode = hpt37x_find_mode(ap, adev->pio_mode); | ||
167 | |||
168 | printk("Find mode for %d reports %X\n", adev->pio_mode, mode); | ||
169 | - mode &= ~0x80000000; /* No FIFO in PIO */ | ||
170 | - mode &= ~0x30070000; /* Leave config bits alone */ | ||
171 | - reg &= 0x30070000; /* Strip timing bits */ | ||
172 | + mode &= 0xCFC3FFFF; /* Leave DMA bits alone */ | ||
173 | + reg &= ~0xCFC3FFFF; /* Strip timing bits */ | ||
174 | pci_write_config_dword(pdev, addr1, reg | mode); | ||
175 | } | ||
176 | |||
177 | @@ -527,8 +525,7 @@ static void hpt372_set_dmamode(struct ata_port *ap, struct ata_device *adev) | ||
178 | { | ||
179 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | ||
180 | u32 addr1, addr2; | ||
181 | - u32 reg; | ||
182 | - u32 mode; | ||
183 | + u32 reg, mode, mask; | ||
184 | u8 fast; | ||
185 | |||
186 | addr1 = 0x40 + 4 * (adev->devno + 2 * ap->port_no); | ||
187 | @@ -539,12 +536,13 @@ static void hpt372_set_dmamode(struct ata_port *ap, struct ata_device *adev) | ||
188 | fast &= ~0x07; | ||
189 | pci_write_config_byte(pdev, addr2, fast); | ||
190 | |||
191 | + mask = adev->dma_mode < XFER_UDMA_0 ? 0x31C001FF : 0x303C0000; | ||
192 | + | ||
193 | pci_read_config_dword(pdev, addr1, ®); | ||
194 | mode = hpt37x_find_mode(ap, adev->dma_mode); | ||
195 | printk("Find mode for DMA %d reports %X\n", adev->dma_mode, mode); | ||
196 | - mode &= ~0xC0000000; /* Leave config bits alone */ | ||
197 | - mode |= 0x80000000; /* FIFO in MWDMA or UDMA */ | ||
198 | - reg &= 0xC0000000; /* Strip timing bits */ | ||
199 | + mode &= mask; | ||
200 | + reg &= ~mask; | ||
201 | pci_write_config_dword(pdev, addr1, reg | mode); | ||
202 | } | ||
203 | |||
204 | diff --git a/drivers/ata/pata_hpt3x2n.c b/drivers/ata/pata_hpt3x2n.c | ||
205 | index d5c9fd7..5f9b60f 100644 | ||
206 | --- a/drivers/ata/pata_hpt3x2n.c | ||
207 | +++ b/drivers/ata/pata_hpt3x2n.c | ||
208 | @@ -25,7 +25,7 @@ | ||
209 | #include <linux/libata.h> | ||
210 | |||
211 | #define DRV_NAME "pata_hpt3x2n" | ||
212 | -#define DRV_VERSION "0.3.4" | ||
213 | +#define DRV_VERSION "0.3.7" | ||
214 | |||
215 | enum { | ||
216 | HPT_PCI_FAST = (1 << 31), | ||
217 | @@ -185,9 +185,8 @@ static void hpt3x2n_set_piomode(struct ata_port *ap, struct ata_device *adev) | ||
218 | |||
219 | pci_read_config_dword(pdev, addr1, ®); | ||
220 | mode = hpt3x2n_find_mode(ap, adev->pio_mode); | ||
221 | - mode &= ~0x8000000; /* No FIFO in PIO */ | ||
222 | - mode &= ~0x30070000; /* Leave config bits alone */ | ||
223 | - reg &= 0x30070000; /* Strip timing bits */ | ||
224 | + mode &= 0xCFC3FFFF; /* Leave DMA bits alone */ | ||
225 | + reg &= ~0xCFC3FFFF; /* Strip timing bits */ | ||
226 | pci_write_config_dword(pdev, addr1, reg | mode); | ||
227 | } | ||
228 | |||
229 | @@ -204,8 +203,7 @@ static void hpt3x2n_set_dmamode(struct ata_port *ap, struct ata_device *adev) | ||
230 | { | ||
231 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | ||
232 | u32 addr1, addr2; | ||
233 | - u32 reg; | ||
234 | - u32 mode; | ||
235 | + u32 reg, mode, mask; | ||
236 | u8 fast; | ||
237 | |||
238 | addr1 = 0x40 + 4 * (adev->devno + 2 * ap->port_no); | ||
239 | @@ -216,11 +214,12 @@ static void hpt3x2n_set_dmamode(struct ata_port *ap, struct ata_device *adev) | ||
240 | fast &= ~0x07; | ||
241 | pci_write_config_byte(pdev, addr2, fast); | ||
242 | |||
243 | + mask = adev->dma_mode < XFER_UDMA_0 ? 0x31C001FF : 0x303C0000; | ||
244 | + | ||
245 | pci_read_config_dword(pdev, addr1, ®); | ||
246 | mode = hpt3x2n_find_mode(ap, adev->dma_mode); | ||
247 | - mode |= 0x8000000; /* FIFO in MWDMA or UDMA */ | ||
248 | - mode &= ~0xC0000000; /* Leave config bits alone */ | ||
249 | - reg &= 0xC0000000; /* Strip timing bits */ | ||
250 | + mode &= mask; | ||
251 | + reg &= ~mask; | ||
252 | pci_write_config_dword(pdev, addr1, reg | mode); | ||
253 | } | ||
254 | |||
255 | diff --git a/drivers/firewire/fw-ohci.c b/drivers/firewire/fw-ohci.c | ||
256 | index cd589ca..6869310 100644 | ||
257 | --- a/drivers/firewire/fw-ohci.c | ||
258 | +++ b/drivers/firewire/fw-ohci.c | ||
259 | @@ -2146,6 +2146,13 @@ ohci_queue_iso_receive_dualbuffer(struct fw_iso_context *base, | ||
260 | page = payload >> PAGE_SHIFT; | ||
261 | offset = payload & ~PAGE_MASK; | ||
262 | rest = p->payload_length; | ||
263 | + /* | ||
264 | + * The controllers I've tested have not worked correctly when | ||
265 | + * second_req_count is zero. Rather than do something we know won't | ||
266 | + * work, return an error | ||
267 | + */ | ||
268 | + if (rest == 0) | ||
269 | + return -EINVAL; | ||
270 | |||
271 | /* FIXME: make packet-per-buffer/dual-buffer a context option */ | ||
272 | while (rest > 0) { | ||
273 | @@ -2199,7 +2206,7 @@ ohci_queue_iso_receive_packet_per_buffer(struct fw_iso_context *base, | ||
274 | unsigned long payload) | ||
275 | { | ||
276 | struct iso_context *ctx = container_of(base, struct iso_context, base); | ||
277 | - struct descriptor *d = NULL, *pd = NULL; | ||
278 | + struct descriptor *d, *pd; | ||
279 | struct fw_iso_packet *p = packet; | ||
280 | dma_addr_t d_bus, page_bus; | ||
281 | u32 z, header_z, rest; | ||
282 | @@ -2237,8 +2244,9 @@ ohci_queue_iso_receive_packet_per_buffer(struct fw_iso_context *base, | ||
283 | d->data_address = cpu_to_le32(d_bus + (z * sizeof(*d))); | ||
284 | |||
285 | rest = payload_per_buffer; | ||
286 | + pd = d; | ||
287 | for (j = 1; j < z; j++) { | ||
288 | - pd = d + j; | ||
289 | + pd++; | ||
290 | pd->control = cpu_to_le16(DESCRIPTOR_STATUS | | ||
291 | DESCRIPTOR_INPUT_MORE); | ||
292 | |||
293 | diff --git a/drivers/media/common/tuners/mxl5007t.c b/drivers/media/common/tuners/mxl5007t.c | ||
294 | index cb25e43..4b975e6 100644 | ||
295 | --- a/drivers/media/common/tuners/mxl5007t.c | ||
296 | +++ b/drivers/media/common/tuners/mxl5007t.c | ||
297 | @@ -207,7 +207,7 @@ static void copy_reg_bits(struct reg_pair_t *reg_pair1, | ||
298 | i = j = 0; | ||
299 | |||
300 | while (reg_pair1[i].reg || reg_pair1[i].val) { | ||
301 | - while (reg_pair2[j].reg || reg_pair2[j].reg) { | ||
302 | + while (reg_pair2[j].reg || reg_pair2[j].val) { | ||
303 | if (reg_pair1[i].reg != reg_pair2[j].reg) { | ||
304 | j++; | ||
305 | continue; | ||
306 | diff --git a/drivers/ssb/sprom.c b/drivers/ssb/sprom.c | ||
307 | index 3668edb..17471a7 100644 | ||
308 | --- a/drivers/ssb/sprom.c | ||
309 | +++ b/drivers/ssb/sprom.c | ||
310 | @@ -13,6 +13,8 @@ | ||
311 | |||
312 | #include "ssb_private.h" | ||
313 | |||
314 | +#include <linux/ctype.h> | ||
315 | + | ||
316 | |||
317 | static int sprom2hex(const u16 *sprom, char *buf, size_t buf_len, | ||
318 | size_t sprom_size_words) | ||
319 | @@ -30,17 +32,27 @@ static int sprom2hex(const u16 *sprom, char *buf, size_t buf_len, | ||
320 | static int hex2sprom(u16 *sprom, const char *dump, size_t len, | ||
321 | size_t sprom_size_words) | ||
322 | { | ||
323 | - char tmp[5] = { 0 }; | ||
324 | - int cnt = 0; | ||
325 | + char c, tmp[5] = { 0 }; | ||
326 | + int err, cnt = 0; | ||
327 | unsigned long parsed; | ||
328 | |||
329 | - if (len < sprom_size_words * 2) | ||
330 | + /* Strip whitespace at the end. */ | ||
331 | + while (len) { | ||
332 | + c = dump[len - 1]; | ||
333 | + if (!isspace(c) && c != '\0') | ||
334 | + break; | ||
335 | + len--; | ||
336 | + } | ||
337 | + /* Length must match exactly. */ | ||
338 | + if (len != sprom_size_words * 4) | ||
339 | return -EINVAL; | ||
340 | |||
341 | while (cnt < sprom_size_words) { | ||
342 | memcpy(tmp, dump, 4); | ||
343 | dump += 4; | ||
344 | - parsed = simple_strtoul(tmp, NULL, 16); | ||
345 | + err = strict_strtoul(tmp, 16, &parsed); | ||
346 | + if (err) | ||
347 | + return err; | ||
348 | sprom[cnt++] = swab16((u16)parsed); | ||
349 | } | ||
350 | |||
351 | diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c | ||
352 | index e8a3938..1911589 100644 | ||
353 | --- a/drivers/usb/serial/mos7840.c | ||
354 | +++ b/drivers/usb/serial/mos7840.c | ||
355 | @@ -2453,9 +2453,14 @@ static int mos7840_startup(struct usb_serial *serial) | ||
356 | mos7840_set_port_private(serial->port[i], mos7840_port); | ||
357 | spin_lock_init(&mos7840_port->pool_lock); | ||
358 | |||
359 | - mos7840_port->port_num = ((serial->port[i]->number - | ||
360 | - (serial->port[i]->serial->minor)) + | ||
361 | - 1); | ||
362 | + /* minor is not initialised until later by | ||
363 | + * usb-serial.c:get_free_serial() and cannot therefore be used | ||
364 | + * to index device instances */ | ||
365 | + mos7840_port->port_num = i + 1; | ||
366 | + dbg ("serial->port[i]->number = %d", serial->port[i]->number); | ||
367 | + dbg ("serial->port[i]->serial->minor = %d", serial->port[i]->serial->minor); | ||
368 | + dbg ("mos7840_port->port_num = %d", mos7840_port->port_num); | ||
369 | + dbg ("serial->minor = %d", serial->minor); | ||
370 | |||
371 | if (mos7840_port->port_num == 1) { | ||
372 | mos7840_port->SpRegOffset = 0x0; | ||
373 | @@ -2666,10 +2671,12 @@ static void mos7840_disconnect(struct usb_serial *serial) | ||
374 | |||
375 | for (i = 0; i < serial->num_ports; ++i) { | ||
376 | mos7840_port = mos7840_get_port_private(serial->port[i]); | ||
377 | - spin_lock_irqsave(&mos7840_port->pool_lock, flags); | ||
378 | - mos7840_port->zombie = 1; | ||
379 | - spin_unlock_irqrestore(&mos7840_port->pool_lock, flags); | ||
380 | - usb_kill_urb(mos7840_port->control_urb); | ||
381 | + if (mos7840_port) { | ||
382 | + spin_lock_irqsave(&mos7840_port->pool_lock, flags); | ||
383 | + mos7840_port->zombie = 1; | ||
384 | + spin_unlock_irqrestore(&mos7840_port->pool_lock, flags); | ||
385 | + usb_kill_urb(mos7840_port->control_urb); | ||
386 | + } | ||
387 | } | ||
388 | |||
389 | dbg("%s\n", "Thank u ::"); | ||
390 | diff --git a/drivers/video/backlight/lcd.c b/drivers/video/backlight/lcd.c | ||
391 | index b15b2b8..b7c1a2c 100644 | ||
392 | --- a/drivers/video/backlight/lcd.c | ||
393 | +++ b/drivers/video/backlight/lcd.c | ||
394 | @@ -41,7 +41,7 @@ static int fb_notifier_callback(struct notifier_block *self, | ||
395 | |||
396 | static int lcd_register_fb(struct lcd_device *ld) | ||
397 | { | ||
398 | - memset(&ld->fb_notif, 0, sizeof(&ld->fb_notif)); | ||
399 | + memset(&ld->fb_notif, 0, sizeof(ld->fb_notif)); | ||
400 | ld->fb_notif.notifier_call = fb_notifier_callback; | ||
401 | return fb_register_client(&ld->fb_notif); | ||
402 | } | ||
403 | diff --git a/drivers/video/matrox/g450_pll.c b/drivers/video/matrox/g450_pll.c | ||
404 | index d42346e..3dcb6d2 100644 | ||
405 | --- a/drivers/video/matrox/g450_pll.c | ||
406 | +++ b/drivers/video/matrox/g450_pll.c | ||
407 | @@ -341,7 +341,8 @@ static int __g450_setclk(WPMINFO unsigned int fout, unsigned int pll, | ||
408 | M1064_XDVICLKCTRL_C1DVICLKEN | | ||
409 | M1064_XDVICLKCTRL_DVILOOPCTL | | ||
410 | M1064_XDVICLKCTRL_P1LOOPBWDTCTL; | ||
411 | - matroxfb_DAC_out(PMINFO M1064_XDVICLKCTRL,tmp); | ||
412 | + /* Setting this breaks PC systems so don't do it */ | ||
413 | + /* matroxfb_DAC_out(PMINFO M1064_XDVICLKCTRL,tmp); */ | ||
414 | matroxfb_DAC_out(PMINFO M1064_XPWRCTRL, | ||
415 | xpwrctrl); | ||
416 | |||
417 | diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c | ||
418 | index 08e28c9..1332dce 100644 | ||
419 | --- a/fs/debugfs/inode.c | ||
420 | +++ b/fs/debugfs/inode.c | ||
421 | @@ -32,7 +32,9 @@ | ||
422 | static struct vfsmount *debugfs_mount; | ||
423 | static int debugfs_mount_count; | ||
424 | |||
425 | -static struct inode *debugfs_get_inode(struct super_block *sb, int mode, dev_t dev) | ||
426 | +static struct inode *debugfs_get_inode(struct super_block *sb, int mode, dev_t dev, | ||
427 | + void *data, const struct file_operations *fops) | ||
428 | + | ||
429 | { | ||
430 | struct inode *inode = new_inode(sb); | ||
431 | |||
432 | @@ -47,14 +49,18 @@ static struct inode *debugfs_get_inode(struct super_block *sb, int mode, dev_t d | ||
433 | init_special_inode(inode, mode, dev); | ||
434 | break; | ||
435 | case S_IFREG: | ||
436 | - inode->i_fop = &debugfs_file_operations; | ||
437 | + inode->i_fop = fops ? fops : &debugfs_file_operations; | ||
438 | + inode->i_private = data; | ||
439 | break; | ||
440 | case S_IFLNK: | ||
441 | inode->i_op = &debugfs_link_operations; | ||
442 | + inode->i_fop = fops; | ||
443 | + inode->i_private = data; | ||
444 | break; | ||
445 | case S_IFDIR: | ||
446 | inode->i_op = &simple_dir_inode_operations; | ||
447 | - inode->i_fop = &simple_dir_operations; | ||
448 | + inode->i_fop = fops ? fops : &simple_dir_operations; | ||
449 | + inode->i_private = data; | ||
450 | |||
451 | /* directory inodes start off with i_nlink == 2 | ||
452 | * (for "." entry) */ | ||
453 | @@ -67,7 +73,8 @@ static struct inode *debugfs_get_inode(struct super_block *sb, int mode, dev_t d | ||
454 | |||
455 | /* SMP-safe */ | ||
456 | static int debugfs_mknod(struct inode *dir, struct dentry *dentry, | ||
457 | - int mode, dev_t dev) | ||
458 | + int mode, dev_t dev, void *data, | ||
459 | + const struct file_operations *fops) | ||
460 | { | ||
461 | struct inode *inode; | ||
462 | int error = -EPERM; | ||
463 | @@ -75,7 +82,7 @@ static int debugfs_mknod(struct inode *dir, struct dentry *dentry, | ||
464 | if (dentry->d_inode) | ||
465 | return -EEXIST; | ||
466 | |||
467 | - inode = debugfs_get_inode(dir->i_sb, mode, dev); | ||
468 | + inode = debugfs_get_inode(dir->i_sb, mode, dev, data, fops); | ||
469 | if (inode) { | ||
470 | d_instantiate(dentry, inode); | ||
471 | dget(dentry); | ||
472 | @@ -84,12 +91,13 @@ static int debugfs_mknod(struct inode *dir, struct dentry *dentry, | ||
473 | return error; | ||
474 | } | ||
475 | |||
476 | -static int debugfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | ||
477 | +static int debugfs_mkdir(struct inode *dir, struct dentry *dentry, int mode, | ||
478 | + void *data, const struct file_operations *fops) | ||
479 | { | ||
480 | int res; | ||
481 | |||
482 | mode = (mode & (S_IRWXUGO | S_ISVTX)) | S_IFDIR; | ||
483 | - res = debugfs_mknod(dir, dentry, mode, 0); | ||
484 | + res = debugfs_mknod(dir, dentry, mode, 0, data, fops); | ||
485 | if (!res) { | ||
486 | inc_nlink(dir); | ||
487 | fsnotify_mkdir(dir, dentry); | ||
488 | @@ -97,18 +105,20 @@ static int debugfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | ||
489 | return res; | ||
490 | } | ||
491 | |||
492 | -static int debugfs_link(struct inode *dir, struct dentry *dentry, int mode) | ||
493 | +static int debugfs_link(struct inode *dir, struct dentry *dentry, int mode, | ||
494 | + void *data, const struct file_operations *fops) | ||
495 | { | ||
496 | mode = (mode & S_IALLUGO) | S_IFLNK; | ||
497 | - return debugfs_mknod(dir, dentry, mode, 0); | ||
498 | + return debugfs_mknod(dir, dentry, mode, 0, data, fops); | ||
499 | } | ||
500 | |||
501 | -static int debugfs_create(struct inode *dir, struct dentry *dentry, int mode) | ||
502 | +static int debugfs_create(struct inode *dir, struct dentry *dentry, int mode, | ||
503 | + void *data, const struct file_operations *fops) | ||
504 | { | ||
505 | int res; | ||
506 | |||
507 | mode = (mode & S_IALLUGO) | S_IFREG; | ||
508 | - res = debugfs_mknod(dir, dentry, mode, 0); | ||
509 | + res = debugfs_mknod(dir, dentry, mode, 0, data, fops); | ||
510 | if (!res) | ||
511 | fsnotify_create(dir, dentry); | ||
512 | return res; | ||
513 | @@ -142,7 +152,9 @@ static struct file_system_type debug_fs_type = { | ||
514 | |||
515 | static int debugfs_create_by_name(const char *name, mode_t mode, | ||
516 | struct dentry *parent, | ||
517 | - struct dentry **dentry) | ||
518 | + struct dentry **dentry, | ||
519 | + void *data, | ||
520 | + const struct file_operations *fops) | ||
521 | { | ||
522 | int error = 0; | ||
523 | |||
524 | @@ -167,13 +179,16 @@ static int debugfs_create_by_name(const char *name, mode_t mode, | ||
525 | if (!IS_ERR(*dentry)) { | ||
526 | switch (mode & S_IFMT) { | ||
527 | case S_IFDIR: | ||
528 | - error = debugfs_mkdir(parent->d_inode, *dentry, mode); | ||
529 | + error = debugfs_mkdir(parent->d_inode, *dentry, mode, | ||
530 | + data, fops); | ||
531 | break; | ||
532 | case S_IFLNK: | ||
533 | - error = debugfs_link(parent->d_inode, *dentry, mode); | ||
534 | + error = debugfs_link(parent->d_inode, *dentry, mode, | ||
535 | + data, fops); | ||
536 | break; | ||
537 | default: | ||
538 | - error = debugfs_create(parent->d_inode, *dentry, mode); | ||
539 | + error = debugfs_create(parent->d_inode, *dentry, mode, | ||
540 | + data, fops); | ||
541 | break; | ||
542 | } | ||
543 | dput(*dentry); | ||
544 | @@ -224,19 +239,13 @@ struct dentry *debugfs_create_file(const char *name, mode_t mode, | ||
545 | if (error) | ||
546 | goto exit; | ||
547 | |||
548 | - error = debugfs_create_by_name(name, mode, parent, &dentry); | ||
549 | + error = debugfs_create_by_name(name, mode, parent, &dentry, | ||
550 | + data, fops); | ||
551 | if (error) { | ||
552 | dentry = NULL; | ||
553 | simple_release_fs(&debugfs_mount, &debugfs_mount_count); | ||
554 | goto exit; | ||
555 | } | ||
556 | - | ||
557 | - if (dentry->d_inode) { | ||
558 | - if (data) | ||
559 | - dentry->d_inode->i_private = data; | ||
560 | - if (fops) | ||
561 | - dentry->d_inode->i_fop = fops; | ||
562 | - } | ||
563 | exit: | ||
564 | return dentry; | ||
565 | } | ||
566 | diff --git a/fs/hfs/catalog.c b/fs/hfs/catalog.c | ||
567 | index 6d98f11..424b033 100644 | ||
568 | --- a/fs/hfs/catalog.c | ||
569 | +++ b/fs/hfs/catalog.c | ||
570 | @@ -289,6 +289,10 @@ int hfs_cat_move(u32 cnid, struct inode *src_dir, struct qstr *src_name, | ||
571 | err = hfs_brec_find(&src_fd); | ||
572 | if (err) | ||
573 | goto out; | ||
574 | + if (src_fd.entrylength > sizeof(entry) || src_fd.entrylength < 0) { | ||
575 | + err = -EIO; | ||
576 | + goto out; | ||
577 | + } | ||
578 | |||
579 | hfs_bnode_read(src_fd.bnode, &entry, src_fd.entryoffset, | ||
580 | src_fd.entrylength); | ||
581 | diff --git a/fs/hfs/dir.c b/fs/hfs/dir.c | ||
582 | index 7c69b98..2b3b861 100644 | ||
583 | --- a/fs/hfs/dir.c | ||
584 | +++ b/fs/hfs/dir.c | ||
585 | @@ -79,6 +79,11 @@ static int hfs_readdir(struct file *filp, void *dirent, filldir_t filldir) | ||
586 | filp->f_pos++; | ||
587 | /* fall through */ | ||
588 | case 1: | ||
589 | + if (fd.entrylength > sizeof(entry) || fd.entrylength < 0) { | ||
590 | + err = -EIO; | ||
591 | + goto out; | ||
592 | + } | ||
593 | + | ||
594 | hfs_bnode_read(fd.bnode, &entry, fd.entryoffset, fd.entrylength); | ||
595 | if (entry.type != HFS_CDR_THD) { | ||
596 | printk(KERN_ERR "hfs: bad catalog folder thread\n"); | ||
597 | @@ -109,6 +114,12 @@ static int hfs_readdir(struct file *filp, void *dirent, filldir_t filldir) | ||
598 | err = -EIO; | ||
599 | goto out; | ||
600 | } | ||
601 | + | ||
602 | + if (fd.entrylength > sizeof(entry) || fd.entrylength < 0) { | ||
603 | + err = -EIO; | ||
604 | + goto out; | ||
605 | + } | ||
606 | + | ||
607 | hfs_bnode_read(fd.bnode, &entry, fd.entryoffset, fd.entrylength); | ||
608 | type = entry.type; | ||
609 | len = hfs_mac2asc(sb, strbuf, &fd.key->cat.CName); | ||
610 | diff --git a/fs/hfs/super.c b/fs/hfs/super.c | ||
611 | index 4abb104..cd0d15d 100644 | ||
612 | --- a/fs/hfs/super.c | ||
613 | +++ b/fs/hfs/super.c | ||
614 | @@ -386,8 +386,13 @@ static int hfs_fill_super(struct super_block *sb, void *data, int silent) | ||
615 | /* try to get the root inode */ | ||
616 | hfs_find_init(HFS_SB(sb)->cat_tree, &fd); | ||
617 | res = hfs_cat_find_brec(sb, HFS_ROOT_CNID, &fd); | ||
618 | - if (!res) | ||
619 | + if (!res) { | ||
620 | + if (fd.entrylength > sizeof(rec) || fd.entrylength < 0) { | ||
621 | + res = -EIO; | ||
622 | + goto bail; | ||
623 | + } | ||
624 | hfs_bnode_read(fd.bnode, &rec, fd.entryoffset, fd.entrylength); | ||
625 | + } | ||
626 | if (res) { | ||
627 | hfs_find_exit(&fd); | ||
628 | goto bail_no_root; | ||
629 | diff --git a/fs/jffs2/gc.c b/fs/jffs2/gc.c | ||
630 | index 090c556..3b6f2fa 100644 | ||
631 | --- a/fs/jffs2/gc.c | ||
632 | +++ b/fs/jffs2/gc.c | ||
633 | @@ -700,7 +700,8 @@ static int jffs2_garbage_collect_metadata(struct jffs2_sb_info *c, struct jffs2_ | ||
634 | struct jffs2_raw_inode ri; | ||
635 | struct jffs2_node_frag *last_frag; | ||
636 | union jffs2_device_node dev; | ||
637 | - char *mdata = NULL, mdatalen = 0; | ||
638 | + char *mdata = NULL; | ||
639 | + int mdatalen = 0; | ||
640 | uint32_t alloclen, ilen; | ||
641 | int ret; | ||
642 | |||
643 | diff --git a/include/linux/sched.h b/include/linux/sched.h | ||
644 | index 09c5851..ebe801e 100644 | ||
645 | --- a/include/linux/sched.h | ||
646 | +++ b/include/linux/sched.h | ||
647 | @@ -1803,11 +1803,18 @@ static inline int is_si_special(const struct siginfo *info) | ||
648 | return info <= SEND_SIG_FORCED; | ||
649 | } | ||
650 | |||
651 | -/* True if we are on the alternate signal stack. */ | ||
652 | - | ||
653 | +/* | ||
654 | + * True if we are on the alternate signal stack. | ||
655 | + */ | ||
656 | static inline int on_sig_stack(unsigned long sp) | ||
657 | { | ||
658 | - return (sp - current->sas_ss_sp < current->sas_ss_size); | ||
659 | +#ifdef CONFIG_STACK_GROWSUP | ||
660 | + return sp >= current->sas_ss_sp && | ||
661 | + sp - current->sas_ss_sp < current->sas_ss_size; | ||
662 | +#else | ||
663 | + return sp > current->sas_ss_sp && | ||
664 | + sp - current->sas_ss_sp <= current->sas_ss_size; | ||
665 | +#endif | ||
666 | } | ||
667 | |||
668 | static inline int sas_ss_flags(unsigned long sp) |