]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
second try at 2.6.28.9
authorGreg Kroah-Hartman <gregkh@suse.de>
Mon, 23 Jun 2008 23:06:11 +0000 (16:06 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 23 Jun 2008 23:06:11 +0000 (16:06 -0700)
review-2.6.25/mbox2 [new file with mode: 0644]

diff --git a/review-2.6.25/mbox2 b/review-2.6.25/mbox2
new file mode 100644 (file)
index 0000000..9ffa117
--- /dev/null
@@ -0,0 +1,1117 @@
+From gregkh@mini.kroah.org Mon Jun 23 16:00:38 2008
+Message-Id: <20080623225737.837265824@mini.kroah.org>
+User-Agent: quilt/0.46-1
+Date: Mon, 23 Jun 2008 15:57:37 -0700
+From: Greg KH <gregkh@suse.de>
+To: linux-kernel@vger.kernel.org,
+ stable@kernel.org
+Cc: Justin Forbes <jmforbes@linuxtx.org>,
+ Zwane Mwaikambo <zwane@arm.linux.org.uk>,
+ Theodore Ts'o <tytso@mit.edu>,
+ Randy Dunlap <rdunlap@xenotime.net>,
+ Dave Jones <davej@redhat.com>,
+ Chuck Wolber <chuckw@quantumlinux.com>,
+ Chris Wedgwood <reviews@ml.cw.f00f.org>,
+ Michael Krufky <mkrufky@linuxtv.org>,
+ Chuck Ebbert <cebbert@redhat.com>,
+ Domenico Andreoli <cavokz@gmail.com>,
+ Willy Tarreau <w@1wt.eu>,
+ Rodrigo Rubira Branco <rbranco@la.checkpoint.com>,
+ torvalds@linux-foundation.org,
+ akpm@linux-foundation.org,
+ alan@lxorguk.ukuu.org.uk
+Subject: [patch 00/10] 2.6.28.9-rc2 review
+Content-Length: 956
+Lines: 28
+
+As -rc1 had a number of issues, here's the set of patches for -rc2.
+
+Responses should be made by Tuesday, June 24, 18:00:00 UTC.  Anything
+received after that time might be too late.
+
+The whole patch series can be found in one patch at:
+        kernel.org/pub/linux/kernel/v2.6/stable-review/patch-2.6.25.9-rc2.gz
+and the diffstat can be found below.
+
+
+thanks,
+
+greg k-h
+
+ Makefile                   |    2 
+ arch/powerpc/kernel/vdso.c |    2 
+ arch/x86/kernel/setup_32.c |   10 ++
+ drivers/hwmon/adt7473.c    |    3 
+ drivers/hwmon/lm85.c       |    2 
+ drivers/net/atl1/atl1_hw.c |    1 
+ drivers/watchdog/hpwdt.c   |  154 +++++++++++++++++++++++----------------------
+ include/asm-x86/page_32.h  |    3 
+ include/linux/bootmem.h    |    2 
+ mm/bootmem.c               |    4 -
+ mm/memory.c                |   41 +++++++++--
+ mm/migrate.c               |   10 ++
+ net/sctp/socket.c          |    4 -
+ 13 files changed, 145 insertions(+), 93 deletions(-)
+
+From gregkh@mini.kroah.org Mon Jun 23 16:00:41 2008
+Message-Id: <20080623230041.416491188@mini.kroah.org>
+References: <20080623225737.837265824@mini.kroah.org>
+User-Agent: quilt/0.46-1
+Date: Mon, 23 Jun 2008 15:57:47 -0700
+From: Greg KH <gregkh@suse.de>
+To: linux-kernel@vger.kernel.org,
+ stable@kernel.org
+Cc: Justin Forbes <jmforbes@linuxtx.org>,
+ Zwane Mwaikambo <zwane@arm.linux.org.uk>,
+ Theodore Ts'o <tytso@mit.edu>,
+ Randy Dunlap <rdunlap@xenotime.net>,
+ Dave Jones <davej@redhat.com>,
+ Chuck Wolber <chuckw@quantumlinux.com>,
+ Chris Wedgwood <reviews@ml.cw.f00f.org>,
+ Michael Krufky <mkrufky@linuxtv.org>,
+ Chuck Ebbert <cebbert@redhat.com>,
+ Domenico Andreoli <cavokz@gmail.com>,
+ Willy Tarreau <w@1wt.eu>,
+ Rodrigo Rubira Branco <rbranco@la.checkpoint.com>,
+ torvalds@linux-foundation.org,
+ akpm@linux-foundation.org,
+ alan@lxorguk.ukuu.org.uk
+Subject: [patch 10/10] Fix ZERO_PAGE breakage with vmware
+Content-Disposition: inline; filename=fix-zero_page-breakage-with-vmware.patch
+Status: RO
+Content-Length: 2689
+Lines: 84
+
+
+2.6.25.9-stable review patch.  If anyone has any objections, please let
+us know.
+
+Note, I had to merge this patch by hand, can someone verify that I 
+didn't mess it up?
+
+------------------ 
+
+From: Linus Torvalds <torvalds@linux-foundation.org>
+
+commit 672ca28e300c17bf8d792a2a7a8631193e580c74 upstream
+
+Commit 89f5b7da2a6bad2e84670422ab8192382a5aeb9f ("Reinstate ZERO_PAGE
+optimization in 'get_user_pages()' and fix XIP") broke vmware, as
+reported by Jeff Chua:
+
+  "This broke vmware 6.0.4.
+   Jun 22 14:53:03.845: vmx| NOT_IMPLEMENTED
+   /build/mts/release/bora-93057/bora/vmx/main/vmmonPosix.c:774"
+
+and the reason seems to be that there's an old bug in how we handle do
+FOLL_ANON on VM_SHARED areas in get_user_pages(), but since it only
+triggered if the whole page table was missing, nobody had apparently hit
+it before.
+
+The recent changes to 'follow_page()' made the FOLL_ANON logic trigger
+not just for whole missing page tables, but for individual pages as
+well, and exposed this problem.
+
+This fixes it by making the test for when FOLL_ANON is used more
+careful, and also makes the code easier to read and understand by moving
+the logic to a separate inline function.
+
+Reported-and-tested-by: Jeff Chua <jeff.chua.linux@gmail.com>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ mm/memory.c |   24 +++++++++++++++++++++---
+ 1 file changed, 21 insertions(+), 3 deletions(-)
+
+--- a/mm/memory.c
++++ b/mm/memory.c
+@@ -989,6 +989,26 @@ no_page_table:
+       return page;
+ }
++/* Can we do the FOLL_ANON optimization? */
++static inline int use_zero_page(struct vm_area_struct *vma)
++{
++      /*
++       * We don't want to optimize FOLL_ANON for make_pages_present()
++       * when it tries to page in a VM_LOCKED region. As to VM_SHARED,
++       * we want to get the page from the page tables to make sure
++       * that we serialize and update with any other user of that
++       * mapping.
++       */
++      if (vma->vm_flags & (VM_LOCKED | VM_SHARED))
++              return 0;
++      /*
++       * And if we have a fault or a nopfn routine, it's not an
++       * anonymous region.
++       */
++      return !vma->vm_ops ||
++              (!vma->vm_ops->fault && !vma->vm_ops->nopfn);
++}
++
+ int get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
+               unsigned long start, int len, int write, int force,
+               struct page **pages, struct vm_area_struct **vmas)
+@@ -1063,9 +1083,7 @@ int get_user_pages(struct task_struct *t
+               foll_flags = FOLL_TOUCH;
+               if (pages)
+                       foll_flags |= FOLL_GET;
+-              if (!write && !(vma->vm_flags & VM_LOCKED) &&
+-                  (!vma->vm_ops || (!vma->vm_ops->nopage &&
+-                                      !vma->vm_ops->fault)))
++              if (!write && use_zero_page(vma))
+                       foll_flags |= FOLL_ANON;
+               do {
+
+-- 
+
+From gregkh@mini.kroah.org Mon Jun 23 16:00:41 2008
+Message-Id: <20080623230041.154801853@mini.kroah.org>
+References: <20080623225737.837265824@mini.kroah.org>
+User-Agent: quilt/0.46-1
+Date: Mon, 23 Jun 2008 15:57:46 -0700
+From: Greg KH <gregkh@suse.de>
+To: linux-kernel@vger.kernel.org,
+ stable@kernel.org
+Cc: Justin Forbes <jmforbes@linuxtx.org>,
+ Zwane Mwaikambo <zwane@arm.linux.org.uk>,
+ Theodore Ts'o <tytso@mit.edu>,
+ Randy Dunlap <rdunlap@xenotime.net>,
+ Dave Jones <davej@redhat.com>,
+ Chuck Wolber <chuckw@quantumlinux.com>,
+ Chris Wedgwood <reviews@ml.cw.f00f.org>,
+ Michael Krufky <mkrufky@linuxtv.org>,
+ Chuck Ebbert <cebbert@redhat.com>,
+ Domenico Andreoli <cavokz@gmail.com>,
+ Willy Tarreau <w@1wt.eu>,
+ Rodrigo Rubira Branco <rbranco@la.checkpoint.com>,
+ torvalds@linux-foundation.org,
+ akpm@linux-foundation.org,
+ alan@lxorguk.ukuu.org.uk,
+ "Mark M. Hoffman" <mhoffman@lightlink.com>,
+ "Darrick J. Wong" <djwong@us.ibm.com>,
+ Jean Delvare <khali@linux-fr.org>
+Subject: [patch 09/10] hwmon: (adt7473) Initialize max_duty_at_overheat before use
+Content-Disposition: inline; filename=patch-hwmon-initialize-max_duty_at_overheat-before-use.patch
+Content-Length: 1012
+Lines: 36
+
+2.6.25.9-stable review patch.  If anyone has any objections, please let
+us know.
+
+------------------ 
+From: Jean Delvare <khali@linux-fr.org>
+
+commit ed4ec814e45ae8b1596aea0a29b92f6c3614acaa upstream
+
+data->max_duty_at_overheat is not updated in adt7473_update_device,
+so it might be used before it is initialized (if the user reads from
+sysfs file max_duty_at_crit before writing to it.)
+
+Signed-off-by: Jean Delvare <khali@linux-fr.org>
+Acked-by: Darrick J. Wong <djwong@us.ibm.com>
+Signed-off-by: Mark M. Hoffman <mhoffman@lightlink.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+
+---
+ drivers/hwmon/adt7473.c |    3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/drivers/hwmon/adt7473.c
++++ b/drivers/hwmon/adt7473.c
+@@ -309,6 +309,9 @@ no_sensor_update:
+                                               ADT7473_REG_PWM_BHVR(i));
+       }
++      i = i2c_smbus_read_byte_data(client, ADT7473_REG_CFG4);
++      data->max_duty_at_overheat = !!(i & ADT7473_CFG4_MAX_DUTY_AT_OVT);
++
+       data->limits_last_updated = local_jiffies;
+       data->limits_valid = 1;
+
+-- 
+
+From gregkh@mini.kroah.org Mon Jun 23 16:00:41 2008
+Message-Id: <20080623230040.879451843@mini.kroah.org>
+References: <20080623225737.837265824@mini.kroah.org>
+User-Agent: quilt/0.46-1
+Date: Mon, 23 Jun 2008 15:57:45 -0700
+From: Greg KH <gregkh@suse.de>
+To: linux-kernel@vger.kernel.org,
+ stable@kernel.org
+Cc: Justin Forbes <jmforbes@linuxtx.org>,
+ Zwane Mwaikambo <zwane@arm.linux.org.uk>,
+ Theodore Ts'o <tytso@mit.edu>,
+ Randy Dunlap <rdunlap@xenotime.net>,
+ Dave Jones <davej@redhat.com>,
+ Chuck Wolber <chuckw@quantumlinux.com>,
+ Chris Wedgwood <reviews@ml.cw.f00f.org>,
+ Michael Krufky <mkrufky@linuxtv.org>,
+ Chuck Ebbert <cebbert@redhat.com>,
+ Domenico Andreoli <cavokz@gmail.com>,
+ Willy Tarreau <w@1wt.eu>,
+ Rodrigo Rubira Branco <rbranco@la.checkpoint.com>,
+ torvalds@linux-foundation.org,
+ akpm@linux-foundation.org,
+ alan@lxorguk.ukuu.org.uk,
+ "Mark M. Hoffman" <mhoffman@lightlink.com>,
+ Jean Delvare <khali@linux-fr.org>
+Subject: [patch 08/10] hwmon: (lm85) Fix function RANGE_TO_REG()
+Content-Disposition: inline; filename=hwmon-fix-function-range_to_reg.patch
+Content-Length: 1163
+Lines: 38
+
+2.6.25.9-stable review patch.  If anyone has any objections, please let
+us know.
+
+------------------ 
+From: Jean Delvare <khali@linux-fr.org>
+
+Function RANGE_TO_REG() is broken. For a requested range of 2000 (2
+degrees C), it will return an index value of 15, i.e. 80.0 degrees C,
+instead of the expected index value of 0. All other values are handled
+properly, just 2000 isn't.
+
+The bug was introduced back in November 2004 by this patch:
+http://git.kernel.org/?p=linux/kernel/git/tglx/history.git;a=commit;h=1c28d80f1992240373099d863e4996cdd5d646d0
+
+In Linus' kernel I decided to rewrite the whole function in a way
+which was more obviously correct. But for -stable let's just do the
+minimal fix.
+
+Signed-off-by: Jean Delvare <khali@linux-fr.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/hwmon/lm85.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/hwmon/lm85.c
++++ b/drivers/hwmon/lm85.c
+@@ -192,7 +192,7 @@ static int RANGE_TO_REG( int range )
+ {
+       int i;
+-      if ( range < lm85_range_map[0] ) { 
++      if (range <= lm85_range_map[0]) {
+               return 0 ;
+       } else if ( range > lm85_range_map[15] ) {
+               return 15 ;
+
+-- 
+
+From gregkh@mini.kroah.org Mon Jun 23 16:00:40 2008
+Message-Id: <20080623230040.512273192@mini.kroah.org>
+References: <20080623225737.837265824@mini.kroah.org>
+User-Agent: quilt/0.46-1
+Date: Mon, 23 Jun 2008 15:57:44 -0700
+From: Greg KH <gregkh@suse.de>
+To: linux-kernel@vger.kernel.org,
+ stable@kernel.org
+Cc: Justin Forbes <jmforbes@linuxtx.org>,
+ Zwane Mwaikambo <zwane@arm.linux.org.uk>,
+ Theodore Ts'o <tytso@mit.edu>,
+ Randy Dunlap <rdunlap@xenotime.net>,
+ Dave Jones <davej@redhat.com>,
+ Chuck Wolber <chuckw@quantumlinux.com>,
+ Chris Wedgwood <reviews@ml.cw.f00f.org>,
+ Michael Krufky <mkrufky@linuxtv.org>,
+ Chuck Ebbert <cebbert@redhat.com>,
+ Domenico Andreoli <cavokz@gmail.com>,
+ Willy Tarreau <w@1wt.eu>,
+ Rodrigo Rubira Branco <rbranco@la.checkpoint.com>,
+ torvalds@linux-foundation.org,
+ akpm@linux-foundation.org,
+ alan@lxorguk.ukuu.org.uk,
+ Thomas Mingarelli <Thomas.Mingarelli@hp.com>
+Subject: [patch 07/10] watchdog: hpwdt: fix use of inline assembly
+Content-Disposition: inline; filename=watchdog-hpwdt-fix-use-of-inline-assembly.patch
+Content-Length: 8115
+Lines: 210
+
+2.6.25.9-stable review patch.  If anyone has any objections, please let
+us know.
+
+------------------ 
+From: Linus Torvalds <torvalds@linux-foundation.org>
+
+commit 1f6ef2342972dc7fd623f360f84006e2304eb935 upstream
+
+The inline assembly in drivers/watchdog/hpwdt.c was incredibly broken,
+and included all the function prologue and epilogue stuff, even though
+it was itself then inside a C function where the compiler would add its
+own prologue and epilogue on top of it all.
+
+This then just _happened_ to work if you had exactly the right compiler
+version and exactly the right compiler flags, so that gcc just happened
+to not create any prologue at all (the gcc-generated epilogue wouldn't
+matter, since it would never be reached).
+
+But the more proper way to fix it is to simply not do this.  Move the
+inline asm to the top level, with no surrounding function at all (the
+better alternative would be to remove the prologue and make it actually
+use proper description of the arguments to the inline asm, but that's a
+bigger change than the one I'm willing to make right now).
+
+Tested-by: S.Çağlar Onur <caglar@pardus.org.tr>
+Acked-by: Thomas Mingarelli <Thomas.Mingarelli@hp.com>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/watchdog/hpwdt.c |  154 ++++++++++++++++++++++++-----------------------
+ 1 file changed, 79 insertions(+), 75 deletions(-)
+
+--- a/drivers/watchdog/hpwdt.c
++++ b/drivers/watchdog/hpwdt.c
+@@ -140,49 +140,52 @@ static struct pci_device_id hpwdt_device
+ };
+ MODULE_DEVICE_TABLE(pci, hpwdt_devices);
++extern asmlinkage void asminline_call(struct cmn_registers *pi86Regs, unsigned long *pRomEntry);
++
+ #ifndef CONFIG_X86_64
+ /* --32 Bit Bios------------------------------------------------------------ */
+ #define HPWDT_ARCH    32
+-static void asminline_call(struct cmn_registers *pi86Regs,
+-                         unsigned long *pRomEntry)
+-{
+-      asm("pushl       %ebp               \n\t"
+-          "movl        %esp, %ebp         \n\t"
+-          "pusha                          \n\t"
+-          "pushf                          \n\t"
+-          "push        %es                \n\t"
+-          "push        %ds                \n\t"
+-          "pop         %es                \n\t"
+-          "movl        8(%ebp),%eax       \n\t"
+-          "movl        4(%eax),%ebx       \n\t"
+-          "movl        8(%eax),%ecx       \n\t"
+-          "movl        12(%eax),%edx      \n\t"
+-          "movl        16(%eax),%esi      \n\t"
+-          "movl        20(%eax),%edi      \n\t"
+-          "movl        (%eax),%eax        \n\t"
+-          "push        %cs                \n\t"
+-          "call        *12(%ebp)          \n\t"
+-          "pushf                          \n\t"
+-          "pushl       %eax               \n\t"
+-          "movl        8(%ebp),%eax       \n\t"
+-          "movl        %ebx,4(%eax)       \n\t"
+-          "movl        %ecx,8(%eax)       \n\t"
+-          "movl        %edx,12(%eax)      \n\t"
+-          "movl        %esi,16(%eax)      \n\t"
+-          "movl        %edi,20(%eax)      \n\t"
+-          "movw        %ds,24(%eax)       \n\t"
+-          "movw        %es,26(%eax)       \n\t"
+-          "popl        %ebx               \n\t"
+-          "movl        %ebx,(%eax)        \n\t"
+-          "popl        %ebx               \n\t"
+-          "movl        %ebx,28(%eax)      \n\t"
+-          "pop         %es                \n\t"
+-          "popf                           \n\t"
+-          "popa                           \n\t"
+-          "leave                          \n\t" "ret");
+-}
++asm(".text                          \n\t"
++    ".align 4                       \n"
++    "asminline_call:                \n\t"
++    "pushl       %ebp               \n\t"
++    "movl        %esp, %ebp         \n\t"
++    "pusha                          \n\t"
++    "pushf                          \n\t"
++    "push        %es                \n\t"
++    "push        %ds                \n\t"
++    "pop         %es                \n\t"
++    "movl        8(%ebp),%eax       \n\t"
++    "movl        4(%eax),%ebx       \n\t"
++    "movl        8(%eax),%ecx       \n\t"
++    "movl        12(%eax),%edx      \n\t"
++    "movl        16(%eax),%esi      \n\t"
++    "movl        20(%eax),%edi      \n\t"
++    "movl        (%eax),%eax        \n\t"
++    "push        %cs                \n\t"
++    "call        *12(%ebp)          \n\t"
++    "pushf                          \n\t"
++    "pushl       %eax               \n\t"
++    "movl        8(%ebp),%eax       \n\t"
++    "movl        %ebx,4(%eax)       \n\t"
++    "movl        %ecx,8(%eax)       \n\t"
++    "movl        %edx,12(%eax)      \n\t"
++    "movl        %esi,16(%eax)      \n\t"
++    "movl        %edi,20(%eax)      \n\t"
++    "movw        %ds,24(%eax)       \n\t"
++    "movw        %es,26(%eax)       \n\t"
++    "popl        %ebx               \n\t"
++    "movl        %ebx,(%eax)        \n\t"
++    "popl        %ebx               \n\t"
++    "movl        %ebx,28(%eax)      \n\t"
++    "pop         %es                \n\t"
++    "popf                           \n\t"
++    "popa                           \n\t"
++    "leave                          \n\t"
++    "ret                            \n\t"
++    ".previous");
+ /*
+  *    cru_detect
+@@ -333,43 +336,44 @@ static int __devinit detect_cru_service(
+ #define HPWDT_ARCH    64
+-static void asminline_call(struct cmn_registers *pi86Regs,
+-                         unsigned long *pRomEntry)
+-{
+-      asm("pushq      %rbp            \n\t"
+-          "movq       %rsp, %rbp      \n\t"
+-          "pushq      %rax            \n\t"
+-          "pushq      %rbx            \n\t"
+-          "pushq      %rdx            \n\t"
+-          "pushq      %r12            \n\t"
+-          "pushq      %r9             \n\t"
+-          "movq       %rsi, %r12      \n\t"
+-          "movq       %rdi, %r9       \n\t"
+-          "movl       4(%r9),%ebx     \n\t"
+-          "movl       8(%r9),%ecx     \n\t"
+-          "movl       12(%r9),%edx    \n\t"
+-          "movl       16(%r9),%esi    \n\t"
+-          "movl       20(%r9),%edi    \n\t"
+-          "movl       (%r9),%eax      \n\t"
+-          "call       *%r12           \n\t"
+-          "pushfq                     \n\t"
+-          "popq        %r12           \n\t"
+-          "popfq                      \n\t"
+-          "movl       %eax, (%r9)     \n\t"
+-          "movl       %ebx, 4(%r9)    \n\t"
+-          "movl       %ecx, 8(%r9)    \n\t"
+-          "movl       %edx, 12(%r9)   \n\t"
+-          "movl       %esi, 16(%r9)   \n\t"
+-          "movl       %edi, 20(%r9)   \n\t"
+-          "movq       %r12, %rax      \n\t"
+-          "movl       %eax, 28(%r9)   \n\t"
+-          "popq       %r9             \n\t"
+-          "popq       %r12            \n\t"
+-          "popq       %rdx            \n\t"
+-          "popq       %rbx            \n\t"
+-          "popq       %rax            \n\t"
+-          "leave                      \n\t" "ret");
+-}
++asm(".text                      \n\t"
++    ".align 4                   \n"
++    "asminline_call:            \n\t"
++    "pushq      %rbp            \n\t"
++    "movq       %rsp, %rbp      \n\t"
++    "pushq      %rax            \n\t"
++    "pushq      %rbx            \n\t"
++    "pushq      %rdx            \n\t"
++    "pushq      %r12            \n\t"
++    "pushq      %r9             \n\t"
++    "movq       %rsi, %r12      \n\t"
++    "movq       %rdi, %r9       \n\t"
++    "movl       4(%r9),%ebx     \n\t"
++    "movl       8(%r9),%ecx     \n\t"
++    "movl       12(%r9),%edx    \n\t"
++    "movl       16(%r9),%esi    \n\t"
++    "movl       20(%r9),%edi    \n\t"
++    "movl       (%r9),%eax      \n\t"
++    "call       *%r12           \n\t"
++    "pushfq                     \n\t"
++    "popq        %r12           \n\t"
++    "popfq                      \n\t"
++    "movl       %eax, (%r9)     \n\t"
++    "movl       %ebx, 4(%r9)    \n\t"
++    "movl       %ecx, 8(%r9)    \n\t"
++    "movl       %edx, 12(%r9)   \n\t"
++    "movl       %esi, 16(%r9)   \n\t"
++    "movl       %edi, 20(%r9)   \n\t"
++    "movq       %r12, %rax      \n\t"
++    "movl       %eax, 28(%r9)   \n\t"
++    "popq       %r9             \n\t"
++    "popq       %r12            \n\t"
++    "popq       %rdx            \n\t"
++    "popq       %rbx            \n\t"
++    "popq       %rax            \n\t"
++    "leave                      \n\t"
++    "ret                        \n\t"
++    ".previous");
+ /*
+  *    dmi_find_cru
+
+-- 
+
+From gregkh@mini.kroah.org Mon Jun 23 16:00:40 2008
+Message-Id: <20080623230040.266388660@mini.kroah.org>
+References: <20080623225737.837265824@mini.kroah.org>
+User-Agent: quilt/0.46-1
+Date: Mon, 23 Jun 2008 15:57:43 -0700
+From: Greg KH <gregkh@suse.de>
+To: linux-kernel@vger.kernel.org,
+ stable@kernel.org
+Cc: Justin Forbes <jmforbes@linuxtx.org>,
+ Zwane Mwaikambo <zwane@arm.linux.org.uk>,
+ Theodore Ts'o <tytso@mit.edu>,
+ Randy Dunlap <rdunlap@xenotime.net>,
+ Dave Jones <davej@redhat.com>,
+ Chuck Wolber <chuckw@quantumlinux.com>,
+ Chris Wedgwood <reviews@ml.cw.f00f.org>,
+ Michael Krufky <mkrufky@linuxtv.org>,
+ Chuck Ebbert <cebbert@redhat.com>,
+ Domenico Andreoli <cavokz@gmail.com>,
+ Willy Tarreau <w@1wt.eu>,
+ Rodrigo Rubira Branco <rbranco@la.checkpoint.com>,
+ torvalds@linux-foundation.org,
+ akpm@linux-foundation.org,
+ alan@lxorguk.ukuu.org.uk,
+ Bernhard Walle <bwalle@suse.de>
+Subject: [patch 06/10] Add return value to reserve_bootmem_node()
+Content-Disposition: inline; filename=add-return-value-to-reserve_bootmem_node.patch
+Content-Length: 1708
+Lines: 52
+
+2.6.25.9-stable review patch.  If anyone has any objections, please let
+us know.
+
+------------------ 
+From: Bernhard Walle <bwalle@suse.de>
+
+commit 71c2742f5e6348d76ee62085cf0a13e5eff0f00e upstream
+
+This patch changes the function reserve_bootmem_node() from void to int,
+returning -ENOMEM if the allocation fails.
+
+This fixes a build problem on x86 with CONFIG_KEXEC=y and
+CONFIG_NEED_MULTIPLE_NODES=y
+
+Signed-off-by: Bernhard Walle <bwalle@suse.de>
+Reported-by: Adrian Bunk <bunk@kernel.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ include/linux/bootmem.h |    2 +-
+ mm/bootmem.c            |    4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+--- a/include/linux/bootmem.h
++++ b/include/linux/bootmem.h
+@@ -94,7 +94,7 @@ extern unsigned long init_bootmem_node(p
+                                      unsigned long freepfn,
+                                      unsigned long startpfn,
+                                      unsigned long endpfn);
+-extern void reserve_bootmem_node(pg_data_t *pgdat,
++extern int reserve_bootmem_node(pg_data_t *pgdat,
+                                unsigned long physaddr,
+                                unsigned long size,
+                                int flags);
+--- a/mm/bootmem.c
++++ b/mm/bootmem.c
+@@ -398,10 +398,10 @@ unsigned long __init init_bootmem_node(p
+       return init_bootmem_core(pgdat, freepfn, startpfn, endpfn);
+ }
+-void __init reserve_bootmem_node(pg_data_t *pgdat, unsigned long physaddr,
++int __init reserve_bootmem_node(pg_data_t *pgdat, unsigned long physaddr,
+                                unsigned long size, int flags)
+ {
+-      reserve_bootmem_core(pgdat->bdata, physaddr, size, flags);
++      return reserve_bootmem_core(pgdat->bdata, physaddr, size, flags);
+ }
+ void __init free_bootmem_node(pg_data_t *pgdat, unsigned long physaddr,
+
+-- 
+
+From gregkh@mini.kroah.org Mon Jun 23 16:00:40 2008
+Message-Id: <20080623230040.020671538@mini.kroah.org>
+References: <20080623225737.837265824@mini.kroah.org>
+User-Agent: quilt/0.46-1
+Date: Mon, 23 Jun 2008 15:57:42 -0700
+From: Greg KH <gregkh@suse.de>
+To: linux-kernel@vger.kernel.org,
+ stable@kernel.org,
+ jejb@kernel.org
+Cc: Justin Forbes <jmforbes@linuxtx.org>,
+ Zwane Mwaikambo <zwane@arm.linux.org.uk>,
+ Theodore Ts'o <tytso@mit.edu>,
+ Randy Dunlap <rdunlap@xenotime.net>,
+ Dave Jones <davej@redhat.com>,
+ Chuck Wolber <chuckw@quantumlinux.com>,
+ Chris Wedgwood <reviews@ml.cw.f00f.org>,
+ Michael Krufky <mkrufky@linuxtv.org>,
+ Chuck Ebbert <cebbert@redhat.com>,
+ Domenico Andreoli <cavokz@gmail.com>,
+ Willy Tarreau <w@1wt.eu>,
+ Rodrigo Rubira Branco <rbranco@la.checkpoint.com>,
+ torvalds@linux-foundation.org,
+ akpm@linux-foundation.org,
+ alan@lxorguk.ukuu.org.uk,
+ Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
+ Jan Beulich <jbeulich@novell.com>,
+ Ingo Molnar <mingo@elte.hu>
+Subject: [patch 05/10] x86: set PAE PHYSICAL_MASK_SHIFT to 44 bits.
+Content-Disposition: inline; filename=x86-set-pae-physical_mask_shift-to-44-bits.patch
+Content-Length: 1697
+Lines: 50
+
+2.6.25.9-stable review patch.  If anyone has any objections, please let
+us know.
+
+------------------ 
+From: Jeremy Fitzhardinge <jeremy@goop.org>
+
+commit ad524d46f36bbc32033bb72ba42958f12bf49b06 upstream
+
+When a 64-bit x86 processor runs in 32-bit PAE mode, a pte can
+potentially have the same number of physical address bits as the
+64-bit host ("Enhanced Legacy PAE Paging").  This means, in theory,
+we could have up to 52 bits of physical address in a pte.
+
+The 32-bit kernel uses a 32-bit unsigned long to represent a pfn.
+This means that it can only represent physical addresses up to 32+12=44
+bits wide.  Rather than widening pfns everywhere, just set 2^44 as the
+Linux x86_32-PAE architectural limit for physical address size.
+
+This is a bugfix for two cases:
+1. running a 32-bit PAE kernel on a machine with
+  more than 64GB RAM.
+2. running a 32-bit PAE Xen guest on a host machine with
+  more than 64GB RAM
+
+In both cases, a pte could need to have more than 36 bits of physical,
+and masking it to 36-bits will cause fairly severe havoc.
+
+Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
+Cc: Jan Beulich <jbeulich@novell.com>
+Signed-off-by: Ingo Molnar <mingo@elte.hu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ include/asm-x86/page_32.h |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/include/asm-x86/page_32.h
++++ b/include/asm-x86/page_32.h
+@@ -14,7 +14,8 @@
+ #define __PAGE_OFFSET         _AC(CONFIG_PAGE_OFFSET, UL)
+ #ifdef CONFIG_X86_PAE
+-#define __PHYSICAL_MASK_SHIFT 36
++/* 44=32+12, the limit we can fit into an unsigned long pfn */
++#define __PHYSICAL_MASK_SHIFT 44
+ #define __VIRTUAL_MASK_SHIFT  32
+ #define PAGETABLE_LEVELS      3
+
+-- 
+
+From gregkh@mini.kroah.org Mon Jun 23 16:00:39 2008
+Message-Id: <20080623230039.650869160@mini.kroah.org>
+References: <20080623225737.837265824@mini.kroah.org>
+User-Agent: quilt/0.46-1
+Date: Mon, 23 Jun 2008 15:57:41 -0700
+From: Greg KH <gregkh@suse.de>
+To: linux-kernel@vger.kernel.org,
+ stable@kernel.org,
+ jejb@kernel.org
+Cc: Justin Forbes <jmforbes@linuxtx.org>,
+ Zwane Mwaikambo <zwane@arm.linux.org.uk>,
+ Theodore Ts'o <tytso@mit.edu>,
+ Randy Dunlap <rdunlap@xenotime.net>,
+ Dave Jones <davej@redhat.com>,
+ Chuck Wolber <chuckw@quantumlinux.com>,
+ Chris Wedgwood <reviews@ml.cw.f00f.org>,
+ Michael Krufky <mkrufky@linuxtv.org>,
+ Chuck Ebbert <cebbert@redhat.com>,
+ Domenico Andreoli <cavokz@gmail.com>,
+ Willy Tarreau <w@1wt.eu>,
+ Rodrigo Rubira Branco <rbranco@la.checkpoint.com>,
+ torvalds@linux-foundation.org,
+ akpm@linux-foundation.org,
+ alan@lxorguk.ukuu.org.uk,
+ Bernhard Walle <bwalle@suse.de>,
+ Ingo Molnar <mingo@elte.hu>
+Subject: [patch 04/10] x86: use BOOTMEM_EXCLUSIVE on 32-bit
+Content-Disposition: inline; filename=x86-use-bootmem_exclusive-on-32-bit.patch
+Content-Length: 1429
+Lines: 45
+
+2.6.25.9-stable review patch.  If anyone has any objections, please let
+us know.
+
+------------------ 
+From: Bernhard Walle <bwalle@suse.de>
+
+commit d3942cff620bea073fc4e3c8ed878eb1e84615ce upstream
+
+This patch uses the BOOTMEM_EXCLUSIVE for crashkernel reservation also for
+i386 and prints a error message on failure.
+
+The patch is still for 2.6.26 since it is only bug fixing. The unification
+of reserve_crashkernel() between i386 and x86_64 should be done for 2.6.27.
+
+Signed-off-by: Bernhard Walle <bwalle@suse.de>
+Signed-off-by: Ingo Molnar <mingo@elte.hu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ arch/x86/kernel/setup_32.c |   10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+--- a/arch/x86/kernel/setup_32.c
++++ b/arch/x86/kernel/setup_32.c
+@@ -483,10 +483,16 @@ static void __init reserve_crashkernel(v
+                                       (unsigned long)(crash_size >> 20),
+                                       (unsigned long)(crash_base >> 20),
+                                       (unsigned long)(total_mem >> 20));
++
++                      if (reserve_bootmem(crash_base, crash_size,
++                                      BOOTMEM_EXCLUSIVE) < 0) {
++                              printk(KERN_INFO "crashkernel reservation "
++                                      "failed - memory is in use\n");
++                              return;
++                      }
++
+                       crashk_res.start = crash_base;
+                       crashk_res.end   = crash_base + crash_size - 1;
+-                      reserve_bootmem(crash_base, crash_size,
+-                                      BOOTMEM_DEFAULT);
+               } else
+                       printk(KERN_INFO "crashkernel reservation failed - "
+                                       "you have to specify a base address\n");
+
+-- 
+
+From gregkh@mini.kroah.org Mon Jun 23 16:00:39 2008
+Message-Id: <20080623230039.361638196@mini.kroah.org>
+References: <20080623225737.837265824@mini.kroah.org>
+User-Agent: quilt/0.46-1
+Date: Mon, 23 Jun 2008 15:57:40 -0700
+From: Greg KH <gregkh@suse.de>
+To: linux-kernel@vger.kernel.org,
+ stable@kernel.org
+Cc: Justin Forbes <jmforbes@linuxtx.org>,
+ Zwane Mwaikambo <zwane@arm.linux.org.uk>,
+ Theodore Ts'o <tytso@mit.edu>,
+ Randy Dunlap <rdunlap@xenotime.net>,
+ Dave Jones <davej@redhat.com>,
+ Chuck Wolber <chuckw@quantumlinux.com>,
+ Chris Wedgwood <reviews@ml.cw.f00f.org>,
+ Michael Krufky <mkrufky@linuxtv.org>,
+ Chuck Ebbert <cebbert@redhat.com>,
+ Domenico Andreoli <cavokz@gmail.com>,
+ Willy Tarreau <w@1wt.eu>,
+ Rodrigo Rubira Branco <rbranco@la.checkpoint.com>,
+ torvalds@linux-foundation.org,
+ akpm@linux-foundation.org,
+ alan@lxorguk.ukuu.org.uk,
+ "David S. Miller" <davem@davemloft.net>
+Subject: [patch 03/10] sctp: Make sure N * sizeof(union sctp_addr) does not overflow.
+Content-Disposition: inline; filename=sctp-make-sure-n-sizeof-does-not-overflow.patch
+Content-Length: 1070
+Lines: 36
+
+2.6.25.9-stable review patch.  If anyone has any objections, please let
+us know.
+
+------------------ 
+From: David S. Miller <davem@davemloft.net>
+
+commit 735ce972fbc8a65fb17788debd7bbe7b4383cc62 upstream
+
+As noticed by Gabriel Campana, the kmalloc() length arg
+passed in by sctp_getsockopt_local_addrs_old() can overflow
+if ->addr_num is large enough.
+
+Therefore, enforce an appropriate limit.
+
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ net/sctp/socket.c |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+--- a/net/sctp/socket.c
++++ b/net/sctp/socket.c
+@@ -4421,7 +4421,9 @@ static int sctp_getsockopt_local_addrs_o
+       if (copy_from_user(&getaddrs, optval, len))
+               return -EFAULT;
+-      if (getaddrs.addr_num <= 0) return -EINVAL;
++      if (getaddrs.addr_num <= 0 ||
++          getaddrs.addr_num >= (INT_MAX / sizeof(union sctp_addr)))
++              return -EINVAL;
+       /*
+        *  For UDP-style sockets, id specifies the association to query.
+        *  If the id field is set to the value '0' then the locally bound
+
+-- 
+
+From gregkh@mini.kroah.org Mon Jun 23 16:00:39 2008
+Message-Id: <20080623230039.170847397@mini.kroah.org>
+References: <20080623225737.837265824@mini.kroah.org>
+User-Agent: quilt/0.46-1
+Date: Mon, 23 Jun 2008 15:57:39 -0700
+From: Greg KH <gregkh@suse.de>
+To: linux-kernel@vger.kernel.org,
+ stable@kernel.org
+Cc: Justin Forbes <jmforbes@linuxtx.org>,
+ Zwane Mwaikambo <zwane@arm.linux.org.uk>,
+ Theodore Ts'o <tytso@mit.edu>,
+ Randy Dunlap <rdunlap@xenotime.net>,
+ Dave Jones <davej@redhat.com>,
+ Chuck Wolber <chuckw@quantumlinux.com>,
+ Chris Wedgwood <reviews@ml.cw.f00f.org>,
+ Michael Krufky <mkrufky@linuxtv.org>,
+ Chuck Ebbert <cebbert@redhat.com>,
+ Domenico Andreoli <cavokz@gmail.com>,
+ Willy Tarreau <w@1wt.eu>,
+ Rodrigo Rubira Branco <rbranco@la.checkpoint.com>,
+ torvalds@linux-foundation.org,
+ akpm@linux-foundation.org,
+ alan@lxorguk.ukuu.org.uk,
+ Oleg Nesterov <oleg@tv-sign.ru>,
+ Nick Piggin <npiggin@suse.de>,
+ KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
+ Hugh Dickins <hugh@veritas.com>,
+ Ingo Molnar <mingo@elte.hu>,
+ Roland McGrath <roland@redhat.com>
+Subject: [patch 02/10] Reinstate ZERO_PAGE optimization in get_user_pages() and fix XIP
+Content-Disposition: inline; filename=reinstate-zero_page-optimization-in-get_user_pages-and-fix-xip.patch
+Content-Length: 4316
+Lines: 140
+
+2.6.25.9-stable review patch.  If anyone has any objections, please let
+us know.
+
+------------------ 
+From: Linus Torvalds <torvalds@linux-foundation.org>
+
+commit 89f5b7da2a6bad2e84670422ab8192382a5aeb9f upstream
+
+KAMEZAWA Hiroyuki and Oleg Nesterov point out that since the commit
+557ed1fa2620dc119adb86b34c614e152a629a80 ("remove ZERO_PAGE") removed
+the ZERO_PAGE from the VM mappings, any users of get_user_pages() will
+generally now populate the VM with real empty pages needlessly.
+
+We used to get the ZERO_PAGE when we did the "handle_mm_fault()", but
+since fault handling no longer uses ZERO_PAGE for new anonymous pages,
+we now need to handle that special case in follow_page() instead.
+
+In particular, the removal of ZERO_PAGE effectively removed the core
+file writing optimization where we would skip writing pages that had not
+been populated at all, and increased memory pressure a lot by allocating
+all those useless newly zeroed pages.
+
+This reinstates the optimization by making the unmapped PTE case the
+same as for a non-existent page table, which already did this correctly.
+
+While at it, this also fixes the XIP case for follow_page(), where the
+caller could not differentiate between the case of a page that simply
+could not be used (because it had no "struct page" associated with it)
+and a page that just wasn't mapped.
+
+We do that by simply returning an error pointer for pages that could not
+be turned into a "struct page *".  The error is arbitrarily picked to be
+EFAULT, since that was what get_user_pages() already used for the
+equivalent IO-mapped page case.
+
+[ Also removed an impossible test for pte_offset_map_lock() failing:
+  that's not how that function works ]
+
+Acked-by: Oleg Nesterov <oleg@tv-sign.ru>
+Acked-by: Nick Piggin <npiggin@suse.de>
+Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
+Cc: Hugh Dickins <hugh@veritas.com>
+Cc: Andrew Morton <akpm@linux-foundation.org>
+Cc: Ingo Molnar <mingo@elte.hu>
+Cc: Roland McGrath <roland@redhat.com>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ arch/powerpc/kernel/vdso.c |    2 +-
+ mm/memory.c                |   17 +++++++++++++----
+ mm/migrate.c               |   10 ++++++++++
+ 3 files changed, 24 insertions(+), 5 deletions(-)
+
+--- a/arch/powerpc/kernel/vdso.c
++++ b/arch/powerpc/kernel/vdso.c
+@@ -141,7 +141,7 @@ static void dump_one_vdso_page(struct pa
+       printk("kpg: %p (c:%d,f:%08lx)", __va(page_to_pfn(pg) << PAGE_SHIFT),
+              page_count(pg),
+              pg->flags);
+-      if (upg/* && pg != upg*/) {
++      if (upg && !IS_ERR(upg) /* && pg != upg*/) {
+               printk(" upg: %p (c:%d,f:%08lx)", __va(page_to_pfn(upg)
+                                                      << PAGE_SHIFT),
+                      page_count(upg),
+--- a/mm/memory.c
++++ b/mm/memory.c
+@@ -943,17 +943,15 @@ struct page *follow_page(struct vm_area_
+       }
+       ptep = pte_offset_map_lock(mm, pmd, address, &ptl);
+-      if (!ptep)
+-              goto out;
+       pte = *ptep;
+       if (!pte_present(pte))
+-              goto unlock;
++              goto no_page;
+       if ((flags & FOLL_WRITE) && !pte_write(pte))
+               goto unlock;
+       page = vm_normal_page(vma, address, pte);
+       if (unlikely(!page))
+-              goto unlock;
++              goto bad_page;
+       if (flags & FOLL_GET)
+               get_page(page);
+@@ -968,6 +966,15 @@ unlock:
+ out:
+       return page;
++bad_page:
++      pte_unmap_unlock(ptep, ptl);
++      return ERR_PTR(-EFAULT);
++
++no_page:
++      pte_unmap_unlock(ptep, ptl);
++      if (!pte_none(pte))
++              return page;
++      /* Fall through to ZERO_PAGE handling */
+ no_page_table:
+       /*
+        * When core dumping an enormous anonymous area that nobody
+@@ -1104,6 +1111,8 @@ int get_user_pages(struct task_struct *t
+                               cond_resched();
+                       }
++                      if (IS_ERR(page))
++                              return i ? i : PTR_ERR(page);
+                       if (pages) {
+                               pages[i] = page;
+--- a/mm/migrate.c
++++ b/mm/migrate.c
+@@ -858,6 +858,11 @@ static int do_move_pages(struct mm_struc
+                       goto set_status;
+               page = follow_page(vma, pp->addr, FOLL_GET);
++
++              err = PTR_ERR(page);
++              if (IS_ERR(page))
++                      goto set_status;
++
+               err = -ENOENT;
+               if (!page)
+                       goto set_status;
+@@ -921,6 +926,11 @@ static int do_pages_stat(struct mm_struc
+                       goto set_status;
+               page = follow_page(vma, pm->addr, 0);
++
++              err = PTR_ERR(page);
++              if (IS_ERR(page))
++                      goto set_status;
++
+               err = -ENOENT;
+               /* Use PageReserved to check for zero page */
+               if (!page || PageReserved(page))
+
+-- 
+
+From gregkh@mini.kroah.org Mon Jun 23 16:00:39 2008
+Message-Id: <20080623230038.876059930@mini.kroah.org>
+References: <20080623225737.837265824@mini.kroah.org>
+User-Agent: quilt/0.46-1
+Date: Mon, 23 Jun 2008 15:57:38 -0700
+From: Greg KH <gregkh@suse.de>
+To: linux-kernel@vger.kernel.org,
+ stable@kernel.org
+Cc: Justin Forbes <jmforbes@linuxtx.org>,
+ Zwane Mwaikambo <zwane@arm.linux.org.uk>,
+ Theodore Ts'o <tytso@mit.edu>,
+ Randy Dunlap <rdunlap@xenotime.net>,
+ Dave Jones <davej@redhat.com>,
+ Chuck Wolber <chuckw@quantumlinux.com>,
+ Chris Wedgwood <reviews@ml.cw.f00f.org>,
+ Michael Krufky <mkrufky@linuxtv.org>,
+ Chuck Ebbert <cebbert@redhat.com>,
+ Domenico Andreoli <cavokz@gmail.com>,
+ Willy Tarreau <w@1wt.eu>,
+ Rodrigo Rubira Branco <rbranco@la.checkpoint.com>,
+ torvalds@linux-foundation.org,
+ akpm@linux-foundation.org,
+ alan@lxorguk.ukuu.org.uk,
+ csnook@redhat.com,
+ advantis@gmx.net,
+ jgarzik@redhat.com,
+ Jay Cliburn <jacliburn@bellsouth.net>
+Subject: [patch 01/10] atl1: relax eeprom mac address error check
+Content-Disposition: inline; filename=atl1-relax-eeprom-mac-address-error-check.patch
+Content-Length: 1707
+Lines: 55
+
+
+2.6.25.9-stable review patch.  If anyone has any objections, please let
+us know.
+
+------------------ 
+From: Radu Cristescu <advantis@gmx.net>
+
+upstream commit: 58c7821c4264a7ddd6f0c31c5caaf393b3897f10
+
+The atl1 driver tries to determine the MAC address thusly:
+
+       - If an EEPROM exists, read the MAC address from EEPROM and
+         validate it.
+       - If an EEPROM doesn't exist, try to read a MAC address from
+         SPI flash.
+       - If that fails, try to read a MAC address directly from the
+         MAC Station Address register.
+       - If that fails, assign a random MAC address provided by the
+         kernel.
+
+We now have a report of a system fitted with an EEPROM containing all
+zeros where we expect the MAC address to be, and we currently handle
+this as an error condition.  Turns out, on this system the BIOS writes
+a valid MAC address to the NIC's MAC Station Address register, but we
+never try to read it because we return an error when we find the all-
+zeros address in EEPROM.
+
+This patch relaxes the error check and continues looking for a MAC
+address even if it finds an illegal one in EEPROM.
+
+http://ubuntuforums.org/showthread.php?t=562617
+
+[jacliburn@bellsouth.net: backport to 2.6.25.7]
+
+Signed-off-by: Radu Cristescu <advantis@gmx.net>
+Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net>
+Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/net/atl1/atl1_hw.c |    1 -
+ 1 file changed, 1 deletion(-)
+
+--- a/drivers/net/atl1/atl1_hw.c
++++ b/drivers/net/atl1/atl1_hw.c
+@@ -250,7 +250,6 @@ static int atl1_get_permanent_address(st
+                       memcpy(hw->perm_mac_addr, eth_addr, ETH_ALEN);
+                       return 0;
+               }
+-              return 1;
+       }
+       /* see if SPI FLAGS exist ? */
+
+-- 
+