diff --git a/CCache/ccache.1 b/CCache/ccache.1 index 9d1cbcdf9..daf3323f9 100644 --- a/CCache/ccache.1 +++ b/CCache/ccache.1 @@ -381,12 +381,6 @@ ccache can handle a much wider ranger of compiler options .IP o ccache avoids a double call to cpp on a cache miss .PP -.SH "BUGS" -.PP -When the cache is stored on an NFS filesystem, the filesystem must be -exported with the \fBno_subtree_check\fP option to make renames between -directories reliable\&. -.PP .SH "CREDITS" .PP Thanks to the following people for their contributions to ccache diff --git a/CCache/util.c b/CCache/util.c index a6b88997c..70d7ea7d4 100644 --- a/CCache/util.c +++ b/CCache/util.c @@ -58,9 +58,26 @@ void copy_fd(int fd_in, int fd_out) } } +static int safe_rename(const char* oldpath, const char* newpath) +{ + /* safe_rename is for creating entries in the cache. + + Works like rename(), but it never overwrites an existing + cache entry. This avoids corruption on NFS. */ + int status = link( oldpath, newpath ); + if( status == 0 || errno == EEXIST ) + { + return unlink( oldpath ); + } + else + { + return -1; + } +} + /* move a file using rename */ int move_file(const char *src, const char *dest) { - return rename(src, dest); + return safe_rename(src, dest); } /* copy a file - used when hard links don't work