+++ /dev/null
-From stable-bounces@linux.kernel.org Tue Feb 13 09:33:02 2007
-From: Douglas Gilbert <dougg@torque.net>
-Date: Tue, 13 Feb 2007 09:31:38 -0800
-Subject: Fix Bug 7994: sleeping function called from invalid context at mm/slab.c:3034
-To: stable@kernel.org
-Cc: Douglas Gilbert <dougg@torque.net>
-Message-ID: <20070213093138.b4fa28c5.akpm@linux-foundation.org>
-
-From: Douglas Gilbert <dougg@torque.net>
-
-ChangeLog:
- - Use GFP_ATOMIC for allocations that can be called
- from the queuecommand() entry point
-
-Signed-off-by: Douglas Gilbert <dougg@torque.net>
-Cc: James Bottomley <James.Bottomley@SteelEye.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-
----
- drivers/scsi/scsi_debug.c | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
-
---- linux-2.6.20.1.orig/drivers/scsi/scsi_debug.c
-+++ linux-2.6.20.1/drivers/scsi/scsi_debug.c
-@@ -954,7 +954,7 @@ static int resp_inquiry(struct scsi_cmnd
- int alloc_len, n, ret;
-
- alloc_len = (cmd[3] << 8) + cmd[4];
-- arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_KERNEL);
-+ arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_ATOMIC);
- if (devip->wlun)
- pq_pdt = 0x1e; /* present, wlun */
- else if (scsi_debug_no_lun_0 && (0 == devip->lun))
-@@ -1217,7 +1217,7 @@ static int resp_report_tgtpgs(struct scs
- alen = ((cmd[6] << 24) + (cmd[7] << 16) + (cmd[8] << 8)
- + cmd[9]);
-
-- arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_KERNEL);
-+ arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_ATOMIC);
- /*
- * EVPD page 0x88 states we have two ports, one
- * real and a fake port with no device connected.
-@@ -2044,7 +2044,7 @@ static struct sdebug_dev_info * devInfoR
- }
- }
- if (NULL == open_devip) { /* try and make a new one */
-- open_devip = kzalloc(sizeof(*open_devip),GFP_KERNEL);
-+ open_devip = kzalloc(sizeof(*open_devip),GFP_ATOMIC);
- if (NULL == open_devip) {
- printk(KERN_ERR "%s: out of memory at line %d\n",
- __FUNCTION__, __LINE__);
--- /dev/null
+From stable-bounces@linux.kernel.org Tue Mar 6 23:57:26 2007
+From: Linus Torvalds <torvalds@linux-foundation.org>
+Date: Wed, 07 Mar 2007 07:56:00 +0000
+Subject: Revert "[PATCH] LOG2: Alter get_order() so that it can make use of ilog2() on a constant"
+To: stable@kernel.org
+Message-ID: <1173254160.3461.305.camel@pmac.infradead.org>
+
+From: Linus Torvalds <torvalds@linux-foundation.org>
+
+Revert "[PATCH] LOG2: Alter get_order() so that it can make use of ilog2() on a constant"
+
+This reverts commit 39d61db0edb34d60b83c5e0d62d0e906578cc707.
+
+The commit was buggy in multiple ways:
+ - the conversion to ilog2() was incorrect to begin with
+ - it tested the wrong #defines, so on all architectures but FRV you'd
+ never see the bug except for constant arguments.
+ - the new "get_order()" macro used its arguments multiple times, and
+ didn't even parenthesize them properly
+ - despite the comments, it was not true that you could use it for
+ constant initializers, since not all architectures even use the
+ generic page.h header file.
+
+All of the problems are individually fixable, but it all boils down to:
+better just revert it, and re-do it from scratch.
+
+Cc: David Howells <dhowells@redhat.com>
+Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
+Cc: Paul Mackerras <paulus@samba.org>
+Cc: Andrew Morton <akpm@osdl.org>
+Cc: David Woodhouse <dwmw2@infradead.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ include/asm-generic/page.h | 38 ++++----------------------------------
+ 1 file changed, 4 insertions(+), 34 deletions(-)
+
+--- linux-2.6.20.1.orig/include/asm-generic/page.h
++++ linux-2.6.20.1/include/asm-generic/page.h
+@@ -4,51 +4,21 @@
+ #ifdef __KERNEL__
+ #ifndef __ASSEMBLY__
+
+-#include <linux/log2.h>
++#include <linux/compiler.h>
+
+-/*
+- * non-const pure 2^n version of get_order
+- * - the arch may override these in asm/bitops.h if they can be implemented
+- * more efficiently than using the arch log2 routines
+- * - we use the non-const log2() instead if the arch has defined one suitable
+- */
+-#ifndef ARCH_HAS_GET_ORDER
+-static inline __attribute__((const))
+-int __get_order(unsigned long size, int page_shift)
++/* Pure 2^n version of get_order */
++static __inline__ __attribute_const__ int get_order(unsigned long size)
+ {
+-#if BITS_PER_LONG == 32 && defined(ARCH_HAS_ILOG2_U32)
+- int order = __ilog2_u32(size) - page_shift;
+- return order >= 0 ? order : 0;
+-#elif BITS_PER_LONG == 64 && defined(ARCH_HAS_ILOG2_U64)
+- int order = __ilog2_u64(size) - page_shift;
+- return order >= 0 ? order : 0;
+-#else
+ int order;
+
+- size = (size - 1) >> (page_shift - 1);
++ size = (size - 1) >> (PAGE_SHIFT - 1);
+ order = -1;
+ do {
+ size >>= 1;
+ order++;
+ } while (size);
+ return order;
+-#endif
+ }
+-#endif
+-
+-/**
+- * get_order - calculate log2(pages) to hold a block of the specified size
+- * @n - size
+- *
+- * calculate allocation order based on the current page size
+- * - this can be used to initialise global variables from constant data
+- */
+-#define get_order(n) \
+-( \
+- __builtin_constant_p(n) ? \
+- ((n < (1UL << PAGE_SHIFT)) ? 0 : ilog2(n) - PAGE_SHIFT) : \
+- __get_order(n, PAGE_SHIFT) \
+- )
+
+ #endif /* __ASSEMBLY__ */
+ #endif /* __KERNEL__ */