Currently, umount /foo results in a statfs("/foo") call, which triggers
autofs. This can create another mountpoint on /foo, which is then unmounted
later instead of the actual /foo at the time umount was called.
This is especially an issue for umount -R /bar, which just fails with
-EBUSY as the accidental mountpoint is never accounted for and so it tries
to umount /bar before /bar/someautofs.
Replace the direct statfs call with open(path, O_PATH) + fstatfs, which sees
the autofs mount directly, without triggering it.
if (!type) {
struct statfs vfs;
- DBG(CXT, ul_debugobj(cxt, " trying statfs()"));
- if (statfs(tgt, &vfs) == 0)
+ DBG(CXT, ul_debugobj(cxt, " trying fstatfs()"));
+ /* O_PATH avoids triggering automount points. */
+ int pathfd = open(tgt, O_PATH);
+ if (pathfd >= 0 && fstatfs(pathfd, &vfs) == 0) {
type = mnt_statfs_get_fstype(&vfs);
+ close(pathfd);
+ }
if (type) {
int rc = mnt_fs_set_fstype(cxt->fs, type);
if (rc)