On Sun, Nov 17, 2019 at 10:56 AM Kirill Smelkov <kirr@xxxxxxxxxx> wrote: > > I'd like to take a time break for now. > I will try to return to this topic after finishing my main work first. > I apologize for the inconvenience. ) Sure, no problem, appreciate that you're looking at it. I *think* the pipe and socket case should be fixed by something like this, but it is entirely and utterly untested. Linus
fs/pipe.c | 6 ++++-- net/socket.c | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/fs/pipe.c b/fs/pipe.c index 8a2ab2f974bd..de6dee559d41 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -783,6 +783,7 @@ int create_pipe_files(struct file **res, int flags) } f->private_data = inode->i_pipe; + stream_open(inode, f); res[0] = alloc_file_clone(f, O_RDONLY | (flags & O_NONBLOCK), &pipefifo_fops); @@ -791,6 +792,7 @@ int create_pipe_files(struct file **res, int flags) fput(f); return PTR_ERR(res[0]); } + stream_open(inode, f); res[0]->private_data = inode->i_pipe; res[1] = f; return 0; @@ -931,9 +933,9 @@ static int fifo_open(struct inode *inode, struct file *filp) __pipe_lock(pipe); /* We can only do regular read/write on fifos */ - filp->f_mode &= (FMODE_READ | FMODE_WRITE); + stream_open(inode, filp); - switch (filp->f_mode) { + switch (filp->f_mode & (FMODE_READ | FMODE_WRITE)) { case FMODE_READ: /* * O_RDONLY diff --git a/net/socket.c b/net/socket.c index 6a9ab7a8b1d2..3c6d60eadf7a 100644 --- a/net/socket.c +++ b/net/socket.c @@ -404,6 +404,7 @@ struct file *sock_alloc_file(struct socket *sock, int flags, const char *dname) sock->file = file; file->private_data = sock; + stream_open(SOCK_INODE(sock), file); return file; } EXPORT_SYMBOL(sock_alloc_file);