diff options
author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-03-01 11:07:22 -0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-03-01 11:07:22 -0800 |
commit | da7a0007e7d191b46ac3dd3ed086e1090f72be81 (patch) | |
tree | e4eeb7cc80044c67bfb2ce31ecbce5a2231eb8e7 | |
parent | 23702d4c026f2c3544c9b32bc97208d5b7a31a6f (diff) | |
download | longterm-queue-2.6.32-da7a0007e7d191b46ac3dd3ed086e1090f72be81.tar.gz |
2.6.32-stable patches
added patches:
autofs-work-around-unhappy-compat-problem-on-x86-64.patch
compat-fix-compile-breakage-on-s390.patch
fix-autofs-compile-without-config_compat.patch
-rw-r--r-- | queue-2.6.32/autofs-work-around-unhappy-compat-problem-on-x86-64.patch | 134 | ||||
-rw-r--r-- | queue-2.6.32/compat-fix-compile-breakage-on-s390.patch | 162 | ||||
-rw-r--r-- | queue-2.6.32/fix-autofs-compile-without-config_compat.patch | 40 | ||||
-rw-r--r-- | queue-2.6.32/series | 3 |
4 files changed, 339 insertions, 0 deletions
diff --git a/queue-2.6.32/autofs-work-around-unhappy-compat-problem-on-x86-64.patch b/queue-2.6.32/autofs-work-around-unhappy-compat-problem-on-x86-64.patch new file mode 100644 index 0000000..0f603bf --- /dev/null +++ b/queue-2.6.32/autofs-work-around-unhappy-compat-problem-on-x86-64.patch @@ -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 +@@ -125,6 +125,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 +@@ -389,6 +389,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> + +@@ -341,6 +342,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-2.6.32/compat-fix-compile-breakage-on-s390.patch b/queue-2.6.32/compat-fix-compile-breakage-on-s390.patch new file mode 100644 index 0000000..b01c03d --- /dev/null +++ b/queue-2.6.32/compat-fix-compile-breakage-on-s390.patch @@ -0,0 +1,162 @@ +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/mm/mmap.c | 2 +- + drivers/s390/block/dasd_eckd.c | 1 + + 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 + + 11 files changed, 9 insertions(+), 11 deletions(-) + +--- a/arch/s390/include/asm/compat.h ++++ b/arch/s390/include/asm/compat.h +@@ -171,13 +171,6 @@ static inline int is_compat_task(void) + return test_thread_flag(TIF_31BIT); + } + +-#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 +@@ -32,7 +32,6 @@ + #include <linux/kernel_stat.h> + #include <linux/syscalls.h> + #include <linux/compat.h> +-#include <asm/compat.h> + #include <asm/uaccess.h> + #include <asm/pgtable.h> + #include <asm/system.h> +--- a/arch/s390/kernel/ptrace.c ++++ b/arch/s390/kernel/ptrace.c +@@ -36,8 +36,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 +@@ -43,6 +43,7 @@ + #include <linux/reboot.h> + #include <linux/topology.h> + #include <linux/ftrace.h> ++#include <linux/compat.h> + + #include <asm/ipl.h> + #include <asm/uaccess.h> +@@ -56,7 +57,6 @@ + #include <asm/ptrace.h> + #include <asm/sections.h> + #include <asm/ebcdic.h> +-#include <asm/compat.h> + #include <asm/kvm_virtio.h> + + long psw_kernel_bits = (PSW_BASE_BITS | PSW_MASK_DAT | PSW_ASC_PRIMARY | +--- a/arch/s390/mm/mmap.c ++++ b/arch/s390/mm/mmap.c +@@ -27,8 +27,8 @@ + #include <linux/personality.h> + #include <linux/mm.h> + #include <linux/module.h> ++#include <linux/compat.h> + #include <asm/pgalloc.h> +-#include <asm/compat.h> + + /* + * Top of mmap area (just below the process stack). +--- a/drivers/s390/block/dasd_eckd.c ++++ b/drivers/s390/block/dasd_eckd.c +@@ -19,6 +19,7 @@ + #include <linux/bio.h> + #include <linux/module.h> + #include <linux/init.h> ++#include <linux/compat.h> + + #include <asm/debug.h> + #include <asm/idals.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 +@@ -14,6 +14,7 @@ + #include <linux/list.h> + #include <linux/types.h> + #include <linux/smp_lock.h> ++#include <linux/compat.h> + + #include <asm/ccwdev.h> + #include <asm/cio.h> +--- a/drivers/s390/char/vmcp.c ++++ b/drivers/s390/char/vmcp.c +@@ -16,6 +16,7 @@ + + #include <linux/fs.h> + #include <linux/init.h> ++#include <linux/compat.h> + #include <linux/kernel.h> + #include <linux/miscdevice.h> + #include <linux/module.h> +--- a/drivers/s390/cio/chsc_sch.c ++++ b/drivers/s390/cio/chsc_sch.c +@@ -11,6 +11,7 @@ + #include <linux/module.h> + #include <linux/uaccess.h> + #include <linux/miscdevice.h> ++#include <linux/compat.h> + + #include <asm/cio.h> + #include <asm/chsc.h> +--- a/drivers/s390/scsi/zfcp_cfdc.c ++++ b/drivers/s390/scsi/zfcp_cfdc.c +@@ -12,6 +12,7 @@ + + #include <linux/types.h> + #include <linux/miscdevice.h> ++#include <linux/compat.h> + #include <asm/ccwdev.h> + #include "zfcp_def.h" + #include "zfcp_ext.h" diff --git a/queue-2.6.32/fix-autofs-compile-without-config_compat.patch b/queue-2.6.32/fix-autofs-compile-without-config_compat.patch new file mode 100644 index 0000000..1a02f8d --- /dev/null +++ b/queue-2.6.32/fix-autofs-compile-without-config_compat.patch @@ -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 +@@ -311,5 +311,9 @@ asmlinkage long compat_sys_openat(unsign + + extern void __user *compat_alloc_user_space(unsigned long len); + ++#else ++ ++#define is_compat_task() (0) ++ + #endif /* CONFIG_COMPAT */ + #endif /* _LINUX_COMPAT_H */ diff --git a/queue-2.6.32/series b/queue-2.6.32/series index 6c7fca1..b05a792 100644 --- a/queue-2.6.32/series +++ b/queue-2.6.32/series @@ -25,3 +25,6 @@ ecryptfs-use-notify_change-for-truncating-lower-inodes.patch ecryptfs-remove-extra-d_delete-in-ecryptfs_rmdir.patch ecryptfs-clear-i_nlink-in-rmdir.patch cdrom-use-copy_to_user-without-the-underscores.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 |