Revert "autofs: work around unhappy compat problem on x86-64". Reopens #633423.
svn path=/dists/sid/linux-2.6/; revision=18958
This commit is contained in:
parent
9eb70b74e9
commit
e1cdd9a89a
|
@ -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 <ben@decadent.org.uk> Mon, 16 Apr 2012 02:27:29 +0100
|
||||
|
||||
|
|
132
debian/patches/bugfix/all/revert-autofs-work-around-unhappy-compat-problem-on-.patch
vendored
Normal file
132
debian/patches/bugfix/all/revert-autofs-work-around-unhappy-compat-problem-on-.patch
vendored
Normal file
|
@ -0,0 +1,132 @@
|
|||
From: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
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 <mjt@tls.msk.ru>
|
||||
Cc: Ian Kent <raven@themaw.net>
|
||||
Cc: stable@kernel.org # for 3.3
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
[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 <linux/parser.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/magic.h>
|
||||
-#include <linux/compat.h>
|
||||
#include "autofs_i.h"
|
||||
#include <linux/module.h>
|
||||
|
||||
@@ -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
|
||||
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue