]> git.eshelyaron.com Git - emacs.git/commitdiff
Port better to NFS unlink
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 16 Aug 2024 03:10:53 +0000 (20:10 -0700)
committerEshel Yaron <me@eshelyaron.com>
Fri, 16 Aug 2024 14:04:53 +0000 (16:04 +0200)
I found this problem while looking into Bug#72641.
* lib-src/etags.c (do_move_file):
* lib-src/update-game-score.c (unlock_file):
* src/androidvfs.c (android_hack_asset_fd_fallback):
* src/filelock.c (current_lock_owner):
Treat unlink as successful if it fails because the file wasn’t there.
This can happen with some NFS implementations, due to its
retrying over the network to get at-least-once semantics.
Although most of Emacs’s calls to unlink were already doing this,
a few instances were not.

(cherry picked from commit 40eecd594ac60f38b6729fd9cf3474a8b9d133b9)

lib-src/etags.c
lib-src/update-game-score.c
src/androidvfs.c
src/filelock.c

index 03bc55de03d0c8131523d4d2d63b4ce2253d0705..edadbc25901b98b4a86877684b86ac6b0b41bb7c 100644 (file)
@@ -7812,7 +7812,7 @@ do_move_file (const char *src_file, const char *dst_file)
   if (fclose (dst_f) == EOF)
     pfatal (dst_file);
 
-  if (unlink (src_file) == -1)
+  if (unlink (src_file) < 0 && errno != ENOENT)
     pfatal ("unlink error");
 
   return;
index 4139073bcd7331763f3afc58984b3fe285d56fb6..e3b24ad77170d0717fd11ca9080c3c1997b98990 100644 (file)
@@ -497,7 +497,7 @@ unlock_file (const char *filename, void *state)
   char *lockpath = (char *) state;
   int saved_errno = errno;
   int ret = unlink (lockpath);
-  if (0 <= ret)
+  if (! (ret < 0 && errno != ENOENT))
     errno = saved_errno;
   free (lockpath);
   return ret;
index 14da8eed37e47d5da73bea62e6258812f51fce59..ff81ef288f507e88595850b8e264576fee4aa089 100644 (file)
@@ -1323,7 +1323,7 @@ android_hack_asset_fd_fallback (AAsset *asset)
   if (fd < 0)
     return -1;
 
-  if (unlink (filename))
+  if (unlink (filename) && errno != ENOENT)
     goto fail;
 
   if (ftruncate (fd, size))
index 1ae57dc734445894131e3c9cdb8ad3f00def7b67..bc09fce69f8b48c92fadba0374b28f67feec02b0 100644 (file)
@@ -501,7 +501,7 @@ current_lock_owner (lock_info_type *owner, Lisp_Object lfname)
      the file system is buggy, e.g., <https://bugs.gnu.org/72641>.
      Emacs never creates empty lock files even temporarily, so removing
      an empty lock file should be harmless.  */
-  return emacs_unlink (SSDATA (lfname)) < 0 ? errno : 0;
+  return emacs_unlink (SSDATA (lfname)) < 0 && errno != ENOENT ? errno : 0;
 }
 
 \f