Index: usr.sbin/autofs/automount.c =================================================================== --- usr.sbin/autofs/automount.c +++ usr.sbin/autofs/automount.c @@ -84,6 +84,30 @@ return (error); } +static int +unmount_by_umount(struct statfs* sfp, bool force) +{ + FILE *f; + char fsid[sizeof(sfp->f_fsid)*2+1]; + size_t i; + + if (sfp->f_fsid.val[0] == 0 || sfp->f_fsid.val[1] == 0) + return (-1); + + /* umount(8) expects the file system ID to be in hexadecimal format */ + for (i = 0; i < sizeof(sfp->f_fsid); i++) + snprintf(fsid+strlen(fsid), sizeof(fsid) - strlen(fsid), + "%02x", ((u_char *)&sfp->f_fsid)[i]); + + if (force) + f = auto_popen("umount", "-f", fsid, NULL); + else + f = auto_popen("umount", fsid, NULL); + + assert(f != NULL); + return (auto_pclose(f)); +} + static const struct statfs * find_statfs(const struct statfs *mntbuf, int nitems, const char *mountpoint) { @@ -304,7 +328,8 @@ continue; } - unmount_by_statfs(&(mntbuf[i]), force); + if (unmount_by_umount(&(mntbuf[i]), force) != 0) + unmount_by_statfs(&(mntbuf[i]), force); } }