From: Dave Chinner Date: Wed, 12 Dec 2018 17:42:40 +0000 (-0600) Subject: io: open pipes in non-blocking mode X-Git-Tag: v4.20.0-rc1~20 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1a05efba;p=thirdparty%2Fxfsprogs-dev.git 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 --- 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 &&