fcatomic: fallback to create a directory with FcAtomicLock
link(2) might be failed on the filesystem that doesn't support the hard link. e.g. FcAtomicLock() always fails on FAT filesystem when link(2) is available. So that may be a good idea to fallback if link(2) is failed.
This commit is contained in:
parent
2837c63876
commit
26160366d7
|
@ -130,6 +130,13 @@ FcAtomicLock (FcAtomic *atomic)
|
||||||
return FcFalse;
|
return FcFalse;
|
||||||
}
|
}
|
||||||
ret = link ((char *) atomic->tmp, (char *) atomic->lck);
|
ret = link ((char *) atomic->tmp, (char *) atomic->lck);
|
||||||
|
if (ret < 0 && errno == EPERM)
|
||||||
|
{
|
||||||
|
/* the filesystem where atomic->lck points to may not supports
|
||||||
|
* the hard link. so better try to fallback
|
||||||
|
*/
|
||||||
|
ret = mkdir ((char *) atomic->lck, 0600);
|
||||||
|
}
|
||||||
(void) unlink ((char *) atomic->tmp);
|
(void) unlink ((char *) atomic->tmp);
|
||||||
#else
|
#else
|
||||||
ret = mkdir ((char *) atomic->lck, 0600);
|
ret = mkdir ((char *) atomic->lck, 0600);
|
||||||
|
@ -195,7 +202,8 @@ void
|
||||||
FcAtomicUnlock (FcAtomic *atomic)
|
FcAtomicUnlock (FcAtomic *atomic)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_LINK
|
#ifdef HAVE_LINK
|
||||||
unlink ((char *) atomic->lck);
|
if (unlink ((char *) atomic->lck) == -1)
|
||||||
|
rmdir ((char *) atomic->lck);
|
||||||
#else
|
#else
|
||||||
rmdir ((char *) atomic->lck);
|
rmdir ((char *) atomic->lck);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue