Magellan Linux

Annotation of /trunk/kernel26-alx/patches-2.6.27-r3/0103-2.6.27.4-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1176 - (hide annotations) (download)
Thu Oct 14 15:11:06 2010 UTC (13 years, 7 months ago) by niro
File size: 27734 byte(s)
-2.6.27-alx-r3: new magellan 0.5.2 kernel
1 niro 1176 diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c
2     index 426e5d9..c44cd6d 100644
3     --- a/arch/x86/kernel/acpi/sleep.c
4     +++ b/arch/x86/kernel/acpi/sleep.c
5     @@ -10,6 +10,7 @@
6     #include <linux/dmi.h>
7     #include <linux/cpumask.h>
8     #include <asm/segment.h>
9     +#include <asm/desc.h>
10    
11     #include "realmode/wakeup.h"
12     #include "sleep.h"
13     @@ -98,6 +99,8 @@ int acpi_save_state_mem(void)
14     header->trampoline_segment = setup_trampoline() >> 4;
15     #ifdef CONFIG_SMP
16     stack_start.sp = temp_stack + 4096;
17     + early_gdt_descr.address =
18     + (unsigned long)get_cpu_gdt_table(smp_processor_id());
19     #endif
20     initial_code = (unsigned long)wakeup_long64;
21     saved_magic = 0x123456789abcdef0;
22     diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c
23     index a69cc0f..bccd0ef 100644
24     --- a/arch/x86/kernel/amd_iommu_init.c
25     +++ b/arch/x86/kernel/amd_iommu_init.c
26     @@ -210,7 +210,7 @@ static void __init iommu_set_exclusion_range(struct amd_iommu *iommu)
27     /* Programs the physical address of the device table into the IOMMU hardware */
28     static void __init iommu_set_device_table(struct amd_iommu *iommu)
29     {
30     - u32 entry;
31     + u64 entry;
32    
33     BUG_ON(iommu->mmio_base == NULL);
34    
35     diff --git a/drivers/acpi/hardware/hwsleep.c b/drivers/acpi/hardware/hwsleep.c
36     index dba3cfb..ecb6ace 100644
37     --- a/drivers/acpi/hardware/hwsleep.c
38     +++ b/drivers/acpi/hardware/hwsleep.c
39     @@ -78,19 +78,17 @@ acpi_set_firmware_waking_vector(acpi_physical_address physical_address)
40     return_ACPI_STATUS(status);
41     }
42    
43     - /* Set the vector */
44     + /*
45     + * According to the ACPI specification 2.0c and later, the 64-bit
46     + * waking vector should be cleared and the 32-bit waking vector should
47     + * be used, unless we want the wake-up code to be called by the BIOS in
48     + * Protected Mode. Some systems (for example HP dv5-1004nr) are known
49     + * to fail to resume if the 64-bit vector is used.
50     + */
51     + if (facs->version >= 1)
52     + facs->xfirmware_waking_vector = 0;
53    
54     - if ((facs->length < 32) || (!(facs->xfirmware_waking_vector))) {
55     - /*
56     - * ACPI 1.0 FACS or short table or optional X_ field is zero
57     - */
58     - facs->firmware_waking_vector = (u32) physical_address;
59     - } else {
60     - /*
61     - * ACPI 2.0 FACS with valid X_ field
62     - */
63     - facs->xfirmware_waking_vector = physical_address;
64     - }
65     + facs->firmware_waking_vector = (u32)physical_address;
66    
67     return_ACPI_STATUS(AE_OK);
68     }
69     @@ -134,20 +132,7 @@ acpi_get_firmware_waking_vector(acpi_physical_address * physical_address)
70     }
71    
72     /* Get the vector */
73     -
74     - if ((facs->length < 32) || (!(facs->xfirmware_waking_vector))) {
75     - /*
76     - * ACPI 1.0 FACS or short table or optional X_ field is zero
77     - */
78     - *physical_address =
79     - (acpi_physical_address) facs->firmware_waking_vector;
80     - } else {
81     - /*
82     - * ACPI 2.0 FACS with valid X_ field
83     - */
84     - *physical_address =
85     - (acpi_physical_address) facs->xfirmware_waking_vector;
86     - }
87     + *physical_address = (acpi_physical_address)facs->firmware_waking_vector;
88    
89     return_ACPI_STATUS(AE_OK);
90     }
91     diff --git a/drivers/acpi/sleep/main.c b/drivers/acpi/sleep/main.c
92     index d13194a..4751909 100644
93     --- a/drivers/acpi/sleep/main.c
94     +++ b/drivers/acpi/sleep/main.c
95     @@ -200,6 +200,8 @@ static int acpi_suspend_enter(suspend_state_t pm_state)
96     break;
97     }
98    
99     + /* If ACPI is not enabled by the BIOS, we need to enable it here. */
100     + acpi_enable();
101     /* Reprogram control registers and execute _BFS */
102     acpi_leave_sleep_state_prep(acpi_state);
103    
104     @@ -296,6 +298,14 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
105     DMI_MATCH(DMI_BOARD_NAME, "KN9 Series(NF-CK804)"),
106     },
107     },
108     + {
109     + .callback = init_old_suspend_ordering,
110     + .ident = "HP xw4600 Workstation",
111     + .matches = {
112     + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
113     + DMI_MATCH(DMI_PRODUCT_NAME, "HP xw4600 Workstation"),
114     + },
115     + },
116     {},
117     };
118     #endif /* CONFIG_SUSPEND */
119     diff --git a/drivers/char/hvc_console.c b/drivers/char/hvc_console.c
120     index fd64137..f2e4caf 100644
121     --- a/drivers/char/hvc_console.c
122     +++ b/drivers/char/hvc_console.c
123     @@ -367,13 +367,13 @@ static void hvc_close(struct tty_struct *tty, struct file * filp)
124     spin_lock_irqsave(&hp->lock, flags);
125    
126     if (--hp->count == 0) {
127     - if (hp->ops->notifier_del)
128     - hp->ops->notifier_del(hp, hp->data);
129     -
130     /* We are done with the tty pointer now. */
131     hp->tty = NULL;
132     spin_unlock_irqrestore(&hp->lock, flags);
133    
134     + if (hp->ops->notifier_del)
135     + hp->ops->notifier_del(hp, hp->data);
136     +
137     /*
138     * Chain calls chars_in_buffer() and returns immediately if
139     * there is no buffered data otherwise sleeps on a wait queue
140     @@ -416,11 +416,11 @@ static void hvc_hangup(struct tty_struct *tty)
141     hp->n_outbuf = 0;
142     hp->tty = NULL;
143    
144     + spin_unlock_irqrestore(&hp->lock, flags);
145     +
146     if (hp->ops->notifier_del)
147     hp->ops->notifier_del(hp, hp->data);
148    
149     - spin_unlock_irqrestore(&hp->lock, flags);
150     -
151     while(temp_open_count) {
152     --temp_open_count;
153     kref_put(&hp->kref, destroy_hvc_struct);
154     diff --git a/drivers/edac/cell_edac.c b/drivers/edac/cell_edac.c
155     index 0e024fe..887072f 100644
156     --- a/drivers/edac/cell_edac.c
157     +++ b/drivers/edac/cell_edac.c
158     @@ -142,7 +142,7 @@ static void __devinit cell_edac_init_csrows(struct mem_ctl_info *mci)
159     csrow->nr_pages = (r.end - r.start + 1) >> PAGE_SHIFT;
160     csrow->last_page = csrow->first_page + csrow->nr_pages - 1;
161     csrow->mtype = MEM_XDR;
162     - csrow->edac_mode = EDAC_FLAG_EC | EDAC_FLAG_SECDED;
163     + csrow->edac_mode = EDAC_SECDED;
164     dev_dbg(mci->dev,
165     "Initialized on node %d, chanmask=0x%x,"
166     " first_page=0x%lx, nr_pages=0x%x\n",
167     diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
168     index 8d29405..59f6ad8 100644
169     --- a/drivers/gpio/gpiolib.c
170     +++ b/drivers/gpio/gpiolib.c
171     @@ -1020,7 +1020,7 @@ int gpio_get_value_cansleep(unsigned gpio)
172    
173     might_sleep_if(extra_checks);
174     chip = gpio_to_chip(gpio);
175     - return chip->get(chip, gpio - chip->base);
176     + return chip->get ? chip->get(chip, gpio - chip->base) : 0;
177     }
178     EXPORT_SYMBOL_GPL(gpio_get_value_cansleep);
179    
180     diff --git a/drivers/md/dm-kcopyd.c b/drivers/md/dm-kcopyd.c
181     index 996802b..8f15353 100644
182     --- a/drivers/md/dm-kcopyd.c
183     +++ b/drivers/md/dm-kcopyd.c
184     @@ -268,6 +268,17 @@ static void push(struct list_head *jobs, struct kcopyd_job *job)
185     spin_unlock_irqrestore(&kc->job_lock, flags);
186     }
187    
188     +
189     +static void push_head(struct list_head *jobs, struct kcopyd_job *job)
190     +{
191     + unsigned long flags;
192     + struct dm_kcopyd_client *kc = job->kc;
193     +
194     + spin_lock_irqsave(&kc->job_lock, flags);
195     + list_add(&job->list, jobs);
196     + spin_unlock_irqrestore(&kc->job_lock, flags);
197     +}
198     +
199     /*
200     * These three functions process 1 item from the corresponding
201     * job list.
202     @@ -398,7 +409,7 @@ static int process_jobs(struct list_head *jobs, struct dm_kcopyd_client *kc,
203     * We couldn't service this job ATM, so
204     * push this job back onto the list.
205     */
206     - push(jobs, job);
207     + push_head(jobs, job);
208     break;
209     }
210    
211     diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c
212     index 6e5528a..4ed9b7a 100644
213     --- a/drivers/md/dm-snap.c
214     +++ b/drivers/md/dm-snap.c
215     @@ -824,8 +824,10 @@ static struct bio *put_pending_exception(struct dm_snap_pending_exception *pe)
216     * the bios for the original write to the origin.
217     */
218     if (primary_pe &&
219     - atomic_dec_and_test(&primary_pe->ref_count))
220     + atomic_dec_and_test(&primary_pe->ref_count)) {
221     origin_bios = bio_list_get(&primary_pe->origin_bios);
222     + free_pending_exception(primary_pe);
223     + }
224    
225     /*
226     * Free the pe if it's not linked to an origin write or if
227     @@ -834,12 +836,6 @@ static struct bio *put_pending_exception(struct dm_snap_pending_exception *pe)
228     if (!primary_pe || primary_pe != pe)
229     free_pending_exception(pe);
230    
231     - /*
232     - * Free the primary pe if nothing references it.
233     - */
234     - if (primary_pe && !atomic_read(&primary_pe->ref_count))
235     - free_pending_exception(primary_pe);
236     -
237     return origin_bios;
238     }
239    
240     diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/drivers/media/video/pvrusb2/pvrusb2-hdw.c
241     index f051c6a..7412258 100644
242     --- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c
243     +++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c
244     @@ -60,7 +60,6 @@ static struct pvr2_hdw *unit_pointers[PVR_NUM] = {[ 0 ... PVR_NUM-1 ] = NULL};
245     static DEFINE_MUTEX(pvr2_unit_mtx);
246    
247     static int ctlchg;
248     -static int initusbreset = 1;
249     static int procreload;
250     static int tuner[PVR_NUM] = { [0 ... PVR_NUM-1] = -1 };
251     static int tolerance[PVR_NUM] = { [0 ... PVR_NUM-1] = 0 };
252     @@ -71,8 +70,6 @@ module_param(ctlchg, int, S_IRUGO|S_IWUSR);
253     MODULE_PARM_DESC(ctlchg, "0=optimize ctl change 1=always accept new ctl value");
254     module_param(init_pause_msec, int, S_IRUGO|S_IWUSR);
255     MODULE_PARM_DESC(init_pause_msec, "hardware initialization settling delay");
256     -module_param(initusbreset, int, S_IRUGO|S_IWUSR);
257     -MODULE_PARM_DESC(initusbreset, "Do USB reset device on probe");
258     module_param(procreload, int, S_IRUGO|S_IWUSR);
259     MODULE_PARM_DESC(procreload,
260     "Attempt init failure recovery with firmware reload");
261     @@ -1698,9 +1695,6 @@ static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
262     }
263     hdw->fw1_state = FW1_STATE_OK;
264    
265     - if (initusbreset) {
266     - pvr2_hdw_device_reset(hdw);
267     - }
268     if (!pvr2_hdw_dev_ok(hdw)) return;
269    
270     for (idx = 0; idx < hdw->hdw_desc->client_modules.cnt; idx++) {
271     diff --git a/drivers/pci/hotplug/cpqphp_core.c b/drivers/pci/hotplug/cpqphp_core.c
272     index 54defec..87a68d2 100644
273     --- a/drivers/pci/hotplug/cpqphp_core.c
274     +++ b/drivers/pci/hotplug/cpqphp_core.c
275     @@ -435,7 +435,7 @@ static int ctrl_slot_setup(struct controller *ctrl,
276     slot->number, ctrl->slot_device_offset,
277     slot_number);
278     result = pci_hp_register(hotplug_slot,
279     - ctrl->pci_dev->subordinate,
280     + ctrl->pci_dev->bus,
281     slot->device);
282     if (result) {
283     err("pci_hp_register failed with error %d\n", result);
284     diff --git a/drivers/scsi/device_handler/scsi_dh_rdac.c b/drivers/scsi/device_handler/scsi_dh_rdac.c
285     index 6e2f130..d576d4c 100644
286     --- a/drivers/scsi/device_handler/scsi_dh_rdac.c
287     +++ b/drivers/scsi/device_handler/scsi_dh_rdac.c
288     @@ -590,6 +590,8 @@ static const struct scsi_dh_devlist rdac_dev_list[] = {
289     {"STK", "OPENstorage D280"},
290     {"SUN", "CSM200_R"},
291     {"SUN", "LCSM100_F"},
292     + {"DELL", "MD3000"},
293     + {"DELL", "MD3000i"},
294     {NULL, NULL},
295     };
296    
297     diff --git a/drivers/usb/atm/speedtch.c b/drivers/usb/atm/speedtch.c
298     index 76fce44..3e86240 100644
299     --- a/drivers/usb/atm/speedtch.c
300     +++ b/drivers/usb/atm/speedtch.c
301     @@ -722,6 +722,16 @@ static void speedtch_atm_stop(struct usbatm_data *usbatm, struct atm_dev *atm_de
302     flush_scheduled_work();
303     }
304    
305     +static int speedtch_pre_reset(struct usb_interface *intf)
306     +{
307     + return 0;
308     +}
309     +
310     +static int speedtch_post_reset(struct usb_interface *intf)
311     +{
312     + return 0;
313     +}
314     +
315    
316     /**********
317     ** USB **
318     @@ -740,6 +750,8 @@ static struct usb_driver speedtch_usb_driver = {
319     .name = speedtch_driver_name,
320     .probe = speedtch_usb_probe,
321     .disconnect = usbatm_usb_disconnect,
322     + .pre_reset = speedtch_pre_reset,
323     + .post_reset = speedtch_post_reset,
324     .id_table = speedtch_usb_ids
325     };
326    
327     diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
328     index c257453..d996a61 100644
329     --- a/drivers/usb/class/cdc-acm.c
330     +++ b/drivers/usb/class/cdc-acm.c
331     @@ -849,9 +849,10 @@ static void acm_write_buffers_free(struct acm *acm)
332     {
333     int i;
334     struct acm_wb *wb;
335     + struct usb_device *usb_dev = interface_to_usbdev(acm->control);
336    
337     for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++) {
338     - usb_buffer_free(acm->dev, acm->writesize, wb->buf, wb->dmah);
339     + usb_buffer_free(usb_dev, acm->writesize, wb->buf, wb->dmah);
340     }
341     }
342    
343     diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c
344     index 7e8e123..023a4e9 100644
345     --- a/drivers/usb/class/cdc-wdm.c
346     +++ b/drivers/usb/class/cdc-wdm.c
347     @@ -42,6 +42,8 @@ static struct usb_device_id wdm_ids[] = {
348     { }
349     };
350    
351     +MODULE_DEVICE_TABLE (usb, wdm_ids);
352     +
353     #define WDM_MINOR_BASE 176
354    
355    
356     diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c
357     index 5a7fa6f..9f42cb8 100644
358     --- a/drivers/usb/core/driver.c
359     +++ b/drivers/usb/core/driver.c
360     @@ -1609,7 +1609,8 @@ int usb_external_resume_device(struct usb_device *udev)
361     status = usb_resume_both(udev);
362     udev->last_busy = jiffies;
363     usb_pm_unlock(udev);
364     - do_unbind_rebind(udev, DO_REBIND);
365     + if (status == 0)
366     + do_unbind_rebind(udev, DO_REBIND);
367    
368     /* Now that the device is awake, we can start trying to autosuspend
369     * it again. */
370     diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
371     index d999638..875de9a 100644
372     --- a/drivers/usb/core/hub.c
373     +++ b/drivers/usb/core/hub.c
374     @@ -3424,7 +3424,7 @@ int usb_reset_device(struct usb_device *udev)
375     USB_INTERFACE_BOUND)
376     rebind = 1;
377     }
378     - if (rebind)
379     + if (ret == 0 && rebind)
380     usb_rebind_intf(cintf);
381     }
382     }
383     diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c
384     index 765adf1..58d5729 100644
385     --- a/fs/cifs/readdir.c
386     +++ b/fs/cifs/readdir.c
387     @@ -762,14 +762,15 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon,
388     rc));
389     return rc;
390     }
391     + cifs_save_resume_key(cifsFile->srch_inf.last_entry, cifsFile);
392     }
393    
394     while ((index_to_find >= cifsFile->srch_inf.index_of_last_entry) &&
395     (rc == 0) && !cifsFile->srch_inf.endOfSearch) {
396     cFYI(1, ("calling findnext2"));
397     - cifs_save_resume_key(cifsFile->srch_inf.last_entry, cifsFile);
398     rc = CIFSFindNext(xid, pTcon, cifsFile->netfid,
399     &cifsFile->srch_inf);
400     + cifs_save_resume_key(cifsFile->srch_inf.last_entry, cifsFile);
401     if (rc)
402     return -ENOENT;
403     }
404     diff --git a/fs/ext2/dir.c b/fs/ext2/dir.c
405     index a78c6b4..11a49ce 100644
406     --- a/fs/ext2/dir.c
407     +++ b/fs/ext2/dir.c
408     @@ -103,7 +103,7 @@ static int ext2_commit_chunk(struct page *page, loff_t pos, unsigned len)
409     return err;
410     }
411    
412     -static void ext2_check_page(struct page *page)
413     +static void ext2_check_page(struct page *page, int quiet)
414     {
415     struct inode *dir = page->mapping->host;
416     struct super_block *sb = dir->i_sb;
417     @@ -146,10 +146,10 @@ out:
418     /* Too bad, we had an error */
419    
420     Ebadsize:
421     - ext2_error(sb, "ext2_check_page",
422     - "size of directory #%lu is not a multiple of chunk size",
423     - dir->i_ino
424     - );
425     + if (!quiet)
426     + ext2_error(sb, __func__,
427     + "size of directory #%lu is not a multiple "
428     + "of chunk size", dir->i_ino);
429     goto fail;
430     Eshort:
431     error = "rec_len is smaller than minimal";
432     @@ -166,32 +166,36 @@ Espan:
433     Einumber:
434     error = "inode out of bounds";
435     bad_entry:
436     - ext2_error (sb, "ext2_check_page", "bad entry in directory #%lu: %s - "
437     - "offset=%lu, inode=%lu, rec_len=%d, name_len=%d",
438     - dir->i_ino, error, (page->index<<PAGE_CACHE_SHIFT)+offs,
439     - (unsigned long) le32_to_cpu(p->inode),
440     - rec_len, p->name_len);
441     + if (!quiet)
442     + ext2_error(sb, __func__, "bad entry in directory #%lu: : %s - "
443     + "offset=%lu, inode=%lu, rec_len=%d, name_len=%d",
444     + dir->i_ino, error, (page->index<<PAGE_CACHE_SHIFT)+offs,
445     + (unsigned long) le32_to_cpu(p->inode),
446     + rec_len, p->name_len);
447     goto fail;
448     Eend:
449     - p = (ext2_dirent *)(kaddr + offs);
450     - ext2_error (sb, "ext2_check_page",
451     - "entry in directory #%lu spans the page boundary"
452     - "offset=%lu, inode=%lu",
453     - dir->i_ino, (page->index<<PAGE_CACHE_SHIFT)+offs,
454     - (unsigned long) le32_to_cpu(p->inode));
455     + if (!quiet) {
456     + p = (ext2_dirent *)(kaddr + offs);
457     + ext2_error(sb, "ext2_check_page",
458     + "entry in directory #%lu spans the page boundary"
459     + "offset=%lu, inode=%lu",
460     + dir->i_ino, (page->index<<PAGE_CACHE_SHIFT)+offs,
461     + (unsigned long) le32_to_cpu(p->inode));
462     + }
463     fail:
464     SetPageChecked(page);
465     SetPageError(page);
466     }
467    
468     -static struct page * ext2_get_page(struct inode *dir, unsigned long n)
469     +static struct page * ext2_get_page(struct inode *dir, unsigned long n,
470     + int quiet)
471     {
472     struct address_space *mapping = dir->i_mapping;
473     struct page *page = read_mapping_page(mapping, n, NULL);
474     if (!IS_ERR(page)) {
475     kmap(page);
476     if (!PageChecked(page))
477     - ext2_check_page(page);
478     + ext2_check_page(page, quiet);
479     if (PageError(page))
480     goto fail;
481     }
482     @@ -292,7 +296,7 @@ ext2_readdir (struct file * filp, void * dirent, filldir_t filldir)
483     for ( ; n < npages; n++, offset = 0) {
484     char *kaddr, *limit;
485     ext2_dirent *de;
486     - struct page *page = ext2_get_page(inode, n);
487     + struct page *page = ext2_get_page(inode, n, 0);
488    
489     if (IS_ERR(page)) {
490     ext2_error(sb, __func__,
491     @@ -361,6 +365,7 @@ struct ext2_dir_entry_2 * ext2_find_entry (struct inode * dir,
492     struct page *page = NULL;
493     struct ext2_inode_info *ei = EXT2_I(dir);
494     ext2_dirent * de;
495     + int dir_has_error = 0;
496    
497     if (npages == 0)
498     goto out;
499     @@ -374,7 +379,7 @@ struct ext2_dir_entry_2 * ext2_find_entry (struct inode * dir,
500     n = start;
501     do {
502     char *kaddr;
503     - page = ext2_get_page(dir, n);
504     + page = ext2_get_page(dir, n, dir_has_error);
505     if (!IS_ERR(page)) {
506     kaddr = page_address(page);
507     de = (ext2_dirent *) kaddr;
508     @@ -391,7 +396,9 @@ struct ext2_dir_entry_2 * ext2_find_entry (struct inode * dir,
509     de = ext2_next_entry(de);
510     }
511     ext2_put_page(page);
512     - }
513     + } else
514     + dir_has_error = 1;
515     +
516     if (++n >= npages)
517     n = 0;
518     /* next page is past the blocks we've got */
519     @@ -414,7 +421,7 @@ found:
520    
521     struct ext2_dir_entry_2 * ext2_dotdot (struct inode *dir, struct page **p)
522     {
523     - struct page *page = ext2_get_page(dir, 0);
524     + struct page *page = ext2_get_page(dir, 0, 0);
525     ext2_dirent *de = NULL;
526    
527     if (!IS_ERR(page)) {
528     @@ -487,7 +494,7 @@ int ext2_add_link (struct dentry *dentry, struct inode *inode)
529     for (n = 0; n <= npages; n++) {
530     char *dir_end;
531    
532     - page = ext2_get_page(dir, n);
533     + page = ext2_get_page(dir, n, 0);
534     err = PTR_ERR(page);
535     if (IS_ERR(page))
536     goto out;
537     @@ -655,14 +662,17 @@ int ext2_empty_dir (struct inode * inode)
538     {
539     struct page *page = NULL;
540     unsigned long i, npages = dir_pages(inode);
541     + int dir_has_error = 0;
542    
543     for (i = 0; i < npages; i++) {
544     char *kaddr;
545     ext2_dirent * de;
546     - page = ext2_get_page(inode, i);
547     + page = ext2_get_page(inode, i, dir_has_error);
548    
549     - if (IS_ERR(page))
550     + if (IS_ERR(page)) {
551     + dir_has_error = 1;
552     continue;
553     + }
554    
555     kaddr = page_address(page);
556     de = (ext2_dirent *)kaddr;
557     diff --git a/fs/ext3/dir.c b/fs/ext3/dir.c
558     index 2eea96e..1b80f1c 100644
559     --- a/fs/ext3/dir.c
560     +++ b/fs/ext3/dir.c
561     @@ -102,6 +102,7 @@ static int ext3_readdir(struct file * filp,
562     int err;
563     struct inode *inode = filp->f_path.dentry->d_inode;
564     int ret = 0;
565     + int dir_has_error = 0;
566    
567     sb = inode->i_sb;
568    
569     @@ -148,9 +149,12 @@ static int ext3_readdir(struct file * filp,
570     * of recovering data when there's a bad sector
571     */
572     if (!bh) {
573     - ext3_error (sb, "ext3_readdir",
574     - "directory #%lu contains a hole at offset %lu",
575     - inode->i_ino, (unsigned long)filp->f_pos);
576     + if (!dir_has_error) {
577     + ext3_error(sb, __func__, "directory #%lu "
578     + "contains a hole at offset %lld",
579     + inode->i_ino, filp->f_pos);
580     + dir_has_error = 1;
581     + }
582     /* corrupt size? Maybe no more blocks to read */
583     if (filp->f_pos > inode->i_blocks << 9)
584     break;
585     diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c
586     index ec8e33b..d1d6487 100644
587     --- a/fs/ext4/dir.c
588     +++ b/fs/ext4/dir.c
589     @@ -102,6 +102,7 @@ static int ext4_readdir(struct file * filp,
590     int err;
591     struct inode *inode = filp->f_path.dentry->d_inode;
592     int ret = 0;
593     + int dir_has_error = 0;
594    
595     sb = inode->i_sb;
596    
597     @@ -148,9 +149,13 @@ static int ext4_readdir(struct file * filp,
598     * of recovering data when there's a bad sector
599     */
600     if (!bh) {
601     - ext4_error (sb, "ext4_readdir",
602     - "directory #%lu contains a hole at offset %lu",
603     - inode->i_ino, (unsigned long)filp->f_pos);
604     + if (!dir_has_error) {
605     + ext4_error(sb, __func__, "directory #%lu "
606     + "contains a hole at offset %Lu",
607     + inode->i_ino,
608     + (unsigned long long) filp->f_pos);
609     + dir_has_error = 1;
610     + }
611     /* corrupt size? Maybe no more blocks to read */
612     if (filp->f_pos > inode->i_blocks << 9)
613     break;
614     diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
615     index 73d1891..f3ada04 100644
616     --- a/fs/proc/task_mmu.c
617     +++ b/fs/proc/task_mmu.c
618     @@ -198,11 +198,8 @@ static int do_maps_open(struct inode *inode, struct file *file,
619     return ret;
620     }
621    
622     -static int show_map(struct seq_file *m, void *v)
623     +static void show_map_vma(struct seq_file *m, struct vm_area_struct *vma)
624     {
625     - struct proc_maps_private *priv = m->private;
626     - struct task_struct *task = priv->task;
627     - struct vm_area_struct *vma = v;
628     struct mm_struct *mm = vma->vm_mm;
629     struct file *file = vma->vm_file;
630     int flags = vma->vm_flags;
631     @@ -210,9 +207,6 @@ static int show_map(struct seq_file *m, void *v)
632     dev_t dev = 0;
633     int len;
634    
635     - if (maps_protect && !ptrace_may_access(task, PTRACE_MODE_READ))
636     - return -EACCES;
637     -
638     if (file) {
639     struct inode *inode = vma->vm_file->f_path.dentry->d_inode;
640     dev = inode->i_sb->s_dev;
641     @@ -257,6 +251,18 @@ static int show_map(struct seq_file *m, void *v)
642     }
643     }
644     seq_putc(m, '\n');
645     +}
646     +
647     +static int show_map(struct seq_file *m, void *v)
648     +{
649     + struct vm_area_struct *vma = v;
650     + struct proc_maps_private *priv = m->private;
651     + struct task_struct *task = priv->task;
652     +
653     + if (maps_protect && !ptrace_may_access(task, PTRACE_MODE_READ))
654     + return -EACCES;
655     +
656     + show_map_vma(m, vma);
657    
658     if (m->count < m->size) /* vma is copied successfully */
659     m->version = (vma != get_gate_vma(task))? vma->vm_start: 0;
660     @@ -367,23 +373,25 @@ static int smaps_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end,
661    
662     static int show_smap(struct seq_file *m, void *v)
663     {
664     + struct proc_maps_private *priv = m->private;
665     + struct task_struct *task = priv->task;
666     struct vm_area_struct *vma = v;
667     struct mem_size_stats mss;
668     - int ret;
669     struct mm_walk smaps_walk = {
670     .pmd_entry = smaps_pte_range,
671     .mm = vma->vm_mm,
672     .private = &mss,
673     };
674    
675     + if (maps_protect && !ptrace_may_access(task, PTRACE_MODE_READ))
676     + return -EACCES;
677     +
678     memset(&mss, 0, sizeof mss);
679     mss.vma = vma;
680     if (vma->vm_mm && !is_vm_hugetlb_page(vma))
681     walk_page_range(vma->vm_start, vma->vm_end, &smaps_walk);
682    
683     - ret = show_map(m, v);
684     - if (ret)
685     - return ret;
686     + show_map_vma(m, vma);
687    
688     seq_printf(m,
689     "Size: %8lu kB\n"
690     @@ -405,7 +413,9 @@ static int show_smap(struct seq_file *m, void *v)
691     mss.referenced >> 10,
692     mss.swap >> 10);
693    
694     - return ret;
695     + if (m->count < m->size) /* vma is copied successfully */
696     + m->version = (vma != get_gate_vma(task)) ? vma->vm_start : 0;
697     + return 0;
698     }
699    
700     static const struct seq_operations proc_pid_smaps_op = {
701     diff --git a/kernel/sched_stats.h b/kernel/sched_stats.h
702     index 8385d43..81365b3 100644
703     --- a/kernel/sched_stats.h
704     +++ b/kernel/sched_stats.h
705     @@ -9,7 +9,7 @@
706     static int show_schedstat(struct seq_file *seq, void *v)
707     {
708     int cpu;
709     - int mask_len = NR_CPUS/32 * 9;
710     + int mask_len = (NR_CPUS/32 + 1) * 9;
711     char *mask_str = kmalloc(mask_len, GFP_KERNEL);
712    
713     if (mask_str == NULL)
714     diff --git a/mm/rmap.c b/mm/rmap.c
715     index 0383acf..e8d639b 100644
716     --- a/mm/rmap.c
717     +++ b/mm/rmap.c
718     @@ -55,7 +55,33 @@
719    
720     struct kmem_cache *anon_vma_cachep;
721    
722     -/* This must be called under the mmap_sem. */
723     +/**
724     + * anon_vma_prepare - attach an anon_vma to a memory region
725     + * @vma: the memory region in question
726     + *
727     + * This makes sure the memory mapping described by 'vma' has
728     + * an 'anon_vma' attached to it, so that we can associate the
729     + * anonymous pages mapped into it with that anon_vma.
730     + *
731     + * The common case will be that we already have one, but if
732     + * if not we either need to find an adjacent mapping that we
733     + * can re-use the anon_vma from (very common when the only
734     + * reason for splitting a vma has been mprotect()), or we
735     + * allocate a new one.
736     + *
737     + * Anon-vma allocations are very subtle, because we may have
738     + * optimistically looked up an anon_vma in page_lock_anon_vma()
739     + * and that may actually touch the spinlock even in the newly
740     + * allocated vma (it depends on RCU to make sure that the
741     + * anon_vma isn't actually destroyed).
742     + *
743     + * As a result, we need to do proper anon_vma locking even
744     + * for the new allocation. At the same time, we do not want
745     + * to do any locking for the common case of already having
746     + * an anon_vma.
747     + *
748     + * This must be called with the mmap_sem held for reading.
749     + */
750     int anon_vma_prepare(struct vm_area_struct *vma)
751     {
752     struct anon_vma *anon_vma = vma->anon_vma;
753     @@ -63,20 +89,17 @@ int anon_vma_prepare(struct vm_area_struct *vma)
754     might_sleep();
755     if (unlikely(!anon_vma)) {
756     struct mm_struct *mm = vma->vm_mm;
757     - struct anon_vma *allocated, *locked;
758     + struct anon_vma *allocated;
759    
760     anon_vma = find_mergeable_anon_vma(vma);
761     - if (anon_vma) {
762     - allocated = NULL;
763     - locked = anon_vma;
764     - spin_lock(&locked->lock);
765     - } else {
766     + allocated = NULL;
767     + if (!anon_vma) {
768     anon_vma = anon_vma_alloc();
769     if (unlikely(!anon_vma))
770     return -ENOMEM;
771     allocated = anon_vma;
772     - locked = NULL;
773     }
774     + spin_lock(&anon_vma->lock);
775    
776     /* page_table_lock to protect against threads */
777     spin_lock(&mm->page_table_lock);
778     @@ -87,8 +110,7 @@ int anon_vma_prepare(struct vm_area_struct *vma)
779     }
780     spin_unlock(&mm->page_table_lock);
781    
782     - if (locked)
783     - spin_unlock(&locked->lock);
784     + spin_unlock(&anon_vma->lock);
785     if (unlikely(allocated))
786     anon_vma_free(allocated);
787     }
788     diff --git a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c
789     index 5a955c4..7eb0b61 100644
790     --- a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c
791     +++ b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c
792     @@ -150,10 +150,12 @@ static unsigned int ipv4_conntrack_defrag(unsigned int hooknum,
793     const struct net_device *out,
794     int (*okfn)(struct sk_buff *))
795     {
796     +#if !defined(CONFIG_NF_NAT) && !defined(CONFIG_NF_NAT_MODULE)
797     /* Previously seen (loopback)? Ignore. Do this before
798     fragment check. */
799     if (skb->nfct)
800     return NF_ACCEPT;
801     +#endif
802    
803     /* Gather fragments. */
804     if (ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET)) {
805     diff --git a/net/ipv4/netfilter/nf_nat_snmp_basic.c b/net/ipv4/netfilter/nf_nat_snmp_basic.c
806     index ffeaffc..8303e4b 100644
807     --- a/net/ipv4/netfilter/nf_nat_snmp_basic.c
808     +++ b/net/ipv4/netfilter/nf_nat_snmp_basic.c
809     @@ -742,6 +742,7 @@ static unsigned char snmp_object_decode(struct asn1_ctx *ctx,
810     *obj = kmalloc(sizeof(struct snmp_object) + len,
811     GFP_ATOMIC);
812     if (*obj == NULL) {
813     + kfree(p);
814     kfree(id);
815     if (net_ratelimit())
816     printk("OOM in bsalg (%d)\n", __LINE__);
817     diff --git a/net/netfilter/xt_iprange.c b/net/netfilter/xt_iprange.c
818     index c63e933..4b5741b 100644
819     --- a/net/netfilter/xt_iprange.c
820     +++ b/net/netfilter/xt_iprange.c
821     @@ -67,7 +67,7 @@ iprange_mt4(const struct sk_buff *skb, const struct net_device *in,
822     if (info->flags & IPRANGE_SRC) {
823     m = ntohl(iph->saddr) < ntohl(info->src_min.ip);
824     m |= ntohl(iph->saddr) > ntohl(info->src_max.ip);
825     - m ^= info->flags & IPRANGE_SRC_INV;
826     + m ^= !!(info->flags & IPRANGE_SRC_INV);
827     if (m) {
828     pr_debug("src IP " NIPQUAD_FMT " NOT in range %s"
829     NIPQUAD_FMT "-" NIPQUAD_FMT "\n",
830     @@ -81,7 +81,7 @@ iprange_mt4(const struct sk_buff *skb, const struct net_device *in,
831     if (info->flags & IPRANGE_DST) {
832     m = ntohl(iph->daddr) < ntohl(info->dst_min.ip);
833     m |= ntohl(iph->daddr) > ntohl(info->dst_max.ip);
834     - m ^= info->flags & IPRANGE_DST_INV;
835     + m ^= !!(info->flags & IPRANGE_DST_INV);
836     if (m) {
837     pr_debug("dst IP " NIPQUAD_FMT " NOT in range %s"
838     NIPQUAD_FMT "-" NIPQUAD_FMT "\n",
839     @@ -123,14 +123,14 @@ iprange_mt6(const struct sk_buff *skb, const struct net_device *in,
840     if (info->flags & IPRANGE_SRC) {
841     m = iprange_ipv6_sub(&iph->saddr, &info->src_min.in6) < 0;
842     m |= iprange_ipv6_sub(&iph->saddr, &info->src_max.in6) > 0;
843     - m ^= info->flags & IPRANGE_SRC_INV;
844     + m ^= !!(info->flags & IPRANGE_SRC_INV);
845     if (m)
846     return false;
847     }
848     if (info->flags & IPRANGE_DST) {
849     m = iprange_ipv6_sub(&iph->daddr, &info->dst_min.in6) < 0;
850     m |= iprange_ipv6_sub(&iph->daddr, &info->dst_max.in6) > 0;
851     - m ^= info->flags & IPRANGE_DST_INV;
852     + m ^= !!(info->flags & IPRANGE_DST_INV);
853     if (m)
854     return false;
855     }