From 1a05efba96ec634d974f4b68439fa66cf89061dc Mon Sep 17 00:00:00 2001 From: Dave Chinner Date: Wed, 12 Dec 2018 11:42:40 -0600 Subject: [PATCH] io: open pipes in non-blocking mode 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 Reviewed-by: Jan Tulak [sandeen: initialize st per djwong's suggestion] Signed-off-by: Eric Sandeen --- io/open.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/io/open.c b/io/open.c index 6ea3e9a20..21c0e054f 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 = { 0 }; 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.47.2