Subject: mkdir -p and EROFS
From: [email-masked] (Eric Blake)
To: [email-masked]
Cc: [email-masked]
Date: Wed, 12 Oct 2005 14:47:01 +0000

The algorithm change between 5.3.0 and 5.90 in lib/mkdir-p.c to
try mkdir() first instead of stat(), and key off of EEXIST, breaks
when mkdir() fails with EROFS on an intermediate directory when
the writable directory has been mounted inside a read-only tree.
For example, on cygwin:

$ mkdir -p //EBLAKE/share/dir
mkdir: cannot create directory `//EBLAKE': Read-only file system

where // and //EBLAKE are read-only, //EBLAKE/share exists and
is writable, and //EBLAKE/share/dir does not exist.  The failure
comes because mkdir("//EBLAKE") fails with EROFS, which, as far
as I can tell, is permitted by POSIX since // (the parent of
//EBLAKE) is not writable, even though I would have preferred
EEXIST.

I have already raised this with the cygwin developers, who
have expressed their desire to leave things as is rather than
trying to return EEXIST in the case that an intermediate
directory in the read-only file system exists, as it is much faster
to blindly return EROFS than to stat the directory name to check
for existance.  So is it worth a patch to mkdir-p.c to treat EROFS
as an indicator to perform a followup stat() (similar to the ENOSYS
hack used for NFS mounts on Solaris)?

--
Eric Blake

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/