]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.2-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 1 Mar 2012 18:36:53 +0000 (10:36 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 1 Mar 2012 18:36:53 +0000 (10:36 -0800)
added patches:
arm-omap-make-iommu-subsys_initcall-to-fix-builtin-omap3isp.patch
autofs-work-around-unhappy-compat-problem-on-x86-64.patch
compat-fix-compile-breakage-on-s390.patch
fix-autofs-compile-without-config_compat.patch

queue-3.2/arm-omap-make-iommu-subsys_initcall-to-fix-builtin-omap3isp.patch [new file with mode: 0644]
queue-3.2/autofs-work-around-unhappy-compat-problem-on-x86-64.patch [new file with mode: 0644]
queue-3.2/compat-fix-compile-breakage-on-s390.patch [new file with mode: 0644]
queue-3.2/fix-autofs-compile-without-config_compat.patch [new file with mode: 0644]
queue-3.2/series [new file with mode: 0644]

diff --git a/queue-3.2/arm-omap-make-iommu-subsys_initcall-to-fix-builtin-omap3isp.patch b/queue-3.2/arm-omap-make-iommu-subsys_initcall-to-fix-builtin-omap3isp.patch
new file mode 100644 (file)
index 0000000..49d1f16
--- /dev/null
@@ -0,0 +1,53 @@
+From 435792d93410f008120c4dbab148019a3cc31dbc Mon Sep 17 00:00:00 2001
+From: Ohad Ben-Cohen <ohad@wizery.com>
+Date: Sun, 26 Feb 2012 12:14:14 +0200
+Subject: ARM: OMAP: make iommu subsys_initcall to fix builtin omap3isp
+
+From: Ohad Ben-Cohen <ohad@wizery.com>
+
+commit 435792d93410f008120c4dbab148019a3cc31dbc upstream.
+
+omap3isp depends on omap's iommu and will fail to probe if
+initialized before it (which always happen if they are builtin).
+
+Make omap's iommu subsys_initcall as an interim solution until
+the probe deferral mechanism is merged.
+
+Reported-by: James <angweiyang@gmail.com>
+Debugged-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Signed-off-by: Ohad Ben-Cohen <ohad@wizery.com>
+Cc: Tony Lindgren <tony@atomide.com>
+Cc: Hiroshi Doyu <hdoyu@nvidia.com>
+Cc: Joerg Roedel <Joerg.Roedel@amd.com>
+Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/arm/mach-omap2/mailbox.c |    3 ++-
+ drivers/iommu/omap-iommu.c    |    3 ++-
+ 2 files changed, 4 insertions(+), 2 deletions(-)
+
+--- a/arch/arm/mach-omap2/mailbox.c
++++ b/arch/arm/mach-omap2/mailbox.c
+@@ -412,7 +412,8 @@ static void __exit omap2_mbox_exit(void)
+       platform_driver_unregister(&omap2_mbox_driver);
+ }
+-module_init(omap2_mbox_init);
++/* must be ready before omap3isp is probed */
++subsys_initcall(omap2_mbox_init);
+ module_exit(omap2_mbox_exit);
+ MODULE_LICENSE("GPL v2");
+--- a/drivers/iommu/omap-iommu.c
++++ b/drivers/iommu/omap-iommu.c
+@@ -1229,7 +1229,8 @@ static int __init omap_iommu_init(void)
+       return platform_driver_register(&omap_iommu_driver);
+ }
+-module_init(omap_iommu_init);
++/* must be ready before omap3isp is probed */
++subsys_initcall(omap_iommu_init);
+ static void __exit omap_iommu_exit(void)
+ {
diff --git a/queue-3.2/autofs-work-around-unhappy-compat-problem-on-x86-64.patch b/queue-3.2/autofs-work-around-unhappy-compat-problem-on-x86-64.patch
new file mode 100644 (file)
index 0000000..7e026b8
--- /dev/null
@@ -0,0 +1,134 @@
+From a32744d4abae24572eff7269bc17895c41bd0085 Mon Sep 17 00:00:00 2001
+From: Ian Kent <raven@themaw.net>
+Date: Wed, 22 Feb 2012 20:45:44 +0800
+Subject: autofs: work around unhappy compat problem on x86-64
+
+From: Ian Kent <raven@themaw.net>
+
+commit a32744d4abae24572eff7269bc17895c41bd0085 upstream.
+
+When the autofs protocol version 5 packet type was added in commit
+5c0a32fc2cd0 ("autofs4: add new packet type for v5 communications"), it
+obvously tried quite hard to be word-size agnostic, and uses explicitly
+sized fields that are all correctly aligned.
+
+However, with the final "char name[NAME_MAX+1]" array at the end, the
+actual size of the structure ends up being not very well defined:
+because the struct isn't marked 'packed', doing a "sizeof()" on it will
+align the size of the struct up to the biggest alignment of the members
+it has.
+
+And despite all the members being the same, the alignment of them is
+different: a "__u64" has 4-byte alignment on x86-32, but native 8-byte
+alignment on x86-64.  And while 'NAME_MAX+1' ends up being a nice round
+number (256), the name[] array starts out a 4-byte aligned.
+
+End result: the "packed" size of the structure is 300 bytes: 4-byte, but
+not 8-byte aligned.
+
+As a result, despite all the fields being in the same place on all
+architectures, sizeof() will round up that size to 304 bytes on
+architectures that have 8-byte alignment for u64.
+
+Note that this is *not* a problem for 32-bit compat mode on POWER, since
+there __u64 is 8-byte aligned even in 32-bit mode.  But on x86, 32-bit
+and 64-bit alignment is different for 64-bit entities, and as a result
+the structure that has exactly the same layout has different sizes.
+
+So on x86-64, but no other architecture, we will just subtract 4 from
+the size of the structure when running in a compat task.  That way we
+will write the properly sized packet that user mode expects.
+
+Not pretty.  Sadly, this very subtle, and unnecessary, size difference
+has been encoded in user space that wants to read packets of *exactly*
+the right size, and will refuse to touch anything else.
+
+Reported-and-tested-by: Thomas Meyer <thomas@m3y3r.de>
+Signed-off-by: Ian Kent <raven@themaw.net>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Jonathan Nieder <jrnieder@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ fs/autofs4/autofs_i.h  |    1 +
+ fs/autofs4/dev-ioctl.c |    1 +
+ fs/autofs4/inode.c     |    2 ++
+ fs/autofs4/waitq.c     |   22 +++++++++++++++++++---
+ 4 files changed, 23 insertions(+), 3 deletions(-)
+
+--- a/fs/autofs4/autofs_i.h
++++ b/fs/autofs4/autofs_i.h
+@@ -110,6 +110,7 @@ struct autofs_sb_info {
+       int sub_version;
+       int min_proto;
+       int max_proto;
++      int compat_daemon;
+       unsigned long exp_timeout;
+       unsigned int type;
+       int reghost_enabled;
+--- a/fs/autofs4/dev-ioctl.c
++++ b/fs/autofs4/dev-ioctl.c
+@@ -385,6 +385,7 @@ static int autofs_dev_ioctl_setpipefd(st
+               sbi->pipefd = pipefd;
+               sbi->pipe = pipe;
+               sbi->catatonic = 0;
++              sbi->compat_daemon = is_compat_task();
+       }
+ out:
+       mutex_unlock(&sbi->wq_mutex);
+--- a/fs/autofs4/inode.c
++++ b/fs/autofs4/inode.c
+@@ -19,6 +19,7 @@
+ #include <linux/parser.h>
+ #include <linux/bitops.h>
+ #include <linux/magic.h>
++#include <linux/compat.h>
+ #include "autofs_i.h"
+ #include <linux/module.h>
+@@ -224,6 +225,7 @@ int autofs4_fill_super(struct super_bloc
+       set_autofs_type_indirect(&sbi->type);
+       sbi->min_proto = 0;
+       sbi->max_proto = 0;
++      sbi->compat_daemon = is_compat_task();
+       mutex_init(&sbi->wq_mutex);
+       spin_lock_init(&sbi->fs_lock);
+       sbi->queues = NULL;
+--- a/fs/autofs4/waitq.c
++++ b/fs/autofs4/waitq.c
+@@ -90,7 +90,24 @@ static int autofs4_write(struct file *fi
+       return (bytes > 0);
+ }
+-      
++
++/*
++ * The autofs_v5 packet was misdesigned.
++ *
++ * The packets are identical on x86-32 and x86-64, but have different
++ * alignment. Which means that 'sizeof()' will give different results.
++ * Fix it up for the case of running 32-bit user mode on a 64-bit kernel.
++ */
++static noinline size_t autofs_v5_packet_size(struct autofs_sb_info *sbi)
++{
++      size_t pktsz = sizeof(struct autofs_v5_packet);
++#if defined(CONFIG_X86_64) && defined(CONFIG_COMPAT)
++      if (sbi->compat_daemon > 0)
++              pktsz -= 4;
++#endif
++      return pktsz;
++}
++
+ static void autofs4_notify_daemon(struct autofs_sb_info *sbi,
+                                struct autofs_wait_queue *wq,
+                                int type)
+@@ -147,8 +164,7 @@ static void autofs4_notify_daemon(struct
+       {
+               struct autofs_v5_packet *packet = &pkt.v5_pkt.v5_packet;
+-              pktsz = sizeof(*packet);
+-
++              pktsz = autofs_v5_packet_size(sbi);
+               packet->wait_queue_token = wq->wait_queue_token;
+               packet->len = wq->name.len;
+               memcpy(packet->name, wq->name.name, wq->name.len);
diff --git a/queue-3.2/compat-fix-compile-breakage-on-s390.patch b/queue-3.2/compat-fix-compile-breakage-on-s390.patch
new file mode 100644 (file)
index 0000000..5f3b973
--- /dev/null
@@ -0,0 +1,190 @@
+From 048cd4e51d24ebf7f3552226d03c769d6ad91658 Mon Sep 17 00:00:00 2001
+From: Heiko Carstens <heiko.carstens@de.ibm.com>
+Date: Mon, 27 Feb 2012 10:01:52 +0100
+Subject: compat: fix compile breakage on s390
+
+From: Heiko Carstens <heiko.carstens@de.ibm.com>
+
+commit 048cd4e51d24ebf7f3552226d03c769d6ad91658 upstream.
+
+The new is_compat_task() define for the !COMPAT case in
+include/linux/compat.h conflicts with a similar define in
+arch/s390/include/asm/compat.h.
+
+This is the minimal patch which fixes the build issues.
+
+Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Jonathan Nieder <jrnieder@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/s390/include/asm/compat.h  |    7 -------
+ arch/s390/kernel/process.c      |    1 -
+ arch/s390/kernel/ptrace.c       |    2 +-
+ arch/s390/kernel/setup.c        |    2 +-
+ arch/s390/kernel/signal.c       |    1 -
+ arch/s390/mm/fault.c            |    1 -
+ arch/s390/mm/mmap.c             |    2 +-
+ drivers/s390/block/dasd_eckd.c  |    2 +-
+ drivers/s390/block/dasd_ioctl.c |    1 +
+ drivers/s390/char/fs3270.c      |    1 +
+ drivers/s390/char/vmcp.c        |    1 +
+ drivers/s390/cio/chsc_sch.c     |    1 +
+ drivers/s390/scsi/zfcp_cfdc.c   |    1 +
+ 13 files changed, 9 insertions(+), 14 deletions(-)
+
+--- a/arch/s390/include/asm/compat.h
++++ b/arch/s390/include/asm/compat.h
+@@ -172,13 +172,6 @@ static inline int is_compat_task(void)
+       return is_32bit_task();
+ }
+-#else
+-
+-static inline int is_compat_task(void)
+-{
+-      return 0;
+-}
+-
+ #endif
+ static inline void __user *arch_compat_alloc_user_space(long len)
+--- a/arch/s390/kernel/process.c
++++ b/arch/s390/kernel/process.c
+@@ -29,7 +29,6 @@
+ #include <asm/irq.h>
+ #include <asm/timer.h>
+ #include <asm/nmi.h>
+-#include <asm/compat.h>
+ #include <asm/smp.h>
+ #include "entry.h"
+--- a/arch/s390/kernel/ptrace.c
++++ b/arch/s390/kernel/ptrace.c
+@@ -20,8 +20,8 @@
+ #include <linux/regset.h>
+ #include <linux/tracehook.h>
+ #include <linux/seccomp.h>
++#include <linux/compat.h>
+ #include <trace/syscall.h>
+-#include <asm/compat.h>
+ #include <asm/segment.h>
+ #include <asm/page.h>
+ #include <asm/pgtable.h>
+--- a/arch/s390/kernel/setup.c
++++ b/arch/s390/kernel/setup.c
+@@ -45,6 +45,7 @@
+ #include <linux/kexec.h>
+ #include <linux/crash_dump.h>
+ #include <linux/memory.h>
++#include <linux/compat.h>
+ #include <asm/ipl.h>
+ #include <asm/uaccess.h>
+@@ -58,7 +59,6 @@
+ #include <asm/ptrace.h>
+ #include <asm/sections.h>
+ #include <asm/ebcdic.h>
+-#include <asm/compat.h>
+ #include <asm/kvm_virtio.h>
+ #include <asm/diag.h>
+--- a/arch/s390/kernel/signal.c
++++ b/arch/s390/kernel/signal.c
+@@ -30,7 +30,6 @@
+ #include <asm/ucontext.h>
+ #include <asm/uaccess.h>
+ #include <asm/lowcore.h>
+-#include <asm/compat.h>
+ #include "entry.h"
+ #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
+--- a/arch/s390/mm/fault.c
++++ b/arch/s390/mm/fault.c
+@@ -36,7 +36,6 @@
+ #include <asm/pgtable.h>
+ #include <asm/irq.h>
+ #include <asm/mmu_context.h>
+-#include <asm/compat.h>
+ #include "../kernel/entry.h"
+ #ifndef CONFIG_64BIT
+--- a/arch/s390/mm/mmap.c
++++ b/arch/s390/mm/mmap.c
+@@ -29,8 +29,8 @@
+ #include <linux/mman.h>
+ #include <linux/module.h>
+ #include <linux/random.h>
++#include <linux/compat.h>
+ #include <asm/pgalloc.h>
+-#include <asm/compat.h>
+ static unsigned long stack_maxrandom_size(void)
+ {
+--- a/drivers/s390/block/dasd_eckd.c
++++ b/drivers/s390/block/dasd_eckd.c
+@@ -18,12 +18,12 @@
+ #include <linux/hdreg.h>      /* HDIO_GETGEO                      */
+ #include <linux/bio.h>
+ #include <linux/module.h>
++#include <linux/compat.h>
+ #include <linux/init.h>
+ #include <asm/debug.h>
+ #include <asm/idals.h>
+ #include <asm/ebcdic.h>
+-#include <asm/compat.h>
+ #include <asm/io.h>
+ #include <asm/uaccess.h>
+ #include <asm/cio.h>
+--- a/drivers/s390/block/dasd_ioctl.c
++++ b/drivers/s390/block/dasd_ioctl.c
+@@ -13,6 +13,7 @@
+ #define KMSG_COMPONENT "dasd"
+ #include <linux/interrupt.h>
++#include <linux/compat.h>
+ #include <linux/major.h>
+ #include <linux/fs.h>
+ #include <linux/blkpg.h>
+--- a/drivers/s390/char/fs3270.c
++++ b/drivers/s390/char/fs3270.c
+@@ -11,6 +11,7 @@
+ #include <linux/console.h>
+ #include <linux/init.h>
+ #include <linux/interrupt.h>
++#include <linux/compat.h>
+ #include <linux/module.h>
+ #include <linux/list.h>
+ #include <linux/slab.h>
+--- a/drivers/s390/char/vmcp.c
++++ b/drivers/s390/char/vmcp.c
+@@ -13,6 +13,7 @@
+ #include <linux/fs.h>
+ #include <linux/init.h>
++#include <linux/compat.h>
+ #include <linux/kernel.h>
+ #include <linux/miscdevice.h>
+ #include <linux/slab.h>
+--- a/drivers/s390/cio/chsc_sch.c
++++ b/drivers/s390/cio/chsc_sch.c
+@@ -8,6 +8,7 @@
+  */
+ #include <linux/slab.h>
++#include <linux/compat.h>
+ #include <linux/device.h>
+ #include <linux/module.h>
+ #include <linux/uaccess.h>
+--- a/drivers/s390/scsi/zfcp_cfdc.c
++++ b/drivers/s390/scsi/zfcp_cfdc.c
+@@ -11,6 +11,7 @@
+ #define KMSG_COMPONENT "zfcp"
+ #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
++#include <linux/compat.h>
+ #include <linux/slab.h>
+ #include <linux/types.h>
+ #include <linux/miscdevice.h>
diff --git a/queue-3.2/fix-autofs-compile-without-config_compat.patch b/queue-3.2/fix-autofs-compile-without-config_compat.patch
new file mode 100644 (file)
index 0000000..7733dd0
--- /dev/null
@@ -0,0 +1,40 @@
+From 3c761ea05a8900a907f32b628611873f6bef24b2 Mon Sep 17 00:00:00 2001
+From: Linus Torvalds <torvalds@linux-foundation.org>
+Date: Sun, 26 Feb 2012 09:44:55 -0800
+Subject: Fix autofs compile without CONFIG_COMPAT
+
+From: Linus Torvalds <torvalds@linux-foundation.org>
+
+commit 3c761ea05a8900a907f32b628611873f6bef24b2 upstream.
+
+The autofs compat handling fix caused a compile failure when
+CONFIG_COMPAT isn't defined.
+
+Instead of adding random #ifdef'fery in autofs, let's just make the
+compat helpers earlier to use: without CONFIG_COMPAT, is_compat_task()
+just hardcodes to zero.
+
+We could probably do something similar for a number of other cases where
+we have #ifdef's in code, but this is the low-hanging fruit.
+
+Reported-and-tested-by: Andreas Schwab <schwab@linux-m68k.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Jonathan Nieder <jrnieder@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ include/linux/compat.h |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- a/include/linux/compat.h
++++ b/include/linux/compat.h
+@@ -561,5 +561,9 @@ asmlinkage ssize_t compat_sys_process_vm
+               unsigned long liovcnt, const struct compat_iovec __user *rvec,
+               unsigned long riovcnt, unsigned long flags);
++#else
++
++#define is_compat_task() (0)
++
+ #endif /* CONFIG_COMPAT */
+ #endif /* _LINUX_COMPAT_H */
diff --git a/queue-3.2/series b/queue-3.2/series
new file mode 100644 (file)
index 0000000..c8975f9
--- /dev/null
@@ -0,0 +1,4 @@
+arm-omap-make-iommu-subsys_initcall-to-fix-builtin-omap3isp.patch
+autofs-work-around-unhappy-compat-problem-on-x86-64.patch
+fix-autofs-compile-without-config_compat.patch
+compat-fix-compile-breakage-on-s390.patch