Re: KCSAN: data-race in __alloc_file / __alloc_file

From: Linus Torvalds
Date: Sun Nov 17 2019 - 14:21:26 EST


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);