[kernel] r8054 - in dists/sid/linux-2.6/debian: . patches/bugfix
patches/series
Martin Michlmayr
tbm at alioth.debian.org
Fri Dec 29 13:41:30 UTC 2006
Author: tbm
Date: Fri Dec 29 14:41:30 2006
New Revision: 8054
Added:
dists/sid/linux-2.6/debian/patches/bugfix/msync-enomem.patch
Modified:
dists/sid/linux-2.6/debian/changelog
dists/sid/linux-2.6/debian/patches/series/9
Log:
* Revert mm/msync patches because they cause filesystem corruption
(closes: #401006, #401980, #402707) ...
* ... and add an alternative msync patch from Hugh Dickins that
doesn't depend on the mm changes (closes: #394392).
Modified: dists/sid/linux-2.6/debian/changelog
==============================================================================
--- dists/sid/linux-2.6/debian/changelog (original)
+++ dists/sid/linux-2.6/debian/changelog Fri Dec 29 14:41:30 2006
@@ -5,6 +5,10 @@
* arm/ixp4xx: Enable some more I2C sensor modules.
* arm/ixp4xx: Enable CONFIG_USB_NET_RNDIS_HOST.
* arm/footbridge: Enable CONFIG_NATSEMI.
+ * Revert mm/msync patches because they cause filesystem corruption
+ (closes: #401006, #401980, #402707) ...
+ * ... and add an alternative msync patch from Hugh Dickins that
+ doesn't depend on the mm changes (closes: #394392).
[ Bastian Blank ]
* Bump ABI to 4.
Added: dists/sid/linux-2.6/debian/patches/bugfix/msync-enomem.patch
==============================================================================
--- (empty file)
+++ dists/sid/linux-2.6/debian/patches/bugfix/msync-enomem.patch Fri Dec 29 14:41:30 2006
@@ -0,0 +1,124 @@
+From: Hugh Dickins <hugh at veritas.com>
+
+Fix 2.6.18 (or 2.6.17) sys_msync to report -ENOMEM as before when an
+unmapped area falls within its range, and not to overshoot: to satisfy
+LSB 3.1 tests and to fix Debian Bug#394392. Took the 2.6.19 sys_msync
+as starting point (including its cleanup of repeated "current->mm"s),
+reintroducing the msync_interval and balance_dirty_pages_ratelimited_nr
+previously needed.
+
+Signed-off-by: Hugh Dickins <hugh at veritas.com>
+---
+
+ mm/msync.c | 66 +++++++++++++++++++++++++++----------------------------------
+ 1 file changed, 30 insertions(+), 36 deletions(-)
+
+--- 2.6.18/mm/msync.c 2006-09-20 04:42:06.000000000 +0100
++++ linux/mm/msync.c 2006-12-26 23:52:58.000000000 +0000
+@@ -146,10 +146,10 @@ static int msync_interval(struct vm_area
+ asmlinkage long sys_msync(unsigned long start, size_t len, int flags)
+ {
+ unsigned long end;
++ struct mm_struct *mm = current->mm;
+ struct vm_area_struct *vma;
+ int unmapped_error = 0;
+ int error = -EINVAL;
+- int done = 0;
+
+ if (flags & ~(MS_ASYNC | MS_INVALIDATE | MS_SYNC))
+ goto out;
+@@ -169,64 +169,58 @@ asmlinkage long sys_msync(unsigned long
+ * If the interval [start,end) covers some unmapped address ranges,
+ * just ignore them, but return -ENOMEM at the end.
+ */
+- down_read(¤t->mm->mmap_sem);
+- vma = find_vma(current->mm, start);
+- if (!vma) {
+- error = -ENOMEM;
+- goto out_unlock;
+- }
+- do {
++ down_read(&mm->mmap_sem);
++ vma = find_vma(mm, start);
++ for (;;) {
+ unsigned long nr_pages_dirtied = 0;
+ struct file *file;
+
++ /* Still start < end. */
++ error = -ENOMEM;
++ if (!vma)
++ goto out_unlock;
+ /* Here start < vma->vm_end. */
+ if (start < vma->vm_start) {
+- unmapped_error = -ENOMEM;
+ start = vma->vm_start;
+- }
+- /* Here vma->vm_start <= start < vma->vm_end. */
+- if (end <= vma->vm_end) {
+- if (start < end) {
+- error = msync_interval(vma, start, end, flags,
+- &nr_pages_dirtied);
+- if (error)
+- goto out_unlock;
+- }
+- error = unmapped_error;
+- done = 1;
+- } else {
+- /* Here vma->vm_start <= start < vma->vm_end < end. */
+- error = msync_interval(vma, start, vma->vm_end, flags,
+- &nr_pages_dirtied);
+- if (error)
++ if (start >= end)
+ goto out_unlock;
++ unmapped_error = -ENOMEM;
+ }
++ /* Here vma->vm_start <= start < vma->vm_end. */
++ error = msync_interval(vma, start, min(end, vma->vm_end),
++ flags, &nr_pages_dirtied);
++ if (error)
++ goto out_unlock;
+ file = vma->vm_file;
+ start = vma->vm_end;
+ if ((flags & MS_ASYNC) && file && nr_pages_dirtied) {
+ get_file(file);
+- up_read(¤t->mm->mmap_sem);
++ up_read(&mm->mmap_sem);
+ balance_dirty_pages_ratelimited_nr(file->f_mapping,
+ nr_pages_dirtied);
+ fput(file);
+- down_read(¤t->mm->mmap_sem);
+- vma = find_vma(current->mm, start);
++ if (start >= end)
++ goto out;
++ down_read(&mm->mmap_sem);
++ vma = find_vma(mm, start);
+ } else if ((flags & MS_SYNC) && file &&
+ (vma->vm_flags & VM_SHARED)) {
+ get_file(file);
+- up_read(¤t->mm->mmap_sem);
++ up_read(&mm->mmap_sem);
+ error = do_fsync(file, 0);
+ fput(file);
+- down_read(¤t->mm->mmap_sem);
+- if (error)
+- goto out_unlock;
+- vma = find_vma(current->mm, start);
++ if (error || start >= end)
++ goto out;
++ down_read(&mm->mmap_sem);
++ vma = find_vma(mm, start);
+ } else {
++ if (start >= end)
++ goto out_unlock;
+ vma = vma->vm_next;
+ }
+- } while (vma && !done);
++ }
+ out_unlock:
+- up_read(¤t->mm->mmap_sem);
++ up_read(&mm->mmap_sem);
+ out:
+- return error;
++ return error ? : unmapped_error;
+ }
+
Modified: dists/sid/linux-2.6/debian/patches/series/9
==============================================================================
--- dists/sid/linux-2.6/debian/patches/series/9 (original)
+++ dists/sid/linux-2.6/debian/patches/series/9 Fri Dec 29 14:41:30 2006
@@ -27,3 +27,10 @@
+ bugfix/sparc/isa-dev-no-reg.patch
+ bugfix/sparc/ehci-hub-contol-alignment.patch
- bugfix/net-r8169-no_mac_adress_change.patch
+- features/mm-msync-cleanup.patch
+- features/mm-do_wp_page-fixup.patch
+- features/mm-install_page-cleanup.patch
+- features/mm-optimize-mprotect.patch
+- features/mm-balance-dirty-pages.patch
+- features/mm-tracking-shared-dirty-pages.patch
++ bugfix/msync-enomem.patch
More information about the Kernel-svn-changes
mailing list