History

Revert "autofs: work around unhappy compat problem on x86-64"

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.

Linus Torvalds committed 14 years ago

Commit fcbf94b1 parent c629eaf4 files · +3 −23Browse files

Unified · Split

4 files
  1. fs/autofs4/autofs_i.h +0 −1
  2. fs/autofs4/dev-ioctl.c +0 −1
  3. fs/autofs4/inode.c +0 −2
  4. fs/autofs4/waitq.c +3 −19
fs/autofs4/autofs_i.h+0−1
@@ -110,7 +110,6 @@ struct autofs_sb_info { · 109 unmodified lines
110110 int sub_version;
111111 int min_proto;
112112 int max_proto;
113− int compat_daemon;
114113 unsigned long exp_timeout;
115114 unsigned int type;
116115 int reghost_enabled;
fs/autofs4/dev-ioctl.c+0−1
@@ -385,7 +385,6 @@ static int autofs_dev_ioctl_setpipefd(struct file *fp, · 384 unmodified lines
385385 sbi->pipefd = pipefd;
386386 sbi->pipe = pipe;
387387 sbi->catatonic = 0;
388− sbi->compat_daemon = is_compat_task();
389388 }
390389 out:
391390 mutex_unlock(&sbi->wq_mutex);
fs/autofs4/inode.c+0−2
@@ -19,7 +19,6 @@ · 18 unmodified lines
1919 #include <linux/parser.h>
2020 #include <linux/bitops.h>
2121 #include <linux/magic.h>
22−#include <linux/compat.h>
2322 #include "autofs_i.h"
2423 #include <linux/module.h>
2524
@@ -225,7 +224,6 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent) · 199 unmodified lines
225224 set_autofs_type_indirect(&sbi->type);
226225 sbi->min_proto = 0;
227226 sbi->max_proto = 0;
228− sbi->compat_daemon = is_compat_task();
229227 mutex_init(&sbi->wq_mutex);
230228 mutex_init(&sbi->pipe_mutex);
231229 spin_lock_init(&sbi->fs_lock);
fs/autofs4/waitq.c+3−19
@@ -91,24 +91,7 @@ static int autofs4_write(struct autofs_sb_info *sbi, · 90 unmodified lines
9191
9292 return (bytes > 0);
9393 }
94−
95−/*
96− * The autofs_v5 packet was misdesigned.
97− *
98− * The packets are identical on x86-32 and x86-64, but have different
99− * alignment. Which means that 'sizeof()' will give different results.
100− * Fix it up for the case of running 32-bit user mode on a 64-bit kernel.
101− */
102−static noinline size_t autofs_v5_packet_size(struct autofs_sb_info *sbi)
103−{
104− size_t pktsz = sizeof(struct autofs_v5_packet);
105−#if defined(CONFIG_X86_64) && defined(CONFIG_COMPAT)
106− if (sbi->compat_daemon > 0)
107− pktsz -= 4;
108−#endif
109− return pktsz;
110−}
111−
94+
11295 static void autofs4_notify_daemon(struct autofs_sb_info *sbi,
11396 struct autofs_wait_queue *wq,
11497 int type)
@@ -172,7 +155,8 @@ static void autofs4_notify_daemon(struct autofs_sb_info *sbi, · 57 unmodified lines
172155 {
173156 struct autofs_v5_packet *packet = &pkt.v5_pkt.v5_packet;
174157
175− pktsz = autofs_v5_packet_size(sbi);
158+ pktsz = sizeof(*packet);
159+
176160 packet->wait_queue_token = wq->wait_queue_token;
177161 packet->len = wq->name.len;
178162 memcpy(packet->name, wq->name.name, wq->name.len);

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t