From: Kevin McCarthy Date: Wed, 29 Aug 2018 20:00:14 +0000 (-0700) Subject: Remove extra lstats() in safe_rename() upon link success X-Git-Tag: 2019-10-25~671^2~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d8734c00e03a11a838ef9cbe102fe0a2dc274758;p=neomutt Remove extra lstats() in safe_rename() upon link success 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. --- diff --git a/mutt/file.c b/mutt/file.c index a7c6688cf..0a12eb558 100644 --- a/mutt/file.c +++ b/mutt/file.c @@ -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);