Skip to content

Throw filesystemerror (errno EINTR) in CIFS mounted disk. #146

Closed
@bxwllzz

Description

@bxwllzz

Describe the bug
Throw unexpected filesystemerror (errno EINTR) in CIFS mounted disk.

terminate called after throwing an instance of 'ghc::filesystem::filesystem_error'
  what():  Interrupted system call: '/mnt/nas_xxx'

strace shows:

...
openat(AT_FDCWD, "/mnt/nas_xxx", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 8
fstat(8, {st_mode=S_IFDIR|0777, st_size=0, ...}) = 0
getdents64(8, 0x5637c220a1c0, 1048576)  = -1 EINTR (Interrupted system call)
close(8)                                = 0
...

To Reproduce
Use ghc::filesystem::recursive_directory_iterator in disk mounted by CIFS

Expected behavior
Retry syscall if errno is EINTR (in my case ::opendir)

Additional context
std::filesystem in gcc 9.4 (Ubuntu 20.04) has same problem.

terminate called after throwing an instance of 'std::filesystem::__cxx11::filesystem_error'
  what():  filesystem error: cannot increment recursive directory iterator: Interrupted system call

boost::filesystem 1.71.0 has same problem.

terminate called after throwing an instance of 'boost::filesystem::filesystem_error'
  what():  filesystem::recursive_directory_iterator directory error: Interrupted system call

boost::filesystem >= 1.74.0 seems fix this problem by retry syscall in EINTR ?
https://www.boost.org/doc/libs/1_74_0/libs/filesystem/src/operations.cpp

Metadata

Metadata

Assignees

Labels

POSIXPOSIX type backend is affectedavailable on masterFix is done on master branch, issue closed on next releasebugSomething isn't working

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions