From: Dave Chinner <dchinner@xxxxxxxxxx> So that O_RDONLY open commands (such as from copy_range) do not block forever waiting on a non-existent writer. Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx> --- io/open.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/io/open.c b/io/open.c index 6ea3e9a2019f..b1d9a0fa317c 100644 --- a/io/open.c +++ b/io/open.c @@ -56,6 +56,7 @@ openfile( struct fs_path *fs_path) { struct fs_path *fsp; + struct stat st; int fd; int oflags; @@ -79,6 +80,18 @@ openfile( if (flags & IO_NOFOLLOW) oflags |= O_NOFOLLOW; + /* + * if we've been passed a pipe to open, don't block waiting for a + * reader or writer to appear. We want to either succeed or error out + * immediately. + */ + if (stat(path, &st) < 0 && errno != ENOENT) { + perror("stat"); + return -1; + } + if (S_ISFIFO(st.st_mode)) + oflags |= O_NONBLOCK; + fd = open(path, oflags, mode); if (fd < 0) { if (errno == EISDIR && -- 2.19.1