From: John S. <John.Salmon@DEShawResearch.com> - 2017-11-04 12:32:39
|
My colleagues and I just reported a bug to the autofs maintainers that may be of interest to fuse developers: https://bugzilla.redhat.com/show_bug.cgi?id=1509088 Basically, the Linux automount daemon has a small window during which it incorrectly leaves file descriptors open when it fork/execs mount, and then locks up the entire automount infrastructure until those file descriptors are closed. When automount mounts a fuse filesystem, those file descriptors stay open when mount execs the fuse daemon, and when the daemon calls fuse_daemonize. Nothing can be automounted until the fuse daemon terminates. This is clearly a bug in the automounter. It's in no way fuse's fault. But it's possible for fuse to work around it. In our fuse daemon, we've implemented: if(BuggyAutomountWorkaround){ struct rlimit rl; getrlimit(RLIMIT_NOFILE, &rl); int rlopen = rl.rlim_cur; if(rlopen > 16384){ syslog(LOG_NOTICE, "Enough is enough... We're only closing 16k files for BuggyAutomountWorkaround even though rlim_cur is %d\n", rlopen); rlopen = 16384; } for(int fd=3; fd<rlopen; ++fd){ if( close(fd) == 0 ) // N.B. These are expected to fail. They *should* fail! syslog(LOG_NOTICE, "Closed fd=%d. Automount probably dodged a bullet.", fd); } } Other fuse application developers might wish to do something similar if they expect that their filesystems may be automounted on Linux. The libfuse developers might also consider putting something similar in fuse_daemonize. John Salmon -- *.* |