On Fri, Oct 9, 2020 at 1:35 PM Roman Perepelitsa < roman.perepelitsa@gmail.com> wrote: > On Fri, Oct 9, 2020 at 10:25 PM Bart Schaefer > wrote: > > > > Er, sorry, this doesn't actually avoid the race, it just prevents the > error message from being shown by whichever shell loses the race. > > I think this is the expected behavior. It's prescribed by POSIX for mkdir. > [...] > > The patch is incorrect for a different reason. If `zf_mkdir -p foo` is > racing with another process that's doing `mkdir foo && rmdir foo`, the > zf_mkdir call must never fail but with this patch it can fail. > Hm ... in that case the code shouldn't call stat() unless the mkdir() gives EEXIST? And then ignore ENOENT from stat()? What if another process is doing "touch foo && rm foo"? How is it possible to distinguish that from mkdir+rmdir ? Or are we confusing the requirements for mkdir(2) from those for mkdir(1) ? I don't have the spec handy.