summaryrefslogtreecommitdiffstats
path: root/sys-utils/mount.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys-utils/mount.c')
-rw-r--r--sys-utils/mount.c46
1 files changed, 15 insertions, 31 deletions
diff --git a/sys-utils/mount.c b/sys-utils/mount.c
index b09e77616..bdf6e4bdb 100644
--- a/sys-utils/mount.c
+++ b/sys-utils/mount.c
@@ -51,8 +51,6 @@
* --options-source-force MNT_OMODE_FORCE
*/
-static int readwrite;
-
static int mk_exit_code(struct libmnt_context *cxt, int rc);
static void __attribute__((__noreturn__)) exit_non_root(const char *option)
@@ -369,7 +367,6 @@ static int mk_exit_code(struct libmnt_context *cxt, int rc)
const char *tgt = mnt_context_get_target(cxt);
const char *src = mnt_context_get_source(cxt);
-try_readonly:
if (mnt_context_helper_executed(cxt)) {
/*
* /sbin/mount.<type> called, return status
@@ -385,6 +382,9 @@ try_readonly:
*/
selinux_warning(cxt, tgt);
+ if (mnt_context_forced_rdonly(cxt))
+ warnx(_("WARNING: device write-protected, mounted read-only"));
+
return MOUNT_EX_SUCCESS; /* mount(2) success */
}
@@ -404,13 +404,14 @@ try_readonly:
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;
+ if (mflags & MS_RDONLY)
+ warnx(_("cannot mount %s read-only"), src);
+ else if (mnt_context_is_rwonly_mount(cxt))
+ warnx(_("%s is write-protected but explicit `-w' flag given"), src);
+ else if (mflags & MS_REMOUNT)
+ warnx(_("cannot remount %s read-write, is write-protected"), src);
+ warnx(_("mount %s on %s failed"), src, tgt);
+ return MOUNT_EX_USAGE;
case -MNT_ERR_NOFSTAB:
if (mnt_context_is_swapmatch(cxt)) {
warnx(_("can't find %s in %s"),
@@ -481,7 +482,6 @@ try_readonly:
*/
syserr = mnt_context_get_syscall_errno(cxt);
-
switch(syserr) {
case EPERM:
if (geteuid() == 0) {
@@ -620,27 +620,11 @@ try_readonly:
case EROFS:
if (mflags & MS_RDONLY)
warnx(_("cannot mount %s read-only"), src);
-
- else if (readwrite)
+ else if (mnt_context_is_rwonly_mount(cxt))
warnx(_("%s is write-protected but explicit `-w' flag given"), src);
-
else if (mflags & MS_REMOUNT)
warnx(_("cannot remount %s read-write, is write-protected"), src);
-
- else if (mflags & MS_BIND)
- warn(_("mount %s on %s failed"), src, tgt);
-
- else {
- warnx(_("%s is write-protected, mounting read-only"), src);
-
- mnt_context_reset_status(cxt);
- mnt_context_set_mflags(cxt, mflags | MS_RDONLY);
- rc = mnt_context_do_mount(cxt);
- if (!rc)
- rc = mnt_context_finalize_mount(cxt);
-
- goto try_readonly;
- }
+ warnx(_("mount %s on %s failed"), src, tgt);
break;
case ENOMEDIUM:
@@ -924,7 +908,7 @@ int main(int argc, char **argv)
break;
case 'r':
append_option(cxt, "ro");
- readwrite = 0;
+ mnt_context_enable_rwonly_mount(cxt, FALSE);
break;
case 'v':
mnt_context_enable_verbose(cxt, TRUE);
@@ -934,7 +918,7 @@ int main(int argc, char **argv)
break;
case 'w':
append_option(cxt, "rw");
- readwrite = 1;
+ mnt_context_enable_rwonly_mount(cxt, TRUE);
break;
case 'o':
append_option(cxt, optarg);