summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mount/umount.c42
1 files changed, 22 insertions, 20 deletions
diff --git a/mount/umount.c b/mount/umount.c
index 0349cb3fc..96c940e21 100644
--- a/mount/umount.c
+++ b/mount/umount.c
@@ -600,6 +600,7 @@ umount_file (char *arg) {
int fstab_has_user, fstab_has_users, fstab_has_owner, fstab_has_group;
int ok, status = 0;
struct stat statbuf;
+ char *loopdev = NULL;
if (!*arg) { /* "" would be expanded to `pwd` */
die(2, _("Cannot unmount \"\"\n"));
@@ -608,26 +609,7 @@ umount_file (char *arg) {
file = canonicalize(arg); /* mtab paths are canonicalized */
- /* if file is a regular file, check if it is associated
- * with some loop device
- */
- if (!stat(file, &statbuf) && S_ISREG(statbuf.st_mode)) {
- char *loopdev = NULL;
- switch (find_loopdev_by_backing_file(file, &loopdev)) {
- case 0:
- if (verbose)
- printf(_("%s is associated with %s, trying to unmount it\n"),
- arg, loopdev);
- file = loopdev;
- break;
- case 2:
- if (verbose)
- printf(_("%s is associated with more than one loop device: not unmounting\n"),
- arg);
- break;
- }
- }
-
+try_loopdev:
if (verbose > 1)
printf(_("Trying to unmount %s\n"), file);
@@ -659,6 +641,26 @@ umount_file (char *arg) {
if (!mc && verbose)
printf(_("Could not find %s in mtab\n"), file);
+ /* not found in mtab - check if it is associated with some loop device
+ * (only if it is a regular file)
+ */
+ if (!mc && !loopdev && !stat(file, &statbuf) && S_ISREG(statbuf.st_mode)) {
+ switch (find_loopdev_by_backing_file(file, &loopdev)) {
+ case 0:
+ if (verbose)
+ printf(_("%s is associated with %s\n"),
+ arg, loopdev);
+ file = loopdev;
+ goto try_loopdev;
+ break;
+ case 2:
+ if (verbose)
+ printf(_("%s is associated with more than one loop device: not unmounting\n"),
+ arg);
+ break;
+ }
+ }
+
if (mc) {
/*
* helper - umount helper (e.g. pam_mount)