]> granicus.if.org Git - neomutt/commitdiff
Remove extra lstats() in safe_rename() upon link success
authorKevin McCarthy <kevin@8t8.us>
Wed, 29 Aug 2018 20:00:14 +0000 (13:00 -0700)
committerRichard Russon <rich@flatcap.org>
Sat, 1 Sep 2018 17:06:08 +0000 (18:06 +0100)
I originally kept the lstat()'s in order to make as few changes as
possible to the function.  However, Derek Martin argues correctly that
if we are trusting the link() 0-retval, the lstats are unnecessary and
in fact can cause a performance impact over NFS.

mutt/file.c

index a7c6688cf56471a8d708e46ae32c441e6410c636..0a12eb558d5033318630439de45996276f721898 100644 (file)
@@ -404,8 +404,15 @@ int mutt_file_safe_rename(const char *src, const char *target)
     return -1;
   }
 
+  /*
+   * Remove the compare_stat() check, because it causes problems with maildir on
+   * filesystems that don't properly support hard links, such as
+   * sshfs.  The filesystem creates the link, but the resulting file
+   * is given a different inode number by the sshfs layer.  This
+   * results in an infinite loop creating links.
+   */
+#if 0
   /* Stat both links and check if they are equal. */
-
   if (lstat(src, &ssb) == -1)
   {
     mutt_debug(1, "#1 can't stat %s: %s (%d)\n", src, strerror(errno), errno);
@@ -420,14 +427,6 @@ int mutt_file_safe_rename(const char *src, const char *target)
 
   /* pretend that the link failed because the target file did already exist. */
 
-#if 0
-  /*
-   * Remove this check, because it causes problems with maildir on
-   * filesystems that don't properly support hard links, such as
-   * sshfs.  The filesystem creates the link, but the resulting file
-   * is given a different inode number by the sshfs layer.  This
-   * results in an infinite loop creating links.
-   */
   if (!compare_stat(&ssb, &tsb))
   {
     mutt_debug(1, "stat blocks for %s and %s diverge; pretending EEXIST.\n", src, target);