Skip to content

Commit dbf107b

Browse files
ebiedermMiklos Szeredi
authored andcommitted
fuse: Remove the buggy retranslation of pids in fuse_dev_do_read
At the point of fuse_dev_do_read the user space process that initiated the action on the fuse filesystem may no longer exist. The process have been killed or may have fired an asynchronous request and exited. If the initial process has exited, the code "pid_vnr(find_pid_ns(in->h.pid, fc->pid_ns)" will either return a pid of 0, or in the unlikely event that the pid has been reallocated it can return practically any pid. Any pid is possible as the pid allocator allocates pid numbers in different pid namespaces independently. The only way to make translation in fuse_dev_do_read reliable is to call get_pid in fuse_req_init_context, and pid_vnr followed by put_pid in fuse_dev_do_read. That reference counting in other contexts has been shown to bounce cache lines between processors and in general be slow. So that is not desirable. The only known user of running the fuse server in a different pid namespace from the filesystem does not care what the pids are in the fuse messages so removing this code should not matter. Getting the translation to a server running outside of the pid namespace of a container can still be achieved by playing setns games at mount time. It is also possible to add an option to pass a pid namespace into the fuse filesystem at mount time. Fixes: 5d6d3a3 ("fuse: allow server to run in different pid_ns") Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
1 parent 3b7008b commit dbf107b

File tree

1 file changed

+0
-6
lines changed

1 file changed

+0
-6
lines changed

fs/fuse/dev.c

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1261,12 +1261,6 @@ static ssize_t fuse_dev_do_read(struct fuse_dev *fud, struct file *file,
12611261
in = &req->in;
12621262
reqsize = in->h.len;
12631263

1264-
if (task_active_pid_ns(current) != fc->pid_ns) {
1265-
rcu_read_lock();
1266-
in->h.pid = pid_vnr(find_pid_ns(in->h.pid, fc->pid_ns));
1267-
rcu_read_unlock();
1268-
}
1269-
12701264
/* If request is too large, reply with an error and restart the read */
12711265
if (nbytes < reqsize) {
12721266
req->out.h.error = -EIO;

0 commit comments

Comments
 (0)