all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Tobias Bading <tbading@web.de>
To: emacs-devel@gnu.org
Subject: Re: Syscalls stat() and faccessat() sometimes fail with errno EINTR when accessing SMB share through VPN
Date: Sun, 14 Feb 2021 12:23:15 +0100	[thread overview]
Message-ID: <38e34b2b-616f-a8a0-77ac-7c12c19478ec@web.de> (raw)
In-Reply-To: <9c207d94-4970-95c5-7234-e5d7f2ee62b2@web.de>

I've asked the GNU libc hackers as well:
https://sourceware.org/pipermail/libc-help/2021-February/005663.html

Tobias

---

On 12.02.21 19:46, Tobias Bading wrote:
> I've placed 22 TEMP_FAILURE_RETRY() macros around the 14 stat() and 8
> faccessat() calls in dired.c, fileio.c, filelock.c, lread.c,
> process.c, and sysdep.c. So far this band-aid seems to circumvent the
> problem, but I still have no idea whether those calls are even
> permitted to fail with errno EINTR.
>
> Tobias
>
> ---
>
> On 12.02.21 16:24, Tobias Bading wrote:
>> Ok, the grep -A2 wasn't that bright XD. With -C2 I just got
>>
>> 16:19:23.935175 --- SIGIO {si_signo=SIGIO, si_code=SI_KERNEL} ---
>> 16:19:23.937296 faccessat(AT_FDCWD, "/smb/server/share/dir/", F_OK) =
>> -1 EINTR (Interrupted system call)
>> [...]
>> 16:19:34.191156 --- SIGIO {si_signo=SIGIO, si_code=SI_KERNEL} ---
>> 16:19:34.192562 stat("/smb/server/share/dir/subdir", 0x7fff40feb5c0)
>> = -1 EINTR (Interrupted system call)
>> [...]
>> 16:19:39.358023 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED,
>> si_pid=68151, si_uid=501, si_status=0, si_utime=1, si_stime=1} ---
>> 16:19:39.358477 stat("/smb/server/share/dir", 0x7fff40fea8b0) = -1
>> EINTR (Interrupted system call)
>> [...]
>> 16:20:01.111670 --- SIGIO {si_signo=SIGIO, si_code=SI_KERNEL} ---
>> 16:20:01.113070 stat("/smb/server/share/dir/subdir", 0x7fff40feb5c0)
>> = -1 EINTR (Interrupted system call)
>> [...]
>> 16:20:05.519682 --- SIGIO {si_signo=SIGIO, si_code=SI_KERNEL} ---
>> 16:20:05.520931 stat("/smb/server/share/dir/subdir", 0x7fff40feb5c0)
>> = -1 EINTR (Interrupted system call)
>>
>> which makes a bit more sense I guess.
>>
>> Tobias
>>
>> ---
>>
>> On 12.02.21 16:11, Tobias Bading wrote:
>>> Hi.
>>>
>>> Everyone doing alright hacking/working from home?
>>>
>>> Yesterday I encountered a curious problem while using (a self-built)
>>> Emacs 26.3.50 on my GNU/Linux machine at home:
>>>
>>> I've set up the automounter to mount SMB shares of Windows servers
>>> in the office through the company's VPN. This works fine for e.g.
>>> "ls -lR /smb/server/share/dir" in a shell, except for bad
>>> performance. The problems start when I try to work with the same
>>> directory from within Emacs with dired-mode, i.e. a simple C-x C-f
>>> /smb/server/share/dir. Quite regularly I get errors like
>>> "dired-get-file-for-visit: File no longer exists; type ‘g’ to update
>>> Dired buffer", although nothing has changed in the directory.
>>>
>>> So I put Emacs under a microscope with
>>>
>>> strace -f -e trace=%file -tt emacs 2>&1 | grep --line-buffered -A2
>>> /smb/ >emacs.log
>>>
>>> which revealed errors like
>>>
>>> faccessat(AT_FDCWD, "/smb/server/share/dir", F_OK) = -1 EINTR
>>> (Interrupted system call)
>>> --- SIGIO {si_signo=SIGIO, si_code=SI_KERNEL} ---
>>> [...]
>>> stat("/smb/server/share/dir", 0x7fffe49383b0) = -1 EINTR
>>> (Interrupted system call)
>>> --- SIGIO {si_signo=SIGIO, si_code=SI_KERNEL} ---
>>> --- SIGIO {si_signo=SIGIO, si_code=SI_KERNEL} ---
>>>
>>> (The timestamps of the SIGIO lines suggest that these signals have
>>> nothing to do with the EINTR errors reported beforehand, the
>>> timestamps are often over 0.1 seconds apart.)
>>>
>>> So far I've only seen stat() and faccessat() failing with EINTR. The
>>> funny thing is, the man pages of those two system calls don't
>>> mention EINTR at all. man signal(7) also doesn't mention these
>>> functions in the paragraph about SA_RESTART. Anyway, I've checked
>>> the source code of my Emacs 26.3.50 build and found
>>> emacs_sigaction_flags() in src/sysdep.c, which does return 0 (as
>>> intended by the dev(s) who wrote the code). I've changed the
>>> implementation to "return SA_RESTART;", but that had no effect.
>>>
>>> To make sure I didn't mess up my own Emacs 26 git branch somehow, I
>>> did a quick test with the current HEAD of origin/master and
>>> "src/emacs -Q", which seems to have the same problem, revealed by
>>> error messages like "apply: Setting current directory: Interrupted
>>> system call, /smb/server/share/dir/".
>>>
>>> I'm stumped. A (shell-command "ls -lAFNR
>>> /smb/server/share/big-dir/") works fine, as does a "cp -a" of that
>>> directory. But when the Emacs process itself calls stat() or
>>> faccessat(), things go sideways? Why? What am I missing? Are stat()
>>> and faccessat() even allowed to fail with EINTR? Is this a kernel
>>> bug, maybe somewhere in the CIFS client implementation? But an
>>> strace of "ls -lAFNR /smb/server/share/big-dir/" shows not a single
>>> EINTR! So why would only Emacs be affected?
>>>
>>> Please enlighten me... ;)
>>>
>>> Tobias
>>>
>>
>




  reply	other threads:[~2021-02-14 11:23 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-12 15:11 Syscalls stat() and faccessat() sometimes fail with errno EINTR when accessing SMB share through VPN Tobias Bading
2021-02-12 15:24 ` Tobias Bading
2021-02-12 18:46   ` Tobias Bading
2021-02-14 11:23     ` Tobias Bading [this message]
2021-02-14 17:59       ` Matt Armstrong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=38e34b2b-616f-a8a0-77ac-7c12c19478ec@web.de \
    --to=tbading@web.de \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.