]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
mount: Handle EROFS before calling mount() syscall
authorStanislav Brabec <sbrabec@suse.cz>
Tue, 12 Apr 2016 18:23:25 +0000 (20:23 +0200)
committerKarel Zak <kzak@redhat.com>
Fri, 22 Apr 2016 10:50:14 +0000 (12:50 +0200)
If the loop device is already initialized read-only, the new code for loop
device reuse returns -EROFS. There is no solution of this situation. But mount
can behave in the same way, as it does for EROFS returned by mount syscall: Try
again in read-only mode.

Before:
mount: /mnt/2: mount failed: Read-only file system

After:
mount: /btrfs.img is used as read only loop, mounting read-only

Note: It would be nice to mention loop device name in the warning message, but
it is not available in the mount context.

Signed-off-by: Stanislav Brabec <sbrabec@suse.cz>
sys-utils/mount.c

index 64ec0a779423de0485dc77fbe620de02468d5421..23856c171c769c519a6490334630748a2733f177 100644 (file)
@@ -402,6 +402,15 @@ try_readonly:
                case -EBUSY:
                        warnx(_("%s is already mounted"), src);
                        return MOUNT_EX_USAGE;
+               /* -EROFS before syscall can happen only for loop mount */
+               case -EROFS:
+                       warnx(_("%s is used as read only loop, mounting read-only"), src);
+                       mnt_context_reset_status(cxt);
+                       mnt_context_set_mflags(cxt, mflags | MS_RDONLY);
+                       rc = mnt_context_mount(cxt);
+                       if (!rc)
+                               rc = mnt_context_finalize_mount(cxt);
+                       goto try_readonly;
                case -MNT_ERR_NOFSTAB:
                        if (mnt_context_is_swapmatch(cxt)) {
                                warnx(_("can't find %s in %s"),