Always allow '-o remount,ro'

Allow the mount(8) utility to always operate on all datasets when
remounting them read-only.  This critical for rc.sysinit/umountroot
which remounts the root filesystem read-only during shutdown to
ensure everything is correctly flushed to disk.

Fix minor typo, the check to set zfsutil should use the bitwise
'&'.  I must have accidentally hit the adjacent '*' and obviously
neither the compiler or my code review caught this.  Fix it now.
This commit is contained in:
Brian Behlendorf 2011-03-15 09:34:56 -07:00
parent 04516a45b2
commit 093aa69286

View File

@ -298,7 +298,7 @@ main(int argc, char **argv)
char mntopts[MNT_LINE_MAX] = { '\0' }; char mntopts[MNT_LINE_MAX] = { '\0' };
char badopt[MNT_LINE_MAX] = { '\0' }; char badopt[MNT_LINE_MAX] = { '\0' };
char *dataset, *mntpoint; char *dataset, *mntpoint;
unsigned long mntflags = 0, zfsflags = 0; unsigned long mntflags = 0, zfsflags = 0, remount_ro = 0;
int sloppy = 0, fake = 0, verbose = 0, nomtab = 0, zfsutil = 0; int sloppy = 0, fake = 0, verbose = 0, nomtab = 0, zfsutil = 0;
int error, c; int error, c;
@ -402,7 +402,10 @@ main(int argc, char **argv)
if (mntflags & MS_REMOUNT) if (mntflags & MS_REMOUNT)
nomtab = 1; nomtab = 1;
if (zfsflags * ZS_ZFSUTIL) if ((mntflags & MS_REMOUNT) && (mntflags & MS_RDONLY))
remount_ro = 1;
if (zfsflags & ZS_ZFSUTIL)
zfsutil = 1; zfsutil = 1;
if ((g_zfs = libzfs_init()) == NULL) if ((g_zfs = libzfs_init()) == NULL)
@ -427,6 +430,10 @@ main(int argc, char **argv)
* 'zfs mount'. However, since 'zfs mount' actually invokes 'mount' * 'zfs mount'. However, since 'zfs mount' actually invokes 'mount'
* we differentiate the two cases using the 'zfsutil' mount option. * we differentiate the two cases using the 'zfsutil' mount option.
* This mount option should only be supplied by the 'zfs mount' util. * This mount option should only be supplied by the 'zfs mount' util.
*
* The only exception to the above rule is '-o remount,ro'. This is
* always allowed for non-legacy datasets for rc.sysinit/umountroot
* to safely remount the root filesystem and flush its cache.
*/ */
if (zfsutil && !strcmp(legacy, ZFS_MOUNTPOINT_LEGACY)) { if (zfsutil && !strcmp(legacy, ZFS_MOUNTPOINT_LEGACY)) {
(void) fprintf(stderr, gettext( (void) fprintf(stderr, gettext(
@ -437,7 +444,7 @@ main(int argc, char **argv)
return (MOUNT_USAGE); return (MOUNT_USAGE);
} }
if (!zfsutil && strcmp(legacy, ZFS_MOUNTPOINT_LEGACY)) { if (!zfsutil && strcmp(legacy, ZFS_MOUNTPOINT_LEGACY) && !remount_ro) {
(void) fprintf(stderr, gettext( (void) fprintf(stderr, gettext(
"filesystem '%s' cannot be mounted using 'mount'.\n" "filesystem '%s' cannot be mounted using 'mount'.\n"
"Use 'zfs set mountpoint=%s' or 'zfs mount %s'.\n" "Use 'zfs set mountpoint=%s' or 'zfs mount %s'.\n"