Allow '-o remount' for non-legacy datasets

This is done for compatibility with existing Linux infrastructure.

In particular, when using zfs as a root filesystem there are init
scripts which as part of shutdown remount root read-only.  Also,
the new systemd infrastructure being used by Fedora expects to be
able to remount a file system read-write.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue #847
This commit is contained in:
Brian Behlendorf 2012-07-30 15:38:02 -07:00
parent 4ab8a725ce
commit c171ea71bb
1 changed files with 9 additions and 9 deletions

View File

@ -312,7 +312,7 @@ main(int argc, char **argv)
char badopt[MNT_LINE_MAX] = { '\0' }; char badopt[MNT_LINE_MAX] = { '\0' };
char mtabopt[MNT_LINE_MAX] = { '\0' }; char mtabopt[MNT_LINE_MAX] = { '\0' };
char *dataset, *mntpoint; char *dataset, *mntpoint;
unsigned long mntflags = 0, zfsflags = 0, remount_ro = 0; unsigned long mntflags = 0, zfsflags = 0, remount = 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;
@ -417,11 +417,10 @@ main(int argc, char **argv)
" mountopts: \"%s\"\n mtabopts: \"%s\"\n"), " mountopts: \"%s\"\n mtabopts: \"%s\"\n"),
dataset, mntpoint, mntflags, zfsflags, mntopts, mtabopt); dataset, mntpoint, mntflags, zfsflags, mntopts, mtabopt);
if (mntflags & MS_REMOUNT) if (mntflags & MS_REMOUNT) {
nomtab = 1; nomtab = 1;
remount = 1;
if ((mntflags & MS_REMOUNT) && (mntflags & MS_RDONLY)) }
remount_ro = 1;
if (zfsflags & ZS_ZFSUTIL) if (zfsflags & ZS_ZFSUTIL)
zfsutil = 1; zfsutil = 1;
@ -454,9 +453,10 @@ main(int argc, char **argv)
* 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 * The only exception to the above rule is '-o remount' which is
* always allowed for non-legacy datasets for rc.sysinit/umountroot * always allowed for non-legacy datasets. This is done because when
* to safely remount the root filesystem and flush its cache. * using zfs as your root file system both rc.sysinit/umountroot and
* systemd depend on 'mount -o remount <mountpoint>' to work.
*/ */
if (zfsutil && !strcmp(legacy, ZFS_MOUNTPOINT_LEGACY)) { if (zfsutil && !strcmp(legacy, ZFS_MOUNTPOINT_LEGACY)) {
(void) fprintf(stderr, gettext( (void) fprintf(stderr, gettext(
@ -467,7 +467,7 @@ main(int argc, char **argv)
return (MOUNT_USAGE); return (MOUNT_USAGE);
} }
if (!zfsutil && strcmp(legacy, ZFS_MOUNTPOINT_LEGACY) && !remount_ro) { if (!zfsutil && strcmp(legacy, ZFS_MOUNTPOINT_LEGACY) && !remount) {
(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"