`mount.zfs -o zfsutil` leverages `zfs_mount_at()`

Using `zfs_mount_at()` gives opportunity to properly propagate
mountopts from what's stored in a pool to the `mount(2)` syscall
invocation. It fixes cases when mount options are set to incorrect
values and rectification is impossible (e. g. Linux initrd boot
sequence in ).
Moved debug information printing after all variables are
initialized - printed text reflects what is passed to `mount(2)`.

Signed-off-by: szubersk <szuberskidamian@gmail.com>
This commit is contained in:
szubersk 2022-02-06 12:22:16 +01:00
parent f2c5bc150e
commit 329e2ffa4b
No known key found for this signature in database
GPG Key ID: 5BA2439DCA1ABF18
1 changed files with 34 additions and 13 deletions
cmd/mount_zfs

View File

@ -246,13 +246,6 @@ main(int argc, char **argv)
} }
} }
if (verbose)
(void) fprintf(stdout, gettext("mount.zfs:\n"
" dataset: \"%s\"\n mountpoint: \"%s\"\n"
" mountflags: 0x%lx\n zfsflags: 0x%lx\n"
" mountopts: \"%s\"\n mtabopts: \"%s\"\n"),
dataset, mntpoint, mntflags, zfsflags, mntopts, mtabopt);
if (mntflags & MS_REMOUNT) { if (mntflags & MS_REMOUNT) {
nomtab = 1; nomtab = 1;
remount = 1; remount = 1;
@ -275,7 +268,10 @@ main(int argc, char **argv)
return (MOUNT_USAGE); return (MOUNT_USAGE);
} }
if (!zfsutil || sloppy ||
libzfs_envvar_is_set("ZFS_MOUNT_HELPER")) {
zfs_adjust_mount_options(zhp, mntpoint, mntopts, mtabopt); zfs_adjust_mount_options(zhp, mntpoint, mntopts, mtabopt);
}
/* treat all snapshots as legacy mount points */ /* treat all snapshots as legacy mount points */
if (zfs_get_type(zhp) == ZFS_TYPE_SNAPSHOT) if (zfs_get_type(zhp) == ZFS_TYPE_SNAPSHOT)
@ -293,11 +289,10 @@ main(int argc, char **argv)
if (zfs_version == 0) { if (zfs_version == 0) {
fprintf(stderr, gettext("unable to fetch " fprintf(stderr, gettext("unable to fetch "
"ZFS version for filesystem '%s'\n"), dataset); "ZFS version for filesystem '%s'\n"), dataset);
return (MOUNT_SYSERR);
}
zfs_close(zhp); zfs_close(zhp);
libzfs_fini(g_zfs); libzfs_fini(g_zfs);
return (MOUNT_SYSERR);
}
/* /*
* Legacy mount points may only be mounted using 'mount', never using * Legacy mount points may only be mounted using 'mount', never using
@ -316,6 +311,8 @@ main(int argc, char **argv)
"Use 'zfs set mountpoint=%s' or 'mount -t zfs %s %s'.\n" "Use 'zfs set mountpoint=%s' or 'mount -t zfs %s %s'.\n"
"See zfs(8) for more information.\n"), "See zfs(8) for more information.\n"),
dataset, mntpoint, dataset, mntpoint); dataset, mntpoint, dataset, mntpoint);
zfs_close(zhp);
libzfs_fini(g_zfs);
return (MOUNT_USAGE); return (MOUNT_USAGE);
} }
@ -326,13 +323,37 @@ main(int argc, char **argv)
"Use 'zfs set mountpoint=%s' or 'zfs mount %s'.\n" "Use 'zfs set mountpoint=%s' or 'zfs mount %s'.\n"
"See zfs(8) for more information.\n"), "See zfs(8) for more information.\n"),
dataset, "legacy", dataset); dataset, "legacy", dataset);
zfs_close(zhp);
libzfs_fini(g_zfs);
return (MOUNT_USAGE); return (MOUNT_USAGE);
} }
if (verbose)
(void) fprintf(stdout, gettext("mount.zfs:\n"
" dataset: \"%s\"\n mountpoint: \"%s\"\n"
" mountflags: 0x%lx\n zfsflags: 0x%lx\n"
" mountopts: \"%s\"\n mtabopts: \"%s\"\n"),
dataset, mntpoint, mntflags, zfsflags, mntopts, mtabopt);
if (!fake) { if (!fake) {
if (zfsutil && !sloppy &&
!libzfs_envvar_is_set("ZFS_MOUNT_HELPER")) {
error = zfs_mount_at(zhp, mntopts, mntflags, mntpoint);
if (error) {
(void) fprintf(stderr, "zfs_mount_at() failed: "
"%s", libzfs_error_description(g_zfs));
zfs_close(zhp);
libzfs_fini(g_zfs);
return (MOUNT_SYSERR);
}
} else {
error = mount(dataset, mntpoint, MNTTYPE_ZFS, error = mount(dataset, mntpoint, MNTTYPE_ZFS,
mntflags, mntopts); mntflags, mntopts);
} }
}
zfs_close(zhp);
libzfs_fini(g_zfs);
if (error) { if (error) {
switch (errno) { switch (errno) {