diff --git a/debian/changelog b/debian/changelog index 51d24285d..bb92b3799 100644 --- a/debian/changelog +++ b/debian/changelog @@ -25,6 +25,8 @@ linux-2.6 (3.2.16-1) UNRELEASED; urgency=low - Ensure that the LOCK code sets exception->inode - Ensure that we check lock exclusive/shared type against open modes * [x86] i915: Fix integer overflows in i915_gem_{do_execbuffer,execbuffer2} + * Revert "autofs: work around unhappy compat problem on x86-64". + Reopens #633423. -- Ben Hutchings Mon, 16 Apr 2012 02:27:29 +0100 diff --git a/debian/patches/bugfix/all/revert-autofs-work-around-unhappy-compat-problem-on-.patch b/debian/patches/bugfix/all/revert-autofs-work-around-unhappy-compat-problem-on-.patch new file mode 100644 index 000000000..7e752733f --- /dev/null +++ b/debian/patches/bugfix/all/revert-autofs-work-around-unhappy-compat-problem-on-.patch @@ -0,0 +1,132 @@ +From: Linus Torvalds +Date: Sat, 28 Apr 2012 08:29:56 -0700 +Subject: [PATCH] Revert "autofs: work around unhappy compat problem on + x86-64" + +commit fcbf94b9dedd2ce08e798a99aafc94fec8668161 upstream. + +This reverts commit a32744d4abae24572eff7269bc17895c41bd0085. + +While that commit was technically the right thing to do, and made the +x86-64 compat mode work identically to native 32-bit mode (and thus +fixing the problem with a 32-bit systemd install on a 64-bit kernel), it +turns out that the automount binaries had workarounds for this compat +problem. + +Now, the workarounds are disgusting: doing an "uname()" to find out the +architecture of the kernel, and then comparing it for the 64-bit cases +and fixing up the size of the read() in automount for those. And they +were confused: it's not actually a generic 64-bit issue at all, it's +very much tied to just x86-64, which has different alignment for an +'u64' in 64-bit mode than in 32-bit mode. + +But the end result is that fixing the compat layer actually breaks the +case of a 32-bit automount on a x86-64 kernel. + +There are various approaches to fix this (including just doing a +"strcmp()" on current->comm and comparing it to "automount"), but I +think that I will do the one that teaches pipes about a special "packet +mode", which will allow user space to not have to care too deeply about +the padding at the end of the autofs packet. + +That change will make the compat workaround unnecessary, so let's revert +it first, and get automount working again in compat mode. The +packetized pipes will then fix autofs for systemd. + +Reported-and-requested-by: Michael Tokarev +Cc: Ian Kent +Cc: stable@kernel.org # for 3.3 +Signed-off-by: Linus Torvalds +[bwh: Backported to 3.2: adjust context] +--- + 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, 3 insertions(+), 23 deletions(-) + +diff --git a/fs/autofs4/autofs_i.h b/fs/autofs4/autofs_i.h +index eb1cc92..d8d8e7b 100644 +--- a/fs/autofs4/autofs_i.h ++++ b/fs/autofs4/autofs_i.h +@@ -110,7 +110,6 @@ 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; +diff --git a/fs/autofs4/dev-ioctl.c b/fs/autofs4/dev-ioctl.c +index 9dacb85..3dfd615 100644 +--- a/fs/autofs4/dev-ioctl.c ++++ b/fs/autofs4/dev-ioctl.c +@@ -385,7 +385,6 @@ static int autofs_dev_ioctl_setpipefd(struct file *fp, + 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,7 +19,6 @@ + #include + #include + #include +-#include + #include "autofs_i.h" + #include + +@@ -225,7 +224,6 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent) + 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; +diff --git a/fs/autofs4/waitq.c b/fs/autofs4/waitq.c +index 9c098db..da8876d 100644 +--- a/fs/autofs4/waitq.c ++++ b/fs/autofs4/waitq.c +@@ -91,24 +91,7 @@ static int autofs4_write(struct autofs_sb_info *sbi, + + 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) +@@ -172,7 +155,8 @@ static void autofs4_notify_daemon(struct autofs_sb_info *sbi, + { + struct autofs_v5_packet *packet = &pkt.v5_pkt.v5_packet; + +- pktsz = autofs_v5_packet_size(sbi); ++ pktsz = sizeof(*packet); ++ + packet->wait_queue_token = wq->wait_queue_token; + packet->len = wq->name.len; + memcpy(packet->name, wq->name.name, wq->name.len); +-- +1.7.10 + diff --git a/debian/patches/series/base b/debian/patches/series/base index a8cb3b140..d3373c471 100644 --- a/debian/patches/series/base +++ b/debian/patches/series/base @@ -192,3 +192,4 @@ + bugfix/all/NFSv4-Ensure-that-we-check-lock-exclusive-shared-typ.patch + bugfix/x86/drm-i915-fix-integer-overflow-in-i915_gem_execbuffer2.patch + bugfix/x86/drm-i915-fix-integer-overflow-in-i915_gem_do_execbuffer.patch ++ bugfix/all/revert-autofs-work-around-unhappy-compat-problem-on-.patch