[PATCH][SRC][XENIAL] UBUNTU: SAUCE: Allow mounting datasets more than once (LP: #1759848)
Colin Ian King
colin.king at canonical.com
Thu Jul 12 13:58:29 UTC 2018
On 25/06/18 20:36, Colin King wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> BugLink: https://bugs.launchpad.net/bugs/1759848
>
> Currently mounting an already mounted zfs dataset results in an
> error, whereas it is typically allowed with other filesystems.
> This causes some bad interactions with mount namespaces. Take
> this sequence for example:
>
> - Create a dataset
> - Create a snapshot of the dataset
> - Create a clone of the snapshot
> - Create a new mount namespace
> - Rename the original dataset
>
> The rename results in unmounting and remounting the clone in the
> original mount namespace, however the remount fails because the
> dataset is still mounted in the new mount namespace. (Note that
> this means the mount in the new mount namespace is never being
> unmounted, so perhaps the unmount/remount of the clone isn't
> actually necessary.)
>
> The problem here is a result of the way mounting is implemented
> in the kernel module. Since it is not mounting block devices it
> uses mount_nodev() instead of the usual mount_bdev(). However,
> mount_nodev() is written for filesystems for which each mount is
> a new instance (i.e. a new super block), and zfs should be able
> to detect when a mount request can be satisfied using an existing
> super block.
>
> Change zpl_mount() to call sget() directly with it's own test
> callback. Passing the objset_t object as the fs data allows
> checking if a superblock already exists for the dataset, and in
> that case we just need to return a new reference for the sb's
> root dentry.
>
> [ Sync'd from zfsutils-linux, from a patch by Seth Forshee and
> backported to zfs 0.6.5.6. Note that this also contains
> some zfstutils changes between 0.6.5.6-0ubuntu20 and
> 0.6.5.6-0ubuntu24 which go also sync'd into this fix, which
> is expected part of the zfs sync'ing ]
>
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
> zfs/META | 2 +-
> zfs/Makefile.in | 2 +-
> zfs/aclocal.m4 | 2 +-
> zfs/config/kernel-fst-mount.m4 | 28 ++++++
> zfs/config/kernel-mount-nodev.m4 | 20 ----
> zfs/config/kernel.m4 | 2 +-
> zfs/configure | 150 +++++++++---------------------
> zfs/contrib/Makefile.in | 2 +-
> zfs/contrib/bash_completion.d/Makefile.in | 2 +-
> zfs/contrib/dracut/90zfs/Makefile.in | 2 +-
> zfs/contrib/dracut/Makefile.in | 2 +-
> zfs/contrib/initramfs/Makefile.in | 2 +-
> zfs/include/Makefile.in | 2 +-
> zfs/include/linux/Makefile.in | 2 +-
> zfs/include/linux/vfs_compat.h | 24 +++++
> zfs/include/sys/Makefile.in | 2 +-
> zfs/include/sys/fm/Makefile.in | 2 +-
> zfs/include/sys/fm/fs/Makefile.in | 2 +-
> zfs/include/sys/fs/Makefile.in | 2 +-
> zfs/module/zfs/zpl_super.c | 65 +++++++++++--
> zfs/zfs_config.h.in | 6 +-
> 21 files changed, 175 insertions(+), 148 deletions(-)
> create mode 100644 zfs/config/kernel-fst-mount.m4
> delete mode 100644 zfs/config/kernel-mount-nodev.m4
>
> diff --git a/zfs/META b/zfs/META
> index 6c7026c..6837592 100644
> --- a/zfs/META
> +++ b/zfs/META
> @@ -2,7 +2,7 @@ Meta: 1
> Name: zfs
> Branch: 1.0
> Version: 0.6.5.6
> -Release: 0ubuntu20
> +Release: 0ubuntu24
> Release-Tags: relext
> License: CDDL
> Author: OpenZFS on Linux
> diff --git a/zfs/Makefile.in b/zfs/Makefile.in
> index 8f68539..f9b0f69 100644
> --- a/zfs/Makefile.in
> +++ b/zfs/Makefile.in
> @@ -140,6 +140,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
> $(top_srcdir)/config/kernel-file-inode.m4 \
> $(top_srcdir)/config/kernel-fmode-t.m4 \
> $(top_srcdir)/config/kernel-follow-down-one.m4 \
> + $(top_srcdir)/config/kernel-fst-mount.m4 \
> $(top_srcdir)/config/kernel-fsync.m4 \
> $(top_srcdir)/config/kernel-generic_io_acct.m4 \
> $(top_srcdir)/config/kernel-get-disk-ro.m4 \
> @@ -155,7 +156,6 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
> $(top_srcdir)/config/kernel-lseek-execute.m4 \
> $(top_srcdir)/config/kernel-mk-request-fn.m4 \
> $(top_srcdir)/config/kernel-mkdir-umode-t.m4 \
> - $(top_srcdir)/config/kernel-mount-nodev.m4 \
> $(top_srcdir)/config/kernel-open-bdev-exclusive.m4 \
> $(top_srcdir)/config/kernel-put-link.m4 \
> $(top_srcdir)/config/kernel-security-inode-init.m4 \
> diff --git a/zfs/aclocal.m4 b/zfs/aclocal.m4
> index 391fd54..75a4bfe 100644
> --- a/zfs/aclocal.m4
> +++ b/zfs/aclocal.m4
> @@ -1245,6 +1245,7 @@ m4_include([config/kernel-fallocate.m4])
> m4_include([config/kernel-file-inode.m4])
> m4_include([config/kernel-fmode-t.m4])
> m4_include([config/kernel-follow-down-one.m4])
> +m4_include([config/kernel-fst-mount.m4])
> m4_include([config/kernel-fsync.m4])
> m4_include([config/kernel-generic_io_acct.m4])
> m4_include([config/kernel-get-disk-ro.m4])
> @@ -1260,7 +1261,6 @@ m4_include([config/kernel-lookup-nameidata.m4])
> m4_include([config/kernel-lseek-execute.m4])
> m4_include([config/kernel-mk-request-fn.m4])
> m4_include([config/kernel-mkdir-umode-t.m4])
> -m4_include([config/kernel-mount-nodev.m4])
> m4_include([config/kernel-open-bdev-exclusive.m4])
> m4_include([config/kernel-put-link.m4])
> m4_include([config/kernel-security-inode-init.m4])
> diff --git a/zfs/config/kernel-fst-mount.m4 b/zfs/config/kernel-fst-mount.m4
> new file mode 100644
> index 0000000..a8ac50b
> --- /dev/null
> +++ b/zfs/config/kernel-fst-mount.m4
> @@ -0,0 +1,28 @@
> +dnl #
> +dnl # 2.6.38 API change
> +dnl # The .get_sb callback has been replaced by a .mount callback
> +dnl # in the file_system_type structure.
> +dnl #
> +AC_DEFUN([ZFS_AC_KERNEL_FST_MOUNT], [
> + AC_MSG_CHECKING([whether fst->mount() exists])
> + ZFS_LINUX_TRY_COMPILE([
> + #include <linux/fs.h>
> +
> + static struct dentry *
> + mount(struct file_system_type *fs_type, int flags,
> + const char *osname, void *data) {
> + struct dentry *d = NULL;
> + return (d);
> + }
> +
> + static struct file_system_type fst __attribute__ ((unused)) = {
> + .mount = mount,
> + };
> + ],[
> + ],[
> + AC_MSG_RESULT(yes)
> + AC_DEFINE(HAVE_FST_MOUNT, 1, [fst->mount() exists])
> + ],[
> + AC_MSG_RESULT(no)
> + ])
> +])
> diff --git a/zfs/config/kernel-mount-nodev.m4 b/zfs/config/kernel-mount-nodev.m4
> deleted file mode 100644
> index 28a4515..0000000
> --- a/zfs/config/kernel-mount-nodev.m4
> +++ /dev/null
> @@ -1,20 +0,0 @@
> -dnl #
> -dnl # 2.6.39 API change
> -dnl # The .get_sb callback has been replaced by a .mount callback
> -dnl # in the file_system_type structure. When using the new
> -dnl # interface the caller must now use the mount_nodev() helper.
> -dnl # This updated callback and helper no longer pass the vfsmount.
> -dnl #
> -AC_DEFUN([ZFS_AC_KERNEL_MOUNT_NODEV],
> - [AC_MSG_CHECKING([whether mount_nodev() is available])
> - ZFS_LINUX_TRY_COMPILE_SYMBOL([
> - #include <linux/fs.h>
> - ], [
> - mount_nodev(NULL, 0, NULL, NULL);
> - ], [mount_nodev], [fs/super.c], [
> - AC_MSG_RESULT(yes)
> - AC_DEFINE(HAVE_MOUNT_NODEV, 1, [mount_nodev() is available])
> - ], [
> - AC_MSG_RESULT(no)
> - ])
> -])
> diff --git a/zfs/config/kernel.m4 b/zfs/config/kernel.m4
> index 0eddc2f..0ba5f07d 100644
> --- a/zfs/config/kernel.m4
> +++ b/zfs/config/kernel.m4
> @@ -77,7 +77,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
> ZFS_AC_KERNEL_TRUNCATE_SETSIZE
> ZFS_AC_KERNEL_6ARGS_SECURITY_INODE_INIT_SECURITY
> ZFS_AC_KERNEL_CALLBACK_SECURITY_INODE_INIT_SECURITY
> - ZFS_AC_KERNEL_MOUNT_NODEV
> + ZFS_AC_KERNEL_FST_MOUNT
> ZFS_AC_KERNEL_SHRINK
> ZFS_AC_KERNEL_SHRINK_CONTROL_HAS_NID
> ZFS_AC_KERNEL_S_INSTANCES_LIST_HEAD
> diff --git a/zfs/configure b/zfs/configure
> index 8d61725..502dec9 100755
> --- a/zfs/configure
> +++ b/zfs/configure
> @@ -21202,21 +21202,31 @@ fi
>
>
>
> - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mount_nodev() is available" >&5
> -$as_echo_n "checking whether mount_nodev() is available... " >&6; }
>
> + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fst->mount() exists" >&5
> +$as_echo_n "checking whether fst->mount() exists... " >&6; }
>
>
> cat confdefs.h - <<_ACEOF >conftest.c
>
>
> - #include <linux/fs.h>
> + #include <linux/fs.h>
> +
> + static struct dentry *
> + mount(struct file_system_type *fs_type, int flags,
> + const char *osname, void *data) {
> + struct dentry *d = NULL;
> + return (d);
> + }
> +
> + static struct file_system_type fst __attribute__ ((unused)) = {
> + .mount = mount,
> + };
>
> int
> main (void)
> {
>
> - mount_nodev(NULL, 0, NULL, NULL);
>
> ;
> return 0;
> @@ -21246,64 +21256,25 @@ _ACEOF
> ac_status=$?
> $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> test $ac_status = 0; }; }; then :
> - rc=0
> -else
> - $as_echo "$as_me: failed program was:" >&5
> -sed 's/^/| /' conftest.$ac_ext >&5
> - rc=1
> -
>
> -fi
> - rm -Rf build
> -
> -
> - if test $rc -ne 0; then :
> + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
> +$as_echo "yes" >&6; }
>
> - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
> -$as_echo "no" >&6; }
> +$as_echo "#define HAVE_FST_MOUNT 1" >>confdefs.h
>
> - else
> - if test "x$enable_linux_builtin" != xyes; then
>
> - grep -q -E '[[:space:]]mount_nodev[[:space:]]' \
> - $LINUX_OBJ/$LINUX_SYMBOLS 2>/dev/null
> - rc=$?
> - if test $rc -ne 0; then
> - export=0
> - for file in fs/super.c; do
> - grep -q -E "EXPORT_SYMBOL.*(mount_nodev)" \
> - "$LINUX/$file" 2>/dev/null
> - rc=$?
> - if test $rc -eq 0; then
> - export=1
> - break;
> - fi
> - done
> - if test $export -eq 0; then :
> - rc=1
> - else :
> - rc=0
> - fi
> - else :
> - rc=0
> - fi
> -
> - fi
> - if test $rc -ne 0; then :
> +else
> + $as_echo "$as_me: failed program was:" >&5
> +sed 's/^/| /' conftest.$ac_ext >&5
>
> - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
> + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
> $as_echo "no" >&6; }
>
> - else :
>
> - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
> -$as_echo "yes" >&6; }
> -
> -$as_echo "#define HAVE_MOUNT_NODEV 1" >>confdefs.h
>
> +fi
> + rm -Rf build
>
> - fi
> - fi
>
>
>
> @@ -30596,21 +30567,31 @@ fi
>
>
>
> - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mount_nodev() is available" >&5
> -$as_echo_n "checking whether mount_nodev() is available... " >&6; }
>
> + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fst->mount() exists" >&5
> +$as_echo_n "checking whether fst->mount() exists... " >&6; }
>
>
> cat confdefs.h - <<_ACEOF >conftest.c
>
>
> - #include <linux/fs.h>
> + #include <linux/fs.h>
> +
> + static struct dentry *
> + mount(struct file_system_type *fs_type, int flags,
> + const char *osname, void *data) {
> + struct dentry *d = NULL;
> + return (d);
> + }
> +
> + static struct file_system_type fst __attribute__ ((unused)) = {
> + .mount = mount,
> + };
>
> int
> main (void)
> {
>
> - mount_nodev(NULL, 0, NULL, NULL);
>
> ;
> return 0;
> @@ -30640,64 +30621,25 @@ _ACEOF
> ac_status=$?
> $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> test $ac_status = 0; }; }; then :
> - rc=0
> -else
> - $as_echo "$as_me: failed program was:" >&5
> -sed 's/^/| /' conftest.$ac_ext >&5
> - rc=1
> -
>
> -fi
> - rm -Rf build
> -
> -
> - if test $rc -ne 0; then :
> + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
> +$as_echo "yes" >&6; }
>
> - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
> -$as_echo "no" >&6; }
> +$as_echo "#define HAVE_FST_MOUNT 1" >>confdefs.h
>
> - else
> - if test "x$enable_linux_builtin" != xyes; then
>
> - grep -q -E '[[:space:]]mount_nodev[[:space:]]' \
> - $LINUX_OBJ/$LINUX_SYMBOLS 2>/dev/null
> - rc=$?
> - if test $rc -ne 0; then
> - export=0
> - for file in fs/super.c; do
> - grep -q -E "EXPORT_SYMBOL.*(mount_nodev)" \
> - "$LINUX/$file" 2>/dev/null
> - rc=$?
> - if test $rc -eq 0; then
> - export=1
> - break;
> - fi
> - done
> - if test $export -eq 0; then :
> - rc=1
> - else :
> - rc=0
> - fi
> - else :
> - rc=0
> - fi
> -
> - fi
> - if test $rc -ne 0; then :
> +else
> + $as_echo "$as_me: failed program was:" >&5
> +sed 's/^/| /' conftest.$ac_ext >&5
>
> - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
> + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
> $as_echo "no" >&6; }
>
> - else :
>
> - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
> -$as_echo "yes" >&6; }
> -
> -$as_echo "#define HAVE_MOUNT_NODEV 1" >>confdefs.h
>
> +fi
> + rm -Rf build
>
> - fi
> - fi
>
>
>
> diff --git a/zfs/contrib/Makefile.in b/zfs/contrib/Makefile.in
> index 1ced2ca..c1204cd 100644
> --- a/zfs/contrib/Makefile.in
> +++ b/zfs/contrib/Makefile.in
> @@ -129,6 +129,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
> $(top_srcdir)/config/kernel-file-inode.m4 \
> $(top_srcdir)/config/kernel-fmode-t.m4 \
> $(top_srcdir)/config/kernel-follow-down-one.m4 \
> + $(top_srcdir)/config/kernel-fst-mount.m4 \
> $(top_srcdir)/config/kernel-fsync.m4 \
> $(top_srcdir)/config/kernel-generic_io_acct.m4 \
> $(top_srcdir)/config/kernel-get-disk-ro.m4 \
> @@ -144,7 +145,6 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
> $(top_srcdir)/config/kernel-lseek-execute.m4 \
> $(top_srcdir)/config/kernel-mk-request-fn.m4 \
> $(top_srcdir)/config/kernel-mkdir-umode-t.m4 \
> - $(top_srcdir)/config/kernel-mount-nodev.m4 \
> $(top_srcdir)/config/kernel-open-bdev-exclusive.m4 \
> $(top_srcdir)/config/kernel-put-link.m4 \
> $(top_srcdir)/config/kernel-security-inode-init.m4 \
> diff --git a/zfs/contrib/bash_completion.d/Makefile.in b/zfs/contrib/bash_completion.d/Makefile.in
> index a848010..f29d5cc 100644
> --- a/zfs/contrib/bash_completion.d/Makefile.in
> +++ b/zfs/contrib/bash_completion.d/Makefile.in
> @@ -130,6 +130,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
> $(top_srcdir)/config/kernel-file-inode.m4 \
> $(top_srcdir)/config/kernel-fmode-t.m4 \
> $(top_srcdir)/config/kernel-follow-down-one.m4 \
> + $(top_srcdir)/config/kernel-fst-mount.m4 \
> $(top_srcdir)/config/kernel-fsync.m4 \
> $(top_srcdir)/config/kernel-generic_io_acct.m4 \
> $(top_srcdir)/config/kernel-get-disk-ro.m4 \
> @@ -145,7 +146,6 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
> $(top_srcdir)/config/kernel-lseek-execute.m4 \
> $(top_srcdir)/config/kernel-mk-request-fn.m4 \
> $(top_srcdir)/config/kernel-mkdir-umode-t.m4 \
> - $(top_srcdir)/config/kernel-mount-nodev.m4 \
> $(top_srcdir)/config/kernel-open-bdev-exclusive.m4 \
> $(top_srcdir)/config/kernel-put-link.m4 \
> $(top_srcdir)/config/kernel-security-inode-init.m4 \
> diff --git a/zfs/contrib/dracut/90zfs/Makefile.in b/zfs/contrib/dracut/90zfs/Makefile.in
> index 80f3262..63da6ed 100644
> --- a/zfs/contrib/dracut/90zfs/Makefile.in
> +++ b/zfs/contrib/dracut/90zfs/Makefile.in
> @@ -130,6 +130,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
> $(top_srcdir)/config/kernel-file-inode.m4 \
> $(top_srcdir)/config/kernel-fmode-t.m4 \
> $(top_srcdir)/config/kernel-follow-down-one.m4 \
> + $(top_srcdir)/config/kernel-fst-mount.m4 \
> $(top_srcdir)/config/kernel-fsync.m4 \
> $(top_srcdir)/config/kernel-generic_io_acct.m4 \
> $(top_srcdir)/config/kernel-get-disk-ro.m4 \
> @@ -145,7 +146,6 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
> $(top_srcdir)/config/kernel-lseek-execute.m4 \
> $(top_srcdir)/config/kernel-mk-request-fn.m4 \
> $(top_srcdir)/config/kernel-mkdir-umode-t.m4 \
> - $(top_srcdir)/config/kernel-mount-nodev.m4 \
> $(top_srcdir)/config/kernel-open-bdev-exclusive.m4 \
> $(top_srcdir)/config/kernel-put-link.m4 \
> $(top_srcdir)/config/kernel-security-inode-init.m4 \
> diff --git a/zfs/contrib/dracut/Makefile.in b/zfs/contrib/dracut/Makefile.in
> index 5136e7f..eed070a 100644
> --- a/zfs/contrib/dracut/Makefile.in
> +++ b/zfs/contrib/dracut/Makefile.in
> @@ -129,6 +129,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
> $(top_srcdir)/config/kernel-file-inode.m4 \
> $(top_srcdir)/config/kernel-fmode-t.m4 \
> $(top_srcdir)/config/kernel-follow-down-one.m4 \
> + $(top_srcdir)/config/kernel-fst-mount.m4 \
> $(top_srcdir)/config/kernel-fsync.m4 \
> $(top_srcdir)/config/kernel-generic_io_acct.m4 \
> $(top_srcdir)/config/kernel-get-disk-ro.m4 \
> @@ -144,7 +145,6 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
> $(top_srcdir)/config/kernel-lseek-execute.m4 \
> $(top_srcdir)/config/kernel-mk-request-fn.m4 \
> $(top_srcdir)/config/kernel-mkdir-umode-t.m4 \
> - $(top_srcdir)/config/kernel-mount-nodev.m4 \
> $(top_srcdir)/config/kernel-open-bdev-exclusive.m4 \
> $(top_srcdir)/config/kernel-put-link.m4 \
> $(top_srcdir)/config/kernel-security-inode-init.m4 \
> diff --git a/zfs/contrib/initramfs/Makefile.in b/zfs/contrib/initramfs/Makefile.in
> index 5bf9c44..7a567be 100644
> --- a/zfs/contrib/initramfs/Makefile.in
> +++ b/zfs/contrib/initramfs/Makefile.in
> @@ -130,6 +130,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
> $(top_srcdir)/config/kernel-file-inode.m4 \
> $(top_srcdir)/config/kernel-fmode-t.m4 \
> $(top_srcdir)/config/kernel-follow-down-one.m4 \
> + $(top_srcdir)/config/kernel-fst-mount.m4 \
> $(top_srcdir)/config/kernel-fsync.m4 \
> $(top_srcdir)/config/kernel-generic_io_acct.m4 \
> $(top_srcdir)/config/kernel-get-disk-ro.m4 \
> @@ -145,7 +146,6 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
> $(top_srcdir)/config/kernel-lseek-execute.m4 \
> $(top_srcdir)/config/kernel-mk-request-fn.m4 \
> $(top_srcdir)/config/kernel-mkdir-umode-t.m4 \
> - $(top_srcdir)/config/kernel-mount-nodev.m4 \
> $(top_srcdir)/config/kernel-open-bdev-exclusive.m4 \
> $(top_srcdir)/config/kernel-put-link.m4 \
> $(top_srcdir)/config/kernel-security-inode-init.m4 \
> diff --git a/zfs/include/Makefile.in b/zfs/include/Makefile.in
> index 5dcbe26..be50bca 100644
> --- a/zfs/include/Makefile.in
> +++ b/zfs/include/Makefile.in
> @@ -130,6 +130,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
> $(top_srcdir)/config/kernel-file-inode.m4 \
> $(top_srcdir)/config/kernel-fmode-t.m4 \
> $(top_srcdir)/config/kernel-follow-down-one.m4 \
> + $(top_srcdir)/config/kernel-fst-mount.m4 \
> $(top_srcdir)/config/kernel-fsync.m4 \
> $(top_srcdir)/config/kernel-generic_io_acct.m4 \
> $(top_srcdir)/config/kernel-get-disk-ro.m4 \
> @@ -145,7 +146,6 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
> $(top_srcdir)/config/kernel-lseek-execute.m4 \
> $(top_srcdir)/config/kernel-mk-request-fn.m4 \
> $(top_srcdir)/config/kernel-mkdir-umode-t.m4 \
> - $(top_srcdir)/config/kernel-mount-nodev.m4 \
> $(top_srcdir)/config/kernel-open-bdev-exclusive.m4 \
> $(top_srcdir)/config/kernel-put-link.m4 \
> $(top_srcdir)/config/kernel-security-inode-init.m4 \
> diff --git a/zfs/include/linux/Makefile.in b/zfs/include/linux/Makefile.in
> index 52deade..70974df 100644
> --- a/zfs/include/linux/Makefile.in
> +++ b/zfs/include/linux/Makefile.in
> @@ -130,6 +130,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
> $(top_srcdir)/config/kernel-file-inode.m4 \
> $(top_srcdir)/config/kernel-fmode-t.m4 \
> $(top_srcdir)/config/kernel-follow-down-one.m4 \
> + $(top_srcdir)/config/kernel-fst-mount.m4 \
> $(top_srcdir)/config/kernel-fsync.m4 \
> $(top_srcdir)/config/kernel-generic_io_acct.m4 \
> $(top_srcdir)/config/kernel-get-disk-ro.m4 \
> @@ -145,7 +146,6 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
> $(top_srcdir)/config/kernel-lseek-execute.m4 \
> $(top_srcdir)/config/kernel-mk-request-fn.m4 \
> $(top_srcdir)/config/kernel-mkdir-umode-t.m4 \
> - $(top_srcdir)/config/kernel-mount-nodev.m4 \
> $(top_srcdir)/config/kernel-open-bdev-exclusive.m4 \
> $(top_srcdir)/config/kernel-put-link.m4 \
> $(top_srcdir)/config/kernel-security-inode-init.m4 \
> diff --git a/zfs/include/linux/vfs_compat.h b/zfs/include/linux/vfs_compat.h
> index 8037055..f440f36 100644
> --- a/zfs/include/linux/vfs_compat.h
> +++ b/zfs/include/linux/vfs_compat.h
> @@ -112,6 +112,30 @@ zpl_bdi_setup_and_register(struct backing_dev_info *bdi, char *name)
> #endif
>
> /*
> + * 4.14 adds SB_* flag definitions, define them to MS_* equivalents
> + * if not set.
> + */
> +#ifndef SB_RDONLY
> +#define SB_RDONLY MS_RDONLY
> +#endif
> +
> +#ifndef SB_SILENT
> +#define SB_SILENT MS_SILENT
> +#endif
> +
> +#ifndef SB_ACTIVE
> +#define SB_ACTIVE MS_ACTIVE
> +#endif
> +
> +#ifndef SB_POSIXACL
> +#define SB_POSIXACL MS_POSIXACL
> +#endif
> +
> +#ifndef SB_MANDLOCK
> +#define SB_MANDLOCK MS_MANDLOCK
> +#endif
> +
> +/*
> * 2.6.38 API change,
> * LOOKUP_RCU flag introduced to distinguish rcu-walk from ref-walk cases.
> */
> diff --git a/zfs/include/sys/Makefile.in b/zfs/include/sys/Makefile.in
> index 20f498f..c0a0c2d 100644
> --- a/zfs/include/sys/Makefile.in
> +++ b/zfs/include/sys/Makefile.in
> @@ -130,6 +130,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
> $(top_srcdir)/config/kernel-file-inode.m4 \
> $(top_srcdir)/config/kernel-fmode-t.m4 \
> $(top_srcdir)/config/kernel-follow-down-one.m4 \
> + $(top_srcdir)/config/kernel-fst-mount.m4 \
> $(top_srcdir)/config/kernel-fsync.m4 \
> $(top_srcdir)/config/kernel-generic_io_acct.m4 \
> $(top_srcdir)/config/kernel-get-disk-ro.m4 \
> @@ -145,7 +146,6 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
> $(top_srcdir)/config/kernel-lseek-execute.m4 \
> $(top_srcdir)/config/kernel-mk-request-fn.m4 \
> $(top_srcdir)/config/kernel-mkdir-umode-t.m4 \
> - $(top_srcdir)/config/kernel-mount-nodev.m4 \
> $(top_srcdir)/config/kernel-open-bdev-exclusive.m4 \
> $(top_srcdir)/config/kernel-put-link.m4 \
> $(top_srcdir)/config/kernel-security-inode-init.m4 \
> diff --git a/zfs/include/sys/fm/Makefile.in b/zfs/include/sys/fm/Makefile.in
> index d8d132f..b6f5397 100644
> --- a/zfs/include/sys/fm/Makefile.in
> +++ b/zfs/include/sys/fm/Makefile.in
> @@ -130,6 +130,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
> $(top_srcdir)/config/kernel-file-inode.m4 \
> $(top_srcdir)/config/kernel-fmode-t.m4 \
> $(top_srcdir)/config/kernel-follow-down-one.m4 \
> + $(top_srcdir)/config/kernel-fst-mount.m4 \
> $(top_srcdir)/config/kernel-fsync.m4 \
> $(top_srcdir)/config/kernel-generic_io_acct.m4 \
> $(top_srcdir)/config/kernel-get-disk-ro.m4 \
> @@ -145,7 +146,6 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
> $(top_srcdir)/config/kernel-lseek-execute.m4 \
> $(top_srcdir)/config/kernel-mk-request-fn.m4 \
> $(top_srcdir)/config/kernel-mkdir-umode-t.m4 \
> - $(top_srcdir)/config/kernel-mount-nodev.m4 \
> $(top_srcdir)/config/kernel-open-bdev-exclusive.m4 \
> $(top_srcdir)/config/kernel-put-link.m4 \
> $(top_srcdir)/config/kernel-security-inode-init.m4 \
> diff --git a/zfs/include/sys/fm/fs/Makefile.in b/zfs/include/sys/fm/fs/Makefile.in
> index 2c61a5e..a1216fb 100644
> --- a/zfs/include/sys/fm/fs/Makefile.in
> +++ b/zfs/include/sys/fm/fs/Makefile.in
> @@ -130,6 +130,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
> $(top_srcdir)/config/kernel-file-inode.m4 \
> $(top_srcdir)/config/kernel-fmode-t.m4 \
> $(top_srcdir)/config/kernel-follow-down-one.m4 \
> + $(top_srcdir)/config/kernel-fst-mount.m4 \
> $(top_srcdir)/config/kernel-fsync.m4 \
> $(top_srcdir)/config/kernel-generic_io_acct.m4 \
> $(top_srcdir)/config/kernel-get-disk-ro.m4 \
> @@ -145,7 +146,6 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
> $(top_srcdir)/config/kernel-lseek-execute.m4 \
> $(top_srcdir)/config/kernel-mk-request-fn.m4 \
> $(top_srcdir)/config/kernel-mkdir-umode-t.m4 \
> - $(top_srcdir)/config/kernel-mount-nodev.m4 \
> $(top_srcdir)/config/kernel-open-bdev-exclusive.m4 \
> $(top_srcdir)/config/kernel-put-link.m4 \
> $(top_srcdir)/config/kernel-security-inode-init.m4 \
> diff --git a/zfs/include/sys/fs/Makefile.in b/zfs/include/sys/fs/Makefile.in
> index 95d7b62..4715b29 100644
> --- a/zfs/include/sys/fs/Makefile.in
> +++ b/zfs/include/sys/fs/Makefile.in
> @@ -130,6 +130,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
> $(top_srcdir)/config/kernel-file-inode.m4 \
> $(top_srcdir)/config/kernel-fmode-t.m4 \
> $(top_srcdir)/config/kernel-follow-down-one.m4 \
> + $(top_srcdir)/config/kernel-fst-mount.m4 \
> $(top_srcdir)/config/kernel-fsync.m4 \
> $(top_srcdir)/config/kernel-generic_io_acct.m4 \
> $(top_srcdir)/config/kernel-get-disk-ro.m4 \
> @@ -145,7 +146,6 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
> $(top_srcdir)/config/kernel-lseek-execute.m4 \
> $(top_srcdir)/config/kernel-mk-request-fn.m4 \
> $(top_srcdir)/config/kernel-mkdir-umode-t.m4 \
> - $(top_srcdir)/config/kernel-mount-nodev.m4 \
> $(top_srcdir)/config/kernel-open-bdev-exclusive.m4 \
> $(top_srcdir)/config/kernel-put-link.m4 \
> $(top_srcdir)/config/kernel-security-inode-init.m4 \
> diff --git a/zfs/module/zfs/zpl_super.c b/zfs/module/zfs/zpl_super.c
> index bcdbbd6..f75a0d8 100644
> --- a/zfs/module/zfs/zpl_super.c
> +++ b/zfs/module/zfs/zpl_super.c
> @@ -443,12 +443,56 @@ zpl_fill_super(struct super_block *sb, void *data, int silent)
> return (error);
> }
>
> -#ifdef HAVE_MOUNT_NODEV
> +static int
> +zpl_test_super(struct super_block *s, void *data)
> +{
> + zfs_sb_t *zsb = s->s_fs_info;
> +
> + objset_t *os = data;
> +
> + if (zsb == NULL)
> + return (0);
> +
> + return (os == zsb->z_os);
> +}
> +
> +static struct super_block *
> +zpl_mount_impl(struct file_system_type *fs_type, int flags, zfs_mntopts_t *zmo)
> +{
> + struct super_block *s;
> + objset_t *os;
> + int err;
> +
> + err = dmu_objset_hold(zmo->z_osname, FTAG, &os);
> + if (err)
> + return (ERR_PTR(-err));
> +
> + s = zpl_sget(fs_type, zpl_test_super, set_anon_super, flags, os);
> + dmu_objset_rele(os, FTAG);
> + if (IS_ERR(s))
> + return (ERR_CAST(s));
> +
> + if (s->s_root == NULL) {
> + err = zpl_fill_super(s, zmo, flags & SB_SILENT ? 1 : 0);
> + if (err) {
> + deactivate_locked_super(s);
> + return (ERR_PTR(err));
> + }
> + s->s_flags |= SB_ACTIVE;
> + } else if ((flags ^ s->s_flags) & SB_RDONLY) {
> + deactivate_locked_super(s);
> + return (ERR_PTR(-EBUSY));
> + }
> +
> + return (s);
> +}
> +#ifdef HAVE_FST_MOUNT
> static struct dentry *
> zpl_mount(struct file_system_type *fs_type, int flags,
> const char *osname, void *data)
> {
> zfs_mntopts_t *zmo = zfs_mntopts_alloc();
> + struct super_block *sb;
> int error;
>
> error = zpl_parse_options((char *)osname, (char *)data, zmo, B_FALSE);
> @@ -456,8 +500,11 @@ zpl_mount(struct file_system_type *fs_type, int flags,
> zfs_mntopts_free(zmo);
> return (ERR_PTR(error));
> }
> + sb = zpl_mount_impl(fs_type, flags, zmo);
> + if (IS_ERR(sb))
> + return (ERR_CAST(sb));
>
> - return (mount_nodev(fs_type, flags, zmo, zpl_fill_super));
> + return (dget(sb->s_root));
> }
> #else
> static int
> @@ -465,6 +512,7 @@ zpl_get_sb(struct file_system_type *fs_type, int flags,
> const char *osname, void *data, struct vfsmount *mnt)
> {
> zfs_mntopts_t *zmo = zfs_mntopts_alloc();
> + struct super_block *sb;
> int error;
>
> error = zpl_parse_options((char *)osname, (char *)data, zmo, B_FALSE);
> @@ -472,10 +520,15 @@ zpl_get_sb(struct file_system_type *fs_type, int flags,
> zfs_mntopts_free(zmo);
> return (error);
> }
> + sb = zpl_mount_impl(fs_type, flags, zmo);
> + if (IS_ERR(sb))
> + return (ERR_CAST(sb));
> +
> + (void) simple_set_mnt(mnt, sb);
>
> - return (get_sb_nodev(fs_type, flags, zmo, zpl_fill_super, mnt));
> + return (0);
> }
> -#endif /* HAVE_MOUNT_NODEV */
> +#endif /* HAVE_FST_MOUNT */
>
> static void
> zpl_kill_sb(struct super_block *sb)
> @@ -542,10 +595,10 @@ const struct super_operations zpl_super_operations = {
> struct file_system_type zpl_fs_type = {
> .owner = THIS_MODULE,
> .name = ZFS_DRIVER,
> -#ifdef HAVE_MOUNT_NODEV
> +#ifdef HAVE_FST_MOUNT
> .mount = zpl_mount,
> #else
> .get_sb = zpl_get_sb,
> -#endif /* HAVE_MOUNT_NODEV */
> +#endif /* HAVE_FST_MOUNT */
> .kill_sb = zpl_kill_sb,
> };
> diff --git a/zfs/zfs_config.h.in b/zfs/zfs_config.h.in
> index c5026c8..60cf471 100644
> --- a/zfs/zfs_config.h.in
> +++ b/zfs/zfs_config.h.in
> @@ -162,6 +162,9 @@
> /* sops->free_cached_objects() exists */
> #undef HAVE_FREE_CACHED_OBJECTS
>
> +/* fst->mount() exists */
> +#undef HAVE_FST_MOUNT
> +
> /* fops->fsync() with range */
> #undef HAVE_FSYNC_RANGE
>
> @@ -252,9 +255,6 @@
> /* Define to 1 if you have the `mlockall' function. */
> #undef HAVE_MLOCKALL
>
> -/* mount_nodev() is available */
> -#undef HAVE_MOUNT_NODEV
> -
> /* sops->nr_cached_objects() exists */
> #undef HAVE_NR_CACHED_OBJECTS
>
>
Did this get a 2nd ACK and applied?
More information about the kernel-team
mailing list