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
110 int sub_version;110 int sub_version;
111 int min_proto;111 int min_proto;
112 int max_proto;112 int max_proto;
113 int compat_daemon;
114 unsigned long exp_timeout;113 unsigned long exp_timeout;
115 unsigned int type;114 unsigned int type;
116 int reghost_enabled;115 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
385 sbi->pipefd = pipefd;385 sbi->pipefd = pipefd;
386 sbi->pipe = pipe;386 sbi->pipe = pipe;
387 sbi->catatonic = 0;387 sbi->catatonic = 0;
388 sbi->compat_daemon = is_compat_task();
389 }388 }
390out:389out:
391 mutex_unlock(&sbi->wq_mutex);390 mutex_unlock(&sbi->wq_mutex);
fs/autofs4/inode.c+0−2
@@ -19,7 +19,6 @@ · 18 unmodified lines
19#include <linux/parser.h>19#include <linux/parser.h>
20#include <linux/bitops.h>20#include <linux/bitops.h>
21#include <linux/magic.h>21#include <linux/magic.h>
22#include <linux/compat.h>
23#include "autofs_i.h"22#include "autofs_i.h"
24#include <linux/module.h>23#include <linux/module.h>
25 24
@@ -225,7 +224,6 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent) · 199 unmodified lines
225 set_autofs_type_indirect(&sbi->type);224 set_autofs_type_indirect(&sbi->type);
226 sbi->min_proto = 0;225 sbi->min_proto = 0;
227 sbi->max_proto = 0;226 sbi->max_proto = 0;
228 sbi->compat_daemon = is_compat_task();
229 mutex_init(&sbi->wq_mutex);227 mutex_init(&sbi->wq_mutex);
230 mutex_init(&sbi->pipe_mutex);228 mutex_init(&sbi->pipe_mutex);
231 spin_lock_init(&sbi->fs_lock);229 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
91 91
92 return (bytes > 0);92 return (bytes > 0);
93}93}
94 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 */
102static 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
112static void autofs4_notify_daemon(struct autofs_sb_info *sbi,95static void autofs4_notify_daemon(struct autofs_sb_info *sbi,
113 struct autofs_wait_queue *wq,96 struct autofs_wait_queue *wq,
114 int type)97 int type)
@@ -172,7 +155,8 @@ static void autofs4_notify_daemon(struct autofs_sb_info *sbi, · 57 unmodified lines
172 {155 {
173 struct autofs_v5_packet *packet = &pkt.v5_pkt.v5_packet;156 struct autofs_v5_packet *packet = &pkt.v5_pkt.v5_packet;
174 157
175 pktsz = autofs_v5_packet_size(sbi);158 pktsz = sizeof(*packet);
159
176 packet->wait_queue_token = wq->wait_queue_token;160 packet->wait_queue_token = wq->wait_queue_token;
177 packet->len = wq->name.len;161 packet->len = wq->name.len;
178 memcpy(packet->name, wq->name.name, wq->name.len);162 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