/* Unmount all filesystems of type VFSTYPES found in mtab. Since we are concurrently updating mtab after every succesful umount, we have to slurp in the entire file before we start. This isn't too bad, because in any case it's important to umount mtab entries in reverse order to mount, e.g. /usr/spool before /usr. */ int umount_all (string_list types) { struct mntentchn *mc, *hd; int errors = 0; hd = mtab_head(); if (!hd->prev) die (2, "umount: cannot find list of filesystems to unmount"); for (mc = hd->prev; mc != hd; mc = mc->prev) { if (matching_type (mc->mnt_type, types)) { errors |= umount_one (mc->mnt_fsname, mc->mnt_dir, mc->mnt_type, mc->mnt_opts); } } sync (); return errors; }
/* Unmount all filesystems of type VFSTYPES found in mtab. Since we are concurrently updating mtab after every successful umount, we have to slurp in the entire file before we start. This isn't too bad, because in any case it's important to umount mtab entries in reverse order to mount, e.g. /usr/spool before /usr. */ static int umount_all (char *types, char *test_opts) { struct mntentchn *mc, *hd; int errors = 0; hd = mtab_head(); if (!hd->prev) die (2, _("umount: cannot find list of filesystems to unmount")); for (mc = hd->prev; mc != hd; mc = mc->prev) { if (matching_type (mc->m.mnt_type, types) && matching_opts (mc->m.mnt_opts, test_opts)) { errors |= umount_one (mc->m.mnt_fsname, mc->m.mnt_dir, mc->m.mnt_type, mc->m.mnt_opts, mc); } } sync (); return errors; }