On 12/3/18 2:16 PM, Dave Chinner wrote: > On Mon, Dec 03, 2018 at 08:20:30AM -0800, Darrick J. Wong wrote: >> On Mon, Dec 03, 2018 at 07:53:42AM +1100, Dave Chinner wrote: >>> 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)) >> >> Hmm... does stat() set st.st_mode even if it returns ENOENT? Or are we >> possibly branching on an uninitialized st here? >> >> struct stat st = { 0 }; ? > > Yeah, I'll fix that. I'll just do that on commit. -Eric