On Fri, Oct 9, 2020 at 10:25 PM Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx> 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.