Magellan Linux

Contents of /trunk/kernel26-alx/patches-2.6.27-r3/0129-2.6.27.30-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1176 - (show annotations) (download)
Thu Oct 14 15:11:06 2010 UTC (13 years, 6 months ago) by niro
File size: 30177 byte(s)
-2.6.27-alx-r3: new magellan 0.5.2 kernel
1 diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c
2 index 5259d8c..5d8fa67 100644
3 --- a/arch/parisc/kernel/cache.c
4 +++ b/arch/parisc/kernel/cache.c
5 @@ -398,12 +398,13 @@ EXPORT_SYMBOL(flush_kernel_icache_range_asm);
6
7 void clear_user_page_asm(void *page, unsigned long vaddr)
8 {
9 + unsigned long flags;
10 /* This function is implemented in assembly in pacache.S */
11 extern void __clear_user_page_asm(void *page, unsigned long vaddr);
12
13 - purge_tlb_start();
14 + purge_tlb_start(flags);
15 __clear_user_page_asm(page, vaddr);
16 - purge_tlb_end();
17 + purge_tlb_end(flags);
18 }
19
20 #define FLUSH_THRESHOLD 0x80000 /* 0.5MB */
21 @@ -444,20 +445,24 @@ extern void clear_user_page_asm(void *page, unsigned long vaddr);
22
23 void clear_user_page(void *page, unsigned long vaddr, struct page *pg)
24 {
25 + unsigned long flags;
26 +
27 purge_kernel_dcache_page((unsigned long)page);
28 - purge_tlb_start();
29 + purge_tlb_start(flags);
30 pdtlb_kernel(page);
31 - purge_tlb_end();
32 + purge_tlb_end(flags);
33 clear_user_page_asm(page, vaddr);
34 }
35 EXPORT_SYMBOL(clear_user_page);
36
37 void flush_kernel_dcache_page_addr(void *addr)
38 {
39 + unsigned long flags;
40 +
41 flush_kernel_dcache_page_asm(addr);
42 - purge_tlb_start();
43 + purge_tlb_start(flags);
44 pdtlb_kernel(addr);
45 - purge_tlb_end();
46 + purge_tlb_end(flags);
47 }
48 EXPORT_SYMBOL(flush_kernel_dcache_page_addr);
49
50 @@ -490,8 +495,10 @@ void __flush_tlb_range(unsigned long sid, unsigned long start,
51 if (npages >= 512) /* 2MB of space: arbitrary, should be tuned */
52 flush_tlb_all();
53 else {
54 + unsigned long flags;
55 +
56 mtsp(sid, 1);
57 - purge_tlb_start();
58 + purge_tlb_start(flags);
59 if (split_tlb) {
60 while (npages--) {
61 pdtlb(start);
62 @@ -504,7 +511,7 @@ void __flush_tlb_range(unsigned long sid, unsigned long start,
63 start += PAGE_SIZE;
64 }
65 }
66 - purge_tlb_end();
67 + purge_tlb_end(flags);
68 }
69 }
70
71 diff --git a/arch/parisc/kernel/pci-dma.c b/arch/parisc/kernel/pci-dma.c
72 index ccd61b9..6cc0be1 100644
73 --- a/arch/parisc/kernel/pci-dma.c
74 +++ b/arch/parisc/kernel/pci-dma.c
75 @@ -90,12 +90,14 @@ static inline int map_pte_uncached(pte_t * pte,
76 if (end > PMD_SIZE)
77 end = PMD_SIZE;
78 do {
79 + unsigned long flags;
80 +
81 if (!pte_none(*pte))
82 printk(KERN_ERR "map_pte_uncached: page already exists\n");
83 set_pte(pte, __mk_pte(*paddr_ptr, PAGE_KERNEL_UNC));
84 - purge_tlb_start();
85 + purge_tlb_start(flags);
86 pdtlb_kernel(orig_vaddr);
87 - purge_tlb_end();
88 + purge_tlb_end(flags);
89 vaddr += PAGE_SIZE;
90 orig_vaddr += PAGE_SIZE;
91 (*paddr_ptr) += PAGE_SIZE;
92 @@ -168,11 +170,13 @@ static inline void unmap_uncached_pte(pmd_t * pmd, unsigned long vaddr,
93 if (end > PMD_SIZE)
94 end = PMD_SIZE;
95 do {
96 + unsigned long flags;
97 +
98 pte_t page = *pte;
99 pte_clear(&init_mm, vaddr, pte);
100 - purge_tlb_start();
101 + purge_tlb_start(flags);
102 pdtlb_kernel(orig_vaddr);
103 - purge_tlb_end();
104 + purge_tlb_end(flags);
105 vaddr += PAGE_SIZE;
106 orig_vaddr += PAGE_SIZE;
107 pte++;
108 diff --git a/arch/x86/kernel/pci-gart_64.c b/arch/x86/kernel/pci-gart_64.c
109 index be33a54..eed133e 100644
110 --- a/arch/x86/kernel/pci-gart_64.c
111 +++ b/arch/x86/kernel/pci-gart_64.c
112 @@ -658,8 +658,6 @@ static __init int init_k8_gatt(struct agp_kern_info *info)
113 memset(gatt, 0, gatt_size);
114 agp_gatt_table = gatt;
115
116 - enable_gart_translations();
117 -
118 error = sysdev_class_register(&gart_sysdev_class);
119 if (!error)
120 error = sysdev_register(&device_gart);
121 @@ -828,6 +826,14 @@ void __init gart_iommu_init(void)
122 wbinvd();
123
124 /*
125 + * Now all caches are flushed and we can safely enable
126 + * GART hardware. Doing it early leaves the possibility
127 + * of stale cache entries that can lead to GART PTE
128 + * errors.
129 + */
130 + enable_gart_translations();
131 +
132 + /*
133 * Try to workaround a bug (thanks to BenH):
134 * Set unmapped entries to a scratch page instead of 0.
135 * Any prefetches that hit unmapped entries won't get an bus abort
136 diff --git a/block/Kconfig b/block/Kconfig
137 index 1ab7c15..150e21d 100644
138 --- a/block/Kconfig
139 +++ b/block/Kconfig
140 @@ -67,9 +67,9 @@ config LSF
141 If unsure, say Y.
142
143 config BLK_DEV_BSG
144 - bool "Block layer SG support v4 (EXPERIMENTAL)"
145 - depends on EXPERIMENTAL
146 - ---help---
147 + bool "Block layer SG support v4"
148 + default y
149 + help
150 Saying Y here will enable generic SG (SCSI generic) v4 support
151 for any block device.
152
153 @@ -79,7 +79,10 @@ config BLK_DEV_BSG
154 protocols (e.g. Task Management Functions and SMP in Serial
155 Attached SCSI).
156
157 - If unsure, say N.
158 + This option is required by recent UDEV versions to properly
159 + access device serial numbers, etc.
160 +
161 + If unsure, say Y.
162
163 config BLK_DEV_INTEGRITY
164 bool "Block layer data integrity support"
165 diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c
166 index 716370c..e56f805 100644
167 --- a/drivers/firewire/fw-sbp2.c
168 +++ b/drivers/firewire/fw-sbp2.c
169 @@ -188,6 +188,12 @@ struct sbp2_target {
170 #define SBP2_RETRY_LIMIT 0xf /* 15 retries */
171 #define SBP2_CYCLE_LIMIT (0xc8 << 12) /* 200 125us cycles */
172
173 +/*
174 + * There is no transport protocol limit to the CDB length, but we implement
175 + * a fixed length only. 16 bytes is enough for disks larger than 2 TB.
176 + */
177 +#define SBP2_MAX_CDB_SIZE 16
178 +
179 /* Unit directory keys */
180 #define SBP2_CSR_UNIT_CHARACTERISTICS 0x3a
181 #define SBP2_CSR_FIRMWARE_REVISION 0x3c
182 @@ -293,7 +299,7 @@ struct sbp2_command_orb {
183 struct sbp2_pointer next;
184 struct sbp2_pointer data_descriptor;
185 __be32 misc;
186 - u8 command_block[12];
187 + u8 command_block[SBP2_MAX_CDB_SIZE];
188 } request;
189 struct scsi_cmnd *cmd;
190 scsi_done_fn_t done;
191 @@ -1159,6 +1165,8 @@ static int sbp2_probe(struct device *dev)
192 if (fw_device_enable_phys_dma(device) < 0)
193 goto fail_shost_put;
194
195 + shost->max_cmd_len = SBP2_MAX_CDB_SIZE;
196 +
197 if (scsi_add_host(shost, &unit->device) < 0)
198 goto fail_shost_put;
199
200 diff --git a/drivers/hwmon/smsc47m1.c b/drivers/hwmon/smsc47m1.c
201 index d1b4985..fa72f5f 100644
202 --- a/drivers/hwmon/smsc47m1.c
203 +++ b/drivers/hwmon/smsc47m1.c
204 @@ -85,6 +85,7 @@ superio_exit(void)
205 #define SUPERIO_REG_ACT 0x30
206 #define SUPERIO_REG_BASE 0x60
207 #define SUPERIO_REG_DEVID 0x20
208 +#define SUPERIO_REG_DEVREV 0x21
209
210 /* Logical device registers */
211
212 @@ -428,6 +429,9 @@ static int __init smsc47m1_find(unsigned short *addr,
213 * The LPC47M292 (device id 0x6B) is somewhat compatible, but it
214 * supports a 3rd fan, and the pin configuration registers are
215 * unfortunately different.
216 + * The LPC47M233 has the same device id (0x6B) but is not compatible.
217 + * We check the high bit of the device revision register to
218 + * differentiate them.
219 */
220 switch (val) {
221 case 0x51:
222 @@ -447,6 +451,13 @@ static int __init smsc47m1_find(unsigned short *addr,
223 sio_data->type = smsc47m1;
224 break;
225 case 0x6B:
226 + if (superio_inb(SUPERIO_REG_DEVREV) & 0x80) {
227 + pr_debug(DRVNAME ": "
228 + "Found SMSC LPC47M233, unsupported\n");
229 + superio_exit();
230 + return -ENODEV;
231 + }
232 +
233 pr_info(DRVNAME ": Found SMSC LPC47M292\n");
234 sio_data->type = smsc47m2;
235 break;
236 diff --git a/drivers/i2c/chips/tsl2550.c b/drivers/i2c/chips/tsl2550.c
237 index 1a9cc13..b96f302 100644
238 --- a/drivers/i2c/chips/tsl2550.c
239 +++ b/drivers/i2c/chips/tsl2550.c
240 @@ -27,7 +27,7 @@
241 #include <linux/delay.h>
242
243 #define TSL2550_DRV_NAME "tsl2550"
244 -#define DRIVER_VERSION "1.1.1"
245 +#define DRIVER_VERSION "1.1.2"
246
247 /*
248 * Defines
249 @@ -189,13 +189,16 @@ static int tsl2550_calculate_lux(u8 ch0, u8 ch1)
250 u8 r = 128;
251
252 /* Avoid division by 0 and count 1 cannot be greater than count 0 */
253 - if (c0 && (c1 <= c0))
254 - r = c1 * 128 / c0;
255 + if (c1 <= c0)
256 + if (c0) {
257 + r = c1 * 128 / c0;
258 +
259 + /* Calculate LUX */
260 + lux = ((c0 - c1) * ratio_lut[r]) / 256;
261 + } else
262 + lux = 0;
263 else
264 - return -1;
265 -
266 - /* Calculate LUX */
267 - lux = ((c0 - c1) * ratio_lut[r]) / 256;
268 + return -EAGAIN;
269
270 /* LUX range check */
271 return lux > TSL2550_MAX_LUX ? TSL2550_MAX_LUX : lux;
272 diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c
273 index 0c0fdbb..e21c2d5 100644
274 --- a/drivers/ieee1394/sbp2.c
275 +++ b/drivers/ieee1394/sbp2.c
276 @@ -874,6 +874,7 @@ static struct sbp2_lu *sbp2_alloc_device(struct unit_directory *ud)
277 }
278
279 shost->hostdata[0] = (unsigned long)lu;
280 + shost->max_cmd_len = SBP2_MAX_CDB_SIZE;
281
282 if (!scsi_add_host(shost, &ud->device)) {
283 lu->shost = shost;
284 diff --git a/drivers/ieee1394/sbp2.h b/drivers/ieee1394/sbp2.h
285 index 875428b..e547b16 100644
286 --- a/drivers/ieee1394/sbp2.h
287 +++ b/drivers/ieee1394/sbp2.h
288 @@ -25,6 +25,12 @@
289 #define SBP2_DEVICE_NAME "sbp2"
290
291 /*
292 + * There is no transport protocol limit to the CDB length, but we implement
293 + * a fixed length only. 16 bytes is enough for disks larger than 2 TB.
294 + */
295 +#define SBP2_MAX_CDB_SIZE 16
296 +
297 +/*
298 * SBP-2 specific definitions
299 */
300
301 @@ -51,7 +57,7 @@ struct sbp2_command_orb {
302 u32 data_descriptor_hi;
303 u32 data_descriptor_lo;
304 u32 misc;
305 - u8 cdb[12];
306 + u8 cdb[SBP2_MAX_CDB_SIZE];
307 } __attribute__((packed));
308
309 #define SBP2_LOGIN_REQUEST 0x0
310 diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
311 index a726f3b..52174d9 100644
312 --- a/drivers/misc/Kconfig
313 +++ b/drivers/misc/Kconfig
314 @@ -321,6 +321,7 @@ config THINKPAD_ACPI_DOCK
315 bool "Legacy Docking Station Support"
316 depends on THINKPAD_ACPI
317 depends on ACPI_DOCK=n
318 + depends on BROKEN
319 default n
320 ---help---
321 Allows the thinkpad_acpi driver to handle docking station events.
322 @@ -334,7 +335,8 @@ config THINKPAD_ACPI_DOCK
323 config THINKPAD_ACPI_BAY
324 bool "Legacy Removable Bay Support"
325 depends on THINKPAD_ACPI
326 - default y
327 + depends on BROKEN
328 + default n
329 ---help---
330 Allows the thinkpad_acpi driver to handle removable bays. It will
331 electrically disable the device in the bay, and also generate
332 diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c
333 index 375a0bd..ec4204a 100644
334 --- a/drivers/net/usb/asix.c
335 +++ b/drivers/net/usb/asix.c
336 @@ -1456,6 +1456,14 @@ static const struct usb_device_id products [] = {
337 // ASIX 88772a
338 USB_DEVICE(0x0db0, 0xa877),
339 .driver_info = (unsigned long) &ax88772_info,
340 +}, {
341 + // ABOCOM for pci
342 + USB_DEVICE(0x14ea, 0xab11),
343 + .driver_info = (unsigned long) &ax88178_info,
344 +}, {
345 + // ASIX 88772a
346 + USB_DEVICE(0x0db0, 0xa877),
347 + .driver_info = (unsigned long) &ax88772_info,
348 },
349 { }, // END
350 };
351 diff --git a/drivers/scsi/libsas/sas_port.c b/drivers/scsi/libsas/sas_port.c
352 index 139935a..ad02d57 100644
353 --- a/drivers/scsi/libsas/sas_port.c
354 +++ b/drivers/scsi/libsas/sas_port.c
355 @@ -56,7 +56,7 @@ static void sas_form_port(struct asd_sas_phy *phy)
356 }
357 }
358
359 - /* find a port */
360 + /* see if the phy should be part of a wide port */
361 spin_lock_irqsave(&sas_ha->phy_port_lock, flags);
362 for (i = 0; i < sas_ha->num_phys; i++) {
363 port = sas_ha->sas_port[i];
364 @@ -69,12 +69,23 @@ static void sas_form_port(struct asd_sas_phy *phy)
365 SAS_DPRINTK("phy%d matched wide port%d\n", phy->id,
366 port->id);
367 break;
368 - } else if (*(u64 *) port->sas_addr == 0 && port->num_phys==0) {
369 - memcpy(port->sas_addr, phy->sas_addr, SAS_ADDR_SIZE);
370 - break;
371 }
372 spin_unlock(&port->phy_list_lock);
373 }
374 + /* The phy does not match any existing port, create a new one */
375 + if (i == sas_ha->num_phys) {
376 + for (i = 0; i < sas_ha->num_phys; i++) {
377 + port = sas_ha->sas_port[i];
378 + spin_lock(&port->phy_list_lock);
379 + if (*(u64 *)port->sas_addr == 0
380 + && port->num_phys == 0) {
381 + memcpy(port->sas_addr, phy->sas_addr,
382 + SAS_ADDR_SIZE);
383 + break;
384 + }
385 + spin_unlock(&port->phy_list_lock);
386 + }
387 + }
388
389 if (i >= sas_ha->num_phys) {
390 printk(KERN_NOTICE "%s: couldn't find a free port, bug?\n",
391 diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
392 index 1ff88af..33b2935 100644
393 --- a/drivers/usb/core/devio.c
394 +++ b/drivers/usb/core/devio.c
395 @@ -579,7 +579,7 @@ static int usbdev_open(struct inode *inode, struct file *file)
396 if (!ps)
397 goto out;
398
399 - ret = -ENOENT;
400 + ret = -ENODEV;
401
402 /* usbdev device-node */
403 if (imajor(inode) == USB_DEVICE_MAJOR)
404 @@ -1305,7 +1305,8 @@ static int get_urb32(struct usbdevfs_urb *kurb,
405 struct usbdevfs_urb32 __user *uurb)
406 {
407 __u32 uptr;
408 - if (get_user(kurb->type, &uurb->type) ||
409 + if (!access_ok(VERIFY_READ, uurb, sizeof(*uurb)) ||
410 + __get_user(kurb->type, &uurb->type) ||
411 __get_user(kurb->endpoint, &uurb->endpoint) ||
412 __get_user(kurb->status, &uurb->status) ||
413 __get_user(kurb->flags, &uurb->flags) ||
414 @@ -1522,8 +1523,9 @@ static int proc_ioctl_compat(struct dev_state *ps, compat_uptr_t arg)
415 u32 udata;
416
417 uioc = compat_ptr((long)arg);
418 - if (get_user(ctrl.ifno, &uioc->ifno) ||
419 - get_user(ctrl.ioctl_code, &uioc->ioctl_code) ||
420 + if (!access_ok(VERIFY_READ, uioc, sizeof(*uioc)) ||
421 + __get_user(ctrl.ifno, &uioc->ifno) ||
422 + __get_user(ctrl.ioctl_code, &uioc->ioctl_code) ||
423 __get_user(udata, &uioc->data))
424 return -EFAULT;
425 ctrl.data = compat_ptr(udata);
426 diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
427 index 13b34bc..c3089c9 100644
428 --- a/drivers/usb/serial/ftdi_sio.c
429 +++ b/drivers/usb/serial/ftdi_sio.c
430 @@ -663,6 +663,9 @@ static struct usb_device_id id_table_combined [] = {
431 { USB_DEVICE(ADI_VID, ADI_GNICE_PID),
432 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
433 { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) },
434 + { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) },
435 + { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID),
436 + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
437 { }, /* Optional parameter entry */
438 { } /* Terminating entry */
439 };
440 diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h
441 index 3425122..c1a6be7 100644
442 --- a/drivers/usb/serial/ftdi_sio.h
443 +++ b/drivers/usb/serial/ftdi_sio.h
444 @@ -897,6 +897,20 @@
445 #define JETI_SPC1201_PID 0x04b2
446
447 /*
448 + * Bayer Ascensia Contour blood glucose meter USB-converter cable.
449 + * http://winglucofacts.com/cables/
450 + */
451 +#define BAYER_VID 0x1A79
452 +#define BAYER_CONTOUR_CABLE_PID 0x6001
453 +
454 +/*
455 + * Marvell OpenRD Base, Client
456 + * http://www.open-rd.org
457 + * OpenRD Base, Client use VID 0x0403
458 + */
459 +#define MARVELL_OPENRD_PID 0x9e90
460 +
461 +/*
462 * BmRequestType: 1100 0000b
463 * bRequest: FTDI_E2_READ
464 * wValue: 0
465 diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
466 index 861e308..5d4f9d6 100644
467 --- a/drivers/usb/storage/transport.c
468 +++ b/drivers/usb/storage/transport.c
469 @@ -961,7 +961,7 @@ int usb_stor_Bulk_max_lun(struct us_data *us)
470 US_BULK_GET_MAX_LUN,
471 USB_DIR_IN | USB_TYPE_CLASS |
472 USB_RECIP_INTERFACE,
473 - 0, us->ifnum, us->iobuf, 1, HZ);
474 + 0, us->ifnum, us->iobuf, 1, 10*HZ);
475
476 US_DEBUGP("GetMaxLUN command result is %d, data is %d\n",
477 result, us->iobuf[0]);
478 diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
479 index 65115a5..17e9626 100644
480 --- a/drivers/usb/storage/unusual_devs.h
481 +++ b/drivers/usb/storage/unusual_devs.h
482 @@ -989,6 +989,13 @@ UNUSUAL_DEV( 0x066f, 0x8000, 0x0001, 0x0001,
483 US_SC_DEVICE, US_PR_DEVICE, NULL,
484 US_FL_FIX_CAPACITY ),
485
486 +/* Reported by Rogerio Brito <rbrito@ime.usp.br> */
487 +UNUSUAL_DEV( 0x067b, 0x2317, 0x0001, 0x001,
488 + "Prolific Technology, Inc.",
489 + "Mass Storage Device",
490 + US_SC_DEVICE, US_PR_DEVICE, NULL,
491 + US_FL_NOT_LOCKABLE ),
492 +
493 /* Reported by Richard -=[]=- <micro_flyer@hotmail.com> */
494 /* Change to bcdDeviceMin (0x0100 to 0x0001) reported by
495 * Thomas Bartosik <tbartdev@gmx-topmail.de> */
496 diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
497 index dfc0197..25200e6 100644
498 --- a/fs/binfmt_flat.c
499 +++ b/fs/binfmt_flat.c
500 @@ -824,15 +824,22 @@ static int load_flat_shared_library(int id, struct lib_info *libs)
501 if (IS_ERR(bprm.file))
502 return res;
503
504 + bprm.cred = prepare_exec_creds();
505 + res = -ENOMEM;
506 + if (!bprm.cred)
507 + goto out;
508 +
509 res = prepare_binprm(&bprm);
510
511 if (res <= (unsigned long)-4096)
512 res = load_flat_file(&bprm, libs, id, NULL);
513 - if (bprm.file) {
514 - allow_write_access(bprm.file);
515 - fput(bprm.file);
516 - bprm.file = NULL;
517 - }
518 +
519 + abort_creds(bprm.cred);
520 +
521 +out:
522 + allow_write_access(bprm.file);
523 + fput(bprm.file);
524 +
525 return(res);
526 }
527
528 diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c
529 index 61cb48f..994ca87 100644
530 --- a/fs/compat_ioctl.c
531 +++ b/fs/compat_ioctl.c
532 @@ -1910,6 +1910,7 @@ COMPATIBLE_IOCTL(FIONCLEX)
533 COMPATIBLE_IOCTL(FIOASYNC)
534 COMPATIBLE_IOCTL(FIONBIO)
535 COMPATIBLE_IOCTL(FIONREAD) /* This is also TIOCINQ */
536 +COMPATIBLE_IOCTL(FS_IOC_FIEMAP)
537 /* 0x00 */
538 COMPATIBLE_IOCTL(FIBMAP)
539 COMPATIBLE_IOCTL(FIGETBSZ)
540 diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
541 index 08f6b04..630feb3 100644
542 --- a/fs/nfs/direct.c
543 +++ b/fs/nfs/direct.c
544 @@ -255,7 +255,7 @@ static void nfs_direct_read_release(void *calldata)
545
546 if (put_dreq(dreq))
547 nfs_direct_complete(dreq);
548 - nfs_readdata_release(calldata);
549 + nfs_readdata_free(data);
550 }
551
552 static const struct rpc_call_ops nfs_read_direct_ops = {
553 @@ -311,14 +311,14 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_direct_req *dreq,
554 data->npages, 1, 0, data->pagevec, NULL);
555 up_read(&current->mm->mmap_sem);
556 if (result < 0) {
557 - nfs_readdata_release(data);
558 + nfs_readdata_free(data);
559 break;
560 }
561 if ((unsigned)result < data->npages) {
562 bytes = result * PAGE_SIZE;
563 if (bytes <= pgbase) {
564 nfs_direct_release_pages(data->pagevec, result);
565 - nfs_readdata_release(data);
566 + nfs_readdata_free(data);
567 break;
568 }
569 bytes -= pgbase;
570 @@ -331,7 +331,7 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_direct_req *dreq,
571 data->inode = inode;
572 data->cred = msg.rpc_cred;
573 data->args.fh = NFS_FH(inode);
574 - data->args.context = get_nfs_open_context(ctx);
575 + data->args.context = ctx;
576 data->args.offset = pos;
577 data->args.pgbase = pgbase;
578 data->args.pages = data->pagevec;
579 @@ -438,7 +438,7 @@ static void nfs_direct_free_writedata(struct nfs_direct_req *dreq)
580 struct nfs_write_data *data = list_entry(dreq->rewrite_list.next, struct nfs_write_data, pages);
581 list_del(&data->pages);
582 nfs_direct_release_pages(data->pagevec, data->npages);
583 - nfs_writedata_release(data);
584 + nfs_writedata_free(data);
585 }
586 }
587
588 @@ -531,7 +531,7 @@ static void nfs_direct_commit_release(void *calldata)
589
590 dprintk("NFS: %5u commit returned %d\n", data->task.tk_pid, status);
591 nfs_direct_write_complete(dreq, data->inode);
592 - nfs_commitdata_release(calldata);
593 + nfs_commit_free(data);
594 }
595
596 static const struct rpc_call_ops nfs_commit_direct_ops = {
597 @@ -564,7 +564,7 @@ static void nfs_direct_commit_schedule(struct nfs_direct_req *dreq)
598 data->args.fh = NFS_FH(data->inode);
599 data->args.offset = 0;
600 data->args.count = 0;
601 - data->args.context = get_nfs_open_context(dreq->ctx);
602 + data->args.context = dreq->ctx;
603 data->res.count = 0;
604 data->res.fattr = &data->fattr;
605 data->res.verf = &data->verf;
606 @@ -725,14 +725,14 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_direct_req *dreq,
607 data->npages, 0, 0, data->pagevec, NULL);
608 up_read(&current->mm->mmap_sem);
609 if (result < 0) {
610 - nfs_writedata_release(data);
611 + nfs_writedata_free(data);
612 break;
613 }
614 if ((unsigned)result < data->npages) {
615 bytes = result * PAGE_SIZE;
616 if (bytes <= pgbase) {
617 nfs_direct_release_pages(data->pagevec, result);
618 - nfs_writedata_release(data);
619 + nfs_writedata_free(data);
620 break;
621 }
622 bytes -= pgbase;
623 @@ -747,7 +747,7 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_direct_req *dreq,
624 data->inode = inode;
625 data->cred = msg.rpc_cred;
626 data->args.fh = NFS_FH(inode);
627 - data->args.context = get_nfs_open_context(ctx);
628 + data->args.context = ctx;
629 data->args.offset = pos;
630 data->args.pgbase = pgbase;
631 data->args.pages = data->pagevec;
632 diff --git a/fs/nfs/read.c b/fs/nfs/read.c
633 index f856004..ff41222 100644
634 --- a/fs/nfs/read.c
635 +++ b/fs/nfs/read.c
636 @@ -58,17 +58,15 @@ struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount)
637 return p;
638 }
639
640 -static void nfs_readdata_free(struct nfs_read_data *p)
641 +void nfs_readdata_free(struct nfs_read_data *p)
642 {
643 if (p && (p->pagevec != &p->page_array[0]))
644 kfree(p->pagevec);
645 mempool_free(p, nfs_rdata_mempool);
646 }
647
648 -void nfs_readdata_release(void *data)
649 +static void nfs_readdata_release(struct nfs_read_data *rdata)
650 {
651 - struct nfs_read_data *rdata = data;
652 -
653 put_nfs_open_context(rdata->args.context);
654 nfs_readdata_free(rdata);
655 }
656 diff --git a/fs/nfs/write.c b/fs/nfs/write.c
657 index 3229e21..84f4e75 100644
658 --- a/fs/nfs/write.c
659 +++ b/fs/nfs/write.c
660 @@ -84,17 +84,15 @@ struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount)
661 return p;
662 }
663
664 -static void nfs_writedata_free(struct nfs_write_data *p)
665 +void nfs_writedata_free(struct nfs_write_data *p)
666 {
667 if (p && (p->pagevec != &p->page_array[0]))
668 kfree(p->pagevec);
669 mempool_free(p, nfs_wdata_mempool);
670 }
671
672 -void nfs_writedata_release(void *data)
673 +static void nfs_writedata_release(struct nfs_write_data *wdata)
674 {
675 - struct nfs_write_data *wdata = data;
676 -
677 put_nfs_open_context(wdata->args.context);
678 nfs_writedata_free(wdata);
679 }
680 diff --git a/fs/proc/base.c b/fs/proc/base.c
681 index a488f61..76f9ffc 100644
682 --- a/fs/proc/base.c
683 +++ b/fs/proc/base.c
684 @@ -240,22 +240,19 @@ static int check_mem_permission(struct task_struct *task)
685 struct mm_struct *mm_for_maps(struct task_struct *task)
686 {
687 struct mm_struct *mm = get_task_mm(task);
688 - if (!mm)
689 - return NULL;
690 - down_read(&mm->mmap_sem);
691 - task_lock(task);
692 - if (task->mm != mm)
693 - goto out;
694 - if (task->mm != current->mm &&
695 - __ptrace_may_access(task, PTRACE_MODE_READ) < 0)
696 - goto out;
697 - task_unlock(task);
698 +
699 + if (mm && mm != current->mm) {
700 + /*
701 + * task->mm can be changed before security check,
702 + * in that case we must notice the change after.
703 + */
704 + if (!ptrace_may_access(task, PTRACE_MODE_READ) ||
705 + mm != task->mm) {
706 + mmput(mm);
707 + mm = NULL;
708 + }
709 + }
710 return mm;
711 -out:
712 - task_unlock(task);
713 - up_read(&mm->mmap_sem);
714 - mmput(mm);
715 - return NULL;
716 }
717
718 static int proc_pid_cmdline(struct task_struct *task, char * buffer)
719 diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
720 index c7f64a9..d8be92a 100644
721 --- a/fs/proc/task_mmu.c
722 +++ b/fs/proc/task_mmu.c
723 @@ -119,6 +119,7 @@ static void *m_start(struct seq_file *m, loff_t *pos)
724 mm = mm_for_maps(priv->task);
725 if (!mm)
726 return NULL;
727 + down_read(&mm->mmap_sem);
728
729 tail_vma = get_gate_vma(priv->task);
730 priv->tail_vma = tail_vma;
731 diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c
732 index 5d84e71..737d219 100644
733 --- a/fs/proc/task_nommu.c
734 +++ b/fs/proc/task_nommu.c
735 @@ -137,6 +137,7 @@ static void *m_start(struct seq_file *m, loff_t *pos)
736 priv->task = NULL;
737 return NULL;
738 }
739 + down_read(&mm->mmap_sem);
740
741 /* start from the Nth VMA */
742 for (vml = mm->context.vmlist; vml; vml = vml->next)
743 diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c
744 index aedaeba..6def64c 100644
745 --- a/fs/sysfs/dir.c
746 +++ b/fs/sysfs/dir.c
747 @@ -914,8 +914,10 @@ again:
748 /* Remove from old parent's list and insert into new parent's list. */
749 sysfs_unlink_sibling(sd);
750 sysfs_get(new_parent_sd);
751 + drop_nlink(old_parent->d_inode);
752 sysfs_put(sd->s_parent);
753 sd->s_parent = new_parent_sd;
754 + inc_nlink(new_parent->d_inode);
755 sysfs_link_sibling(sd);
756
757 out_unlock:
758 diff --git a/include/asm-parisc/tlbflush.h b/include/asm-parisc/tlbflush.h
759 index 1f6fd4f..9c5d646 100644
760 --- a/include/asm-parisc/tlbflush.h
761 +++ b/include/asm-parisc/tlbflush.h
762 @@ -12,14 +12,12 @@
763 * N class systems, only one PxTLB inter processor broadcast can be
764 * active at any one time on the Merced bus. This tlb purge
765 * synchronisation is fairly lightweight and harmless so we activate
766 - * it on all SMP systems not just the N class. We also need to have
767 - * preemption disabled on uniprocessor machines, and spin_lock does that
768 - * nicely.
769 + * it on all systems not just the N class.
770 */
771 extern spinlock_t pa_tlb_lock;
772
773 -#define purge_tlb_start(x) spin_lock(&pa_tlb_lock)
774 -#define purge_tlb_end(x) spin_unlock(&pa_tlb_lock)
775 +#define purge_tlb_start(flags) spin_lock_irqsave(&pa_tlb_lock, flags)
776 +#define purge_tlb_end(flags) spin_unlock_irqrestore(&pa_tlb_lock, flags)
777
778 extern void flush_tlb_all(void);
779 extern void flush_tlb_all_local(void *);
780 @@ -63,14 +61,15 @@ static inline void flush_tlb_mm(struct mm_struct *mm)
781 static inline void flush_tlb_page(struct vm_area_struct *vma,
782 unsigned long addr)
783 {
784 + unsigned long flags;
785 /* For one page, it's not worth testing the split_tlb variable */
786
787 mb();
788 mtsp(vma->vm_mm->context,1);
789 - purge_tlb_start();
790 + purge_tlb_start(flags);
791 pdtlb(addr);
792 pitlb(addr);
793 - purge_tlb_end();
794 + purge_tlb_end(flags);
795 }
796
797 void __flush_tlb_range(unsigned long sid,
798 diff --git a/include/asm-x86/irqflags.h b/include/asm-x86/irqflags.h
799 index 424acb4..f57f2fb 100644
800 --- a/include/asm-x86/irqflags.h
801 +++ b/include/asm-x86/irqflags.h
802 @@ -12,9 +12,15 @@ static inline unsigned long native_save_fl(void)
803 {
804 unsigned long flags;
805
806 + /*
807 + * Note: this needs to be "=r" not "=rm", because we have the
808 + * stack offset from what gcc expects at the time the "pop" is
809 + * executed, and so a memory reference with respect to the stack
810 + * would end up using the wrong address.
811 + */
812 asm volatile("# __raw_save_flags\n\t"
813 "pushf ; pop %0"
814 - : "=g" (flags)
815 + : "=r" (flags)
816 : /* no input */
817 : "memory");
818
819 diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h
820 index 78a5922..0dee17c 100644
821 --- a/include/linux/nfs_fs.h
822 +++ b/include/linux/nfs_fs.h
823 @@ -461,7 +461,6 @@ extern int nfs_writepages(struct address_space *, struct writeback_control *);
824 extern int nfs_flush_incompatible(struct file *file, struct page *page);
825 extern int nfs_updatepage(struct file *, struct page *, unsigned int, unsigned int);
826 extern int nfs_writeback_done(struct rpc_task *, struct nfs_write_data *);
827 -extern void nfs_writedata_release(void *);
828
829 /*
830 * Try to write back everything synchronously (but check the
831 @@ -476,7 +475,6 @@ extern int nfs_wb_page_cancel(struct inode *inode, struct page* page);
832 extern int nfs_commit_inode(struct inode *, int);
833 extern struct nfs_write_data *nfs_commitdata_alloc(void);
834 extern void nfs_commit_free(struct nfs_write_data *wdata);
835 -extern void nfs_commitdata_release(void *wdata);
836 #else
837 static inline int
838 nfs_commit_inode(struct inode *inode, int how)
839 @@ -495,6 +493,7 @@ nfs_have_writebacks(struct inode *inode)
840 * Allocate nfs_write_data structures
841 */
842 extern struct nfs_write_data *nfs_writedata_alloc(unsigned int npages);
843 +extern void nfs_writedata_free(struct nfs_write_data *);
844
845 /*
846 * linux/fs/nfs/read.c
847 @@ -503,12 +502,12 @@ extern int nfs_readpage(struct file *, struct page *);
848 extern int nfs_readpages(struct file *, struct address_space *,
849 struct list_head *, unsigned);
850 extern int nfs_readpage_result(struct rpc_task *, struct nfs_read_data *);
851 -extern void nfs_readdata_release(void *data);
852
853 /*
854 * Allocate nfs_read_data structures
855 */
856 extern struct nfs_read_data *nfs_readdata_alloc(unsigned int npages);
857 +extern void nfs_readdata_free(struct nfs_read_data *);
858
859 /*
860 * linux/fs/nfs3proc.c
861 diff --git a/kernel/fork.c b/kernel/fork.c
862 index 843ce75..fcbd28c 100644
863 --- a/kernel/fork.c
864 +++ b/kernel/fork.c
865 @@ -536,18 +536,18 @@ void mm_release(struct task_struct *tsk, struct mm_struct *mm)
866 * the value intact in a core dump, and to save the unnecessary
867 * trouble otherwise. Userland only wants this done for a sys_exit.
868 */
869 - if (tsk->clear_child_tid
870 - && !(tsk->flags & PF_SIGNALED)
871 - && atomic_read(&mm->mm_users) > 1) {
872 - u32 __user * tidptr = tsk->clear_child_tid;
873 + if (tsk->clear_child_tid) {
874 + if (!(tsk->flags & PF_SIGNALED) &&
875 + atomic_read(&mm->mm_users) > 1) {
876 + /*
877 + * We don't check the error code - if userspace has
878 + * not set up a proper pointer then tough luck.
879 + */
880 + put_user(0, tsk->clear_child_tid);
881 + sys_futex(tsk->clear_child_tid, FUTEX_WAKE,
882 + 1, NULL, NULL, 0);
883 + }
884 tsk->clear_child_tid = NULL;
885 -
886 - /*
887 - * We don't check the error code - if userspace has
888 - * not set up a proper pointer then tough luck.
889 - */
890 - put_user(0, tidptr);
891 - sys_futex(tidptr, FUTEX_WAKE, 1, NULL, NULL, 0);
892 }
893 }
894
895 diff --git a/mm/hugetlb.c b/mm/hugetlb.c
896 index 1ecbcf6..2885674 100644
897 --- a/mm/hugetlb.c
898 +++ b/mm/hugetlb.c
899 @@ -2257,7 +2257,7 @@ void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed)
900 long chg = region_truncate(&inode->i_mapping->private_list, offset);
901
902 spin_lock(&inode->i_lock);
903 - inode->i_blocks -= blocks_per_huge_page(h);
904 + inode->i_blocks -= (blocks_per_huge_page(h) * freed);
905 spin_unlock(&inode->i_lock);
906
907 hugetlb_put_quota(inode->i_mapping, (chg - freed));
908 diff --git a/mm/page_alloc.c b/mm/page_alloc.c
909 index 85799e8..c6ecf87 100644
910 --- a/mm/page_alloc.c
911 +++ b/mm/page_alloc.c
912 @@ -846,7 +846,7 @@ static struct page *__rmqueue(struct zone *zone, unsigned int order,
913 */
914 static int rmqueue_bulk(struct zone *zone, unsigned int order,
915 unsigned long count, struct list_head *list,
916 - int migratetype)
917 + int migratetype, int cold)
918 {
919 int i;
920
921 @@ -865,7 +865,10 @@ static int rmqueue_bulk(struct zone *zone, unsigned int order,
922 * merge IO requests if the physical pages are ordered
923 * properly.
924 */
925 - list_add(&page->lru, list);
926 + if (likely(cold == 0))
927 + list_add(&page->lru, list);
928 + else
929 + list_add_tail(&page->lru, list);
930 set_page_private(page, migratetype);
931 list = &page->lru;
932 }
933 @@ -1068,7 +1071,8 @@ again:
934 local_irq_save(flags);
935 if (!pcp->count) {
936 pcp->count = rmqueue_bulk(zone, 0,
937 - pcp->batch, &pcp->list, migratetype);
938 + pcp->batch, &pcp->list,
939 + migratetype, cold);
940 if (unlikely(!pcp->count))
941 goto failed;
942 }
943 @@ -1087,7 +1091,8 @@ again:
944 /* Allocate more to the pcp list if necessary */
945 if (unlikely(&page->lru == &pcp->list)) {
946 pcp->count += rmqueue_bulk(zone, 0,
947 - pcp->batch, &pcp->list, migratetype);
948 + pcp->batch, &pcp->list,
949 + migratetype, cold);
950 page = list_entry(pcp->list.next, struct page, lru);
951 }
952
953 diff --git a/net/socket.c b/net/socket.c
954 index 3e2859c..058d965 100644
955 --- a/net/socket.c
956 +++ b/net/socket.c
957 @@ -695,7 +695,7 @@ static ssize_t sock_sendpage(struct file *file, struct page *page,
958 if (more)
959 flags |= MSG_MORE;
960
961 - return sock->ops->sendpage(sock, page, offset, size, flags);
962 + return kernel_sendpage(sock, page, offset, size, flags);
963 }
964
965 static ssize_t sock_splice_read(struct file *file, loff_t *ppos,